Moteur de stockage MySQL Innodb (1)

Structure physique InnoDB On-Disk Structures (structure du disque)

Introduction: Le concept d'espace table provient de la base de données Oracle. L'objectif initial est de pouvoir faire un bon travail d'extension de stockage.

位置 : Le moteur de stockage InnoDB -> Structures sur disque InnoDB -> Tablespaces

  1. Espace table partagé (espace table système)
    ① Mode de stockage de l'espace table: ibdata1 ~ ibdataN

Version 5.5+ du type de stockage d'espace table par défaut.

stockage ibdata1: données système, journaux, annulation, tables temporaires, données utilisateur (segment d'index + segment de données).
stockage frm: stocker les informations du dictionnaire de données de chaque table

Après avoir lu la structure de stockage ci-dessus, la question se pose: la copie des fichiers xxx.frm et xxx.ibd de la table Innodb vers d'autres instances, cela signifie-t-elle que la table de données est sauvegardée?

Le fait n'est pas. Parce qu'il n'y a pas de copie du dictionnaire de données global. Les fichiers xxx.frm et xxx.ibd ne sont qu'une partie des données. Il existe des données système, des informations de journal et des informations de table temporaire dans l'ibdataN manquant. Lorsqu'une copie est nécessaire, la bibliothèque copiera tout le répertoire stocké dans le répertoire correspondant.

Puis-je copier les fichiers user.frm, user.MYD et user.MYI de la table myisam vers d'autres instances?

peut. Parce que myisam ne dispose pas d'informations de dictionnaire de données globales (informations de données système). Mais les autorisations doivent être correctes pour que le redémarrage prenne effet.

② Modifications de l'espace table partagé IbdataN dans chaque version

Le dictionnaire de données InnoDB se compose de tables système internes qui contiennent des métadonnées pour le suivi des objets tels que les tables, les index et les colonnes de la table. Les métadonnées se trouvent en fait dans l'espace de table système InnoDB. Pour des raisons historiques, les métadonnées du dictionnaire de données chevauchent dans une certaine mesure les informations stockées dans le fichier de métadonnées de la table InnoDB (fichier .frm -> desc city).

Lien vers le document officiel: https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

L'
espace table partagé de la version 5.5 stocke les données système et les données utilisateur

Lié au système: informations de dictionnaire de données (globales), informations d'annulation d'annulation, informations de tampon DoubleWrite, informations de table temporaire, tampon de modification

(Global) Informations du dictionnaire de données Informations sur
la structure de base du tableau, état, paramètres système, attributs, etc. Il équivaut à la somme du dictionnaire de données de toutes les tables sauvegardées.

Annuler les informations de restauration
Le journal utilisé pour annuler l'opération est similaire à la sauvegarde avant modification. Si vous faites une erreur, sauvegardez-le.

Double mécanisme d'écriture des informations du tampon DoubleWrite Les informations
temporaires de la table telles que classer par sont d'abord triées, puis dupliquées , générées à un endroit, traitées par le système et supprimées lorsqu'elles sont épuisées

Changer le tampon (insérer le tampon) Utilisez la fonction Changer le tampon pour mettre temporairement en mémoire tampon les données mises à jour requises par l'index auxiliaire. Lorsque les données du nouvel insert doivent être interrogées, l'opération de fusion est effectuée en mémoire et l'index auxiliaire est le plus récent à ce moment.
Données utilisateur: lignes de données de table, données d'index de table

Version 5.6 Le
tablespace partagé ne stocke que les données système, sépare les données utilisateur (les fichiers * .ibd sont séparés) et gère les tablespaces indépendants.

Lié au système: informations de dictionnaire de données (globales), informations d'annulation d'annulation, informations de tampon DoubleWrite, informations de table temporaire, tampon de modification
Insérez la description de l'image ici

Version 5.7
Basé sur la version 5.6, la table temporaire est indépendante (ibtmp1), et Undo peut également être défini comme indépendant.
Lié au système: informations de dictionnaire de données (globales), informations d'annulation d'annulation, informations de tampon DoubleWrite, tampon de modification
Insérez la description de l'image ici

Version 8.0.19
Sur la base de la version 5.7, les informations de restauration UNDO sont indépendantes par défaut (undo_00x), et le dictionnaire de données n'est plus stocké de manière centralisée dans l'espace table partagé, le fichier .ibd sous la bibliothèque mysql.
Lié au système: informations de tampon DoubleWrite, changement de tampon

Version 8.0.20
Basé sur la version précédente, informations indépendantes sur le tampon DoubleWrite.
Lié au système: modifier le tampon
Insérez la description de l'image ici

Document officiel 15.6.4 Double tampon d'écriture:
Avant MySQL 8.0.20, la zone de stockage du tampon de double écriture se trouve dans l'espace table système InnoDB
À partir de MySQL 8.0.20, la zone de stockage du tampon double écriture se trouve dans le fichier de double écriture.

Fonction de stockage indépendante: Détruisez un fichier sans affecter la situation globale, garantissant la sécurité des données


③Gestion des tablespace partagées Lors de la configuration d'un nouvel environnement, initialisez: mysql --initalize-insecure
. Le tablespace partagé n'est pas défini lors de l'initialisation. La valeur par défaut est un: ibdata1, ibdata1: 12M: autoextend fichier ibdata1, la taille initiale par défaut est 12M, et il sera automatiquement développé si ce n'est pas suffisant. Par défaut, chaque extension est de 64 Mo

-Rechercher le nom et la taille du tablespace:

select @@innodb_data_file_path;

Recherchez la taille d'extension par défaut:

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

Comment étendre l'espace table partagé?

第一历程:查看表空间的大小
# 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

④ Configurer des tablespaces partagés lors de l'initialisation (recommandations de production)
La version 5.7 recommande de configurer 2 ~ 3 tablespaces partagés d'une taille de 512M ou 1G, et le dernier est personnalisé pour une expansion automatique

第一历程:修改配置文件
# 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. Dans la
    version 5.6 de l' espace table indépendant , pour les données utilisateur, la gestion du stockage séparé, les lignes de données de la table de stockage et les index
    ① Affichez l'espace table indépendant:
select @@innodb_file_per_table;

1 La table créée par une gestion de stockage séparée, le fichier correspondant au disque: t1.frm et t1.ibd
0 L'espace table partagé stocke la table créée, le fichier correspondant au disque: t1.frm, pas de fichier .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中。

② Utilisez un espace table indépendant pour une migration rapide des données
Principe:

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

Migration des données via des fichiers .ibd.
Condition préalable: le destinataire doit disposer de fichiers ibdata et de fichiers .frm.
Source: 3306 / test / t100w ----> Cible: 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;

Eh bien, le contenu d'aujourd'hui sera présenté ici en premier, à propos de l'espace table de migration pour restaurer les données, de l'espace table d'annulation, de l'espace table temporaire, etc., les articles de suivi entreront dans les détails un par un.

Pour un contenu plus passionnant, veuillez suivre le compte public WeChat

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45320660/article/details/114967361
conseillé
Classement