Motor de almacenamiento MySQL Innodb (dos)

  1. deshacer tablespace

Enlace al documento oficial: https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html

Rol: utilizado para hacer la operación de deshacer

Almacenamiento: la versión 5.7 todavía está en el espacio de tabla compartido (ibdataN) por defecto, y es independiente por defecto después de la versión 8.0 (undo_001, undo_002)

Sugerencia de producción: después de la versión 5.7, deshaga manualmente de forma independiente

deshacer la gestión del espacio de tabla:
cómo ver los parámetros de configuración de deshacer

#打开独立undo模式,并设置undo的个数,3~5个(0 表示没有独立)

mysql> SELECT @@innodb_undo_tablespaces;
+---------------------------+
| @@innodb_undo_tablespaces |
+---------------------------+
|                         3 |
+---------------------------+
#undo日志的大小,默认1G。

mysql> SELECT @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
|                 1073741824 |
+----------------------------+
# 开启undo自动回收的机制(undo purge)

mysql> select @@innodb_undo_log_truncate;
+----------------------------+
| @@innodb_undo_log_truncate |
+----------------------------+
|                          0 |         0 表示不回收
+----------------------------+
# 触发自动回收的条件,单位是检测次数。

mysql> select @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
|                                    128 |        
+----------------------------------------+

Configurar deshacer tablespaces
Descripción del documento oficial: https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html
Inserte la descripción de la imagen aquí

El espacio de tabla para deshacer solo se puede cambiar cuando se inicializa y no se puede cambiar en uso (en ibdata, no se puede cambiar)

Solución: migración de espacio de tabla (físico) e importación lógica.

# 初始化时配置:
第一历程:编写配置文件
# vim /etc/my.cnf
innodb_undo_tablespaces=3
innodb_max_undo_log_size=128M
innodb_undo_log_truncate=on
innodb_purge_rseg_truncate_frequency=32

第二历程:初始化数据
mysqld --initialize-insecure --user=mysql --basedir=/server/app/mysql --datadir=/server/data

第三历程:启动数据库
# systemctl restart mysqld
# ll -h /server/data/undo*      默认10M
-rw-r----- 1 mysql mysql 10M May  16 15:48 /server/data/undo001
-rw-r----- 1 mysql mysql 10M May  16 15:48 /server/data/undo002
-rw-r----- 1 mysql mysql 10M May  16 15:48 /server/data/undo003

¿Cómo realizar la migración Deshacer (almacenamiento independiente)?

查看存储位置:
show variables like "%undo%";

a.关闭数据库
# /etc/init.d/mysqld stop

b.设定路径参数
# vim /etc/my.cnf 
innodb_undo_directory=/data/3306/undologs 

c.创建目录,并拷贝文件
mkdir -p  /data/3306/undologs 
chown -R mysql. /data/* 
#先复制过去,没问题,再删掉。
cp -a /data/3306/data/undo* /data/3306/undologs/      

d.启动数据库 
/etc/init.d/mysqld start
mysql
show variables like "%undo%";
  1. Espacio de tabla temporal
    1. Función: almacenar la tabla temporal interna creada por el optimizador de tabla temporal creado por el usuario
    2. ¿Cómo se administra?
# ll -h /server/3306/data/ibtmp1
-rw-r----- 1 mysql mysql 12M May  7 16:14 /server/3306/data/ibtmp1
#vim /etc/my.cnf

innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:512M:autoextend:max:512M

# systemctl restart mysqld
        建议数据初始化之前设定好,一般2-3个,大小512M-1G。
  1. Búfer de escritura doble (DWB)

Introducción: Mejore la confiabilidad de innodb para resolver fallas de escritura parcial (salto de página de escritura de página parcial).

Ubicación: 5.7 se almacena en ibdataN de forma predeterminada y puede ser independiente después de 8.20

¿Qué problema resuelve Doublewrite Buffer?

Luego, primero planteamos una pregunta sobre la unidad más pequeña de IO:

1. La unidad más pequeña de IO predeterminada de MySQL es () y Oracle es ().

2. La unidad más pequeña de E / S del sistema de archivos es ()

3. La unidad más pequeña de E / S de disco es ()

解析:16K,8K,4K (也有1K的)512B

Por lo tanto, existe el riesgo de que la página se dañe debido a las escrituras de IO:

Inserte la descripción de la imagen aquí

Flujo de trabajo de Doublewrite Buffer
Inserte la descripción de la imagen aquí

Doublewrite consta de dos partes, una es el búfer de doble escritura en la memoria, cuyo tamaño es de 2 MB, y la otra son las 128 páginas continuas en el espacio de tabla compartido (ibdata x) en el disco, es decir, 2 extensiones, y el tamaño también es de 2 m.

1. Cuando una serie de mecanismos desencadenan el vaciado de páginas sucias en el grupo de búfer de datos, no se escriben directamente en el archivo de datos del disco, sino que primero se copian en el búfer de escritura doble en la memoria;

2. Luego, escriba en el espacio de tabla compartido del disco dos veces desde los dos búferes de escritura (almacenamiento continuo, escritura secuencial, alto rendimiento), cada uno escribiendo 1 MB;

3. Una vez completado el segundo paso, escriba los datos de la página sucia en el búfer de escritura doble en los archivos de espacio de tabla reales (escritura discreta); (después de que se solidifiquen los datos de la página sucia, los datos de escritura doble correspondientes se pueden sobrescribir marcándolos)

  1. Cambiar búfer

Introducción: por ejemplo, insertar, actualizar y eliminar datos. Para índices agrupados, los nodos hoja se actualizarán inmediatamente. Para el índice auxiliar, no se actualiza en tiempo real. Ponlo en el búfer de cambios

En la estructura de memoria de InnoDB, se agrega insertar búfer (sesión) y la versión actual se llama cambiar búfer.
Tamaño predeterminado: mysql ocupa el 25% de la memoria.
Función: almacenar temporalmente los datos actualizados que necesita el índice auxiliar. Cuando es necesario consultar los datos de la nueva inserción, la operación de combinación se realiza en la memoria y el índice auxiliar es el último en este momento.

Para obtener contenido más interesante, preste atención a la cuenta pública de WeChat

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45320660/article/details/114968654
Recomendado
Clasificación