数据库常见故障诊断与处理
常见故障诊断与处理
硬件故障
编号 | 名称 | 症状 | 处理 |
---|---|---|---|
H01 | Primary节点宕机 | pg_up = 0 持续1-3分钟 | 无需立即介入。 事后补充实例 从接入域名摘除 执行 Case 8:集群角色调整 |
H02 | Replica节点宕机 | pg_up = 0 持续1-3分钟 | 无需立即介入。 事后补充实例, 从接入域名摘除 执行 Case 8:集群角色调整 |
H03 | Primary节点网络分区 | 失去 主实例所有监控数据,网路不可达 | 确认Failover情况 必要时强制Fencing旧主库 |
H04 | Replica节点网络分区 | 失去 从实例所有监控数据,网路不可达 | 通常无影响,等待恢复 联系运维与网络工程师处理 |
H05 | TCP重传率过高 | TCP Retrans长时间居高不下,大量Conn Reset,大量查询请求失败 | 找运维与网络工程师处理 |
H06 | 节点内存错误 | EDAC计数器增长,系统错误日志 | 确认从库内存无错后 执行Case 10:集群主从切换 |
H07 | 磁盘坏块,数据腐坏 | 查询结果与日志出现 can’t read block 等错误信息 | 执行Case 10:集群主从切换 使用数据恢复工具,人工恢复数据 |
R01 | CPU使用率高 | CPU / Load / Pressure指标高 | top确认大CPU占比程序并清理 如为雪崩,执行杀查询止损。 |
R02 | 出现OOM | 出现进程Failure,OOM消息,内存使用高,开始使用SWAP | 确认内存,确认SWAP top确认大内存占用程序并清理 重新拉起被杀进程 紧急添加SWAP分区 |
R03 | 磁盘满 | 磁盘写满 数据库Crash 大量shell命令无法执行 | 移除 /pg/dummy 释放应急空间检查并处理WAL堆积 检查并处理大量Log文件 确认业务是否有可清理数据 |
R06 | 磁盘/网卡IO过高 | 磁盘/网卡 BandWidth过大 磁盘 > 2GB/s 网络 > 1 GB/s | 检查使用网络/磁盘的应用程序,如备份,添加限速。 |
软件故障
编号 | 名称 | 症状 | 处理 |
---|---|---|---|
SP1 | 数据库进程中止 | ps aux 找不到postgres进程 | 检查Postgres,Patroni状态 确认Failover结果,或手工执行Failover |
SP2 | 连接池进程中止 | systemctl status pgbouncer Failure | 重启服务组件 或 重置服务组件 |
SP3 | Primary Patroni进程中止 | systemctl status patroni Failure | 同上,进入维护模式,重启或重置 Patroni |
SP4 | Primary Consul进程中止 | systemctl status consul Failure | 同上,进入维护模式,重启或重置 Consul |
S05 | HAProxy进程中止 | systemctl status haproxy Failure | 同上,重启或重置 Haproxy |
S06 | 连接池污染 | 出现类似于 Cannot execute xxx on readonly transactions 的报错 | 重启Pgbouncer连接池 或配置 server_reset_query |
S07 | 连接池无法连接至数据库 | pgbouncer can not connect to server | 检查用户、密码、HBA配置是否正确 执行 Case 4:集群业务用户创建 刷新用户 |
S08 | 连接池达到QPS瓶颈 | PGbouncer QPS 达到 3~4W,CPU使用率达到100% | 使用多个Pgbouncer(不推荐) 使用Default服务绕开Pgbouncer 通知业务方限速 |
S09 | DCS Server不可用 | 自动切换模式下,所有主库将在TTL后进入不可写状态 | 立即将所有集群设置为维护模式 |
S10 | DCS Agent不可用 | 若为从库无影响,若为主库,会降级为从库,集群不可写入 | 立即将该集群设置为维护模式 |
S11 | XID Wraparound | 年龄剩余1000w时,进入保护模式。 | 应通过监控提前避免此问题 定位年龄过大的数据库与表,执行紧急清理 迅速定位阻塞Vacuum的原因并解决 进入单用户模式下恢复 |
S12 | WAL堆积 | WAL大小持续增长 | 多次执行CHECKPOINT 确认WAL归档状态 确认从库上是否有未结束超长事务 确认是否有复制槽阻止WAL回收 |
人为问题
编号 | 名称 | 症状 | 处理 |
---|---|---|---|
M01 | 误删数据库集群 | 数据库集群没了 | 使用冷备恢复集群 准备跑路 |
M02 | 误将某实例提升为主库 | 脑裂 | 自动模式下无需处理,否则脑裂 |
M03 | 误删数据 | 数据没了 | 停止VACUUM,使用 pg_dirtyread 提取。从延迟备库中提取 从冷备份中提取并恢复 |
M04 | 误删表 | 表没了 | 从延迟备库中提取 从冷备份中提取并恢复 |
M05 | 整型序列号溢出 | Sequence超出INTMAX | 参考整型主键在线升级手册处理 |
M06 | 插入数据因主键序列号重复而冲突 | violate constratint … | 增长序列号值(如+100000) |
M07 | 慢查询堆积/雪崩 | 大量慢查询日志 | 使用 pg_terminate_backend 周期性清理慢查询(如每1秒) |
M08 | 死锁堆积/雪崩 | 锁堆积 | 使用 pg_terminate_backend 周期性清理查询(如每1秒) |
M09 | HBA拒绝访问 | no hba entry for xxx | Case 6:集群HBA规则调整 |
M10 | 用户密码错误 | password auth failure for xxx | Case 4:集群业务用户创建 |
M11 | 访问权限不足 | permission denied for x | 检查用户是否使用正确的管理员创建对象 参考 Default Privilege 手工修正对象权限 |
最后修改 2022-05-27: init commit (1e3e284)