InnoDB 通过 redo log 实现 crash-safe 能力,即使数据库发生异常重启,已提交的事务都不会丢失。
内部实现
ib_logfile+ 数字
redo log 的写入机制
write 和 fsync 的时机由参数 innodb_flush_log_at_trx_commit 控制
后台线程自动持久化 redo log buffer 的场景
innodb_log_buffer_size
应用场景
binlog 的写入机制
binlog_cache_size
max_binlog_size
write 和 fsync 的时机由参数 sync_binlog 控制
binlog 组提交
sync_binlog 和 binlog_group_commit_sync_no_delay_count 的区别
查看 binlog 相关命令
# 查看 binlog 内容的 2 种方法 mysql> show binlog events in 'master.000001'; mysqlbinlog -vv data/master.000001 --start-position=8900; # 查看binlog_format: mysql> show session variables like 'binlog_format'; # 修改日志格式: mysql> set session binlog_format=statement; mysql> set session binlog_format=row; # 查看日志文件列表: mysql> show binary logs; # 根据查看到的日志文件使用显示日志事件的命令: mysql> show binlog events in 'XXX';
statement:binlog 记录的是 SQL 语句的原文
show warnings
row:binlog 记录的是数据行的内容变化
mysqlbinlog master.000001 --start-position=2738 --stop-position=2973 | mysql -h127.0.0.1 -P13000 -u$user -p$pwd;
mixed:对 safe 语句记录的是 SQL,对 unsafe 语句记录的是 row
now()
SET TIMESTAMP=1546103491
innodb_io_capacity
innodb_flush_neighbors
控制全力刷脏页的速度上限,即告诉 InnoDB 主机的 IO 能力。参数 innodb_io_capacity,设置成磁盘的IOPS,默认值为200,如果主机磁盘用的是SSD,建议改为 20000。
mysql> show global variables like 'innodb_io_capacity';
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
控制按全力速度的百分之几来刷脏页。为了避免平时刷太慢,导致内存脏页太多,或 redo log 写满,InnoDB 就根据这两个因素决定平时刷脏页速度百分比。R % = max{ func1(当前脏页比例)、func2(redo log 写盘的速度) }。参数 innodb_max_dirty_pages_pct 控制脏页比例上限,默认值是 75%。平时要多关注脏页比例,不要让它经常接近 75%。
R % = max{ func1(当前脏页比例)、func2(redo log 写盘的速度) }
innodb_max_dirty_pages_pct
mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
mysql> select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
mysql> select @a/@b;
刷新相邻页面策略:连坐刷邻居可以减少很多随机 IO,对机械硬盘(几百 IOPS )能大幅提升性能,对 SSD 建议关闭(MySQL 8.0 中默认是 0)。因为 IOPS 往往不是瓶颈,而“只刷自己”,就能更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。
sql Show variables like "output";
set long_query_time=0