AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 19095
Accepted
Jon of All Trades
Jon of All Trades
Asked: 2012-06-12 14:54:08 +0800 CST2012-06-12 14:54:08 +0800 CST 2012-06-12 14:54:08 +0800 CST

Quais opções existem para copiar dados entre servidores regularmente?

  • 772

Minhas desculpas se isso já foi respondido. Pesquisei SO e, claro, aqui no DBA, e estou surpreso por não encontrar correspondências próximas. Especificamente, estou procurando uma solução que sobreviva às diferenças de esquema.


Finalmente consegui um servidor de desenvolvimento para sombrear um servidor de data warehouse de produção. Estarei testando mudanças de schema e sproc aqui, eventualmente publicando tais mudanças no servidor prod. Para isso, precisarei de dados razoavelmente atuais, mas não precisam ser atualizados em tempo real. Meu plano é copiar os dados de estado final do servidor principal para o servidor de desenvolvimento como a etapa final do ETL noturno. Qual é a melhor maneira de conseguir isso?

Parâmetros

Todas as cópias automáticas serão de prod para dev. Qualquer cópia de dev para prod será feita à mão e, geralmente, será apenas DDL.

Como o esquema do servidor de desenvolvimento deve mudar independentemente do servidor de produção, não quero que o processo de cópia falhe quando o esquema de destino for diferente (tudo bem se as tabelas específicas em fluxo não puderem ser mantidas em sincronia, é claro) . Caso contrário, eu apenas DROP DATABASErestauraria o backup da noite passada.

Manter o esquema, SPs, exibições e UDFs sincronizados não é necessário, nem mesmo desejável. Eles só devem mudar quando eu os mudar especificamente.

Os registros podem ser alterados retroativamente na maioria das tabelas, portanto atualizações incrementais provavelmente não serão práticas.

O volume de dados é de 14 GB para as tabelas mais críticas, mais cerca de 200 GB de dados menos importantes que podem ser atualizados semanalmente.

Meu objetivo é terminar o processo em duas horas. Os servidores são co-localizados e devem ter alta taxa de transferência. Copiar ( INSERT INTO..SELECT * FROM ProdServer..) uma única tabela com 600 MB de dados e 300 de índices levou 7,5 minutos; nada bom. Preocupante, outra tabela com 11 GB de dados e 8 GB de índices não terminou em 130 minutos, quando a cancelei. Vou testar isso novamente sem índices.

Colocar o banco de dados prod offline é aceitável se puder ser breve - não mais que 30 minutos. O banco de dados de desenvolvimento pode ficar offline por horas, se necessário.

Se eu puder excluir temporariamente uma tabela específica, mantendo-a estática por alguns dias durante o teste, isso seria valioso.

Opções

1: Replicação

Eu poderia criar um instantâneo diário após o término do ETL e publicá-lo no servidor de desenvolvimento. Eu não usei a replicação antes, mas este parece ser o tipo de cenário para o qual ela se destina. Hora de aprender uma nova faceta da tecnologia?

2: Cópia em massa e inserção em massa

Eu poderia escrever um script que percorre todas as tabelas no banco de dados prod e despeja o conteúdo em um arquivo com nome exclusivo. No lado do desenvolvedor, eu percorreria esses arquivos e TRUNCATE/ BULK INSERTna tabela de destino, com um TRY..CATCHbloco caso o esquema fosse alterado. Não tenho certeza se isso teria um desempenho aceitável, mas seria bastante simples de implementar.

3: INSERT do servidor vinculado

Posso executar um TRUNCATE/ INSERT..SELECTpara cada tabela, provavelmente puxando do lado do desenvolvedor. Isso seria simples e rápido, especialmente se alguém eliminar e recriar os índices. Para lidar com as mudanças de esquema, pode-se identificar a interseção das listas de campos para cada par de tabelas e apenas tentar copiar esses campos; isso ajudaria se muitos campos fossem NULLable.


Existem outras opções? Existe uma maneira mais fácil que estou ignorando? Há alguma pegadinha que você encontrou ao trabalhar em projetos semelhantes?

Esta questão descreve o lado da exportação, mas a saída desejada era CSV, portanto as opções são limitadas (e o BCP funciona muito bem, conforme respondido).

Esta questão fala sobre como copiar rapidamente um banco de dados inteiro, incluindo o esquema. Exclui especificamente a replicação.

Esta questão discute a sincronização bidirecional, para a qual a replicação é sugerida.

sql-server-2008 replication
  • 4 4 respostas
  • 3483 Views

4 respostas

  • Voted
  1. Best Answer
    gbn
    2012-06-12T22:58:22+08:002012-06-12T22:58:22+08:00

    Eu consideraria o backup/restauração de uma mistura de backups completos e diferenciais de produção para desenvolvimento. Em seguida, sincronize esta cópia restaurada com seus bancos de dados de desenvolvimento reais

    O SQL Server 2008 R2+ oferece suporte à compactação de backup na Standard Edition (no SQL Server 2008, era apenas Enterprise Edition), o que torna isso mais fácil.

    Razões:

    • Você testa sua integridade de backup e capacidade de restauração
    • Você pode redefinir seu banco de dados de desenvolvimento facilmente se algum macaco de código o estragar
    • Você pode comparar DDL "antes" e "depois", desempenho, etc.
    • Você pode capturar o banco de dados restaurado conforme necessário para reverter isso se fizer alterações

    Eu usei isso antes e vou usá-lo novamente por esses motivos

    Sugeri isso em minha resposta para O menor backup possível ... com SQL Server

    • 2
  2. Remus Rusanu
    2012-06-13T01:53:20+08:002012-06-13T01:53:20+08:00

    Integração contígua com migrações . A implantação de V. Next significa executar os scripts de atualização para V. Prev para v. Next. Os scripts são fonte, verificados. Nunca considere os arquivos binários do banco de dados (MDF, LDF) como o esquema verdadeiro. considere a fonte (.sql) como o esquema, sempre opere nos arquivos .sql, teste os arquivos .sql até ter certeza da atualização e, em seguida, implante a atualização executando o arquivo .sql.

    A implantação baseada em diff está repleta de problemas, pois você está à mercê da ferramenta diff (algumas são melhores que outras, pessoalmente, eu nunca confiaria em minha implantação ao vivo em nenhuma delas). A implantação baseada em cópia nem vale a pena mencionar.

    Nenhuma alteração ocorre no servidor de fígado sem passar por esse processo. Sempre .

    Que tal copiar o servidor prod para o dev? Por que você precisaria fazer isso, além de comprometer os dados expondo-os a olhos não autorizados? Implante um servidor de teste/desenvolvimento usando o mesmo procedimento, integração contígua e migrações.

    Em alguns cenários, é aceitável ter uma réplica de teste de prod ou uma réplica de desenvolvimento de prod. Torne-o parte da queda de compilação de integração contígua: a queda noturna começa com um backup prod, executa as migrações de v. prod para v. dev, o resultado é a variante dev do banco de dados prod, descartado recentemente. BTW, você notou que o drop também apenas testou a migração de v. prod para v. dev? Os dados precisam ser anonimizados ou alguma outra transformação para o ambiente de desenvolvimento? Torne-a uma etapa de implantação específica do desenvolvedor, é claro, controlada por scripts verificados na árvore de origem.

    • 1
  3. Thomas Stringer
    2012-06-12T15:54:54+08:002012-06-12T15:54:54+08:00

    Eu recomendaria usar o SQL Server Integration Services (SSIS) para esse tipo de requisito. O poder do SSIS seria a facilidade de tratamento de erros (conforme exigido pela sua pergunta), a capacidade de agendá-lo e a capacidade de manutenção impecável de um pacote DTSX. Você não terá que se preocupar em vincular servidores explicitamente ou qualquer tempo de inatividade.

    O SSIS lida bem com a separação de interesses. É um pacote independente que, quando usado com o SQL Server Agent, pode ser agendado todas as noites ou você pode executá-lo sob demanda.

    • 0
  4. SQLGuyChuck
    2012-06-19T22:49:16+08:002012-06-19T22:49:16+08:00

    A replicação de instantâneo seria o único tipo de replicação que poderia funcionar. Mas pode impedir alterações de esquema como as outras versões (transacional, mesclagem/ponto a ponto). Mas você ficaria melhor com um backup e restauração (as ideias de Remus parecem perfeitas), pois você não ganhará nada com a replicação para este cenário.

    • 0

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve