1. 物理存储结构
1.表空间
- 支持两类表空间: 共享,独立
5.5 版本 : 默认共享表空间. 包含: 数据字典\undo\tmp\用户表数据和索引
5.6 版本 : 默认独立表空间. 包含: 数据字典\undo\tmp,将用户数据和索引独立,每个表单独存储
5.7 版本 : 默认独立表空间. 包含: 数据字典\undo,tmp独立,将用户数据和索引独立,每个表单独存储
8.0 版本 : 默认独立表空间. 数据字典取消掉, undo,tmp独立 将用户数据和索引独立,每个表单独存储
- 功能名词介绍
transaction 事务
undo : ibdata1 回滚日志
tmp : ibtmp1 临时表空间
redo : ib_logfile0~N 重做日志
ibd : t1.ibd 表空间数据文件
Innodb Buffer Pool 数据缓冲区池(70-80%)
log buffer 重做日志缓冲区
LSN 日志序列号
Trx_id 事务ID
checkpoint 检查点
- 事务 ?
1.什么是事务?
将多条DML(标准的事务语句),放在一个"组"中运行,要么全成功要么全失败.
- 交易?
以物换物
货币换物
虚拟币换物
虚拟币虚拟物 - 事务ACID特性atomicity, consistency, isolation, and durability.
A : 原子性 : 每一个事务都是一个完整整体,不可再分性 . 要么全执行成功要么全失败.
C : 一致性 : 在事务前,中,后,保证事务操作的数据前后一致.
I : 隔离性 : 多个事务之间,所做事务互不干扰,不能同时更新同一行数据.
D : 持久性 : 事务完成之后,所涉及到的数据,必须永久有效(落地)
2.事务的生命周期管理
标准的事务生命周期:
(1) 开启一个事务
begin / start transaction;
(2) 标准的事务语句
insert
update
delete
(3) 结束事务
commit; # 提交事务
rollback; # 回滚事务
3.非标准的事务生命周期
(1) 自动提交机制
MySQL 5.6 以后:
- begin子句会自动添加
- 每一条执行完成之后都会自动提交
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
[root@db01 data_3306]# vim /etc/my.cnf
autocommit=0
[root@db01 data_3306]# /etc/init.d/mysqld restart
说明: 默认情况下,开启事务时不加begin,逐条自动提交. 手工开启begin命令,按照正常事务工作过程.
(2) 隐式提交
1.用于隐式提交的 SQL 语句:
begin
a
b
begin
SET AUTOCOMMIT = 1
2.导致提交的非事务语句:
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
3.导致隐式提交的语句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE
(3) 隐式回滚
会话断开
数据库重启
死锁
4.事务底层的工作过程
(1) redo
- 分布:
内存: log buffer
磁盘: ib_logfile0~N - 功能:
1.保存内存数据页的变化
2.commit时, 实现事务的快速持久化的特性: 量少,顺序IO
3.宕机时,通过redo实现重做事务,将数据库恢复到宕机之前的状态.
我们由把这步称之为 ACSR 中的"前滚"操作
(2) undo 回滚日志 - 分布: 默认 ibdata1, 5.7开始可以独立undo,8.0后自动独立
- 功能 :
1.保存当前事务操作的反操作
2.在执行rollback命令时,undo提供回滚操作,在ACID中主要实现A的特性,CI也有部分功能
3.宕机时,ACSR过程中提供回滚操作(将没有commit标记的)
5.锁(写) 及 隔离级别(读)主要保证隔离性
锁 :
S : 共享锁,读锁
X : 排它锁,写锁
IS : 意向S
IX : 意向XX 锁的细分
TX ------> 表锁 DDL
全局锁表:
备份时,备份系统表时(非INOODB表),FTWRL
mysql> flush table with read lock;
mysql> unlock tables;
单表: DDL
mysql> lock table t1 read ;
mysql> unlock tables;
RX ------> 记录锁 DML
GAP LOCK X ------> 间隙锁 特殊DML
Next LOCK X ------> 下一键锁定
- 隔离级别(transaction_isolation)
mysql> select @@transaction_isolation;
RU :读未提交 READ-UNCOMMITTED
(1).模拟:
session A
mysql> begin;
mysql> use world
mysql> delete from city where id=1000;
session B
mysql> begin;
mysql> use world
mysql> select *from city where id=1000;
(2).会产生的问题:
1. 脏读
2. 不可重复读现象
3. 幻读
RC :读已提交 ***** READ-COMMITTED
1. 不可重复读现象
2. 幻读
RR :可重复读 ***** REPEATABLE-READ
1. 幻读
说明:
- RR级别+ GAP+ Next lock(GAP+RX)有效防止幻读现象
- 通过MVCC,多版本并发控制中,一致性快照读技术,解决了不可重复读问题.
SR :串行化
总结:
AID 都是为了数据库最终一致性 C
SQL_MODE
约束
自己扩展:
MDL 原数据锁
page lock 页锁
latch 内存页锁
2. InnoDB 存储引擎核心参数
mysql> select @@innodb_data_file_path; 共享表空间的大小
mysql> select @@innodb_file_per_table;
mysql> select @@innodb_buffer_pool_size; 默认128M,不要超过80%物理内存,否则会产生oom故障
mysql> select @@innodb_log_buffer_size; 默认16M,日志缓存区的大小
mysql> select @@innodb_log_file_size; 默认48M,日志文件大小
mysql> select @@innodb_log_file_in_group;
mysql> select @@innodb_flush_log_at_trx_commit; # 双1标准之一.控制
- redo刷写的策略.
0 每秒钟刷写redo到磁盘.
1 每次事务提交,理解刷写redo到磁盘
2 每次事务提交,立即写日志到OS cache中,然后每秒钟刷写到磁盘.
mysql> select @@innodb_flush_method; 控制(buffer脏页,redo buffer日志)刷写方式
建议设置:
O_DIRECT : 数据页刷写磁盘直接穿过文件系统缓存,redo 刷写时,先写