
Este blog describe un problema con MySQL 5.7 super_lectura_solo función cuando se usa junto con GTID en casos de esclavos encadenados.
En MySQL 5.7.5 y posteriores se introdujo el gtid_executed
tabla en la base de datos MySQL para almacenar cada GTID. Esto permite que la instancia esclava use la función GTID independientemente de si la opción binlog está configurada o no. Aquí hay un ejemplo de las filas en él. gtid_executed
mesa:
mysql> SELECT * FROM mysql.gtid_ejecutado; + ————————— + ———– – —– + ————– + | fuente_uuid | inicio_intervalo | intervalou_fine | + ————————— + ———– – —– + ————– + | 00005730-1111-1111-1111-111111111111 | 1 | 1 | | 00005730-1111-1111-1111-111111111111 | 2 | 2 | | 00005730-1111-1111-1111-111111111111 | 3 | 3 | | 00005730-1111-1111-1111-111111111111 | 4 | 4 | | 00005730-1111-1111-1111-111111111111 | 5 | 5 | | 00005730-1111-1111-1111-111111111111 | 6 | 6 | | 00005730-1111-1111-1111-1111111111111 | 7 | 7 | | 00005730-1111-1111-1111-1111111111111 | 8 | 8 | | 00005730-1111-1111-1111-1111111111111 | 9 | 9 | | 00005730-1111-1111-1111-1111111111111 | 10 | 10 | …
mysql> SELECCIONE * SÍ mysql.gtid_ejecutado; + ————————— + ———– – —– + ————– + | fuente_uuid | inicio_intervalo | fin_intervalo | + ————————— + ———– – —– + ————– + | 00005730–1111–1111–1111–111111111111 | 1 | 1 | | 00005730–1111–1111–1111–111111111111 | 2 | 2 | | 00005730–1111–1111–1111–111111111111 | 3 | 3 | | 00005730–1111–1111–1111–111111111111 | 4 | 4 | | 00005730–1111–1111–1111–111111111111 | 5 | 5 | | 00005730–1111–1111–1111–111111111111 | 6 | 6 | | 00005730–1111–1111–1111–111111111111 | 7 | 7 | | 00005730–1111–1111–1111–111111111111 | 8 | 8 | | 00005730–1111–1111–1111–111111111111 | 9 | 9 | | 00005730–1111–1111–1111–111111111111 | 10 | 10 | … |
Para ahorrar espacio, esta tabla debe comprimirse periódicamente reemplazando las filas GTID con una sola fila que represente ese rango de identificadores. Por ejemplo, los GTID anteriores se pueden representar con la siguiente fila:
mysql> SELECT * FROM mysql.gtid_ejecutado; + ————————— + ———– – —– + ————– + | fuente_uuid | inicio_intervalo | intervalou_fine | + ————————— + ———– – —– + ————– + | 00005730-1111-1111-1111-111111111111 | 1 | 10 | …
mysql> SELECCIONE * SÍ mysql.gtid_ejecutado; + ————————— + ———– – —– + ————– + | fuente_uuid | inicio_intervalo | fin_intervalo | + ————————— + ———– – —– + ————– + | 00005730–1111–1111–1111–111111111111 | 1 | 10 | … |
Por otro lado, tenemos la super_read_only
Si esta opción está habilitada, MySQL no permitirá ninguna actualización, incluso para los usuarios que tienen SUPER
privilegios Se ha implementado antes WebscaleSQL y luego portado a Percona Server 5.6. El código principal de MySQL ha implementado una función similar en la versión 5.7.8.
mysql super_read_only
función no permitirá la compresión de la mysql.gtid_executed
mesa. Si se realiza una gran cantidad de transacciones en la instancia maestra, hace que la gtid_executed
mesa para crecer a un tamaño considerable. Veamos un ejemplo.
Utilice MySQL Sandbox para configurar rápidamente una configuración Maestro/Esclavo y sysbench para simular una gran cantidad de transacciones en la instancia maestra.
Primero, instale la replicación con GTID:
make_replication_sandbox –sandbox_base_port = 5730 /opt/mysql/5.7.17 –how_many_nodes = 1 –gtid
hacer_replicación_sandbox –sandbox_base_port=5730 /optar/mysql/5.7.17 –cuantos_nodos=1 –gtid |
A continuación, configure las variables para una instancia de esclavo encadenado:
echo «super_read_only = ON» >> nodo1 / my.sandbox.cnf echo «log_slave_updates = ON» >> nodo1 / my.sandbox.cnf nodo1 / reiniciar
ecus «super_read_only = ACTIVADO» >> nodo 1/Mia.salvadera.cnf ecus «log_slave_updates = ACTIVADO» >> nodo 1/Mia.salvadera.cnf nodo 1/empieza de nuevo |
Ahora, genera una gran cantidad de transacciones:
sysbench –test = oltp.lua –mysql-socket = / tmp / mysql_sandbox5730.sock –report-interval = 1 –oltp-tables-count = 100000 –oltp-table-size = 100 –max-time = 1800 –oltp-read-only = off –max-requests = 0 –num-threads = 8 –rand-type = uniform –db-driver = mysql –mysql-user = msandbox –mysql- contraseña = msandbox –mysql-db = preparar texto
banco de sistema –prueba=oltp.lua –mysql–presa= /tmp/mysql_sandbox5730.calcetín –reporte–intervalo=1 –oltp–mesas–contar=100,000 –oltp–mesa–cortar=100 –máximo–hora=1800 –oltp–leer–solo=apagado –máximo–preguntas=0 –número–alambres=8 –rand–escribe=uniforme –base de datos–conductor=mysql –mysql–usuario=caja de arena –mysql–contraseña=caja de arena –mysql–base de datos=prueba Se preparan |
Después de ejecutar sysbench por un tiempo, verificamos que el número de fila en el gtid_executed
la tabla crece más rápido:
esclavo1 [localhost] {msandbox} ((ninguno))> seleccionar número
desde mysql.gtid_ejecutado; + ———- + | contar [localhost] | + ———- + | 300038 | + ———- + 1 fila en conjunto (0.00 seg) esclavo1{msandbox}(( nadie ))> selecciona el conteo sí mysql.gtid_ejecutado ;+ ———- + | contar | + ———- + | 300038 | + ———- + 1 póngase en fila |
en SHOW ENGINE INNODB STATUS
colocar gtid_executed
(0.00
segundo)
Revisandopodemos encontrar un hilo de compresión que se ejecuta y que intenta comprimir mesa. — TRANSACCIÓN 4192571, ACTIVO 0 segundos capturar fila tablas mysql en uso 1, cerrado 1 9 estructura de bloque (s), tamaño de almacenamiento dinámico 1136, 1533 bloqueo de fila (s), cancelar entradas de registro 1525 ID de subproceso de MySQL 4, controlador de subproceso del sistema operativo 1847624710239 , id de consulta 0 Compresión de la tabla gtid_executed — TRANSACCIÓN 4192571, ACTIVOS 0 segundo atrapar póngase en fila mysql mesas en usar 1, cerrado 1 9 cerrar con llave estructura(s), munzeddu cortar1136, 1533 póngase en fila cerrar con llave (s), cancelar Iniciar sesión ingresos 1525 mysql hilo identificación 4, sistema operativo hilo resolver 139671027824384, preguntar identificación |
0 Compresióngtid_ejecutado
mesa gtid_executed
Este subproceso se ejecuta y tarda años en completarse (o puede que nunca se complete). Se ha informado como flush-logs
#84332 mysqladmin shutdown
. gtid_executed
¿Qué sucede si tiene que detener MySQL mientras se comprime el subproceso?
esta funcionando la mesa En este caso especial, lo ejecutas
pedir antes o al mismo tiempo que
MySQL dejará de aceptar conexiones (todas las conexiones nuevas están esperando al servidor) y comenzará a esperar a que se complete el hilo. mesa para completar su trabajo. A continuación se muestra un ejemplo. Primero, ejecute el comando vaciar registros y obtenga el ERROR 1290:$ mysql -h 127.0.0.1 -P 5731 -u msandbox -pmsandbox -e «registros de lavado»; ERROR 1290 (HY000): el servidor MySQL se está ejecutando con la opción –super-read-only, por lo que no puede ejecutar esta declaración PS mysql– h 127.0.0.1– pags 5731– tucaja de arena – pmsandbox – mi«registros de lavado»;ERROR1290 ( HY000 ) : tu mysql servidor estácorrerconLu–súper – leer – solo opción de modo que Lu |
hipocresía
realiza
esta declaración Intentamos cerrar la instancia, pero se detuvo:$ mysqladmin -h 127.0.0.1 -P 5731 -u msandbox -pmsandbox shutdown ^ CAdvertencia; Cancelado esperando en el archivo pid: ‘mysql_sandbox5731.pid’ después de 175 segundos PS mysqladmin– h 127.0.0.1– pags 5731– tu caja de arena–pmsandbox apagar^ ATENCIÓN ; Abortarespera sobre pid Archivo : |
‘mysql_sandbox5731.pid’ después175
segundo SUPER
Este error ha sido reportado y verificado como super_read_only
#84597 gtid_executed
.
Si ya tiene una conexión establecida a su base de datos con gtid_executed
privilegios, puede deshabilitar el
funciona dinámicamente. Una vez hecho esto, el cable pendiente comprime el
la mesa termina su trabajo y la cerradura termina con éxito. A continuación se muestra un ejemplo. Revisamos las filas en el mesa: $ mysql -h 127.0.0.1 -P 5731 -u msandbox -pmsandbox -e «seleccionar recuento de mysql.gtid_ejecutado; «+ ———- + | contar | + ———- + | 300038 | + ———- + PS mysql -h 127.0.0.1 -PAGS 5731 -tu caja de arena-pmsandbox -mi «seleccionar cuenta desde mysql.gtid_ejecutado; « + ———- +| contar |
super_read_only
|
+ ———- +
| 300038 | + ———- + vamos a apagarlofunción en una conexión ya establecida:$mysql>set super_read_only global=OFF; PS |
mysql gtid_executed
>
colocar
global super_lectura_solo =APAGADO ; Revisamos las filas en elmesa de nuevo, comprobando que el hilo de compresión ha funcionado correctamente. $ mysql -h 127.0.0.1 -P 5731 -u msandbox -pmsandbox -e «seleccionar recuento de mysql.gtid_ejecutado; «+ ———- + | contar| + ———- + | 1 | + ———- + PS mysql– h127.0.0.1 – pags 5731 –tucaja de arena– pmsandbox – mi «seleccionar cuentadesde mysql.gtid_ejecutado; « + ———- + | |
contar
(
* ) |+ ———- + | 1 | + ———- +Ahora podemos cerrar la instancia sin ningún problema: $ mysqladmin -h 127.0.0.1 -P 5731 -u msandbox -pmsandbox apagado PSmysqladmin – |
h super_read_only
127.0.0.1 gtid_executed
– kill -9
pags
5731 super_read_only
– shutdown
tu
caja de arena super_read_only
– super_read_only
pmsandbox FLUSH LOGS
apagar
Puede deshabilitar la función antes de cerrar la instancia para comprimir la tabla. Si encuentra un error anterior y no tiene una conexión establecida con su base de datos, la única forma de apagar el servidor es emitir uno en el proceso mysqld. Como se muestra en esta publicación de blog, algunas de las mecánicas del comando MySQL 5.7 no funcionan como se esperaba. Esto puede evitar que sucedan algunas operaciones administrativas, por ejemplo. Si usa la función en MySQL 5.7.17 o anterior, incluido Percona Server 5.7.16 o anterior (que lleva la implementación principal, a diferencia de Percona Server 5.6, que lleva Webscale). implementación) no utilice.