Como DBA de MySQL, se puede decir que no se debe ignorar pt-archiver. Como miembro importante del conjunto de herramientas pt-toolkit, a menudo puede ayudar fácilmente a los administradores de bases de datos a resolver problemas de archivo de datos. Por ejemplo, para una lista en ejecución en línea, la empresa solo necesita almacenar los datos en ejecución de los últimos tres meses y archivar los datos de hace tres meses, luego pt-archiver puede ayudarlo fácilmente a completar esta tarea e incluso puede configurarlo. Es una tarea automática y no requiere intervención humana.
Como DBA, debemos saber por qué, para poder utilizar las herramientas 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 profundizaremos en el principio de funcionamiento de pt-archiver.
Primero, observación del principio
Esta máquina tiene métodos nativos, por lo que 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- destino h = 127 . txn-size 1000-sleep 30
Opciones comunes
-Analizar
Especifica una herramienta que realiza una operación de "analizar tabla" en la tabla después de que se hayan recopilado los datos. sido archivado. Especifique un método como '-analyse=ds ', donde s representa la tabla de origen yd representa la tabla de destino, o puede especificarlos por separado.
-Preguntar: ingrese la contraseña en el símbolo del sistema
para proteger la seguridad de la contraseña, siempre que el módulo Perl-$TERM esté instalado para leer la clave.
-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 confirmar.
El vaciado automático y el vaciado al disco para archivos especificados por '-file' solo se deshabilita cuando se confirma una transacción, lo que significa que el bloque del sistema operativo vacía el archivo, por lo que antes de confirmar la transacción, algunos los datos se vacían implícitamente en el disco. De forma predeterminada, el archivo se descarga en el disco después de cada línea de operación.
-Eliminación por lotes
Eliminar filas en lotes especificando la forma de eliminar fragmentos en una sola declaración ejecutará implícitamente la opción '-commit-each'.
Utilice una única instrucción DELETE para eliminar la fila de la tabla correspondiente a cada fragmento. El método habitual es eliminar filas por clave principal. Esto mejorará en gran medida la velocidad de eliminación por lotes, pero puede ser lento si existe. son condiciones complejas de 'DÓNDE' algunas.
-[No] Límite de eliminación masiva
Valor predeterminado: Sí
Especifica que las opciones '- eliminación masiva ' y '- límite ' serán agregado al actual en declaraciones archivadas.
-Inserción masiva
Utilice el método LOAD DATA LOCAL INFILE para insertar filas insertando bloques de forma masiva (las opciones '-bulk-delete' y '-commit-each' se especifican implícitamente ).
En comparación con la inserción fila por fila, es más rápido que insertar instrucciones de inserción en una sola fila. Al crear implícitamente una tabla temporal para almacenar las filas (bloques) que deben insertarse en lotes, en lugar de realizar directamente operaciones de inserción por lotes, la carga de datos unificada se realiza después de que se completa cada bloque en la tabla temporal. Para garantizar la seguridad de los datos, esta opción forzará la selección de "-eliminación masiva", que puede garantizar de manera efectiva que la inserción sea completamente exitosa antes de la eliminación.
Canal
Especifique qué base de datos maestra debe archivarse cuando el entorno de replicación maestro-esclavo es de múltiples fuentes. Esto es aplicable a la situación en la que varias bases de datos maestras corresponden a una base de datos esclava. en replicación de múltiples fuentes.
-Juego de caracteres, -A
Especifica el juego de caracteres de conexión.
-[No] Verificar el juego de caracteres
Valor predeterminado: Sí
Especifique esta verificación para garantizar que el juego de caracteres y el juego de caracteres de la tabla sean los mismos al conectarse a la base de datos.
-[No]columna de verificación
Predeterminado: Sí
Especifica una verificación para garantizar que la tabla fuente especificada por la opción '-source' y ' - dest 'La tabla de destino especificada tiene los mismos campos.
No verifica la clasificación y el tipo de campo de los campos en la tabla, solo verifica si hay campos en la tabla de origen y en la tabla de destino. Si hay diferentes diferencias de campo, la herramienta informará un error y saldrá. Si necesita deshabilitar esta verificación, especifique '-no - no-check-columns '.
-Slave check-lag
Pausa la operación de archivo después de especificar un retraso de replicación maestro-esclavo 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 (conectadas a través de DSN).
-Intervalo de comprobación
Valor predeterminado: 1s
Si también se especifica la opción '-check-slave-lag-lag', esta opción especifica el tiempo es cuánto tiempo se detiene la herramienta cuando detecta un retraso en la replicación maestro-esclavo. Verifique cada 100 filas de operaciones.
-column, -c
Especifique los campos de la tabla que se archivarán. Si hay varios campos, sepárelos con ',' (coma).
-commit-each
Especifica que las confirmaciones se basan en el número de filas recuperadas y archivadas al mismo tiempo, lo que deshabilita la opción '-txn-size'.
Después de cada recopilación y archivo de datos de la tabla, antes de recopilar los siguientes datos y el tiempo de suspensión especificado por la opción '-sleep', confirme la transacción y actualice el archivo especificado por la opción '-file', el tamaño de la transacción viene dado por los controles de la opción '-limit'.
-Host, -h
Especifica la dirección IP de la base de datos conectada.
-Port, -P
Especifica el puerto de la base de datos al que conectarse.
-Usuario, -u
Especifica el usuario de la base de datos conectada.
-Contraseña, -p
Especifica la contraseña del usuario de la base de datos conectada.
-Socket, -S
Especifica utilizar un archivo de socket para la conexión.
-Database, -d
Especifica la base de datos a la que conectarse.
-Fuente
Especifique la tabla que se va a archivar. Esta opción debe especificarse y representarse mediante un DSN.
-Destino
Especifica la tabla final de destino que se archivará, representada por DSN.
Si no se especifica esta opción, la tabla fuente especificada por la opción '-source' es la misma tabla de forma predeterminada.
-Dónde
Especifique los datos que se archivarán mediante la declaración condicional WHERE. Esta opción debe especificarse. No es necesario agregar la palabra clave "DÓNDE". Si realmente no necesita condiciones WHERE para limitar, especifique '-where 1 = 1 '.
-Archivo
Especifique el archivo en el que se deben archivar los datos de la tabla. Utilice un formato similar a MySQL DATE_FORMAT() para nombrar métodos.
El contenido de este archivo utiliza el mismo formato que la instrucción SELECT INTO OUTFILE en MySQL. Las opciones de nomenclatura del archivo son las siguientes:
%Y: año, 4 dígitos (año, número, 4 dígitos) número)
%m: mes, dos dígitos (mes, número (01...12))
%d: día, dos dígitos (un cierto día del mes Día, número (01...31))
%H: hora (hora (00...23))
%i: minuto, número ( 00... 59))
%s: Segundos (00...59))
%D: Nombre de la base de datos.
%t: nombre de la tabla
Por ejemplo: -file '/var/log/archive/% y-% m-% d-% d,% t '
-Formato de salida
Especifique el formato de salida del contenido del archivo con la opción '-file'.
De forma predeterminada, esta opción no se especifica como delimitador de tabulación para el campo. Si se especifica esta opción, ',' (coma) se utiliza como delimitador de campo y ' " ' (comillas dobles) se utiliza para encerrar los campos. Ejemplo de uso: "-output-format=dump=dump".
-for-UPDATE
Especifica que se agregará una cláusula FOR UPDATE a la instrucción SELECT ejecutada para cada archivo comprimido - SHARED LOCK
Especifica que se agregará una cláusula LOCK IN SHARE MODE La instrucción add. se agrega a la instrucción SELECT ejecutada para cada archivo comprimido
-Title
Especifica que el nombre del campo se escribe como la primera línea del archivo.
-Ignorar
Especifica agregar la opción IGNORE a la instrucción INSERT
-Limit
Valor predeterminado: 1
Especifique cada uno El número de filas en la tabla de obtención y la tabla de archivo
-Local
Especifica que las declaraciones de optimización y análisis no se escriben en el binlog. Retraso máximo
p>Valor predeterminado: 1 s
Especifique el tiempo de retraso máximo permitido para la replicación maestro-esclavo, en segundos si el retraso maestro-esclavo excede el valor especificado después de cada fila. recopilación de datos, la operación de archivado se detendrá dentro del valor especificado por la opción '-check-interval'. Después del tiempo de suspensión, el tiempo de retardo maestro-esclavo se verifica nuevamente consultando la biblioteca esclava para obtener el valor 'Seconds_Behind_Master' si el maestro- El retraso de la replicación esclava siempre es mayor que el valor especificado de este parámetro, o la replicación desde el repositorio se detiene, la operación esperará hasta que se reinicie el repositorio y el retraso sea menor que el valor especificado por este parámetro.
- no-delete
Especifica no eliminar los datos de la tabla archivada.
-Optimizar
Especifica una herramienta que realiza una operación de "optimizar tabla" en la tabla después. los datos se han archivado. Especifique un método como '-analyze=ds' donde s representa la tabla de origen yd representa la tabla de destino, o se pueden especificar por separado
-Solo clave principal
. p>Para especificar que solo se archive el campo de clave principal, esta es la opción '-columns = clave principal'. Abreviatura de
La operación de archivo de la herramienta funciona mejor si se elimina, porque solo uno. Es necesario leer el campo de la clave principal, en lugar de todos los campos de la fila.
-Progreso
Especifique el número de líneas para imprimir la información de progreso, la hora actual y la hora. tiempo transcurrido y el número de líneas para archivar.
-Purge
Especifique la operación de limpieza que se realizará en lugar de una operación de archivo. file' se puede ignorar y será más eficiente si solo se puede usar la operación clear junto con la opción '-primary-key-only'
-quiet. p>La herramienta especificada se ejecuta silenciosamente y no genera ninguna información de ejecución.
-Reemplazar
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.
-Número de reintentos
Valor predeterminado: 1
Especifica 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.
-Runtime
Especifica cuánto tiempo debe ejecutarse la operación de archivo de la herramienta antes de salir. Los sufijos de tiempo permitidos se denominan s=segundos, m=minutos, h=horas y d=días. Si no se especifica, el valor predeterminado es s..
-[No] Safe-Auto-Increment
Predeterminado: Sí
Especifique el valor correspondiente al valor máximo de AUTO_INCREMENT La fila no se utiliza para archivar.
Esta opción agregará una cláusula WHERE adicional al archivar y purgar para evitar que la herramienta elimine filas de datos con el valor máximo del atributo AUTO_INCREMENT en campos ascendentes de una sola columna. Para seguir utilizando el valor correspondiente a AUTO_INCREMENT después de reiniciar la base de datos, la fila con el valor de campo máximo no se puede archivar ni borrar.
-Establecer variables
Valor predeterminado:
wait_timeout=10000
innodb_lock_wait_timeout=1
Tiempo de espera de bloqueo=60
Especifique el valor del parámetro al archivar la herramienta. Si hay varios valores, sepárelos con ',' (coma). Por ejemplo '-set-vars=wait_timeout=5000'.
-Omitir la verificación de clave externa
Utilice la instrucción SET FOREIGN_KEY_CHECKS = 0 para especificar que la verificación de clave externa está deshabilitada.
-Sleep
Especifique el tiempo que la herramienta necesita para dormir al obtener datos archivados mediante una instrucción SELECT. El valor predeterminado es sin hibernación. Las transacciones no se confirmarán antes de la hibernación y el archivo especificado por la opción '-file' no se borrará. Si se especifica la opción '-commit-each', la confirmación de la transacción y el vaciado de archivos se realizarán antes de la hibernación.
-Statistics
Especifica que la herramienta recopila e imprime estadísticas de tiempo para las operaciones.
Un ejemplo de datos estadísticos es el siguiente:
'
Comenzó el 2008-07-18t 07:18:53 y finalizó el 2008-07- 18t 07: 18:53
Fuente: D = base de datos, t = tabla
Seleccionar 4
Insertar 4
Eliminar 4
Porcentaje de tiempo de recuento de acciones
Enviar 10 0,1079 88,27
Seleccionar 5 0,0047 3,87
Eliminar 4 0,0028 2,29
Insertar 4 0.0028 2.28
Otro 0 0.0040 3.29
-Tamaño de transacción
Valor predeterminado: 1
Especifica el número de filas por transacción . Si es 0, la funcionalidad comercial está deshabilitada.
-Version
Muestra la versión de la herramienta y sale.
-[No] Comprobación de versión
Valor predeterminado: Sí
Comprueba las últimas versiones de Percona Toolkit, MySQL y otros programas.
-why-exit
Especifica el motivo por el que se cerrará la herramienta, además del número de líneas de archivo completadas.
Es muy conveniente utilizar esta opción junto con la opción '-run-time' al realizar tareas de archivado automático, para determinar si la tarea de archivado se completa dentro de un tiempo específico. Si también se especifica la opción '-estadísticas', se imprimirán todos los motivos de salida.
2. Análisis de principios
Con base en el resultado de los registros generales, compilamos la lista de series de tiempo de la siguiente manera.
Tres. Otras explicaciones
A primera vista, este proceso parece estar bien, pero ¿qué pasa si los datos antiguos cambian durante el proceso de escanear datos de la tabla original e insertarlos en la nueva tabla?
Con este problema, rastreamos el código fuente y desciframos la línea 6839 de pt-archiver.
Luego realicé las siguientes acciones en varias ventanas de sesión.
Finalmente, el resultado de pt-archiver es el siguiente:
#Actualizaciones de software disponibles:
Recuento del tiempo transcurrido
2020- 04 -08t 09:13:21 0 0
2020-04-08t 09:13:21 0 1
Inicio en 2020-04-08t 09:13:21 y final en 2020-04-08t 09: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
Seleccione 1
Insertar 1
Eliminar 1
Porcentaje de tiempo de recuento de acciones
Sueño 1 30,0002 99,89
Insertar 1 0,0213 0.07
Enviar 2 0.0080 0.03
Seleccionar 2 0.0017 0.01
Eliminar 1 0.0005 0.00
Otro 0 0.0008 0.00
Obviamente, el registro con id=3 no está archivado (cambiamos la columna de condición aquí, pero es posible que otras columnas se hayan cambiado en la producción real, lo que resultó en datos archivados inexactos).
Entonces, ¿cómo solucionar esta situación?
Obviamente, la base de datos puede evitar que otros programas modifiquen los datos correspondientes agregando y excluyendo otros bloqueos en la base de datos. De hecho, pt-archiver nos ha ayudado a considerar esta situación; pt-archiver ofrece dos opciones.
- for-update: Agrega el modificador FOR UPDATE a la declaración SELECT
- share-lock: Agrega el modificador de bloqueo en modo compartido a la declaración SELECT
Cuarto, resumen
Pt-archiver, como herramienta de archivo, es sin duda una de las excelentes herramientas para la operación y mantenimiento diario de MySQL DBA. Puede conocer sus principios basándose en saber cómo usarlo.
Es mejor bloquear los registros de archivo durante el proceso de archivado para evitar datos de archivo inexactos.
En un entorno maestro-esclavo, es mejor controlar la velocidad del proceso de archivado para evitar retrasos entre maestro y esclavo.
Intente controlar el tamaño del fragmento y no lo haga demasiado grande ni provoque grandes transacciones.