Cierre MySQL de forma segura

paso

1. En algunos entornos especiales, el nodo esclavo puede intentar comenzar desde la posición incorrecta. Para reducir este riesgo, primero detenga el hilo de io, para no recibir nueva información de eventos.

mysql> detener esclavo io_thread;
mysql> mostrar estado del esclavo \ G
mysql> detener esclavo sql_thread; // Después de que el hilo sql haya aplicado todos los eventos, también detenga el hilo sql

De esta manera, el subproceso io y el subproceso sql pueden estar en una posición coherente, de modo que el registro de retransmisión solo contiene los eventos que se han ejecutado, y la información de ubicación en el repositorio relay_log_info_repository también es la más reciente.

Inicie el esclavo de la replicación multiproceso, asegúrese de que los espacios se hayan llenado antes de cerrar la replicación:
mysql> detener esclavo;
mysql> iniciar esclavo hasta sql_after_mts_gaps; #Después de aplicar el espacio en el registro de relé
mysql> mostrar estado del esclavo \ G # Asegúrese de Sql_thread
mysql> detener el esclavo se ha detenido antes ;

2. Confirmar, revertir o eliminar transacciones de larga duración

Muchas cosas pueden suceder en 1 minuto Cuando se apaga, InnoDB debe revertir las transacciones no comprometidas. El costo de la reversión de la transacción es muy caro y puede llevar mucho tiempo. Cualquier reversión de transacción puede significar la pérdida de datos, por lo que idealmente esperamos que MySQL no abra ninguna transacción cuando está cerrado.

Si la base de datos está cerrada para lectura y escritura, las operaciones de escritura deben enrutarse a otros nodos con anticipación. Si debe cerrar la base de datos que aún recibe transacciones, la siguiente consulta generará información de sesión que tiene un tiempo de ejecución superior a 60 segundos. Con base en esta información, decida el siguiente paso:

mysql> SELECT trx_id, trx_started, (NOW() - trx_started) trx_duration_seconds, id processlist_id, user, IF(LEFT(HOST, (LOCATE(':', host) - 1)) = '', host, LEFT(HOST, (LOCATE(':', host) - 1))) host, command, time, REPLACE(SUBSTRING(info,1,25),'\n','') info_25 FROM information_schema.innodb_trx JOIN information_schema.processlist ON innodb_trx.trx_mysql_thread_id = processlist.id WHERE (NOW() - trx_started) > 60 ORDER BY trx_started;

+--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+
| trx_id | trx_started         | trx_duration_seconds | processlist_id | user | host      | command | time | info_25                   |
+--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+
| 511239 | 2020-04-22 16:52:23 |                 2754 |           3515 | dba  | localhost | Sleep   | 1101 | NULL                      |
| 511240 | 2020-04-22 16:53:44 |                   74 |           3553 | root | localhost | Query   |   38 | update t1 set name="test" |
+--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+
2 rows in set (0.00 sec)

3. Limpiar la lista de procesos

mysql quiere desconectarse y cerrarse. Podemos usar pt-kill manualmente para ver y eliminar conexiones en estados activos y durmientes. No debería haber nuevas conexiones de escritura entrando en este momento. Solo nos ocupamos de las conexiones de lectura.

pt-kill --host="localhost" --victims="all" --interval=10 --ignore-user="pmm|orchestrator" --busy-time=1 --idle-time=1 --print [--kill]

-Ignore-user puede excluir selectivamente las conexiones establecidas por ciertos usuarios.

4. Configure innodb para completar la actualización máxima (vaciado)

SET GLOBAL innodb_fast_shutdown = 0;
SET GLOBAL innodb_max_dirty_pages_pct = 0;
SET GLOBAL innodb_change_buffering = 'ninguno';

La desactivación de innodb_fast_shutdown puede hacer que el proceso de cierre tarde varios minutos o incluso horas, porque debe esperar a que se elimine el registro de deshacer y se fusione el búfer de cambios. Para acelerar el cierre, configure innodb_max_dirty_pages_pct = 0 y supervise los resultados de la siguiente consulta. El valor esperado es 0, pero no siempre está garantizado si todavía hay actividad en mysql. Luego, si el resultado detectado no continúa disminuyendo, puede continuar con el siguiente paso:

5. Vaciar el contenido del grupo de almacenamientos intermedios

SET GLOBAL innodb_buffer_pool_dump_pct = 75;
SET GLOBAL innodb_buffer_pool_dump_now = ON;

Al inicio, si desea cargar el contenido volcado, verifique la configuración del parámetro innodb_buffer_pool_load_at_startup.

6, actualice el registro

LAVAR TRONCOS;

7, cierre mysql

Proceso de cierre de Mysql

1. Proceso de cierre:

1. Inicie el apagado y envíe la señal SIGTERM

2. Si es necesario, cree un nuevo hilo de cierre.

Si se trata de un cierre iniciado por el cliente, se creará un hilo de cierre dedicado

Si se cierra al recibir la señal SIGTERM directamente, el hilo específicamente responsable del procesamiento de la señal será responsable del cierre, o un nuevo hilo independiente será responsable de este asunto.

Cuando no se puede crear un hilo de apagado independiente (como memoria insuficiente), MySQL Server emitirá un mensaje de advertencia similar al siguiente:

Error: no se puede crear un hilo para matar el servidor

3. MySQL Server ya no responde a nuevas solicitudes de conexión

Cierre la supervisión de la red TCP / IP , cierre Unix Socket y otros canales

4. Cierre gradualmente la conexión y la transacción actuales.

Las conexiones inactivas se cancelarán inmediatamente;

Actualmente hay transacciones y conexiones SQL activas, que se marcarán como eliminadas, y su estado se comprobará periódicamente para que puedan cerrarse durante la siguiente comprobación;

Si actualmente hay una transacción activa, la transacción se revertirá. Si la tabla no transaccional también se modifica en la transacción, los datos modificados no se pueden revertir y solo se pueden completar cambios parciales;

Si es el maestro en el escenario de replicación maestro / esclavo, el procesamiento del subproceso de replicación es el mismo que el del subproceso ordinario;

Si es el esclavo en el escenario de replicación Maestro / Esclavo, los subprocesos de IO y SQL se cerrarán a su vez . Si estos dos subprocesos están actualmente activos, la bandera eliminada también se agregará y luego se cerrará;

En el servidor esclavo, el subproceso SQL puede detener directamente la operación SQL actual (para evitar problemas de replicación) y luego cerrar el subproceso;

En MySQl 5.0.80 y versiones anteriores, si el subproceso SQL ejecuta una transacción en el medio, la transacción se revertirá; a partir de 5.0.81, esperará a que finalicen todas las operaciones, a menos que el usuario inicie una operación KILL.

Cuando el hilo SQL del esclavo se fuerza a KILL al realizar operaciones en tablas no transaccionales, puede causar datos inconsistentes de maestro y esclavo;

5. El proceso del servidor MySQL cierra todos los hilos y cierra todos los motores de almacenamiento;

Actualizar todos los cachés de tabla y cerrar todas las tablas abiertas;

Cada motor de almacenamiento es responsable de las operaciones de apagado relacionadas. Por ejemplo, MyISAM vaciará todas las operaciones que esperan ser escritas; InnoDB vaciará el grupo de búferes en el disco (a partir de MySQL 5.0.5, si innodb_fast_shutdown no está configurado en 2), configure el actual El LSN se registra en el espacio de tabla y luego se cierran todos los hilos internos.

6. Se cierra el proceso del servidor MySQL.

2. Acerca de la instrucción KILL

A partir de 5.0, KILL admite la especificación de dos opciones: CONEXIÓN | CONSULTA :

@KILL CONNECTION es el mismo que el original, deje de revertir la transacción, cierre la conexión del hilo y libere los recursos relacionados;

@KILL QUERY solo detiene la operación actualmente enviada por el hilo para su ejecución, y las demás permanecen sin cambios;

Después de enviar la operación KILL, se establecerá un bit de bandera de interrupción especial en el hilo . Por lo general, lleva un tiempo cerrar el hilo, porque la bandera de interrupción solo se verifica en ciertas circunstancias:

1. Al ejecutar una consulta SELECT, en el ciclo ORDER BY o GROUP BY, el bit de bandera de interrupción se comprobará cada vez que se lea algún bloque de registro de fila. Si se encuentra que existe, la sentencia se terminará;

2. Cuando se ejecuta ALTER TABLE, se verificará la bandera de eliminación después de leer algunos bloques de registros de fila de la tabla original. Si se encuentra que existe, la declaración se terminará y la tabla temporal se eliminará;

3. Al realizar ACTUALIZAR y ELIMINAR, cada vez que se lea y actualice o elimine algún bloque de registro de fila, se verificará el indicador de eliminación. Si se encuentra que existe, la declaración se terminará y la transacción se revertirá. es una operación en una tabla no transaccional, será Los datos modificados no se revertirán;

4. La función GET_LOCK () devuelve NULL;

5. El hilo INSERT DELAY agregará rápidamente nuevos registros en la memoria y luego terminará;

6. Si el hilo actual tiene un bloqueo a nivel de tabla, se liberará y terminará;

7. Si la llamada a la operación de escritura del hilo está esperando para liberar el espacio en disco, lanzará directamente un error de "espacio en disco lleno" y luego terminará;

8. Cuando la tabla MyISAM está KILL durante la ejecución de REPAIR TABLE u OPTIMIZE TABLE, la tabla se dañará e inutilizará, y la reparación se completará nuevamente.

Tres, algunas sugerencias para cerrar MySQL de forma segura

Para cerrar de forma segura el proceso del servicio mysqld, siga los pasos a continuación:

0. Utilice una cuenta con la máxima autoridad como SUPER y ALL para conectarse a MySQL, preferiblemente una conexión de socket Unix;

1. En la versión 5.0 y superior, configure innodb_fast_shutdown = 1 para permitir el cierre rápido de InnoDB (sin purga completa, inserte fusión de búfer), si es para actualizar o degradar la versión de MySQL, no la configure;

2. Configure innodb_max_dirty_pages_pct = 0 para permitir que InnoDB vacíe todas las páginas sucias en el disco;

3. Establezca max_connections y max_user_connections en 1, lo que significa que, al final, no se permitirá la creación de ninguna nueva conexión excepto para su conexión actual;

4. Cierre todos los subprocesos inactivos, es decir, los ID de subproceso cuyo estado sea Suspender y cuyo Tiempo sea mayor que 1;

5. Ejecute SHOW PROCESSLIST para confirmar si todavía hay subprocesos activos, especialmente subprocesos que generarán bloqueos de tabla , como SELECT con conjuntos de datos grandes, o UPDATE a gran escala, o ejecutando DDL.

6. Ejecute SHOW ENGINE INNODB STATUS para confirmar que el valor de la longitud de la lista de historial es bajo (generalmente inferior a 500), es decir, hay pocas transacciones sin PURGE, y confirme que el número de secuencia del registro, el registro se vació hasta y el último. punto de control en tres estados El valor es el mismo, es decir, se han verificado todos los LSN;

7. Luego ejecute la operación FLUSH LOCKAL TABLES, actualice todos los cachés de tablas y cierre las tablas abiertas (la función de LOCAL es que esta operación no registra BINLOG);

8. Si se trata de un servidor SLAVE, lo mejor es cerrar IO_THREAD primero, esperar a que se apliquen todos los RELAY LOGs y luego cerrar SQL_THREAD para evitar que SQL_THREAD termine en la ejecución de transacciones grandes, y esperar pacientemente a que se terminen todas las aplicaciones. Si debe cerrarlo a la fuerza, también es mejor esperar al final de la transacción grande antes de cerrar SQL_THREAD;

9. Finalmente, ejecute mysqladmin shutdown.

10. En caso de emergencia, puede configurar innodb_fast_shutdown = 1 y luego ejecutar directamente mysqladmin shutdown, o incluso llamar a kill o kill -9 directamente en la capa del sistema operativo para eliminar el proceso mysqld (algunas transacciones pueden perderse cuando innodb_flush_log_at_trx_commit = 0) Sin embargo, cuando el proceso de mysqld se inicia de nuevo, realizará el trabajo de RECUPERACIÓN DE CRASH, que debe sopesarse.

Innodb_fast_shutdown le dice a Innodb qué hacer cuando se apaga. Hay tres valores para elegir:

  1. 0 significa que cuando InnoDB está cerrado, debe purgar todo, fusionar el búfer de inserción y eliminar las páginas sucias. Esta es la forma más lenta de apagar, pero también es la más rápida al reiniciar. El significado de purgar todo, fusionar búfer de inserción y vaciar páginas sucias se presentará más adelante.
  2. 1 significa que cuando InnoDB está cerrado, no necesita purgar todo, fusionar el búfer de inserción, solo vaciar la página sucia.
  3. 2 significa que cuando InnoDB está cerrado, no necesita purgar todo, fusionar el búfer de inserción ni vaciar las páginas sucias, solo vaciar los registros en el búfer de registros a los archivos de registro. Por lo tanto, es el que lleva más tiempo a la hora de restaurar.

Cuarto, el proceso de recuperación

Cuando se reinicia mysql, su proceso de recuperación (también llamado recuperación de fallas)

  1. Si innodb_fast_shutdown = 2 o se produjo un bloqueo de mysql cuando innodb se cerró la última vez, utilizará el registro de rehacer para rehacer esas transacciones comprometidas.
  2. Las siguientes operaciones son las siguientes:
    a> Revertir transiciones incompletas cancelar esas transacciones no confirmadas
    b> Purgar todas las páginas de deshacer inútiles y borrar
    c> Combinar insertar búfer combinar insertar búfer

Reimpreso; https://www.cnblogs.com/DataArt/p/10218602.html

Supongo que te gusta

Origin blog.csdn.net/ximenjianxue/article/details/114893542
Recomendado
Clasificación