- 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.作用:存储用户创建的临时表优化器创建的内部临时表
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。
- Doublewrite Buffer(DWB)
介绍:提高innodb的可靠性,用来解决部分写失败(partial page write页断裂)。
位置:5.7 默认存储在ibdataN中,8.20以后可以独立了
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数据可覆盖)
- Change Buffer
介绍:比如insert,update,delete 数据,对于聚簇索引会立即更新叶子节点。对于辅助索引,不是实时更新的。 放到了change buffer中
在InnoDB 内存结构中,加入了insert buffer(会话),现在版本叫change buffer。
默认大小:mysql占用内存的25%。
功能:临时缓冲辅助索引需要的更新数据。当需要查询新insert 的数据,会在内存中进行merge(合并)操作,此时辅助索引就是最新的。
更多精彩内容,欢迎关注微信公众号