MySQL的Innodb存储引擎(二)

  1. undo表空间

官方文档链接:https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html

作用:用来做撤销操作

存储:5.7版本默认还是在共享表空间中(ibdataN), 8.0版本以后默认就是独立的(undo_001、undo_002)

生产建议:5.7版本后,将undo手工进行独立

undo表空间管理:
如何查看undo的配置参数

#打开独立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 |        
+----------------------------------------+

配置undo表空间
官方文档说明:https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html
在这里插入图片描述

undo表空间只有初始化的时候可以更改,不能在使用中更改(ibdata中,无法更改)

解决方式:表空间迁移(物理)和逻辑导入。

# 初始化时配置:
第一历程:编写配置文件
# 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

如何进行Undo迁移(独立存储)?

查看存储位置:
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. 临时表空间
    1.作用:存储用户创建的临时表优化器创建的内部临时表
    2.如何管理?
# 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. Doublewrite Buffer(DWB)

介绍:提高innodb的可靠性,用来解决部分写失败(partial page write页断裂)。

位置:5.7 默认存储在ibdataN中,8.20以后可以独立了

扫描二维码关注公众号,回复: 13034626 查看本文章

Doublewrite Buffer到底解决了什么问题?

那我们先提一个关于IO的最小单位问题:

1、MySQL默认IO的最小单位是 ( ),Oracle是 ( )。

2、文件系统IO的最小单位是 ( )

3、磁盘IO的最小单位是 ( )

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

因此,存在IO写入导致page损坏的风险:

在这里插入图片描述

Doublewrite Buffer 工作流程
在这里插入图片描述

doublewrite由两部分组成,一部分为内存中的doublewrite buffer,其大小为2MB,另一部分是磁盘上共享表空间(ibdata x)中连续的128个页,即2个区(extent),大小也是2M。

1、当一系列机制触发数据缓冲池中的脏页刷新时,并不直接写入磁盘数据文件中,而是先拷贝至内存中的doublewrite buffer中;

2、接着从两次写缓冲区分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB;

3、待第二步完成后,再将doublewrite buffer中的脏页数据写入实际的各个表空间文件(离散写);(脏页数据固化后,即进行标记对应doublewrite数据可覆盖)

  1. Change Buffer

介绍:比如insert,update,delete 数据,对于聚簇索引会立即更新叶子节点。对于辅助索引,不是实时更新的。 放到了change buffer中

在InnoDB 内存结构中,加入了insert buffer(会话),现在版本叫change buffer。
默认大小:mysql占用内存的25%。
功能:临时缓冲辅助索引需要的更新数据。当需要查询新insert 的数据,会在内存中进行merge(合并)操作,此时辅助索引就是最新的。

更多精彩内容,欢迎关注微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45320660/article/details/114968654