复制延迟/停止
症状
备库/副本正在落后或已完全停止;只读副本显示的是过时数据。
1. 延迟有多大,是在增长还是保持稳定
延迟是多少秒/字节?是稳定的偏差还是持续增长?若在增长,说明副本的应用跟不上;若保持稳定,则是出现过短暂停顿。
Oracle
SELECT name, value, unit FROM v$dataguard_stats WHERE name LIKE '%lag%';PostgreSQL
SELECT client_addr, state, write_lag, flush_lag, replay_lag FROM pg_stat_replication;MySQL
SHOW REPLICA STATUS\G -- Seconds_Behind_SourceSQL Server
SELECT ar.replica_server_name, drs.redo_queue_size, drs.log_send_queue_size FROM sys.dm_hadr_database_replica_states drs JOIN sys.availability_replicas ar ON drs.replica_id=ar.replica_id;Redis
INFO replication # master_repl_offset vs slave offset2. 复制是否在运行,是否有错误
IO/SQL 线程状态如何、应用进程如何、连接是否断开?若有错误(例如冲突行、缺失的表),应用已停止;请阅读错误信息。
MySQL
SHOW REPLICA STATUS\G -- Replica_IO_Running / Replica_SQL_Running / Last_ErrorPostgreSQL
SELECT status, last_msg_receipt_time, latest_end_lsn FROM pg_stat_wal_receiver; -- on the standbyOracle
SELECT process, status, sequence#, thread# FROM v$managed_standby WHERE process LIKE 'MRP%' OR process LIKE 'RFS%';3. 找出瓶颈
为什么跟不上?是单线程应用加上繁重的写入负载(PG/MySQL 大多串行应用)、备库上的 I/O 瓶颈、网络,还是长查询阻塞了应用(PG hot_standby_feedback / recovery conflict)?
4. 消除延迟
加快应用:启用并行应用(MySQL replica_parallel_workers——8.0.26 之前为 slave_parallel_workers;PG 没有该功能,但有相关的 recovery 设置)、改善备库 I/O、解决阻塞应用的查询。若因错误而停止:修复错误(手动解决冲突行)并恢复复制。
5. 若已损坏则重建
若副本严重落后/已损坏,重新同步是最干净的做法:用新的备份重建备库(PG pg_basebackup、MySQL clone/xtrabackup、Oracle RMAN duplicate)。关键:重建之前先找出原因,否则问题会再次发生。