Motor de almacenamiento MySQL Innodb (1)

Estructura física de InnoDB On-Disk Structures (estructura de disco)

Introducción: El concepto de espacio de tabla se origina en la base de datos de Oracle. El propósito inicial es poder hacer un buen trabajo de expansión del almacenamiento.

位置 : El motor de almacenamiento InnoDB -> Estructuras en disco InnoDB -> Tablespaces

  1. Espacio de tabla compartido (espacio de tabla del sistema)
    ① Modo de almacenamiento de espacio de tabla: ibdata1 ~ ibdataN

Versión 5.5+ del tipo de almacenamiento de espacio de tabla predeterminado.

Almacenamiento ibdata1: datos del sistema, registros, deshacer, tablas temporales, datos de usuario (segmento de índice + segmento de datos).
frm storage: almacena la información del diccionario de datos de cada tabla

Después de leer la estructura de almacenamiento anterior, surge la pregunta: Copiar los archivos xxx.frm y xxx.ibd en la tabla Innodb a otras instancias, ¿significa que la tabla de datos está respaldada?

El hecho no lo es. Porque no hay copia del diccionario de datos globales. Los archivos xxx.frm y xxx.ibd son solo una parte de los datos. Hay datos relacionados con el sistema, información de registro e información de tabla temporal en el ibdataN que falta. Cuando se necesita copiar, la biblioteca copiará todo el directorio almacenado en el directorio correspondiente.

¿Puedo copiar los archivos user.frm, user.MYD y user.MYI de la tabla myisam a otras instancias?

lata. Porque myisam no tiene información de diccionario de datos global (información de datos del sistema). Pero los permisos deben ser correctos para que el reinicio surta efecto.

② Cambios en el espacio de tabla compartido de IbdataN en cada versión

El diccionario de datos InnoDB consta de tablas del sistema interno que contienen metadatos para rastrear objetos como tablas, índices y columnas en la tabla. Los metadatos se encuentran en realidad en el espacio de tabla del sistema InnoDB. Debido a razones históricas, los metadatos del diccionario de datos se superponen hasta cierto punto con la información almacenada en el archivo de metadatos de la tabla InnoDB (archivo .frm—> desc city).

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


Datos del sistema de almacenamiento de espacio de tabla compartido y datos de usuario de la versión 5.5

Relacionado con el sistema: información de diccionario de datos (global), información de reversión de deshacer, información de búfer DoubleWrite, información de tabla temporal, cambio de búfer

(Global) Información del diccionario de datos Información de
la estructura básica de la tabla, estado, parámetros del sistema, atributos, etc. Es equivalente a la suma del diccionario de datos de todas las tablas respaldadas.

Deshacer la información de reversión
El registro utilizado para deshacer la operación es similar a la copia de seguridad antes de la modificación. Si comete un error, haga una copia de seguridad.

Mecanismo de escritura doble de información de búfer de DoubleWrite La información de la
tabla temporal, como ordenar por, se ordena primero, luego se duplica , se genera en un lugar, el sistema la procesa y se descarta cuando se agota

cambiar búfer (insertar búfer) Utilice la función Cambiar búfer para almacenar temporalmente los datos actualizados requeridos por 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.
Datos de usuario: filas de datos de la tabla, datos del índice de la tabla

Versión 5.6 El
espacio de tabla compartido solo almacena datos del sistema, separa los datos del usuario (los archivos * .ibd están separados) y administra espacios de tabla independientes.

Relacionado con el sistema: información de diccionario de datos (global), información de reversión de deshacer, información de búfer DoubleWrite, información de tabla temporal, cambio de búfer
Inserte la descripción de la imagen aquí

Versión 5.7
Basado en la versión 5.6, la tabla temporal es independiente (ibtmp1) y Deshacer también se puede configurar para que sea independiente.
Relacionado con el sistema: información de diccionario de datos (global), información de reversión de deshacer, información de búfer DoubleWrite, cambio de búfer
Inserte la descripción de la imagen aquí

Versión 8.0.19
Sobre la base de la versión 5.7, la información de reversión UNDO es independiente por defecto (undo_00x), y el diccionario de datos ya no se almacena centralmente en el espacio de tabla compartido, el archivo .ibd bajo la biblioteca mysql.
Relacionado con el sistema: información de búfer DoubleWrite, cambio de búfer

Versión 8.0.20
Basado en la versión anterior, información de búfer DoubleWrite independiente.
Relacionado con el sistema: cambio de búfer
Inserte la descripción de la imagen aquí

Documento oficial 15.6.4 Búfer de doble escritura:
antes de MySQL 8.0.20, el área de almacenamiento del búfer de escritura doble se encuentra en el espacio de tabla del sistema InnoDB.
A partir de MySQL 8.0.20, el área de almacenamiento del búfer de escritura doble se encuentra en el archivo de escritura doble.

Función de almacenamiento independiente: destruye un archivo sin afectar la situación general, lo que garantiza la seguridad de los datos.


③Gestión del espacio de tabla compartido Al configurar un nuevo entorno, inicialice: mysql --initalize-insecure
. El espacio de tabla compartido no se configura durante la inicialización. El valor predeterminado es uno: ibdata1, ibdata1: 12M: autoextend ibdata1 archivo, el tamaño inicial predeterminado es 12M, y se expandirá automáticamente si no es suficiente. De forma predeterminada, cada expansión es de 64M

-Consulte el nombre y el tamaño del espacio de tabla:

select @@innodb_data_file_path;

Consultar el tamaño de expansión predeterminado:

show variables like "%increm%"select @@innodb_autoextend_increment64

¿Cómo expandir el espacio de tabla compartido?

第一历程:查看表空间的大小
# ls -lh ibdata1
-rw-r----- 1 mysql mysql 12M May  7 10:04 ibdata1

第二历程:# vim /etc/my.cnf
innodb_data_file_path=ibdata1:12M;ibdata2:100M;ibdata3:100M:autoextend

第三历程:重启数据库
# systemctl restart mysqld

# ll -h ibdata*
-rw-r----- 1 mysql mysql  12M May  7 11:29 ibdata1
-rw-r----- 1 mysql mysql 100M May  7 11:29 ibdata2
-rw-r----- 1 mysql mysql 100M May  7 11:29 ibdata3

注意:ibdata1的大小是实际的大小,否则会报错

如果不一致:innodb_data_file_path=ibdata1:8M;ibdata2:100M;ibdata3:100M:autoextend

重启报错:# /etc/init.d/mysqld restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. ERROR! The server quit without updating PID file (/server/3306/data/db01.pid).


错误日志信息:
# tail -30 /server/3306/data/db01.err
[ERROR] InnoDB: The innodb_system data file './ibdata1' is of a different size 768 pages (rounded down to MB) than the 640 pages specified in the .cnf file!

错误提示得出:ibdata1文件的实际大小:
# awk "BEGIN{print 768*16/1024}"      768页*16KB/1024=12M
12

设置大小:
# awk "BEGIN{print 640*16/1024}"
10

④ Configurar espacios de tabla compartidos durante la inicialización (recomendaciones de producción) La
versión 5.7 recomienda configurar 2 ~ 3 espacios de tabla compartidos con un tamaño de 512M o 1G, y el último está personalizado para la expansión automática

第一历程:修改配置文件
# vim /etc/my.cnf
innodb_data_file_path=ibdata1:1024M;ibdata2:1024M;ibdata3:1024M:autoextend

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

第三历程:重启
# systemctl restart mysqld
8.0 版本建议设置1个就ok,大小512M或者1G。
  1. En el espacio de tabla independiente
    versión 5.6, para datos de usuario, gestión de almacenamiento separada, filas e índices de datos de la tabla de almacenamiento
    ① Ver el espacio de tabla independiente:
select @@innodb_file_per_table;

1 La tabla creada por una gestión de almacenamiento separada, el archivo correspondiente al disco: t1.frm y t1.ibd
0 El espacio de tabla compartido almacena la tabla creada, el archivo correspondiente al disco: t1.frm, sin archivo .ibd

演示:
当前是独立的存储管理

mysql> create database t1;
mysql> create table t1(id int);

# ll /server/3306/data/t1/
-rw-r----- 1 mysql mysql    65 May  7 12:07 db.opt
-rw-r----- 1 mysql mysql  8556 May  7 12:07 t1.frm
-rw-r----- 1 mysql mysql 98304 May  7 12:07 t1.ibd

mysql> set global innodb_file_per_table=0;
mysql> create table t2(id int);
mysql> insert into t2 values (1);

# ll /server/3306/data/t1/
-rw-r----- 1 mysql mysql    65 May  7 12:07 db.opt
-rw-r----- 1 mysql mysql  8556 May  7 12:07 t1.frm
-rw-r----- 1 mysql mysql 98304 May  7 12:07 t1.ibd
-rw-r----- 1 mysql mysql  8556 May  7 12:34 t2.frm
此时存储的数据在ibdata中。

② Utilice un espacio de tabla independiente para una rápida migración de datos
Principio:

select @@innodb_file_per_table;
1                  --->      单独的存储管理

Migración de datos a través de archivos .ibd.
Requisito previo : el extremo receptor debe tener archivos ibdata y archivos .frm.
Fuente: 3306 / test / t100w ----> Destino: 3307 / test / t100w

第一历程:锁定源端t100w表,只读
mysql> lock tables test.t100w write;
mysql> show create table t100w;
CREATE TABLE `t100w` (
`id` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

第二历程:目标端创建test库和t100w的空表
mysql> create database test charset="utf8mb4";
mysql> use test
mysql> CREATE TABLE `t100w` (
`id` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

第三历程:单独删除目标端空的表空间文件(保留t100w的frm,ibdata1中关于t100w的系统数据)
# ll /server/3307/data/test/
-rw-r----- 1 mysql mysql    67 May  7 12:46 db.opt
-rw-r----- 1 mysql mysql  8662 May  7 12:52 t100w.frm
-rw-r----- 1 mysql mysql 98304 May  7 12:52 t100w.ibd

mysql> alter table test.t100w discard tablespace;
# ll /server/3307/data/test/
-rw-r----- 1 mysql mysql   67 May  7 12:46 db.opt
-rw-r----- 1 mysql mysql 8662 May  7 12:52 t100w.frm

第四历程:拷贝源端ibd文件到目标端目录,并设置权限    如果不是单独的表空间管理,此时是没有.ibd文件的
# cp /server/3306/data/test/t100w.ibd /server/3307/data/test/
# chown  -R mysql.mysql /server/3307/

第五历程:导入表空间
mysql> alter table test.t100w import tablespace;
mysql> select count(*) from test.t100w;
+--------------+
| count(*)     |
+--------------+
|  1000000   |
+--------------+

第六历程:解锁源端数据表
mysql> unlock tables;

Bueno, el contenido de hoy se presentará aquí primero, sobre el espacio de tabla de migración para restaurar datos, el espacio de tabla Deshacer, el espacio de tabla temporal, etc., los artículos de seguimiento entrarán en detalles uno por uno.

Para obtener más contenido interesante, siga 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/114967361
Recomendado
Clasificación