2008-09-15 14 views
24

Tenemos una base de datos MySQL en vivo que es 99% INSERT, alrededor de 100 por segundo. Queremos archivar los datos cada día para que podamos ejecutar consultas sin afectar la base de datos principal y en vivo. Además, una vez que se completa el archivo, queremos borrar la base de datos en vivo.La mejor manera de archivar la base de datos MySQL en vivo

¿Cuál es la mejor manera de hacerlo sin (de ser posible) bloquear los INSERT? Usamos INSERT DELAYED para las consultas.

Respuesta

13

http://www.maatkit.org/ tiene mk-archivador

archivos o purgas filas de una tabla a otra tabla y/o un archivo. Está diseñado para "mordisquear" de manera eficiente los datos en fragmentos muy pequeños sin interferir con las consultas críticas de procesamiento de transacciones en línea (OLTP). Lo logra con un plan de consulta sin retroceso que mantiene su lugar en la tabla de consulta a consulta, por lo que cada consulta subsiguiente hace muy poco trabajo para encontrar más filas archivables.

Otra alternativa es simplemente crear una nueva tabla de base de datos cada día. MyIsam tiene algunas ventajas para esto, ya que los INSERT hasta el final de la tabla generalmente no se bloquean de todos modos, y existe un tipo de tabla de combinación para volverlos a unir. Varios sitios web registran el tráfico httpd en tablas como esa.

Con Mysql 5.1, también hay tablas de particiones que pueden hacer casi lo mismo.

+0

mk-archivador hace exactamente lo que quiero! – DavidM

+2

Maatkit se ha convertido en parte de Percona Toolkit - http://www.percona.com/doc/percona-toolkit/2.1/pt-archiver.html –

0

¿Podría mantener dos bases de datos duplicadas? Escribir en uno, mantener el segundo como archivo. Cambie cada, digamos, 24 horas (o el tiempo que considere apropiado). En la base de datos que era el archivo, inserte toda la actividad de hoy. Entonces las dos bases de datos deben coincidir. Use esto como el nuevo db en vivo. Tome la base de datos archivada y haga lo que quiera. Puede hacer una copia de seguridad/extraer/leer todo lo que desee ahora que no se está escribiendo activamente.

Es como disparar reflejos donde puedes desconectar una unidad para hacer una copia de seguridad, volver a sincronizarla y luego sacar la otra unidad para realizar una copia de seguridad.

1

La replicación de MySQL funcionaría perfectamente para esto.
Maestro -> el servidor en vivo.
Esclavo -> un servidor diferente en la misma red.

2

Parece que la replicación es la mejor solución para esto. Después de la sincronización inicial, el esclavo recibe actualizaciones a través del Binary Log, por lo que no afecta en absoluto al DB maestro.

More on replication.

2

que utilizan las tablas de particiones de MySQL y he lograr resultados maravillosos en todos los aspectos.

Cuestiones relacionadas