¿Cómo puedo mover tablas MySQL de un servidor físico a otro?
Tal como este escenario exacto: tengo un servidor MySQL que usa una tabla innodb y tiene un tamaño de aproximadamente 20 GB.
Quiero moverlo a un nuevo servidor, ¿cuál es la forma más eficiente de hacer esto?
Respuestas:
Mi forma favorita es canalizar un comando sqldump a un comando sql. Puedes hacer todas las bases de datos o una específica. Entonces, por ejemplo,
Puedes hacer todas las bases de datos con
El único problema es cuando la base de datos es demasiado grande y la tubería colapsa. En ese caso, puede hacer tabla por tabla o cualquiera de los otros métodos mencionados a continuación.
fuente
netcat
.Recientemente moví una base de datos de 30GB con la siguiente estrategia:
Servidor antiguo
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)Nuevo servidor
tar -xzvf mysqldata.tar.gz
)fuente
De acuerdo con la Guía de estudio de certificación MySQL 5.0 , el Capítulo 32, Sección 32.3.4, Páginas 456,457, describe las Condiciones para la portabilidad binaria que resaltan lo siguiente:
Hay dos formas principales basadas en el motor de almacenamiento para mover tablas individuales.
Para el ejemplo dado, supondremos lo siguiente:
Mesas MyISAM
Si mydb.mytable usa el motor de almacenamiento MyISAM, la tabla se manifestará físicamente como tres archivos separados
.Frm contiene la estructura de la tabla
.MYD contiene los datos de la tabla
.MYI contiene la página de índice de la tabla
Estos archivos se usan de forma interdependiente para representar la tabla desde un punto de vista lógico en mysql. Dado que estos archivos no tienen ninguna asociación lógica adicional adjunta, migrar una tabla de un servidor DB a otro. Incluso puede hacerlo desde un servidor Windows a un servidor Linux o MacOS. Por supuesto, puede cerrar mysql y copiar los 3 archivos de la tabla. Podrías ejecutar lo siguiente:
en una sesión ssh para mantener la tabla como solo lectura y mantener el bloqueo durante 24 horas. Un segundo después, realice la copia en otra sesión ssh. Luego, elimine la sesión de mysql con el bloqueo de 24 horas. No necesitas esperar 24 horas.
Tablas InnoDB
Según la cita del libro de certificación mencionada anteriormente, hay muchos factores que rigen cómo hacer una copia de seguridad de una tabla InnoDB específica. En aras de la simplicidad, la claridad y la brevedad, simplemente realice un mysqldump de la tabla deseada utilizando los parámetros de transacción única para tener un volcado perfecto de la tabla en un momento determinado. No es necesario darse el gusto con la semántica de InnoDB si solo desea una tabla. Puede volver a cargar ese archivo de volcado en cualquier servidor MySQL que elija.
Dado que dos preguntas se fusionaron aquí (jcolebrand): EDITAR
Si está más que dispuesto a vivir con un rendimiento de base de datos lento, puede realizar una serie de rsyncs desde el antiguo servidor (ServerA) al nuevo servidor (ServerB) incluso mientras mysql todavía se está ejecutando en ServerA.
Paso 01) instale la misma versión de mysql en ServerB que ServerA tiene
Paso 02) En ServerA, ejecute
SET GLOBAL innodb_max_dirty_pages_pct = 0;
desde mysql y aproximadamente 10 minutos (Esto purga páginas sucias del InnoDB Buffer Pool. También ayuda a realizar un apagado de mysql más rápido) Si su base de datos es todo MyISAM, puede omitir este paso.Paso 03)
rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
Paso 04) Repita el Paso 03 hasta que un rsync tome menos de 1 minuto
Paso 05)
service mysql stop
en el ServidorAPaso 06) Realice un rsync más
Paso 07)
scp ServerA:/etc/my.cnf ServerB:/etc/
Paso 08)
service mysql start
en ServerBPaso 08)
service mysql start
en el servidor A (opcional)Darle una oportunidad !!!
CONSIDERACIÓN
Puede crear un esclavo de replicación como este. Solo recuerde tener el ID de servidor establecido explícitamente en el maestro /etc/my.cnf y un número diferente para el ID de servidor en el esclavo /etc/my.cnf
fuente
Ni siquiera necesita mysqldump si está moviendo un esquema de base de datos completo, y está dispuesto a detener la primera base de datos (por lo que es coherente cuando se transfiere)
No recuerdo si mysqldump maneja usuarios y permisos, o solo los datos ... pero incluso si lo hace, esto es mucho más rápido que hacer un volcado y ejecutarlo. Solo lo usaría si tuviera que volcar una base de datos mysql para luego volver a insertarla en algún otro RDBMS, si tuviera que cambiar las opciones de almacenamiento (innodb vs. myisam), o tal vez si estuviera cambiando las principales versiones de mysql (pero Aunque creo que he hecho esto entre 4 y 5)
fuente
--all-databases
volcados del esquema mysql. Al iniciar mysql en la siguiente máquina, aparecen los permisos siempre que haya transferido la carpeta de datos a la otra máquina con la misma versión principal de MySQL. (MySQL 5.5.x a MySQL 5.5.x, MySQL 5.1.x a MySQL 5.1.x, MySQL 5.0.x a MySQL 5.0.x)mysqldump
maneja usuarios y permisos, ya que estos se almacenan dentro delmysql
esquema.Si solo desea mover una tabla específica, intente:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
Puede especificar más nombres de tabla arriba, en el mismo comando. Una vez que se complete el comando, mueva el archivo databasename.tablename.sql al otro servidor y luego restaure usando:
Tenga en cuenta que el archivo .sql posterior se crea utilizando el programa mysqldump , y la restauración se realiza directamente en mysql .
fuente
Puede existir esta posibilidad de mover los archivos de la base de datos real (para mi instalación se encuentran en / var / lib / mysql), pero no estoy realmente seguro de cómo actuará / funcionará.
fuente
Tendrá que tomarse un tiempo de inactividad. Va a tomar un tiempo dependiendo de la velocidad de su red. Asumiré que estás ejecutando MySQL en Linux / Unix. Aquí está el proceso que uso:
Luego proceda de la forma habitual para configurar MySQL local.
* Nota: también puede usar el parámetro -c con rsync para agregar una suma de verificación a la transferencia, sin embargo, esto será muy lento dependiendo de la velocidad de la CPU.
fuente
Puedo confirmar que el método de DTest también funciona para copiar entre ubuntu y osx.
Para copiar todas las bases de datos sin tener que hacer ningún volcado o similar:
Asegúrese de tener un mysql limpio de mysql (instalado el dmg descargado de mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), eso (MUY IMPORTANTE) nunca se ha ejecutado.
Copie el contenido de la carpeta / var / lib / mysql / de la máquina ubuntu en la parte superior de / usr / local / mysql / data / contents en la mac. Para obtener acceso para obtener la carpeta en la máquina ubuntu, tuve que usar sudo, es decir:
Copié la carpeta usando scp.
Antes de comenzar, tome una copia de la carpeta mysql en el mac para asegurarse de no estropear nada.
Después de copiar la carpeta, haga lo siguiente en la máquina Mac:
Inicie el servidor mysql por primera vez (desde el panel de preferencias en Preferencias del sistema-> mysql). Todos los usuarios y bases de datos ahora deben configurarse correctamente.
Esto funcionó con mysql 5.1.61 en ubuntu 64 bit 11.10 y mysql 5.1.63 en osx lion (macbook pro).
fuente
Creo que todas las respuestas anteriores probablemente funcionen bien, pero en realidad no abordan el problema de establecer un nombre de base de datos durante la transferencia.
Así es como lo hice con bash:
Usted puede ser mejor usar
rsync
quescp
, y no comprimir el archivo si está haciendo esto a menudo.En mi servidor de origen:
En mi servidor de destino:
En cualquiera de las máquinas para ver el progreso:
Todo esto supone que tiene el archivo de configuración de MySQL en su directorio de inicio en ambas máquinas y establece los permisos:
fuente
¿Lo estás moviendo a otro servidor MySQL DB? si es así, realice una exportación
fuente
Método genérico de Linux:
edite el datadir (y el socket) para mysqld y mysqld_safe (si corresponde) para apuntar a la nueva ubicación, luego
Publiqué esto porque nadie parecía simplemente enumerar la menor cantidad de pasos para hacer esto y siento que es la forma más sencilla personalmente.
fuente
Quizás esta sea una mejor manera de hacerlo:
Versión 1 : copia de archivos de datos (solo MYISAM)
Versión 2 : mysqldump
Versión 3 : master / slave + mysqldump / file-copy
guión:
PD:
para copiar tablas pequeñas use:
fuente
Sugeriría los dos pasos simples para transferir la base de datos completa de un servidor a otro.
Paso 1 : Realice una copia de seguridad completa de las bases de datos en el servidor de origen utilizando mysqldump .
Paso 2 : puede usar el comando rsync para transferir todas las bases de datos al servidor de destino.
fuente