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 / 1038
Accepted
BradC
BradC
Asked: 2011-02-03 16:29:19 +0800 CST2011-02-03 16:29:19 +0800 CST 2011-02-03 16:29:19 +0800 CST

Mover tabelas para outro banco de dados SQL2008 (incluindo índices, gatilhos etc.)

  • 772

Eu preciso mover um monte (mais de 100) de tabelas grandes (milhões de linhas) de um banco de dados SQL2008 para outro.

Originalmente, usei apenas o Assistente de Importação/Exportação, mas todas as tabelas de destino estavam sem chaves primárias e estrangeiras, índices, restrições, gatilhos etc. (As colunas de identidade também foram convertidas em INTs simples, mas acho que perdi uma caixa de seleção no bruxo.)

Qual é a maneira certa de fazer isso?

Se fossem apenas algumas tabelas, eu voltaria para a fonte, executaria o script da definição da tabela (com todos os índices, etc.) e executaria as partes de criação de índice do script no destino. Mas com tantas tabelas, isso parece impraticável.

Se não houvesse tantos dados, eu poderia usar o assistente "Criar scripts..." para fazer o script da fonte, incluindo dados, mas um script de 72m de linha simplesmente não parece uma boa ideia!

sql-server sql-server-2008
  • 7 7 respostas
  • 34638 Views

7 respostas

  • Voted
  1. mrdenny
    2011-02-03T18:08:38+08:002011-02-03T18:08:38+08:00

    Fazer o script das tabelas e usar o SSIS para transferir os dados seria a maneira mais confiável e eficaz de mover os dados para o novo banco de dados.

    • 14
  2. Best Answer
    BradC
    2011-02-04T10:44:53+08:002011-02-04T10:44:53+08:00

    Na verdade, fizemos isso usando muitos scripts manuais em conjunto com o assistente de importação, mas esta manhã encontrei uma resposta melhor, cortesia do artigo do blog de Tibor Karaszi .

    Parte de nossa frustração aqui foi que o SQL 2000 "DTS Import/Export Wizard" torna isso quase trivialmente fácil selecionando "Copy Objects and Data":

    Assistente de importação DTS

    Esta terceira opção é a que contém a capacidade de incluir índices/gatilhos, etc:

    Opções avançadas

    Esta opção foi REMOVIDA do SQL 2005/2008 Import Wizard. Por quê? Nenhuma idéia:

    Assistente de importação de 2008

    Em 2005/2008, você aparentemente tem que criar manualmente um pacote SSIS no BIDS e usar a Tarefa Transferir Objetos do SQL Server , que contém todas as mesmas opções que estavam no assistente 2000:

    Tarefa de Transferência de Objetos do SQL Server do SSIS

    • 9
  3. gbn
    2011-02-03T23:36:12+08:002011-02-03T23:36:12+08:00

    Eu consideraria fazer um script da tabela ou usar uma ferramenta de comparação (por exemplo, Red Gate) para gerar as tabelas no banco de dados de destino. Sem índices ou restrições ainda.

    Então eu consideraria restaurar o banco de dados com um nome diferente no mesmo servidor e fazer

     INSERT newdb.dbo.newtable SELECT * FROM olddb.dbo.oldtable
    

    .. para cada tabela, com SET IDENTITY INSERT ON se necessário

    Então eu adicionaria índices e restrições depois de carregar os dados.

    Depende do seu nível de conforto com o SSIS (resposta do mrdenny) ou se você preferir SQL bruto.

    • 8
  4. Marian
    2011-02-04T00:30:13+08:002011-02-04T00:30:13+08:00

    Eu acrescentaria à resposta do Sr. Denny: Script do esquema de tabelas e use o BCP para mover os dados. Se você não estiver familiarizado com o SSIS, usar BCP e lotes deve ser fácil de fazer. Para milhões de linhas, nada supera o BCP (inserção em massa) :).

    • 6
  5. bernd_k
    2011-02-14T07:48:42+08:002011-02-14T07:48:42+08:00

    Eu sou o único que está completamente desconfortável com o SSIS.

    Quando as tabelas de origem não têm colunas de identidade

    1. crie um banco de dados vazio no servidor de destino
    2. crie um servidor vinculado ao servidor de origem no servidor de destino
    3. execute o script abaixo no banco de dados de origem para gerar as instruções select * into ...
    4. execute o script gerado do banco de dados de destino
    5. script de chaves primárias, índices, gatilhos, funções e procedimentos do banco de dados de origem
    6. crie esses objetos pelo script gerado

    Agora o T-SQL para gerar as instruções Select * into ...

    SET NOCOUNT ON
    
    declare @name sysname
    declare @sql varchar(255)
    
    declare db_cursor cursor for
    select name from sys.tables order by 1
    open db_cursor
    
    fetch next from db_cursor into @name
    while @@FETCH_STATUS = 0
    begin
        Set @sql = 'select * into [' + @name + '] from [linked_server].[source_db].[dbo].[' + @name + '];'
        print @sql
    
        fetch next from db_cursor into @name
    end
    
    close db_cursor
    deallocate db_cursor
    

    Isso gera uma linha para cada tabela para copiar como

    select * into [Table1] from [linked_server].[source_db].[dbo].[Table1];
    

    Caso as tabelas contenham colunas de identidade, eu crio scripts nas tabelas incluindo propriedade de identidade e chaves primárias.

    Eu não uso insert into ... select ... usando um servidor vinculado neste caso, pois essa não é uma técnica em massa. Estou trabalhando em alguns scripts do PowerShell semelhantes a [esta pergunta SO 1 , mas ainda estou trabalhando no tratamento de erros. Tabelas realmente grandes podem causar erros de falta de memória, pois uma tabela inteira é carregada na memória, antes de ser enviada via SQLBulkCopy para o banco de dados.

    A recriação de índices etc. é semelhante ao caso acima. Desta vez posso pular a recriação das chaves primárias.

    • 4
  6. Carol Baker West
    2013-04-27T11:19:52+08:002013-04-27T11:19:52+08:00

    Você pode usar ferramentas de comparação que comparam esquemas e dados de banco de dados e primeiro sincronizar um esquema de banco de dados em branco com o banco de dados original para criar todas as tabelas.

    Em seguida, sincronize os dados do banco de dados original com o novo (todas as tabelas estão lá, mas estão todas vazias) para inserir os registros nas tabelas

    Eu uso ApexSQL Diff e ApexSQL Data Diff para isso, mas existem outras ferramentas semelhantes.

    O bom desse processo é que você não precisa sincronizar os bancos de dados usando a ferramenta, pois isso pode ser bastante doloroso para milhões de linhas.

    Você pode simplesmente criar um script INSERT INTO SQL (não se surpreenda se forem vários shows) e executá-lo.

    Como scripts tão grandes não podem ser abertos no SQL Server Management Studio, eu uso sqlcmd ou osql

    • 2
  7. Kin Shah
    2013-04-27T11:45:25+08:002013-04-27T11:45:25+08:00

    Como @mrdenny mencionou -

    1. script de tabelas primeiro com todos os índices, FK's, etc e crie tabelas em branco no banco de dados de destino.

    Em vez de usar o SSIS, use o BCP para inserir dados

    1. bcp os dados usando o script abaixo. defina o SSMS no modo de texto e copie a saída gerada pelo script abaixo em um arquivo bat.

      -- save below output in a bat file by executing below in SSMS in TEXT mode
      
      -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
      
      select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
          +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
          +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
          +  QUOTENAME(name)  
          +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
          +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
          +  REPLACE(name,' ','') 
          + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
      /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
      order by schema_name(schema_id)
      
    2. Execute o arquivo bat que irá gerar os arquivos .dat na pasta que você especificou.

    3. Execute o script abaixo no

      --- Execute this on the destination server.database from SSMS.
      
      --- Make sure the change the @Destdbname and the bcp out path as per your environment.
      
      declare @Destdbname sysname
      set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
      select 'BULK INSERT ' 
      /*Remember Tables must be present on destination database */ 
      + QUOTENAME(@Destdbname) + '.' 
      + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
      + '.' + QUOTENAME(name) 
      + ' from ''D:\BCP\' /* Change here for bcp out path */ 
      + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
      + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
      + char(10) 
      + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
      + char(10) + 'go'
         from sys.tables
         where is_ms_shipped = 0
      and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
      and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
          order by schema_name(schema_id) 
      
    4. Execute a saída usando o SSMS para inserir dados de volta nas tabelas.

    Este é um método bcp muito rápido, pois usa o modo nativo.

    • 1

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?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 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

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +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
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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