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 / 72042
Accepted
Devashish Dixit
Devashish Dixit
Asked: 2014-07-23 01:25:36 +0800 CST2014-07-23 01:25:36 +0800 CST 2014-07-23 01:25:36 +0800 CST

Copiar de uma tabela MySQL para outra tabela MySQL do mesmo banco de dados

  • 772

Eu tenho cerca de 40 milhões de linhas em uma tabela MySQL e quero copiar essa tabela para outra tabela no mesmo banco de dados. Qual é a maneira mais eficiente de fazer isso? Quanto tempo levará (aprox.)?

mysql insert
  • 3 3 respostas
  • 49104 Views

3 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2014-07-23T06:23:01+08:002014-07-23T06:23:01+08:00

    Suponha que você tenha mydb.mytbe queira criarmydb.mytbcopy

    Eu tenho cinco (5) abordagens para fazer esta cópia

    ABORDAGEM #1

    No mysqlcliente, execute o seguinte

    USE mydb
    CREATE TABLE mytbcopy LIKE mytb;
    INSERT INTO mytbcopy SELECT * FROM mytb;
    

    ABORDAGEM #2

    MYSQL_USER=root
    MYSQL_PASS=rootpassword
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
    mysqldump ${MYSQL_CONN} mydb mytb | mysql ${MYSQL_CONN} -Dtest
    mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"
    

    ABORDAGEM #3

    DUMPFILE=/some/path/tabledata.sql
    MYSQL_USER=root
    MYSQL_PASS=rootpassword
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
    mysqldump ${MYSQL_CONN} mydb mytb > ${DUMPFILE}
    mysql ${MYSQL_CONN} -Dtest < ${DUMPFILE}
    rm -f ${DUMPFILE}
    mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"
    

    ABORDAGEM #4

    MYSQL_USER=root
    MYSQL_PASS=rootpassword
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb
    

    ABORDAGEM Nº 5

    DUMPFILE=/some/path/tabledata.sql
    MYSQL_USER=root
    MYSQL_PASS=rootpassword
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' > ${DUMPFILE}
    mysql ${MYSQL_CONN} -Dmydb < ${DUMPFILE}
    rm -f ${DUMPFILE}
    

    ANÁLISE

    • A ABORDAGEM #1 é a mais fácil em termos de etapas, mas requer o envio de 40 milhões de linhas em uma transação. Este será o mais exigente no InnoDB Storage Engine.
    • Para as outras abordagens, o mysqldump enviará 40 milhões de linhas em blocos de milhares de linhas
      • APPROACH #2 e APPROACH #3 farão o mysqldump da tabela no banco de dados de teste. Depois de criar a tabela no banco de dados de teste, ela é posteriormente renomeada e movida para o banco de dados original
      • APPROACH #4 e APPROACH #5 renomeiam a tabela usando sed contra o stream vindo do mysqldump enquanto ele ecoa os comandos INSERT
      • APPROACH #2 e APPROACH #4 usam pipes em vez de um arquivo de saída
      • APPROACH #3 e APPROACH #5 usam um arquivo de saída para recarga subsequente

    Se você deseja copiar mydb.mytbpara uma tabela já existente mydb.mytbcopye as duas tabelas possuem estruturas idênticas:

    ABORDAGEM #6

    INSERT INTO mytbcopy SELECT * FROM mytb;
    

    Assim como #APPROACH 1 , #APPROACH 6 teria uma única transação de 40 milhões de linhas

    ABORDAGEM Nº 7

    MYSQL_USER=root
    MYSQL_PASS=rootpassword
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    mysqldump ${MYSQL_CONN} -t mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb
    

    Essa abordagem não descarta a tabela. Ele simplesmente gera os INSERTs

    EPÍLOGO

    Não posso fornecer uma estimativa de tempo, pois não conheço a composição do servidor de banco de dados, estrutura de tabela, layout de índice e coisas assim.

    DE UMA CHANCE !!!

    • 24
  2. jynus
    2014-07-23T06:42:06+08:002014-07-23T06:42:06+08:00

    As tabelas InnoDB, ao contrário do MyISAM*, não podem ser "apenas copiadas", pois parte de seu dicionário de dados (e potencialmente outras estruturas das quais a tabela depende, como o buffer de mesclagem) estão localizadas na memória (se o servidor estiver em execução) e em o tablespace comum/principal, também conhecido como aquele arquivo grande chamado ibdata1.

    Se você estiver usando Percona Server >=5.1 ou MySQL >= 5.6, há suporte para tablespaces transportáveis, que permitem exportar e importar tabelas diretamente do sistema de arquivos. Aqui está o método para MySQL e para Percona . Em ambos os casos, é necessário que você tenha criado a tabela com a innodb_file_per_tableopção e envolva o uso de DISCARD TABLESPACE/IMPORT TABLESPACEe/ou Percona Xtrabakup (caso queira que a exportação seja feita online). Observe que o Percona Server ou o Xtrabakup não estão disponíveis para Windows.

    Este método será, falando em geral, tão rápido quanto copiar o arquivo usando os comandos do sistema de arquivos (cp, rsync).

    Embora possa haver alguns casos em que isso possa funcionar no MySQL < 5.6 (de maneira hacky) para restaurações, não funcionará para uma cópia de tabela. Nesses casos, uma maneira de fazer isso é usando SQL :

    CREATE TABLE new_table LIKE old_table;
    INSERT INTO new_table SELECT * FROM old_table;
    

    Isso será tão rápido quanto o InnoDB pode executar Handler_read_rnd_nexte Handler_write, uma vez por linha. Se você usar esse método, certifique-se de desativar, pelo menos temporariamente, as opções de durabilidade e de ter um grande conjunto de buffers e log de transações. Nessas circunstâncias, pode reduzir o tempo de importação, mas definitivamente não caberá totalmente na memória, portanto, espere muito tempo. Além disso, você está tentando importar 40 milhões de linhas em uma única transação, o que pode causar problemas.

    Minha recomendação real, neste segundo caso, seria usar algo como pt-archiver , pois ele realizará uma operação semelhante à que acabei de mencionar, mas será feita em "pedaços", evitando a sobrecarga transacional (pode não será mais rápido, mas em caso de falha, não tentará reverter toda a tabela, demorando uma eternidade). Para os tamanhos de dados que você mencionou, esse é provavelmente o melhor caminho a seguir.

    Uma opção final seria exportar e importar usando o formato CSV (ou TSV) , com uma combinação de SELECT INTO OUTFILE/mysqldump e LOAD DATA/mysqlimport. Esta era uma opção muito comum se você precisasse de simultaneidade em certas versões antigas do mysql, pois o uso do sql criava bloqueios maiores (não é mais verdade se feito corretamente). Como o mysqldump/import só funciona de forma serializada, recomendo pesquisar opções para paralelizá-lo, muito útil para tabelas grandes.

    De qualquer forma, tente evitar várias frases SQL, pois será seu gargalo mais importante se você executar muitas consultas diferentes (que devem ser executadas, analisadas e otimizadas individualmente).


    *As estruturas do MyISAM não podem ser copiadas de maneira hot, mas é muito fácil sincronizá-las temporariamente no disco com arquivos FTWRL.

    • 0
  3. Shahzad Hussain
    2016-12-27T04:21:37+08:002016-12-27T04:21:37+08:00

    mover dados de uma tabela para outra no esquema

    create table your_table_name select * from old_schema_table;

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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