Google SQL External Read Replica 未更新问题排查咨询
问题定位步骤
1. 验证副本同步链路的底层状态
- 检查复制账号权限:确认你配置的复制账号在源库是否拥有
REPLICATION SLAVE、REPLICATION CLIENT这类必要权限,权限不足会导致复制进程拉不到增量binlog,但重试时会反复拉取全量备份临时文件,徒增存储占用 - 核对源库和副本的版本兼容性:不同大版本的SQL实例(比如MySQL 5.7和8.0、不同云厂商的托管SQL实例)如果存在binlog格式不兼容的问题,会导致增量解析失败,副本会自动触发全量重同步逻辑,产生存储占用但不会落地实际的增量数据更新
- 检查源库binlog保留策略:如果源库的binlog保留时间短于副本第一次拉取增量的时间,副本找不到对应的binlog位点,就会反复触发全量种子同步,每次同步都会生成完整的临时数据文件,导致存储涨幅和源库大小一致
2. 排查副本侧的隐藏进程与临时文件
- 列出副本实例的所有后台进程,执行
ps aux | grep mysql(以MySQL为例,其他数据库替换对应进程名),查看是否有未正常退出的全量同步进程在后台静默运行 - 检查副本的数据目录下是否存在大量
*.ibd临时文件、未提交的表空间文件,或者同步中间件生成的快照缓存文件,这类文件通常不会被统计到常规的读写操作指标里,但会持续占用存储 - 执行存储占用统计命令
du -h --max-depth=1 [数据目录路径],逐层定位到底是哪个目录的存储在增长,确认是否是同步快照的存储目录占用异常
3. 验证复制状态与元数据配置
- 执行副本的复制状态查询命令,比如MySQL的
show slave status\G(MySQL 8.0对应show replica status\G)、PostgreSQL的select * from pg_stat_wal_receiver;,重点核对:- 复制位点是否和源库当前位点一致
- 是否存在
Seconds_Behind_Master一直为0但Exec_Master_Log_Pos长时间不更新的情况 - 是否有隐藏的复制错误被实例的日志过滤规则屏蔽
- 检查副本的同步过滤规则:如果配置了错误的库表过滤规则,比如
replicate_wild_ignore_table匹配了所有表,会导致拉到的增量数据全部被过滤掉,看起来就像没有拉到更新,但是拉取binlog产生的临时文件还是会占用存储 - 核对源库和副本的server-id配置:如果两者的server-id重复,源库会拒绝发送增量binlog,副本就会反复触发全量重同步
4. 排查监控与日志的采集配置
- 确认你查看的日志是否覆盖了复制相关的日志路径,很多托管SQL实例的复制日志和常规SQL运行日志是分开存储的,不会出现在默认的SQL错误日志里
- 检查指标采集的过滤规则:确认读写操作、日志条目这类指标是不是没有采集复制进程的相关行为,很多默认的监控规则只会统计业务侧的读写操作,不会统计后台复制进程的IO行为,所以看起来没有读写记录但实际后台一直在拉取数据
内容的提问来源于stack exchange,提问作者Cat Named Dog
相关产品推荐
相关产品推荐

