A maneira mais fácil de copiar uma tabela de um banco de dados para outro?

151

Qual é o melhor método para copiar os dados de uma tabela em um banco de dados para uma tabela em outro banco de dados quando os bancos de dados estão sob usuários diferentes?

Eu sei que posso usar

INSERT INTO database2.table2 SELECT * from database1.table1

Mas aqui o problema é que ambos database1e database2estão sob diferentes usuários do MySQL. Então, user1pode acessar database1apenas e user2pode acessar database2apenas. Qualquer ideia?

Sparky
fonte
6
Você pode conceder concessões no nível da tabela aos usuários. veja: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh
2
Infelizmente, isso não funcionará no meu caso, pois estou usando um servidor de hospedagem compartilhada Godaddy. Eles não permitem fazer essas coisas com o banco de dados.
Sparky
@mmdemirbas Uma tabela no banco de dados tem quase 1 milhão de linhas. O dump do banco de dados será enorme. Além disso, quando tentei exportar, apenas cerca de 10000 linhas estão sendo exportadas - provavelmente devido ao tamanho grande.
Sparky
Eu sei que você pode usar RENAME para mover tabelas, e é super rápido. Existe um truque equivalente para copiar tabelas?
Dan
BTW: Você precisará cuidar para que a lista de campos esteja na mesma ordem nas duas tabelas. Caso contrário, será necessário selecionar os campos pelo nome da tabela no banco de dados1 para que eles mapeiem para os campos corretos na tabela no banco de dados2. Esse problema surgiu para mim, onde eu havia feito backup de um banco de dados em que a tabela1 foi modificada após a criação inicial e o novo banco de dados em que foi criado a partir de um arquivo mysqldump.
21719 Steve

Respostas:

113

Se você tiver acesso ao shell, poderá mysqldumpdespejar o conteúdo database1.table1e direcioná-lo mysqlpara database2. O problema aqui é que table1ainda é table1.

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

Talvez você precise renomear table1para table2com outra consulta. Por outro lado, você pode usar o sed para alterar a tabela1 para a tabela2 entre os tubos.

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

Se a tabela2 já existir, você poderá adicionar os parâmetros ao primeiro mysqldump que não permite criar a tabela criada.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
helmor
fonte
O problema é que, quando automatizado, você precisa mostrar a senha. Se não for automatizado e estiver sendo feito pelo usuário na linha de comando, está ok.
Nelles
100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

onde db1 é o destino e db2 é a fonte

carne principal
fonte
Isso funciona se os dois usuários não tiverem permissão para selecionar dados um do outro?
Berílio 24/03
1
isso não funcionará em diferentes servidores mysql?
PUG
8
Isso não copiar índices
bcoughlan
@ Berllium no isso requer que o usuário tenha permissões para os dois bancos de dados. jaminator não, isso não funcionará em servidores diferentes, mas não acho que a pergunta estivesse sendo feita sobre isso. bcoughlan você está correto. esta é uma grande falha nessa abordagem: ela não preserva adequadamente a estrutura da tabela.
precisa saber é o seguinte
4
A tabela copiada não tinha chave primária e incremento automático definido. Você tem que executar isto depoisALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
60

Se você estiver usando o PHPMyAdmin, pode ser realmente simples. Suponha que você tenha os seguintes bancos de dados:

DB1 & DB2

O DB1 possui usuários de uma tabela que você deseja copiar para o DB2

No PHPMyAdmin, abra o DB1 e vá para a tabela de usuários.

Nesta página, clique na guia "Operações" no canto superior direito. Em Operações, procure a seção Copiar tabela para (database.table):

& você terminou!

Mekey Salaria
fonte
1
Simplesmente morto! É quando eu posso comemorar a preguiça!
precisa saber é o seguinte
1
Você economizou meu tempo ... eu estava fazendo uma abordagem ingênua ... primeiro exportando e importando.
Hamza Zafeer
1
Nenhum dos outros trabalhos respostas, só seu que cópias índice de bem
Bsienn
1
Isso não funcionaria se a tabela fosse especialmente grande, ou seja, com mais de 4 GB. Por exemplo, eu tenho uma tabela de 22 GB com a qual o phpMyAdmin simplesmente não pode trabalhar.
Mark D
1
Resposta perfeita. Não sabia sobre esse recurso do phpmyadmin.
Zookastos
23

MySql Workbench : Altamente Recomendado

Ferramenta de migração de banco de dados do MySql Workbench

Isso resolverá facilmente os problemas de migração. Você pode migrar tabelas selecionadas de bancos de dados selecionados entre MySql e SqlServer. Você deve experimentá-lo definitivamente.

mmdemirbas
fonte
Estou prestes a tentar, tenho a configuração, mas me pergunto se você comparou a mysql Workbenchmigração à SQLYogcópia do banco de dados? Do meu olhar rápido parece que eles são muito semelhantes, mas mysql bancada é uma característica mais recente
wired00
Não, eu não tentei o SQLYog.
mmdemirbas
Não é aparente como migrar para o SQL Server do MySQL usando o MySql Workbench. Estou no Workbench e não encontro pistas da ajuda ou da interface do usuário. Eu sei que o SSMA para MySQL funciona para mim.
subsci
2
Interessante, mas o programa pegou a migração com um banco de dados grande, a linha de comando funcionou melhor.
Claudionor Oliveira
1
@mmdemirbas, " Você pode migrar tabelas selecionadas de bancos de dados selecionados entre MySql e SqlServer. " Porém, a pergunta do OP não é sobre o SQL Server.
precisa saber é o seguinte
19

Eu uso o Navicat para MySQL ...

Isso facilita toda a manipulação de banco de dados!

Você simplesmente seleciona os dois bancos de dados no Navicat e depois usa.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1
Nick M
fonte
13

Eu sei que essa é uma pergunta antiga, apenas respondendo para que qualquer pessoa que chegue aqui tenha uma abordagem melhor.

A partir da versão 5.6.10, você pode fazer

CREATE TABLE new_tbl LIKE orig_tbl;

Consulte a documentação aqui: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

Mir Adnan
fonte
1
Não copiará dados! Leia a documentação que você referenciou:> ** CREATE TABLE ... LIKE não preserva nenhum dado **
dgpro 5/18
11

Se suas tabelas estão no mesmo servidor mysql, você pode executar o seguinte

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
fonte
e os outros índices ?! A questão afirma copiar uma tabela não só seus dados
Jorj
9

Use a funcionalidade de exportação e importação do MySql Workbench. Etapas:
1. Selecione os valores que deseja

E.g. select * from table1; 
  1. Clique no botão Exportar e salve-o como CSV.
  2. crie uma nova tabela usando colunas semelhantes à primeira

    E.g. create table table2 like table1; 
  3. selecione tudo da nova tabela

    E.g. select * from table2;  
  4. Clique em Importar e selecione o arquivo CSV que você exportou na etapa 2

Amostra dos botões Exportar e Importar no MySql Workbench

biniam
fonte
1
Ele só funciona para tabelas com menos de um bilhão de linhas, eu acho.
Diogo Paim
9

Aqui está outra maneira fácil:

  1. use DB1; mostre crie a tabela TB1;
    • copie a sintaxe aqui na área de transferência para criar TB1 no DB2
  2. use DB2;
    • cole a sintaxe aqui para criar a tabela TB1

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;

MojganK
fonte
Isso me ajudou a automatizar a cópia de um banco de dados, sem precisar usar um programa GUI, obrigado.
New2HTML
4

Tente mysqldbcopy( documentação )

Ou você pode criar uma " tabela federada " no seu host de destino. As tabelas federadas permitem ver uma tabela de um servidor de banco de dados diferente, como se fosse local. ( documentação )

Depois de criar a tabela federada, você pode copiar dados com o costume insert into TARGET select * from SOURCE

Aaron Digulla
fonte
1
Eu li sobre tabelas federadas, mas o Amazon RDS (agora) não tem suporte para isso ... XP
Chococroc
4

Com o MySQL Workbench, você pode usar a Exportação de Dados para despejar apenas a tabela em um arquivo SQL local (Somente Dados, Somente Estrutura ou Estrutura e Dados) e depois Importar Dados para carregá-lo no outro banco de dados.

Você pode ter várias conexões (diferentes hosts, bancos de dados, usuários) abertas ao mesmo tempo.

Doug Krugman
fonte
3

Uma maneira simples de obter todas as consultas necessárias é usar os dados do information_schema e concat.

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

Você obterá uma lista de resultados parecidos com este:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

Você pode simplesmente executar essas consultas.

No entanto, ele não funcionará com o MySQL Views. Você pode evitá-los anexando a AND TABLE_TYPE = 'BASE TABLE'partir da consulta inicial:

John Mellor
fonte
1

Isso é algo que você precisa fazer regularmente ou apenas um?

Você pode fazer uma exportação (por exemplo, usando o phpMyAdmin ou similar) que criará um script em sua tabela e seu conteúdo em um arquivo de texto e poderá reimportá-la para o outro banco de dados.

Sepster
fonte
Eu preciso fazer isso apenas uma vez. Mas o problema é que a tabela no banco de dados tem quase 1 milhão de linhas. O dump do banco de dados será enorme. Além disso, quando tentei exportar, apenas cerca de 10000 linhas estão sendo exportadas - provavelmente devido ao tamanho grande.
Sparky
Ah, sim, isso é uma limitação. Este artigo do WordPress Codex pode ajudar? É um artigo do wordpress, mas pode fornecer algumas dicas (há uma seção sobre como despejar tabelas usando a linha de comando, no caso em que o banco de dados é muito grande para o phpMyAdmin).
Sepster
A ferramenta de linha de comando mysqldump não tem problemas com 1 milhão de linhas ou vários bilhões de linhas - tudo o que afetará é quanto tempo leva e quanto do seu disco rígido o resultado ocupa (supondo que você o envie para um arquivo). Minha experiência com o comando de exportação do phpMyAdmin é que é muito mais limitado que o mysqldump.
precisa saber é o seguinte
1

use as etapas abaixo para copiar e inserir algumas colunas de uma tabela de banco de dados para outra tabela de banco de dados.

  1. CREATE TABLE nome da tabela (nome da coluna tipo de dados (tamanho), nome da coluna tipo de dados (tamanho));

2. INSERIR NO db2.tablename SELECT columnname1, columnname2 FROM db1.tablename;

Vishnu Mais
fonte
1

Primeiro, crie o despejo. Adicionado os --no-create-info --no-create-dbsinalizadores, se table2já existir:

mysqldump -u user1 -p database1 table1 > dump.sql

Em seguida, digite a user1senha. Então:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

Em seguida, digite a user2senha.

O mesmo que o @helmors responde, mas a abordagem é mais segura, pois as senhas não são expostas em texto bruto ao console (pesquisa reversa-i, busca de senhas etc.). Outra abordagem é boa se for executada a partir de um arquivo de script com as restrições apropriadas impostas às suas permissões.

wizzfizz94
fonte
0

No xampp basta exportar a tabela necessária como um arquivo .sql e depois importá-la para o necessário

Sameera Sampath
fonte
-1

crie a tabela destination_customer como sakila.customer (Database_name.tablename), isso copiará apenas a estrutura da tabela de origem, para que os dados também sejam copiados com a estrutura, crie a tabela destination_customer como selecione * de sakila.customer

rajat prakash
fonte
Esta parece ser uma resposta para uma pergunta totalmente diferente. Não há CREATE TABLE LIKEperguntas, então por que mencionar que está errado? E não há explicação de como essa resposta resolve o problema de que nenhum usuário tem acesso às tabelas do outro.
Toby Speight