skip_slave_start =0
relay_log =/database/mysql/log/relaylog/330
7/relay-bin
relay_log_recovery =1
master_info_repository =table
relay_log_info_repository =table
slave_parallel_type =logical_clock
slave_parallel_workers =4
loose-rpl_semi_sync_master_enabled =1
loose-rpl_semi_sync_slave_enabled =1
loose-rpl_semi_sync_master_timeout =1000
slave_rows_search_algorithms = 'INDEX_SCAN,HASH_SCAN'
binlog_group_commit_sync_delay =500
binlog_group_commit_sync_no_delay_count = 13
binlog_transaction_dependency_tracking = WRITESET
transaction_write_set_extraction = XXHASH64
3. 备份导致写入阻塞
我们有一部分的 MySQL 备份计划是采用备库上每天凌晨执行物理全备的方法做备份。物理全备
采用的是开源工具 xtrabackup ,实际上无论使用 xtrabackup 或者 mysqldump,备份工具都需要
执行 FLUSH TABLES WITH READ LOCK (FTWRL)命令,这个命令需要获取一些锁。
1. 如果此时在备库上有大查询,就堵塞 FTWRL 操作,备库 show processlist “显示 Waiting for
table flush” ,这个 FTWRL 被阻塞会从而导致这张表上的事务无法提交,也就是影响扩大了,影响到
表的写入了。这个一般不常见,因为如果这个从库定位为备库一般就规范使用会不作为读写分离的
只读库使用,上面不应该有大查询。
2. 如果库里 MyISAM 表比较多,为了保证备份数据的一致性,FTWRL 操作持续时间会较长,直到所
有 MyISAM 表拷贝完成,期间任何写入都会被阻塞,卡在 "Waiting for global read lock",解决这个
问题的办法就是永远不要使用 MyISAM 存储引擎的表,请将他们修改为 InnoDB 存储引擎的表。
#设置以下参数保证没有人能使用 MyISAM 表,保平安。
[mysqld]
...
default_storage_engine=innodb
# MySQL5.7 以 后 官 方
默认值
default_tmp_storage_engine=innodb
# MySQL5.7 以后官方
默认值
disabled_storage_engines=ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,M
ERGE,NDB,MyISAM
因为 MySQL5.7 中 MySQL 元数据还有 MyISAM 表,所以以上设置会影响 MySQL5.7 的小版本升
级,需要一些小技巧解决,MySQL8.0 的话就直接干吧。
评论