Campos e índices de cambio de tabla sin bloqueo en línea para tablas grandes de mil millones de niveles

Inserte la descripción de la imagen aquí

antecedentes

En su trabajo diario, a menudo necesita realizar cambios en la estructura de la tabla de la base de datos, que generalmente implican operaciones ALTER como agregar y eliminar campos y modificar atributos de campo. Sin embargo, en el caso de tablas grandes, especialmente decenas de millones y miles de millones de tablas grandes, si no se manejan correctamente. Estas operaciones a menudo conducen a enormes peligros ocultos de bloquear tablas, especialmente en el entorno de producción. Una vez que se cambia la estructura de la tabla durante mucho tiempo, la tabla se bloqueará durante mucho tiempo, lo que hará que los datos generados por el usuario no cambiarse a la tabla normalmente durante mucho tiempo, lo que conducirá a La función de servicio es anormal y el resultado será catastrófico.

Generalmente, para implementar este tipo de cambio Alter, podemos tener las siguientes ideas:

1. Detenga el servidor y realice cambios en la estructura de la tabla durante el período de detención, lo que naturalmente puede evitar el impacto en los usuarios. Sin embargo, muchas escenas no pueden dejar de servir. Y si el volumen de datos de la tabla llega a cientos de millones, puede llevar más de diez horas o incluso más detener el servicio, lo cual es extremadamente poco realista;

2. Ejecute temprano en la mañana y realice cambios en un período de tiempo con menos usuarios para minimizar el impacto en los usuarios. Pero si hay una tabla de bloqueo, si hay usuarios que utilizan el servicio, el servicio no estará disponible;

3. Use para cambiar la tabla, pero la desventaja es que durante el período de copia de datos a la nueva tabla, si el usuario realiza una operación de actualización o eliminación durante este período, y los datos se encuentran en la parte que se ha copiado, entonces esta parte de los datos no se detectará, lo que provocará una pérdida. Los datos operativos del usuario son demasiado riesgosos;

4. La desventaja de usar procedimientos almacenados es que lleva mucho tiempo ejecutar y puede afectar las operaciones DDL del usuario. Porque para evitar que se bloqueen demasiadas filas de datos cada vez que se modifica el bucle, necesitamos controlar el número de filas de datos que se actualizan cada vez, y la granularidad no puede ser demasiado grande, de lo contrario es muy probable que la Las filas de datos que el usuario está operando se bloquearán.

Entonces, para las necesidades reales anteriores, ¿no existe una buena herramienta para resolver nuestros puntos débiles? De hecho, en la industria, existe una herramienta relativamente madura. Para escenarios de relojes grandes, los cambios Alter se pueden realizar en línea sin el riesgo de bloquear el reloj. Además, tiene algunas otras ventajas, comencemos a explorar.

1. ¿Qué es pt-osc?

pt-online-schema-change es un miembro de Percona-toolkit. Al mejorar el ddl nativo, puede modificar la estructura de la tabla en línea sin bloquear la tabla. En el sitio web oficial de Percona, con respecto a la herramienta pt-osc, también se menciona específicamente que la tabla ALTER no parece estar bloqueada.

¿Cómo resuelve la herramienta ps-osc el problema de evitar bloqueos de tablas y detectar las acciones de actualización y eliminación del usuario mencionadas anteriormente?

Los pasos principales de pt-osc son los siguientes:

1. Cree una nueva tabla exactamente igual que la tabla original, nombrándola como'_nombre de tabla oficial_nuevo ';

2. Utilice la instrucción alter para cambiar el contenido que se cambiará en la nueva tabla recién creada, evitando la operación de alteración en la tabla original;

3. Cree 3 activadores en la tabla original, inserte, actualice y elimine, que se utilizan principalmente para copiar datos de la tabla original a la nueva tabla. Si el usuario tiene una operación DDL, el activador puede detectar la operación DDL que se produjo durante este período. Los datos también se escriben en la nueva tabla para garantizar que los datos de la nueva tabla estén actualizados y no pierdan los nuevos datos operativos del usuario;

4. Copie los datos a la nueva tabla por bloque, y el proceso de copia mantiene un bloqueo S en la fila de datos;

5. Cambie el nombre, cambie el nombre de la tabla original a la tabla anterior, llamada "_nombre de la tabla oficial_antigua", cambie el nombre de la nueva tabla a la tabla oficial, puede decidir si eliminar la tabla anterior después de que la ejecución se complete a través de la configuración;

6. Elimine 3 disparadores;

2. Instalación de pt-osc

Pasos de instalación en el sistema linux:

--下载安装包
wget  http://szxge1-sw.artifactory.cd-cloud-artifact.tools.huawei.com/artifactory/CommonComponent/common/tool/percona-toolkit-3.1.0.tar.gz
--解压安装包
tar -zxvf percona-toolkit-3.1.0.tar.gz
--安装依赖环境
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum -y install perl-Digest-MD5
cd percona-toolkit-3.1.0
perl Makefile.PL
--编译
make
make install
yum install mariadb
--安装Mysql
yum install perl-DBD-MySQL

Tres, el uso de pt-osc

La herramienta pt-osc es muy simple de usar, puede ingresar directamente el comando pt-osc format en la línea de comandos de Linux para ejecutarlo directamente.

Tome el ejemplo de agregar un campo llamado MARK a la base de datos Mysql:

pt-online-schema-change --user="root" --password="*****" --host="数据库IP" --port=3306 --alter "ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';" D=my_test,t=t_test --no-drop-old-table --execute --print --no-check-replication-filters --charset=utf8 --no-check-unique-key-change --max-load="Threads_running=100" --critical-load="Threads_running=300" --recursion-method=none;

En la declaración anterior:

1. El usuario y la contraseña son el nombre de usuario y la contraseña de la base de datos para realizar la operación de cambio, respectivamente, que requieren alta autoridad;

2. Host es la dirección IP de la base de datos;

3. Puerto es el número de puerto de la base de datos;

4. Una declaración de alteración específica va seguida de alterar;

5. D es el nombre de la base de datos;

6. t es el nombre de la tabla que se va a cambiar;

7, no-drop-old-table no es para eliminar

8. juego de caracteres, juego de caracteres, use utf8;

9. Max-load, al copiar datos, la herramienta monitoreará el número de subprocesos que se ejecutan en la base de datos, si es mayor que el valor de Threads_running configurado, la copia se suspenderá hasta que sea menor que este valor. De esta forma, evita una gran presión sobre la base de datos y afecta el uso normal de los servicios de red existentes;

10. Carga crítica, el valor predeterminado es 50. Después de cada bloque, verifique MOSTRAR ESTADO GLOBAL La diferencia con la carga máxima es que si la carga es demasiado alta, se detendrá directamente en lugar de suspenderse. Puede configurar el umbral de acuerdo con la situación de su propia base de datos;

Nota: En la declaración de cambio que sigue a -alter, el nombre de la columna no se puede agregar con símbolos; de lo contrario, se informará un error. Por ejemplo, -alter "ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT'mark source region is 1 ';", si se agrega un símbolo al campo MARK, se producirá un error. El símbolo `después de COMMENT no tiene ningún efecto.

La siguiente es la información impresa cuando se usa la herramienta pt-osc para ejecutar realmente un trabajo. Por razones de seguridad, parte de la información del registro se oculta y se ignora.

Inserte la descripción de la imagen aquí

[root@ttt ~]#  `pt-online-schema-change --user="root" --password="*****" --host="数据库IP" --port=3306 --alter "ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';" D=my_test,t=t_test --no-drop-old-table --execute --print --no-check-replication-filters --charset=utf8 --no-check-unique-key-change --max-load="Threads_running=100" --critical-load="Threads_running=300" --recursion-method=none;`
No slaves found.  See --recursion-method if host EulerOS-BaseTemplate has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `my_test`.`t_test`...
Creating new table...
CREATE TABLE `my_test`.`_t_test_new` (
      `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '递增ID',
      .............建表语句数据................
Created new table my_test._t_test_new OK.
Altering new table...
ALTER TABLE `my_test`.`_t_test_new` ADD COLUMN MARK TINYINT NULL DEFAULT 1 COMMENT 'mark source region is 1';
Altered `my_test`.`_t_test_new` OK.
2020-10-14T11:14:48 Creating triggers...
2020-10-14T11:14:48 Created triggers OK.
2020-10-14T11:14:48 Copying approximately 346697 rows...
INSERT LOW_PRIORITY IGNORE INTO `my_test`.`_t_test_new` (`id`, ..建表语句信息.... FROM `my_test`.`_t_test_new` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) AND ((`id` <= ?)) LOCK IN SHARE MODE /*pt-online-schema-change 31340 copy nibble*/
SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `my_test`.`t_test` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ?)) ORDER BY `id` LIMIT ?, 2 /*next chunk boundary*/
2020-10-14T11:14:53 Copied rows OK.
2020-10-14T11:14:53 Analyzing new table...
2020-10-14T11:14:53 Swapping tables...
RENAME TABLE `my_test`.`t_test` TO `my_test`.`_t_test_old`, `my_test`.`_t_test_new` TO `my_test`.`t_test`
2020-10-14T11:14:53 Swapped original and new tables OK.
Not dropping old table because --no-drop-old-table was specified.
2020-10-14T11:14:53 Dropping triggers...
DROP TRIGGER IF EXISTS `my_test`.`pt_osc_my_test_t_test_del`
DROP TRIGGER IF EXISTS `my_test`.`pt_osc_my_test_t_test_upd`
DROP TRIGGER IF EXISTS `my_test`.`pt_osc_my_test_t_test_ins`
2020-10-14T11:14:54 Dropped triggers OK.
Successfully altered `my_test`.`t_test`.

Cuarto, comparación de desempeño

Muchas de las ventajas y buenas características de pt-osc se han presentado anteriormente. Entonces, ¿cuál es el efecto real? En el entorno de prueba, se realizó una prueba especial para que todos tuvieran una experiencia más intuitiva.

En la biblioteca de prueba, se prepara una tabla grande con 16 millones de datos. El objetivo es agregar un campo a la tabla grande y usar procedimientos almacenados y herramientas pt-osc para probar.

4.1 Uso de procedimientos almacenados

Primero use el procedimiento almacenado para probar, para evitar bloquear la tabla, solo actualice 200 filas cada vez. El cambio completo toma 90 minutos de principio a fin. De hecho, durante la ejecución del procedimiento almacenado, si el usuario también está operando la fila de datos que el procedimiento almacenado está cambiando en el DDL, los datos del usuario pueden bloquearse y el usuario no puede cambiar correctamente.

4.2 Usar la herramienta pt-osc

pt-osc tarda unos 7 minutos desde el inicio de la ejecución hasta la finalización del cambio, que es muy rápido. En el proceso de ejecución, el servicio del entorno de prueba se conecta a la base de datos y ejecuta múltiples tareas que operarán la mesa Durante todo el proceso, las tareas se pueden ejecutar normalmente sin excepción.

5. Conclusión

Las ventajas mencionadas anteriormente de ps-osc pueden ayudarnos a implementar cambios bajo los requisitos del servicio ininterrumpido en el entorno de red en vivo, y garantizar que la base de datos no se vea afectada por bloqueos de tablas, sobrecargas, etc.durante el cambio. asegurando así que el negocio pueda funcionar normalmente.

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/liuxingjiaoyu/article/details/112916561
Recomendado
Clasificación