¿La forma más fácil de copiar una tabla de una base de datos a otra?

151

¿Cuál es el mejor método para copiar los datos de una tabla en una base de datos a una tabla en otra base de datos cuando las bases de datos están bajo diferentes usuarios?

Sé que puedo usar

INSERT INTO database2.table2 SELECT * from database1.table1

Pero aquí el problema es que tanto database1y database2están bajo diferentes usuarios de MySQL. Por user1lo tanto , database1solo user2puede acceder y solo puede acceder database2. ¿Alguna idea?

Chispeante
fuente
66
Puede otorgar subvenciones a nivel de tabla a los usuarios. ver: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh
2
Desafortunadamente, esto no funcionará en mi caso, ya que estoy usando un servidor de alojamiento compartido Godaddy. No permitirán hacer tales cosas con la base de datos.
Sparky
@mmdemirbas Una tabla en la base de datos tiene casi 1 millón de filas. El volcado de la base de datos será enorme. Además, cuando intenté exportar, solo se exportan alrededor de 10000 filas, probablemente debido al gran tamaño.
Sparky
Sé que puedes usar RENAME para mover tablas, y es súper rápido. ¿Hay un truco equivalente para copiar tablas?
Dan
Por cierto: deberá asegurarse de que la lista de campos esté en el mismo orden en ambas tablas. De lo contrario, será necesario seleccionar los campos por nombre de la tabla en la base de datos1 para que se asignen a los campos correctos en la tabla en la base de datos2. Este problema se me ocurrió cuando hice una copia de seguridad de una base de datos donde se modificó la tabla1 después de la creación inicial, y la nueva base de datos donde se creó a partir de un archivo mysqldump.
Steve L

Respuestas:

113

Si tiene acceso de shell, puede usar mysqldumppara volcar el contenido database1.table1y canalizarlo mysqla database2. El problema aquí es que table1todavía está table1.

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

Tal vez necesita cambiar el nombre table1de table2la otra consulta. Por otro lado, puede usar sed para cambiar table1 a table2 entre las tuberías a.

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

Si la tabla 2 ya existe, puede agregar los parámetros al primer mysqldump que no permite crear la tabla-crea.

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
fuente
El problema con esto es que cuando está automatizado, debe mostrar la contraseña. Si no está automatizado y lo realiza el usuario desde la línea de comandos, está bien.
Nelles
100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

donde db1 es el destino y db2 es la fuente

carne principal
fuente
¿Funciona esto si los dos usuarios no tienen permisos para seleccionar datos entre sí?
Berilio
1
¿Esto no funcionará en diferentes servidores mysql?
PUG
8
Esto no copia los índices
bcoughlan
@Beryllium no, esto requiere que el usuario tenga permisos para ambos DB. jaminator no, esto no funcionará en diferentes servidores, pero no creo que la pregunta sea sobre eso. bcoughlan tienes razón. Este es un gran defecto en este enfoque: no conserva adecuadamente la estructura de la tabla.
thomasrutter
44
La tabla copiada no tenía la clave primaria y el conjunto de incremento automático. Tienes que ejecutar esto despuésALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
60

Si está utilizando PHPMyAdmin, podría ser realmente simple. Supongamos que tiene las siguientes bases de datos:

DB1 & DB2

DB1 tiene una tabla de usuarios que desea copiar a DB2

En PHPMyAdmin, abra DB1, luego vaya a la tabla de usuarios.

En esta página, haga clic en la pestaña "Operaciones" en la parte superior derecha. En Operaciones, busque la sección Copiar tabla a (database.table):

& ¡estás listo!

Mekey Salaria
fuente
1
Muy simple! ¡Aquí es cuando puedo celebrar ser flojo!
Daniel Dut
1
Ahorras mi tiempo ... estaba haciendo un enfoque ingenuo ... primero exportando y luego importando.
Hamza Zafeer
1
Ninguna de las otras respuestas funciona, solo la suya que copia el índice también
Bsienn
1
Esto no funcionaría si la tabla fuera especialmente grande, es decir, más de 4 GB. Por ejemplo, tengo una tabla de 22 GB con la que phpMyAdmin simplemente no puede trabajar.
Mark D
1
Respuesta perfecta. No sabía sobre esta característica de phpmyadmin.
zookastos
23

MySql Workbench : muy recomendable

Herramienta de migración de base de datos de MySql Workbench

Esto manejará fácilmente los problemas de migración. Puede migrar tablas seleccionadas de bases de datos seleccionadas entre MySql y SqlServer. Deberías intentarlo definitivamente.

mmdemirbas
fuente
Estoy a punto de intentarlo, lo tengo configurado, pero me pregunto si ha comparado la mysql Workbenchmigración con SQLYogla copia de la base de datos. Desde mi rápido vistazo, parece que son muy similares, pero mysql workbench es una característica más nueva
wired00
No, no probé SQLYog.
mmdemirbas
No es evidente cómo migrar a SQL Server desde MySQL usando MySql workbench. Estoy en Workbench y no encuentro pistas de la ayuda o la interfaz de usuario. Sé que el SSMA para MySQL funciona para mí.
subsci
2
Interesante, pero el programa sorprendió haciendo la migración con una gran base de datos, la línea de comando funcionó mejor.
Claudionor Oliveira
1
@mmdemirbas, " Puede migrar tablas seleccionadas de bases de datos seleccionadas entre MySql y SqlServer " . Sin embargo, la pregunta del OP no se trata de SQL Server.
sampablokuper
19

Yo uso Navicat para MySQL ...

¡Facilita la manipulación de todas las bases de datos!

Simplemente seleccione ambas bases de datos en Navicat y luego use.

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

Sé que esta es una pregunta vieja, solo responde para que cualquiera que aterrice aquí tenga un mejor enfoque.

A partir de 5.6.10 puedes hacer

CREATE TABLE new_tbl LIKE orig_tbl;

Consulte la documentación aquí: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

Mir Adnan
fuente
1
¡No copiará datos! Lea la documentación a la que ha hecho referencia:> ** CREATE TABLE ... LIKE no conserva ningún DATA **
dgpro
11

Si sus tablas están en el mismo servidor mysql, puede ejecutar lo siguiente

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
fuente
¿Qué pasa con los otros índices? La pregunta indica que copiar una tabla no solo sus datos
Jorj
9

Utilice la funcionalidad de Exportar e Importar de MySql Workbench. Pasos:
1. Seleccione los valores que desee.

E.g. select * from table1; 
  1. Haga clic en el botón Exportar y guárdelo como CSV.
  2. crear una nueva tabla usando columnas similares a la primera

    E.g. create table table2 like table1; 
  3. seleccionar todo de la nueva tabla

    E.g. select * from table2;  
  4. Haga clic en Importar y seleccione el archivo CSV que exportó en el paso 2

Muestra de los botones Exportar e Importar en MySql Workbench

biniam
fuente
1
Solo funciona para tablas con menos de mil millones de filas, creo.
Diogo Paim
9

Aquí hay otra manera fácil:

  1. usar DB1; muestre cree la tabla TB1;
    • copie la sintaxis aquí en el portapapeles para crear TB1 en DB2
  2. utilizar DB2;
    • pegue la sintaxis aquí para crear la tabla TB1

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

MojganK
fuente
Esto me ayudó a automatizar la copia de una base de datos, sin tener que usar un programa gui, gracias.
New2HTML
4

Probar mysqldbcopy( documentación )

O puede crear una " tabla federada " en su host de destino. Las tablas federadas le permiten ver una tabla de un servidor de base de datos diferente como si fuera local. ( documentación )

Después de crear la tabla federada, puede copiar datos con la habitual insert into TARGET select * from SOURCE

Aaron Digulla
fuente
1
He leído sobre tablas federadas, pero Amazon RDS (en este momento) no tiene soporte para ello ... XP
Chococroc
4

Con MySQL Workbench puede usar Exportación de datos para volcar solo la tabla en un archivo SQL local (Solo datos, Solo estructura o Estructura y datos) y luego Importar datos para cargarlo en el otro DB.

Puede tener múltiples conexiones (diferentes hosts, bases de datos, usuarios) abiertas al mismo tiempo.

Doug Krugman
fuente
3

Una forma sencilla de obtener todas las consultas que necesita es utilizar los datos de information_schema y concat.

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

Luego obtendrá una lista de resultados que se ve así:

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;
...

Luego puede ejecutar esas consultas.

Sin embargo, no funcionará con Vistas MySQL. Puede evitarlos agregando AND TABLE_TYPE = 'BASE TABLE'desde la consulta inicial:

John Mellor
fuente
1

¿Es algo que debes hacer regularmente o solo una vez?

Puede hacer una exportación (por ejemplo, usando phpMyAdmin o similar) que creará una secuencia de comandos de su tabla y su contenido en un archivo de texto, luego podría volver a importarla en la otra Base de datos.

Sepster
fuente
Necesito hacerlo solo una vez. Pero el problema es que la tabla en la base de datos tiene casi 1 millón de filas. El volcado de la base de datos será enorme. Además, cuando intenté exportar, solo se exportan alrededor de 10000 filas, probablemente debido al gran tamaño.
Sparky
Ah, sí, eso es una limitación. ¿Este artículo de WordPress Codex podría ayudar? Es un artículo de WordPress, pero podría proporcionarle una idea (hay una sección sobre cómo volcar tablas usando la línea de comandos, en el caso de que el DB sea demasiado grande para que phpMyAdmin lo maneje).
Sepster
La herramienta de línea de comandos mysqldump no tiene problemas con 1 millón de filas o varios miles de millones de filas; todo lo que afectará es cuánto tiempo lleva y cuánto tiempo ocupa el disco duro (suponiendo que lo envíe a un archivo). Mi experiencia con el comando de exportación de phpMyAdmin es que es mucho más limitado que mysqldump.
thomasrutter
1

utilice los pasos a continuación para copiar e insertar algunas columnas de una tabla de base de datos a otra tabla de base de datos:

  1. CREATE TABLE nombre de tabla (nombre de columna tipo de datos (tamaño), nombre de columna tipo de datos (tamaño));

2. INSERTAR EN db2.tablename SELECCIONAR columnname1, columnname2 FROM db1.tablename;

Vishnu Más
fuente
1

Primero crea el volcado. Se agregaron las --no-create-info --no-create-dbbanderas si table2ya existe:

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

Luego ingrese la user1contraseña. Luego:

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

Luego ingrese la user2contraseña.

Igual que la respuesta @helmors, pero el enfoque es más seguro ya que las contraseñas no están expuestas en texto sin formato a la consola (búsqueda inversa, sniffers de contraseña, etc.). Otro enfoque está bien si se ejecuta desde un archivo de script con las restricciones apropiadas impuestas a sus permisos.

wizzfizz94
fuente
0

IN xampp solo exporta la tabla requerida como un archivo .sql y luego impórtala a la tabla requerida

Sameera Sampath
fuente
-1

crear la tabla destination_customer como sakila.customer (Database_name.tablename), esto solo copiará la estructura de la tabla de origen, para que los datos también se copien con la estructura, haga esto crear la tabla destination_customer como select * from sakila.customer

rajat prakash
fuente
Esto parece ser una respuesta a una pregunta totalmente diferente. No hay CREATE TABLE LIKEen la pregunta, entonces, ¿por qué mencionar que está mal? Y no hay explicación de cómo esta respuesta resuelve el problema de que ninguno de los usuarios tiene acceso a las tablas del otro.
Toby Speight