Day-07-数据库存储事务知识 (概念原理)
1、数据库存储引擎结构 (磁盘结构部分–表空间–一大波名词知识–底层原理知识)
2、数据库事务机制概念
3、数据库事务机制特性 (A-原子特性 C-一致性 I-隔离性 D-持久性)
4、数据库事务生命周期
5、数据库事务提交方式
6、数据库事务隔离级别 (RC RR 脏读 不可重复读 幻读)
7、数据库事务工作流程 (A-原子特性 C-一致性 I-隔离性 D-持久性) 详述
8、数据库存储行锁模式 (表锁)
入门门槛问题:
01 数据库索引原理问题 - Btree 索引树构建(聚簇 辅助)
02 数据库存储引擎问题 - 存储引擎结构
03 数据库事务处理特性 - 隔离机制
1、数据库存储引擎结构
磁盘结构部分:
类型三:undo表空间
作用:可以将事务变化前的数据页信息进行保存,便于进行数据的回滚操作
文件:undo_00x
操作:
mysql> select @@innodb_undo_tablespaces;
+---------------------------+
| @@innodb_undo_tablespaces |
+---------------------------+
| 2 |
+---------------------------+
1 row in set (0.00 sec)
-- 确认是否打开独立undo模式,并设置undo表空间文件个数(3-5个),(用于轮询)
mysql> select @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
| 1073741824 |
+----------------------------+
1 row in set (0.00 sec)
-- 表示undo日志信息的大小,默认1G
mysql> select @@innodb_undo_log_truncate;
+----------------------------+
| @@innodb_undo_log_truncate |
+----------------------------+
| 1 |
+----------------------------+
1 row in set (0.00 sec)
-- 表示开启undo自动回收的机制(undo purge)
-- 是否对原有历史undo日志数据进行释放
mysql> select @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
| 128 |
+----------------------------------------+
1 row in set (0.00 sec)
-- 触发自动回收的条件,单位是检测次数
-- 在释放undo日志数据前,做多少次数据量确认
官方参数使用说明(important):
The number of undo tablespaces can only be configured when initializing a MySQL instence and is fixed for the life of the instance;
undo表空间的数量只能在初始化MySQL实例时配置,并且在实例生命周期内是固定的
PS:undo有些配置信息,需要在初始化操作时进行预先调整;
类型四:temp表空间
作用:用于存储临时数据信息,比如:排序的数据信息 分组的数据信息 连表查询的数据信息
文件:ibtmp1
类型五:redo事务日志 ****
作用:用于存储数据操作记录信息(实现方法 利用了WAL技术 write ahead log)
文件:ib_logfileX
配置:
mysql> show variables like '%innodb_log_file%';
+---------------------------+----------+
| Variable_name | Value |
+---------------------------+----------+
| innodb_log_file_size | 50331648 |
| innodb_log_files_in_group | 2 |
+---------------------------+----------+
2 rows in set (0.07 sec)
-- 在实际生产环境中,建议大小为512M~4G,应用组数为2~4组(写入数据过程轮询写入)
redo事务日志配置操作方法:
# 编写数据库配置文件信息
vim /etc/my.cnf
[mysqld]
innodb_log_file_size=100M
innodb_log_files_in_group=3
# 确认配置信息是否已经生效
[root@xiaoQ-01 data]# /etc/init.d/mysqld restart
[root@xiaoQ-01 data]# ll /data/3306/data/ib_log*
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ib_logfile0
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ib_logfile1
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ib_logfile2
类型六:ib_buffer_pool预热文件
作用:ib_buffer_pool预热文件可以用于缓冲和缓存,可以存储"热"数据页(经常查询或修改的数据页),从而减少物理IO消耗;
从数据库5.7版本开始,数据库正常关闭后,内存中存储的数据页缓冲或缓存信息均会失效,重新启动后还会消耗IO获取相应数据页信息;
为了可以尽量减少磁盘IO的消耗,可以将内存中的热数据页信息存储在ib_buffer_pool文件中;
数据库服务再次启动后,会直接读取ib_buffer_pool文件中信息,并将读取的信息加载到内存中,最终减少随机IO数量;
说明:存在ib_buffer_pool预热文件后,有可能在数据库服务关闭时比较耗费一些时间,但实际环境数据库服务关闭情况较少;
文件:ib_buffer_pool
类型七:Doublewrite Buffer(DWB)文件
作用:可以保证数据页信息存储时,不会出现坏页(或者在出现坏页时,可以修复坏页)
DWB文件主要作用是:mysql process crash in the middle of a page write(在数据库服务存储时,数据页写了一半);
数据库Innodb可以找到一个好的数据页副本从Doublewrite Buffer文件中,主要是避免数据信息出现损坏;
MySQL数据库最小IO存储单元是page(16kB),OS系统中最小的IO存储单元是block(4kB),OS也可以称为存储子系统;
会出现一个问题:数据库系统与操作系统的存储关系问题,在数据库中写入一个数据页时,在文件系统层面可能只是写入了2个block;
文件:#ib_16384_0.dblwr
#ib_16384_1.dblwr
内存结构部分:
类型一:AHI
作用:用于存储热点数据页的内存地址信息,可以快速调取数据页中数据,减少总索引树的IO消耗
简单理解:索引的索引
类型二:change buffer
作用:将辅助索引树中,变化的索引数据页信息进行临时存储,避免辅助索引树结构频繁发生变化,导致业务访问索引树受到影响
类型三:Buffer Pool
作用:包含了AHI内存数据信息 + change buffer内存数据信息 + 磁盘加载数据页信息和索引页信息
配置:
# Buffer Pool配置参数信息查看:
mysql> select @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 134217728 |
+---------------------------+
1 row in set (0.00 sec)
-- buffer pool默认内存空间大小为128M,生产建议大小可以设置为物理内存总量的50%~80%
# Buffer Pool配置参数修改方法:
# 配置信息临时调整
mysql > set global innodb_buffer_pool_size=268435456;
-- 配置调整后,重新登录mysql数据库生效
# 配置信息永久调整
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]
innodb_buffer_pool_size=256M
-- 配置调整后,重新启动mysql数据库生效
类型四:Log Buffer
作用:Log Buffer内存存储区域主要用来缓冲 redo log日志信息;
配置: