2012-03-28 19 views
9

Estoy a punto de migrar nuestra base de datos de producción a otro servidor. Tiene unos 38GB de tamaño y está usando tablas MYISAM. Debido a que no tengo acceso físico al nuevo sistema de archivos del servidor, solo podemos usar mysqldump.mysqldump sin interrumpir producción en vivo INSERT

He revisado este sitio y veo si la copia de seguridad en línea de mysqldump reducirá nuestro sitio web de producción. Desde esta publicación: Run MySQLDump without Locking Tables, dice que obviamente mysqldump bloqueará la base de datos y evitará la inserción. Pero después de algunas pruebas, tengo curiosidad por descubrir que muestra lo contrario.

Si uso

mysqldump -u root -ppassword --flush-logs testDB > /tmp/backup.sql 

mysqldump será finalmente por defecto hacer un '--lock-mesas', y este es un Lee los locales cerraduras (refer to mysql 5.1 doc), donde inserciones concurrentes todavía disponibles. He hecho un ciclo for para insertarlo en una de las tablas cada segundo, mientras que mysqldump tarda un minuto en completarse. Cada segundo habrá un registro insertado durante ese período. Lo que significa que mysqldump no interrumpirá el servidor de producción y INSERT aún puede continuar.

¿Hay alguien que tenga una experiencia diferente? Quiero asegurarme de que esto continúe antes de continuar en mi servidor de producción, por lo que me alegraría saber si he hecho algo incorrecto que haga que mi prueba sea incorrecta.

[Mi versión de mysql-server es 01/05/52, y mysqldump es 10,13]

+0

Debería obtener acceso al nuevo servidor ** PRIMERO **, y probablemente buscando la replicación de mysql para resolver la migración. ** RECUERDA: ** Puedes volcar e instalar en el nuevo servidor, ** PERO ** después de volcar los datos, habrá ** MÁS ** nueva escritura, cómo sincronizarás la nueva escritura en el nuevo servidor ? – ajreal

+0

Para la posterior escritura de datos nueva, la resolveremos utilizando mysqlbinlog, que debe tenerse en cuenta. Ahora mi principal preocupación será la primera copia de seguridad usando mysqldump. Solo quiero asegurarme de que mysqldump evite INSERT o no. De mi prueba, no mostró que lo hará. Solo quiero asegurarme de cómo es otra experiencia. – sylye

Respuesta

0

mysqldump no añade --lock-tables de forma predeterminada. Trate de usar --lock-tables Avíseme si ayudó

BTW - ¡También debería usar los bloqueos adicionales que harán que su importación sea más rápida!

+1

hola, he probado nuevamente y se confirma que mysqldump por defecto emitirá --lock-tables. Dos puntos para probar eso. Primero, 'mysqldump --help | grep lock' mostrará 'lock-tables' es TRUE. En segundo lugar, usando 'mysql> show open tables;' durante la ejecución de mysqldump, la columna 'In_use' indicará 1, y otra mysql INSERT no hará que cambie a 2, de modo que muestre que es LOCK READ LOCAL. Entonces mi pregunta es, ¿hay alguien más teniendo su mysqldump bloqueando la tabla y evitando INSERTAR? porque el mío no. – sylye

1

Nunca lo he hecho antes, pero podría probar --skip-add-locks al descargar.

Aunque podría llevar más tiempo, podría volcar varios parches, cada uno de los cuales tomaría muy poco tiempo para completarse. Si agrega --skip--add-drop-table, podrá cargar estos volcados múltiples más pequeños en la misma tabla sin volver a crearlos. Usar --extended-insert haría que el archivo sql fuera más pequeño para arrancar.

Posiblemente intente algo como mysqldump -u -p${password} --skip-add-drop-table --extended-insert --where='id between 0 and 20000' test_db test_table > test.sql. Usted tendría que volcar la estructura de tablas y subirlos primero con el fin de hacerlo de esta manera, o eliminar el add-drop-table --skip por primera volcado

+0

hola, gracias por el consejo. Pero en este momento mi principal preocupación no es tratar de reducir el tiempo de mysqldump, ya que los datos son demasiado. Mi intención será averiguar, 'mysqldump' evitará INSERT o no mientras se está ejecutando. Buscando a alguien que haya hecho esto antes. – sylye

1

1) El uso de --opt es el mismo como se especifica --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick y --set-charset. Todas las opciones que --opt representan también están activadas por defecto porque --opt está activado por defecto.

2) mysqldump puede recuperar y volcar el contenido de la tabla fila por fila, o puede recuperar todo el contenido de una tabla y almacenarlo en la memoria antes de volcarlo. El almacenamiento en memoria intermedia puede ser un problema si está volcando tablas grandes. Para volcar tablas fila por fila, use la opción --quick (o --opt, que habilita --quick). La opción --opt (y por lo tanto --quick) está habilitada de manera predeterminada, por lo que para habilitar el almacenamiento en memoria intermedia, use --skip-quick.

3)--single-transaction Esta opción emite una declaración BEGIN SQL antes de volcar los datos desde el servidor (tablas transaccionales InnoDB).

Si el esquema es una combinación de ambos InnoDB y MyISAM, siguiendo el ejemplo le ayudará a:

mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=512M db > db.sql 
2

Ahora, usted puede tener una base de datos con tablas disjuntas, o un almacén de datos - donde todo no es normalizado (en absoluto), y donde no hay enlaces entre las tablas. En ese caso, cualquier volcado funcionaría.

ASUMO que una base de datos de producción que contiene datos 38G contiene gráficos de alguna forma (BLOB), y luego, ubuntuosamente, tiene enlaces de otras tablas. ¿Derecha?

Por lo tanto, usted está, por lo que puedo ver, en riesgo de perder enlaces serios entre tablas (generalmente pares de claves primarias/foráneas), por lo tanto, puede capturar una tabla en el momento de actualizarse/insertarse , mientras que su dependiente (que usa esa tabla como su fuente principal) no se ha actualizado aún. Por lo tanto, perderá la llamada integridad de su base de datos.

La mayoría de las veces resulta extremadamente engorroso restablecer la integridad debido a que el sistema que utiliza/genera/mantiene el sistema de base de datos no se ha realizado como un sistema orientado a transacciones, por lo tanto, las relaciones en la base de datos no pueden rastreado excepto a través de las relaciones de clave primaria/extranjera.

Por lo tanto, seguramente se puede salir con la tarea de copiar su mesa sin cerraduras y muchas de las otras propuestas aquí arriba, pero corre el riesgo de quemarse los dedos, y dependiendo de cuán sensibles sean las operaciones del sistema, usted puede quemarse gravemente o simplemente rascarse la superficie.

Ejemplo: Si su base de datos es un sistema de base de datos de misión crítica, que contiene la frecuencia cardíaca recomendada para dispositivos de soporte vital en una UCI, pensaría más de dos veces antes de realizar la migración.

Si, sin embargo, la base de datos contiene imágenes de Facebook o sitio similar = usted puede vivir con las consecuencias de cualquier cosa desde 0 hasta 129,388 enlaces perdidos :-).

Ahora - mucho para el análisis. Solución:

USTED TENDRÁ que crear un software que haga el volcado para usted con total integridad, table-set por table-set, tuple por tuple. Debe identificar ese grupo de datos, que se puede copiar desde su base 24/7/365 en línea actual a su nueva base, y luego hacer eso, y luego marcar que se ha copiado.

IFFF ahora los cambios se producen a los registros que ya ha copiado, tendrá que hacer una copia posterior de los mismos. Puede ser un asunto complicado hacerlo.

IFFF está ejecutando una versión más avanzada de MYSQL - en realidad puede crear otro sitio y/o una réplica, o una base de datos distribuida - y luego salirse con la suya, de esa manera.

IFFF tiene una ventana de, por ejemplo, 10 minutos, que puede crear si la necesita, entonces también puede simplemente COPIE los archivos físicos, ubicados en la unidad. Estoy hablando de los archivos .stm .std y demás, entonces puedes cerrar el servidor por unos minutos y luego copiar.

ahora a una pregunta cardinal:

que tiene que hacer el mantenimiento de sus máquinas de vez en cuando. ¿Su sistema no tiene espacio para ese tipo de operaciones? Si no, ¿qué harás cuando el disco duro falle? Presta atención al "cuándo", no a "si".

+0

¿Cómo implica un tamaño de base de datos de 38 GB gráficos o contenido BLOB? – MattBianco