今天mysql又遇备库延迟案例,顺便总结一下
mysql>show slave status\g
slave_io_state: waiting for master to send event
master_host: 10.10.13.20
master_user: rpl_user
master_port: 3310
connect_retry: 60
master_log_file: mysql-bin.000013
read_master_log_pos: 48207531
relay_log_file: relay-bin-rpl1.000023
relay_log_pos: 1153
relay_master_log_file: mysql-bin.000013
slave_io_running: yes
slave_sql_running: yes
replicate_do_db:
replicate_ignore_db:
replicate_do_table:
replicate_ignore_table:
replicate_wild_do_table:
replicate_wild_ignore_table:
last_errno: 0
last_error:
skip_counter: 0
exec_master_log_pos: 940
relay_log_space: 48208449
until_condition: none
until_log_file:
until_log_pos: 0
master_ssl_allowed: no
master_ssl_ca_file:
master_ssl_ca_path:
master_ssl_cert:
master_ssl_cipher:
master_ssl_key:
seconds_behind_master: 65708
master_ssl_verify_server_cert: no
last_io_errno: 0
last_io_error:
last_sql_errno: 0
last_sql_error:
replicate_ignore_server_ids:
master_server_id: 2155887676
master_uuid: 000c1822-5be5-11ec-be70-a8ca7b94d69c
master_info_file: mysql.slave_master_info
sql_delay: 0
sql_remaining_delay: null
slave_sql_running_state: waiting for dependent transaction to commit
master_retry_count: 86400
master_bind:
last_io_error_timestamp:
last_sql_error_timestamp:
master_ssl_crl:
master_ssl_crlpath:
retrieved_gtid_set: 000c1822-5be5-11ec-be70-a8ca7b94d69c:20-2141
executed_gtid_set: 000c1822-5be5-11ec-be70-a8ca7b94d69c:1-2136,
6feab22c-5be4-11ec-b641-1047800760df:1-16
1.查看目前执行的事务
seconds_behind_master的数值不断在变大,首先看看目前正在跑的是什么事务,
查看relay_master_log_file: mysql-bin.000013和exec_master_log_pos: 940
在主库:
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000013 | grep -a '100' 940
发现目前卡在执行gtid:000c1822-5be5-11ec-be70-a8ca7b94d69c:2137上,这是一个大事务,批量删除delete from procu1 limit 6000000。因为binlog设置的row格式,主库在执行了一条delete sql;在binlog会生成六百万条delete记录,到了备库要执行六百万次。
2.查看事务表
在备库:
mysql>select * from information_schema.innodb_trx\g
trx_id:25389
trx_state:running
start:2020-12-11 10:33:41
requested_lock_id:null
waite_started:null
weight:107178
mysql_thread_id:94
tables_in_use:1
tables_locked:1
lock_structs:692
lock_memory_bytes:90320
rows_locked:212972
rows_modified:106486
concurrency_tickets:0
isolation_leve:read commited
unique_checks:1
foreign_key_checks:1
foreign_key_error:null
没有具体的sql语句trx_query,可以看到rows_locked和rows_modified在增加。rows_modified这个值要一直增加到六百万才结束,而且因为autocommit=off,数据目前都是在undo上
3.查看innodb引擎信息
在备库:
mysql>show engine innodb status\g
摘要:
---transaction **25389**, active 58424 sec
mysql tables in use 1, locked 1
18740 lock struct(s), heap size 3137744, 11885860 row lock(s), undo log entries 5942930
mysql thread id 65, os thread handle 139944933123840, query id 415 executing event
4.查看会话信息
在备库:
mysql>show processlist
| 64 | system user | | null | connect | 58362 | waiting for dependent transaction to commit | null |
| 65 | system user | | null | connect | 66073 | executing event | null |
备库复制线程是在后台执行,若是kill掉线程,会暂停slave同步,无法解决。
可以尝试让备库资源宽裕,加快执行,然后耐心等待大事务完成,追上最新数据。
例如一些优化操作:
set global innodb_buffer_pool_size=增大值;
set global slave_pending_jobs_size_max=增大值;
set global foreign_key_checks=0;
set global unique_checks=0;
set global innodb_flush_log_at_trx_commit=0;
set global sync_binlog=0;
若是考虑需要等候时间太久,人工干预方案:
-
跳过事务
在备库手动执行跑批操作,不做binlog记录,再跳过gtid
stop slave;
set sql_log_bin=0;
set global super_read_only=0;
delete from procu1 limit 6000000;
commit;
set global super_read_only=1;
set sql_log_bin=1;
set @@session.gtid_next= '000c1822-5be5-11ec-be70-a8ca7b94d69c:1-2137';
begin; commit;
set session gtid_next = automatic;
start slave;
-
重做备库
在主库全量备份,恢复到备库
一、常见主备延迟场景
- 备库所在机器的性能要比主库所在的机器性能差
- 备库的查询压力大
- 大事务
- 大表ddl
- 备库的并行复制能力
- 随机重放
- 主库并发高
- 锁等待
二、常见主备延迟优化
1.主库优化
- dml大事务,分拆小事务,小量分批多次执行
- ddl大表操作,第三方工具pt-online-schema-change,业务低谷执行
2.备库优化
- 增大从库参数innodb_buffer_pool_size的值,可以缓存更多数据,减少由于转换导致的io压力。
- 增大参数innodb_log_file_size、innodb_log_files_in_group的值,减少buffer pool的刷盘io,提升写入性能。
- 修改参数innodb_flush_method为o_direct,提升写入性能。
- 关掉从库binlog日志或者关掉参数log_slave_updates.
- 修改参数innodb_flush_log_at_tr_commit为0或2.
- 如果binlog没有关掉(gtid开启,需要binlog日志打开),修改sync_binlog参数为0或者一个很大的值,减少磁盘io压力。
- 如果binlog_format为row模式并且被修改表没有主键,则需要加上主键
- 如果binlog_format为row模式,则可以在备库总删除一些不必要的索引(同步完成之后再加上)。
- 了解清楚写库上操作内容,适当地在备库中预热一些数据,可以减少在复制时等待的时间。
- 修改参数master_info_repository、relay_log_info_repository为table,减少直接io导致的磁盘压力。
- 可以打开多线程复制。slave_parallel_type=‘logical_clock’ slave_parallel_workers=32
- 升级mysql 版本
- 升级硬件
最后修改时间:2022-05-06 15:24:01
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。