Red de conocimiento informático - Aprendizaje de código fuente - Archivado de datos de bases de datos, ¿cuál es el mejor método?

Archivado de datos de bases de datos, ¿cuál es el mejor método?

Análisis del principio de pt-archiver

Como DBA de MySQL, se puede decir que no hay nadie que no conozca pt-archiver. Como miembro importante de la suite pt-toolkit. a menudo puede ayudar fácilmente a los administradores de bases de datos a resolver problemas de archivo de datos. Por ejemplo, es suficiente tener una tabla en ejecución. La empresa solo necesita almacenar los datos en ejecución de los últimos tres meses y archivar los datos de hace tres meses. En este momento, pt-archiver puede ayudarlo a completar esta tarea fácilmente. Incluso configurarte para automatizar tareas sin intervención humana.

Como administradores de bases de datos, debemos saber qué está sucediendo y por qué, para poder utilizar la herramienta pt con confianza. Creo que muchos administradores de bases de datos han estudiado el principio de cambio de esquema en línea de pt, por lo que hoy planificaremos el principio de funcionamiento de pt-archiver con más profundidad.

1. Principio de observación

Los nativos tienen sus propios métodos. Abrimos directamente el registro general para observar cómo pt-archiver completa el archivo.

Comando

pt-archiver --source h=127.0.0.1,u=xucl,p=xuclxucl,P=3306,D=xucl,t=t1 --dest h =127.0.0.1,P=3306,u=xucl,p=xuclxucl,D= xucl_archive、t=t1 --progreso 5000 \

--estadísticas --charset=utf8mb4 --limit=10000 - -txn-size 1000 --sleep 30

Opciones comunes

-- analizar

Especifique la herramienta para realizar la operación "ANAlizar TABLA" en la tabla después completar el archivo de datos. Especifíquelo como "--analyze=ds", donde s representa la tabla de origen yd representa la tabla de destino, o se puede especificar por separado.

--ask-pass

Solicita una contraseña en la línea de comando para proteger las contraseñas, siempre que el módulo perl-TermReadKey esté instalado.

--buffer

Especifica que los datos del búfer se vacían en el archivo especificado por la opción "--file" y se vacían al enviarlos.

Solo cuando se confirma la transacción, el archivo especificado por "--file" se vaciará automáticamente y el archivo se vaciará en el disco, lo que significa que el archivo será vaciado por el bloque del sistema operativo. por lo tanto, antes de confirmar la transacción, algunos datos se descargarán implícitamente al disco. De forma predeterminada, el archivo se descarga en el disco después de cada línea de operación.

--Batch delete

Especifica una única instrucción para eliminar bloques en lotes de filas, ejecutando implícitamente la opción "--commit-each".

Utilice una única instrucción DELETE para eliminar las filas de la tabla correspondientes a cada bloque. El método habitual es eliminar las filas una por una mediante la clave principal. La eliminación por lotes puede mejorar en gran medida la velocidad, pero si hay "DÓNDE" complejos. "condiciones, la velocidad se reducirá. Podría ser más lenta.

--[no]bulk-delete-limit (límite de eliminación masiva)

Predeterminado: Sí

Especifique agregar "--" a la declaración que ejecuta las opciones de eliminación masiva de archivos" y "--limit".

--bulk-insert

Inserta filas mediante la inserción masiva de bloques utilizando el método LOAD DATA LOCAL INFILE (las opciones "--bulk-delete" y "--commit- se especifican implícitamente " cada")

En lugar de insertar individualmente ejecutando la operación de inserción fila por fila, esto es más rápido que ejecutar la instrucción INSERT en una sola fila. No realizaremos operaciones de inserción por lotes directamente, sino que crearemos implícitamente una tabla temporal para almacenar las filas (bloques) que deben insertarse en lotes y realizaremos una carga de datos unificada después de completar la inserción de cada bloque en la tabla temporal.

Para garantizar la seguridad de los datos, esta opción forzará el uso de la opción "--eliminar por lotes", asegurando efectivamente que la inserción sea completamente exitosa antes de la eliminación.

--channel

Cuando el entorno de replicación maestro-esclavo es de replicación de múltiples fuentes, especifique qué estación maestra archivar. Esto es adecuado para la replicación de múltiples fuentes donde se corresponden varias estaciones maestras. a una estación esclava.

--charset,-A

Especifica el juego de caracteres de conexión.

--[no]check-charset

Predeterminado: Sí

Especifica una verificación para garantizar que la conexión de la base de datos tenga el mismo conjunto de caracteres que el carácter de la tabla. colocar.

--[no]check-columns

Predeterminado: Sí

Especifique la verificación para garantizar que la tabla fuente especificada por las opciones "--source" y "--dest" "La tabla de destino especificada tiene los mismos campos.

No verificará la clasificación y el tipo de campos en la tabla, solo verificará si los campos existen en la tabla de origen y en la tabla de destino. Si los campos son inconsistentes, la herramienta saldrá con un. error. Si desea desactivar esta verificación, especifique "--no-check-columns".

--check-slave-lag

Especifica pausar la operación de archivo después de que el retraso de replicación maestro-esclavo sea mayor que el valor especificado por la opción "--max-lag" . De forma predeterminada, la herramienta verifica todas las dependencias, pero esta opción solo es válida para dependencias específicas (a través del método de conexión DSN).

--check-interval

Predeterminado: 1s

Si también se especifica la opción "--check-slave-lag", el tiempo especificado por este opción Es el tiempo de pausa cuando la herramienta detecta un retraso en la replicación maestro-esclavo. Verifique cada 100 filas.

--columns, -c

Especifique los campos de la tabla que se archivarán. Si hay varios campos, sepárelos con "," (coma).

--commit-each

Especifica el número de filas que se recuperarán y archivarán por confirmación. Esta opción deshabilita la opción "--txn-size".

Después de cada recuperación y archivado de datos de la tabla, se confirmará una transacción y el archivo especificado por la opción "--sleep" se actualizará antes de la siguiente recuperación y el tiempo de suspensión especificado por la opción "- -sleep". El tamaño de la transacción está controlado por la opción "--limit".

--host,-h

Especifique la dirección IP de la base de datos a la que conectarse.

-port, -P

Especifique el puerto de la base de datos al que conectarse.

--user, -u

Especifique el usuario de la base de datos al que conectarse.

--contraseña, -p

Especifique la contraseña del usuario de la base de datos conectada.

--socket, -S

Especifica el uso de una conexión de archivo SOCKET.

--databases, -d

Especifique la base de datos a la que conectarse

--source

Especifique la tabla para realizar operaciones de archivado ; Esta opción es obligatoria y se expresa mediante el método DSN.

--dest

Utilice el método DSN para especificar la tabla de destino en la que archivar.

Si no se especifica esta opción, el valor predeterminado es usar la misma tabla que la opción "--source" que especifica la tabla fuente.

--where

Especifica que los datos que se archivarán se especifican mediante la declaración condicional WHERE, y esta opción es una opción obligatoria. La palabra clave WHERE "no es obligatoria. Si realmente no necesita restringir la condición WHERE, puede especificar "--where 1=1".

--File

Especificar que los datos de la tabla deben archivarse. En qué archivo. Utilice un esquema de nomenclatura de formato similar a MySQL DATE_FORMAT()

El contenido del archivo utiliza el mismo formato que la instrucción SELECT INTO OUTFILE en MySQL.

Las opciones de nombres de archivos son las siguientes:

%Y: año, número, cuatro dígitos

%m: mes, número (01...12)

%d: mes, día, número (01...31)

%H: hora (00...23)

%i: minuto (00... 59) )

%s: segundos (00..59)

%s.segundos (00...59)

%D: nombre de la base de datos

p>

%t: nombre de la tabla

Ejemplo: --file '/var/log/archive/%Y-%m-%d-%D.% t'

--output-format

Utilice la opción "--file" para especificar el formato de salida del contenido del archivo.

El valor predeterminado si no se especifica esta opción es usar el carácter de tabulación como separador de campo. Si se especifica esta opción, use ',' (coma) como separador de campo y use '"' (. comillas dobles; instrucción. --share-lock

Especifica agregar una cláusula LOCK IN SHARE MODE a cada instrucción SELECT ejecutada por el archivo

--header

.

Especifica que el nombre del campo se escribe como la primera línea del archivo en el encabezado

--ignore

Especifica agregar la opción IGNORE a la instrucción INSERT <. /p>

--limit<. /p>

Predeterminado: 1

Especifique el número de filas para cada declaración para recuperar y archivar la tabla

-- local

Especifique no combinar OPTIMIZE y ANALYZE. La declaración se escribe en binlog

--max-lag

Valor predeterminado: 1s

. Especifica el tiempo de retardo máximo permitido de replicación maestro-esclavo (en segundos). Si el retraso maestro-esclavo excede el valor especificado después de recuperar los datos de cada fila, la operación de archivado se suspenderá y el tiempo de suspensión se especificará mediante la opción "--". check-interval". Una vez finalizado el tiempo de suspensión, la duración del retraso maestro-esclavo se verificará nuevamente y el esclavo realizará la verificación. Determinado por el valor "Seconds_Behind_Master". Si el retraso de replicación maestro-esclavo es continuo mayor que el valor especificado en este parámetro, o la biblioteca esclava deja de replicarse, la operación esperará hasta que se reinicie la biblioteca esclava y el retraso sea menor que el valor especificado en este parámetro

--no-. eliminar

Especifica no eliminar los datos de la tabla archivada

--Optimización

Especifica que la herramienta eliminará los datos después de archivarlos. La tabla realiza la operación "OPTIMIZAR". Operación TABLE". El método de especificación es "--analyze=ds", donde s representa la tabla de origen y d representa la tabla de destino.

--primary-key-only<. /p>

Especifica que solo se archivarán los campos de clave principal, esto es una abreviatura de la opción "--columns=primary-key"

Esto es más efectivo si la operación de archivo de la herramienta es BORRAR, ya que solo es obligatorio. Leer un campo de la clave principal en lugar de todos los campos de la fila

--progress

Especifique imprimir información de progreso para cada fila, imprimir la hora actual, el tiempo transcurrido y la hora que se archivará. Número de filas.

--purge

Especifica que se realizará una operación de purga en lugar de una operación de archivado. Esta operación permite ignorar las opciones "--dest" y "--file". Si es solo una operación de limpieza, se puede usar en combinación con la opción "--primary-key-only" para mejorar la eficiencia.

--quiet, -q

Especifica la herramienta de ejecución silenciosa y no genera ninguna información de ejecución.

--replace

Especifique la opción de escritura "--dest" para reescribir la instrucción INSERT en una instrucción REPLACE cuando el destino especificado finalice la tabla.

--Reintentar

Valor predeterminado: 1

Especifique el número de reintentos cuando la operación de archivo encuentra un punto muerto o se agota el tiempo de espera. Cuando el número de reintentos excede el valor especificado por esta opción, la herramienta saldrá con un error.

--run-time

Especifica cuánto tiempo debe ejecutarse la operación de archivo de la herramienta antes de salir. Los sufijos de tiempo permitidos son s=segundos, m=minutos, h=horas y d=días, el valor predeterminado es s si no se especifica.

--[no]safe-auto-increment

Predeterminado: Sí

Especifique no archivar el número máximo de columnas de incremento automático (AUTO_INCREMENT) correspondientes tomó.

Esta opción agrega una cláusula WHERE adicional a la purga del archivo para evitar que la herramienta elimine filas con el valor máximo del atributo AUTO_INCREMENT del campo ascendente de una sola columna, de modo que el valor de AUTO_INCREMENT se use después de reiniciar la base de datos. , pero esto puede provocar que las filas con los valores máximos correspondientes para los campos no se puedan archivar ni eliminar.

--set-vars

Predeterminado:

wait_timeout=10000

innodb_lock_wait_timeout=1

lock_wait_timeout= 60

Especifique los valores de los parámetros al archivar la herramienta. Si hay varios parámetros, sepárelos con ',' (coma). Por ejemplo, "--set-vars=wait_timeout=5000".

---skip-foreign-key-checks

Especifica deshabilitar las comprobaciones de claves externas mediante la instrucción SET FOREIGN_KEY_CHECKS = 0.

--sleep

Especifica cuánto tiempo debe dormir la herramienta antes de recuperar datos archivados mediante una instrucción SELECT. El valor predeterminado es no dormir. Las transacciones no se confirmarán antes de dormir y el archivo especificado por la opción "--file" no se actualizará. Si se especifica la opción "--commit-each", la transacción se confirma y el archivo se vacía antes de dormir.

--Estadísticas

Especifique la herramienta para recopilar e imprimir estadísticas de tiempo de operación.

Las estadísticas de muestra son las siguientes:

Comenzó en 2008-07-18T07:18:53 y finalizó en 2008-07-18T07:18 :53

Fuente: D=db,t=table

SELECCIONAR 4

INSERTAR 4

BORRAR 4

Porcentaje de tiempo de recuento de acciones

compromiso 10 0,1079 88,27

SELECCIONAR 5 0,0047 3,87

Eliminar 4 0,0028 2,29

Insertar 4 0,0028 2,28

p>

Otro 0 0.0040 3.29

--txn-size

Predeterminado: 1

Especifique el número de registros que se procesarán para cada transacción. Si el valor es 0, la funcionalidad de transacción está deshabilitada.

--Version

Muestra la versión de la herramienta y sale.

--[no]version-check

Predeterminado: sí

Comprueba las últimas versiones del kit de herramientas Percona, MySQL y otros programas.

--why-quit

Especifica que la herramienta imprime el motivo de salida si sale que no sea debido al número de líneas archivadas completadas.

Esta opción es muy conveniente cuando se realizan tareas de archivado automático junto con la opción "--run-time". La opción "--run-time" se utiliza para determinar si la tarea de archivado se completa dentro del archivo. tiempo especificado. Si también se especifica la opción "--stats", se imprimen todos los motivos de salida.

2. Principios de análisis

Basándonos en la salida de los registros generales, organizamos las series de tiempo de la siguiente manera

3.

A primera vista A primera vista, no parece haber ningún problema con este proceso, pero ¿qué pasa si después de escanear los datos de la tabla original, los datos antiguos cambian durante el proceso de inserción en la nueva tabla?

Pensando en esto, establecimos un punto de interrupción en la línea 6839 de pt-archiver según el código fuente

Luego, hice las siguientes operaciones en varias ventanas de sesión

p>

Finalmente, pt-archiver genera los siguientes resultados:

# Hay una actualización de software disponible:

RECUENTO DEL TIEMPO TRANSCURRIDO

2020- 04- 08T09:13:21 0 0

2020-04-08T09:13:21 0 1

Comenzó en 2020-04-08T09:13:21, finalizó en 2020- 04- 08T09:13:51

Fuente: A=utf8mb4,D=xucl,P=3306,h=127.0.0.1,p=...,t=t1,u=xucl

Dest: A=utf8mb4,D=xucl_archive,P=3306,h=127.0.0.1,p=...,t=t1,u=xucl

SELECCIONAR 1

INSERT 1

ELIMINAR 1

Porcentaje de tiempo de recuento de acciones

dormir 1 30,0002 99,89

insertar 1 0,0213 0,07

commit 2 0.0080 0.03

seleccionar 2 0.0017 0.01

eliminar 1 0.0005 0.00

otro 0 0.0008 0.00

Obviamente, id =3 registros no se archivan (cambiamos la columna de condición aquí).

Cambiamos la columna condicional aquí, pero en producción es posible que hayamos cambiado otras columnas, lo que provocó que se archivaran datos inexactos)

Entonces, ¿cómo solucionamos esta situación?

Obviamente, la base de datos puede evitar que otros programas modifiquen los datos correspondientes agregando un bloqueo exclusivo en la base de datos. pt-archiver realmente nos ha ayudado a considerar esta situación. pt-archiver proporciona dos opciones

--for-update: agregue el modificador FOR UPDATE a la instrucción SELECT

--share-. lock: agregue el modificador LOCK IN SHARE MODE a la instrucción SELECT

Cuarto resumen

Como herramienta de archivo, pt-archiver es sin duda la operación y el mantenimiento diario de MySQL DBA. poderosas herramientas en . En el proceso de uso de pt-archiver, debe dominar el método de uso de acuerdo con los principios de pt-archiver

Durante el proceso de archivado, es mejor bloquear los registros del archivo para evitar datos de archivo inexactos

En un entorno maestro-esclavo, es mejor controlar la velocidad de archivado para evitar causar retrasos entre maestro-esclavo

Intente controlar el tamaño del bloque y no los haga demasiado grandes. El tamaño del bloque no debe ser demasiado grande para evitar provocar grandes transacciones