1、功能
数据读写
数据安全和一致性
提高性能
热备份
自动故障恢复
高可用
2、存储引擎介绍
InnoDB
第三方:RocksDB、MyRocks、ToKuDB
压缩比较高,数据的插入性能高,其他和InnoDB差不多
3、InnoDB
事物
行锁
MVCC
外键(不用)
ACSR
热备
复制(多线程,GTID,MTS)
4、存储引擎
查看:
show engines;
select @@default_storage_engine;
show create table xxx;
修改引擎:
alter table xxx engine=innodb;
整理碎片:
alter table xxx engine=innodb;
二、InnoDB物理存储结构
1、最直观的存储方式
ibdata1:数据字典的统计信息、undo表空间等数据
ib_logfile0 - ib_logfile1:redo日志文件,事物日志文件
ibtmp1:临时表空间存储位置,存储临时表
frm:存储表的列信息
ibd:数据行+索引
2、表空间(tablespace)
表空间数据文件:
ibdata1:元数据+undo日志
ibd:数据行+索引
共享表空间(5.5版本默认模式)===> 独立表空间(5.6版本)
三、事物
ACID
一致性:符合预期的,汇款前后总和不变
事物的生命周期:
begin;
insert update delete
commit; rollback;
set global autocommit=0;
名词解析
redo log:重做日志
ib_logfile0 - ib_logfile1 默认50M,轮询使用
redo log buffer:redo内存区域
ibd:数据+索引文件
buffer pool:ibd文件的内存缓冲
LSN:日志序列号
存在于ibd-buffer pool 和 redo-redo buffer
数据库启动时,要比较ibd和redo log 的LSN,相同才能启动
WAL(write ahead log):
日志优先于数据写入磁盘,redo log > ibd
脏页:
内存脏页,改了内存,写入磁盘之前,叫做脏页
CKPT:
将脏页写到磁盘的动作
TXID:
事物id
(1)事物日志:redo日志
作用:主要保证D,辅助A、C
记录了内存数据的变化
提供快速持久化功能
CSR实现前滚操作
情况一:事物已经提交
更改数据时,将数据从ibd读入buffer pool,更改内存,同时更改redo log buffer,
commit的时候,将redo log buffer写入ib_logfile文件
断电,重启mysql,会先将ibd和ib_logfile中LSN不一致的,读到内存,然后更新buffer poll,立即将脏页写入磁盘,恢复到断电之前的状态,完成重启。
(2)回滚日志:undo日志
作用:
记录数据修改之前的状态
CSR中实现未提交事物的回滚操作
实现一致性快照,保证MVCC,读写操作不会互相阻塞
情况二:事物未提交
断电重启时,如果发现redo日志里有未提交的事物标签,就拿着这个TXID去undo日志找到对应的记录,在内存中回滚,所有未提交的操作均会丢失,再写回磁盘,保证数据一致性
四、锁
实现了事物隔离的功能
InnoDB实现了行级锁
row-level lock
gap
next-lock
隔离级别:
脏读、不可重复读、幻读
RU
RC
RR:解决了不可重复读,但是会出现幻读,通过gap和next-lock解决幻读
SR
select @@transaction_isolation;
transaction_isolation=READ-UNCOMMITTED
transaction_isolation=READ-COMMITTED
transaction_isolation=REPEATABLE-READ
幻读含义:同一个事物,当前读发生了增量变化
五、InnoDB核心参数
存储引擎:
default_storage_engine=innodb
表空间模式(独立表空间):
innodb_file_per_table=1
共享表空间文件个数和大小:
innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend
双一标准:commit时候,redo log buffer刷到磁盘上
innodb_flush_log_at_trx_commit=1
控制 redo log buffer 和 buffer pool:
innodb_flush_method=(O_DIRECT, fsync)
fsync(默认):先刷新到os buffer,再到disk
O_DIRECT(建议):绕过os buffer,直接刷disk
redo日志设置:
innodb_log_buffer_size=16777216(16M)
innodb_log_file_size=50331648(50M)
innodb_log_files_in_group=2(ib_logfile0、ib_logfile1)
脏页刷写策略:
(1)innodb_max_dirty_pages_pct=75
(2)CSR
(3)redo文件满了