2010-07-14 27 views
21

Quiero hacer eso usando un código y no usando una herramienta como "MySQL Migration Toolkit". La forma más fácil que conozco es abrir una conexión (usando conectores MySQL) a DB1 y leer sus datos. Abra la conexión a DB2 y escriba los datos en ella. ¿Hay una manera mejor/más fácil?¿Cómo puedo transferir datos entre 2 bases de datos MySQL?

+1

dos bases de datos en el mismo servidor o dos bases de datos en diferentes servidores? –

+0

@Itay: aún no estoy seguro de si están en el mismo servidor o no. Sé que esto hace una diferencia, pero no me vino a la mente preguntarles.Lo haré mañana. – Morano88

Respuesta

20

primero voy a asumir que usted no está en condiciones de sólo copia el directorio de datos /, porque si lo está, entonces el uso de su instantánea/copia de seguridad/restauración existente probablemente sea suficiente (y pruebe sus procedimientos de copia de seguridad/restauración en la negociación).

En cuyo caso, si las dos tablas tienen la misma estructura, generalmente el enfoque más rápido e irónicamente más fácil será usar SELECT ... INTO OUTFILE ... en un extremo, y LOAD DATA INFILE ... en el otro.

Consulte http://dev.mysql.com/doc/refman/5.1/en/load-data.html y .../select.html para obtener detalles definitivos.

Para las tablas triviales el siguiente trabajo:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

También hemos utilizado las memorias FIFO con gran efecto para evitar la sobrecarga de escribir realmente en el disco, o si nosotros tenemos que escribir en el disco, por alguna razón, para canalizarlo a través de gzip.

es decir.

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

Básicamente, se le dirigirá los datos de la tabla a un FIFO se puede comprimir, Munge, o túnel, a través de una red a su contenido de corazones.

+0

Gracias, aunque está en el manual dev.mysql pero no está funcionando correctamente. Me está dando este error: Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '\ n' 'en la línea 1) No acepta' \ n '... ¿por qué? – Morano88

+0

Stack Overflow corrompió la consulta de muestra. En la fuente, la barra en la cláusula ESCAPADO POR se escapó, pero el escape se perdió cuando se convirtió a html. Perdón por eso, no había notado la corrupción. Lo arreglé arriba. – Recurse

+0

Esto es exactamente lo que necesito usar para acelerar la copia de seguridad de una base de datos bastante grande, pero no puedo hacer que funcione tu ejemplo. Puedo crear el FIFO, y si vuelvo a la tubería usando mysqldump funciona bien. Sin embargo, si trato de descargarme a la tubería con SELECT ... INTO OUTFILE aparece el error de que "myfifo ya existe". –

11

El motor de almacenamiento FEDERATED? No es el más rápido del grupo, pero por una vez, incidental o por pequeñas cantidades de datos, lo hará. Eso es asumiendo que estás hablando de 2 SERVIDORES. Con 2 bases de datos en un mismo servidor que va a ser simplemente:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

Muchas gracias, todavía no estoy seguro si las 2 bases de datos están en el mismo servidor o no. – Morano88

+0

Esto fue fantástico para mi situación. Cheers :) – Nick

+0

Funcionó muy bien con Amazon RDS, donde no tiene acceso a la máquina subyacente que ejecuta la instancia de MySQL, descartando soluciones que implican INFILE/OUTFILE. – Andz

1

Puede utilizar mysqldump y mysql (el cliente de línea de comandos). Estas son herramientas de línea de comandos y en la pregunta que escribe no quiere usarlas, pero seguir usándolas (incluso al ejecutarlas desde su código) es la manera más fácil; mysqldump resuelve muchos problemas.

Puede hacer select s a partir de una base de datos y insert a la otra, que es bastante fácil. Pero si también necesita transferir el esquema de la base de datos (create table s etc.), se vuelve un poco más complicado, por lo que recomiendo mysqldump. Pero muchas herramientas de administración de PHP-MySQL también lo hacen, por lo que puedes usarlas o mirar su código.

O tal vez puede usar la replicación de MySQL.

+0

¿Funcionará esto (selecciona, inserta) si las dos bases de datos están en 2 servidores diferentes? No, solo quiero migrar datos, no creaciones de tablas ... etc. – Morano88

+0

Sí, tendrá conexiones tvo - para cada servidor, una - en una conexión, ejecutará SELECCIONAR, luego en el otro INSERTAR con los datos que devolvió de ese SELECTO . – Messa

0

Si activado el registro binario en el servidor actual (y tienen todos los registros de basura) se puede configurar la replicación para el segundo servidor

Cuestiones relacionadas