vm的数据库已关闭怎么办
- 数据库
- 2025-08-17
- 6
初步诊断与基础排查
验证现象真实性
| 检查项 | 操作方法 | 预期结果 |
|---|---|---|
| 连接测试 | 使用客户端工具(如SQL Server Management Studio/psql/mysql -h)尝试连接 | 报错提示”无法建立连接” |
| 进程状态核查 | ps aux | grep <数据库进程名> (Linux) / 任务管理器(Windows) | 无对应进程运行 |
| 服务状态查询 | systemctl status <服务名> (Systemd) 或 service --status-all | 显示服务未运行或异常终止 |
️ 关键判断:若仅表现为应用层断连但底层进程存活,则属于连接池耗尽或超时策略触发;若进程完全消失,则为主动/被动停机事件。
典型诱因分类表
| 类别 | 具体表现 | 特征迹象 |
|---|---|---|
| 人为干预 | 近期执行过shutdown immediate命令 | 日志含”User requested shutdown” |
| 硬件故障 | 突然断电/磁盘IO飙升后宕机 | 系统日志出现SCSI错误/硬盘SMART警告 |
| 软件缺陷 | 版本升级后兼容性问题 | 核心转储文件生成+特定模块崩溃堆栈 |
| 资源竞争 | 高峰期CPU/内存占用率持续>90% | 交换分区激增+GC暂停时间延长 |
| 安全机制触发 | Selinux阻断/AppArmor规则限制 | audit日志记录DENY动作 |
| 定时任务冲突 | crontab任务与守护进程抢占端口 | syslog显示”Address already in use” |
分级处置方案
A. 应急重启(适用于非灾难性停机)
# Linux示例(以PostgreSQL为例) sudo systemctl start postgresql@13-main # 根据实际集群命名规范调整 # Windows示例 net start MSSQLSERVER /PREFIX=instancename
成功标志:监听端口恢复正常(默认TCP 5432/1433/3306),且pg_ctl status或sqlcmd -S可获取版本信息。
B. 深度故障排查
-
日志挖掘三板斧


- 错误追踪:重点查看/var/lib/pgsql/data/pg_log(PG)、C:Program FilesMicrosoft SQL ServerMSSQLxx.LOG(MSSQL)
- 时间关联:将系统日志(journalctl -u postgresql)、数据库日志、应用日志进行时间轴比对
- 高频错误码解析:
| 错误码 | 含义 | 推荐操作 |
|————–|————————–|—————————|
| FATAL: out of memory | 共享缓冲区不足 | 增大shared_buffers参数 |
| ORA-01578 | 归档日志满 | 清理过期归档+调整retention policy |
| [42][S0202] | 连接数超限 | 提升max_connections限制 |
-
核心文件校验

- 数据完整性检查:REPAIR TABLE(MySQL)、pg_resetwal(PG)
- 配置文件回滚:对比postgresql.conf与模板文件的差异,特别是max_connections, work_mem等关键参数
- 权限体系审查:确认OS用户组与数据库角色映射关系正确(如pg_hba.conf中的method设置)
- 根因:促销规则引擎产生的复杂事务导致undo log暴增,最终撑爆InnoDB buffer pool
- 解决:紧急扩容至32GB RAM,修改innodb_buffer_pool_size=24G,启用innodb_autoincresize动态调整
- 教训:压力测试应覆盖业务峰值的150%,并设置innodb_lru_scan_depth=100提升扫描效率
- 现象:ASM实例挂载失败,数据文件标记为OFFLINE
- 修复:通过ALTER DISKGROUP ... MOUNT;重新挂载,使用RMAN REPAIR FAILURE修复受损EXTENTS
- 改进:部署ASM过滤器防止低性能磁盘加入存储池,设置_disk_substring_match='^/dev/mapper/'限定设备范围
C. 特殊场景处理
场景类型 解决方案 风险等级 主从复制中断 执行SELECT pg_last_xact_replay_lag();评估滞后量,必要时重建备库 表空间膨胀 使用VACUUM FULL重组物理存储,配合ALTER TABLESET TABLESPACE迁移热点表 跨版本迁移失败 采用逻辑备份(pg_dump)+自定义类型注册方式实现向前兼容
长效防护机制建设
监控体系强化
监控维度 推荐工具 阈值设置建议 进程存活 Prometheus+node_exporter 连续3次心跳丢失触发告警 慢查询检测 Percona Toolkit >1秒的查询占比超过5%报警 锁等待统计 PgBouncer+pg_stat_activity 平均锁等待时间>200ms预警 冷热数据分布 AgensGraph可视化分析 Hot分区占比超过30%需优化 容灾架构设计
组件 实施方案 RTO/RPO目标 本地高可用 Patroni+ETCD集群 RTO<30s, RPO=0 异地备份 S3 Glacier DeepArchive+MinIO同步 每日增量备份+每周全量 流量切换 Keepalived VRRP+DNS轮询 手动切换<5分钟
典型案例复盘
案例1:某电商大促期间MySQL宕机
案例2:金融行业Oracle ASM磁盘脱落
相关问答FAQs
Q1: 数据库自动停止但没有明显错误日志怎么办?
A: 优先考虑以下隐蔽原因:① OOM Killer终止进程(检查dmesg | grep oom-killer);② cgroup资源限制(查看cat /sys/fs/cgroup/memory/your_cgroup/memory.limit_in_bytes);③ KSM合并脏页导致的延迟写入丢失,建议开启审计模式:auditctl -a exit,always -F arch=b64 -S task_struct捕获退出信号。
Q2: 重启后立即再次停止如何处理?
A: 这是典型的死循环故障,可采用”隔离法”定位:① 最小化启动参数(仅保留必要扩展);② 禁用插件/触发器逐个排查;③ 新建空数据库测试基础功能,某银行曾遇此问题,最终发现是由于自定义审计函数中的无限递归调用导致,临时绕过方案:ALTER PROCEDURE suspicious_proc() UNDEFINE;禁用