Linux怎么编写全套数据库故障自动演练脚本实施常态化断电测试

酷杰酱_7134

酷杰酱_7134

2026-10-18

151人浏览

原创

sigkill(kill -9)是唯一能真实模拟断电式异常终止的软件手段,它强制中断数据库主进程、丢弃未刷盘数据并触发crash recovery,但必须精准杀主进程、启用fsync/synchronous_commit、校验recovery完成状态且隔离环境常态化执行。

linux怎么编写全套数据库故障自动演练脚本实施常态化断电测试

断电测试不能真断电,kill -9 模拟更可控

真关电源不仅风险高、难复现,还会污染硬件环境。生产库常态化演练必须用软件方式模拟异常终止——核心就是向数据库主进程发送 SIGKILL(即 kill -9),绕过正常关闭流程,强制中断所有连接、丢弃未刷盘的 WAL 和 buffer 数据,触发 crash recovery 流程。

关键点在于:必须精准 kill 主进程(不是 pg_ctl 或 wrapper 进程),且确保数据库已启用 fsync=on 和 synchronous_commit=on(否则 recovery 行为不典型)。

  • 查主进程 PID:ps -eo pid,comm,args | grep postgres | grep -v "grep" | grep -v "pg_ctl",取第一个非辅助进程的 pid
  • 避免误杀:用 pg_controldata 先确认数据目录状态,再执行 kill -9 $PID
  • PostgreSQL 12+ 可配合 pg_ctl stop -m immediate,但该命令仍会做 checkpoint,不如 kill -9 彻底;MySQL 则需 kill mysqld 主线程(ps -eLo pid,tid,comm,args | grep mysqld | grep -v "grep" 找 TID=PID 的那行)

脚本必须校验 recovery 是否真正完成,不能只看进程起来

很多脚本用 pg_isready -U $USER -d $DB 或 mysqladmin ping 就判定“恢复成功”,这是严重误区。进程起来了,但可能卡在 replay WAL 阶段,查询仍报 database is starting up 或连接被拒绝。

PostgreSQL 要等 pg_is_in_recovery() 返回 false;MySQL 要确认 SHOW STATUS LIKE 'wsrep_local_state_comment'(Galera)或 SELECT @@innodb_buffer_pool_load_status(InnoDB warmup 完成)。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • PostgreSQL 示例轮询逻辑:
    while pg_isready -q && psql -tAc "SELECT NOT pg_is_in_recovery();" 2>/dev/null | grep -q "t"; do sleep 2; done
  • MySQL 示例(单机):
    while ! mysql -e "SELECT 1" 2>/dev/null | grep -q "1"; do sleep 1; done && mysql -e "SELECT @@innodb_buffer_pool_load_status;" 2>/dev/null | grep -q "DONE"
  • 超时必须设限(如 300 秒),超时则标记失败并保留 pg_log/ 或 error.log 快照

演练日志和指标要自动采集,否则无法闭环

一次断电后 recovery 耗时 8 秒还是 80 秒?WAL 重放了多少条?buffer pool 命中率是否跌穿阈值?这些不记录,演练就只是“跑通了”,没有持续改进价值。

建议在 kill 前后各采集一次基础指标快照,而非依赖事后人工查:

  • PostgreSQL:pg_stat_database(xact_rollback、blks_read)、pg_stat_bgwriter(checkpoints_timed、buffers_checkpoint)
  • MySQL:SHOW GLOBAL STATUS(Innodb_buffer_pool_read_requests、Innodb_buffer_pool_reads)、SHOW ENGINE INNODB STATUS 中的 LOG section
  • 统一用 date +%s.%3N 打时间戳,输出到带日期前缀的 /var/log/db-drill-$(date +%Y%m%d).log

定时任务 + 环境隔离是常态化的硬性前提

把脚本丢进 crontab 不等于常态化——没隔离的测试会污染开发/测试库,而 cron 缺少失败告警和历史追溯能力。

  • 必须使用独立数据库实例(Docker 容器或专用 VM),数据目录与生产完全分离
  • 用 systemd timer 替代 cron:支持 OnFailure=、Persistent=true、随机延迟(RandomizedDelaySec=300),更适合故障演练节奏
  • 每次执行前检查磁盘剩余空间(df -B1 $PGDATA | awk 'NR==2 {print $4}'),低于 2GB 自动跳过并告警

最易被忽略的是:不同版本 PostgreSQL 对 pg_wal/archive_status/ 文件清理策略不同,MySQL 8.0.23+ 的 innodb_redo_log_capacity 会影响 recovery 启动速度——这些参数差异不纳入脚本判断逻辑,演练结果就不可比。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2705

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3921

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2971

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

967

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2607

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2607

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2873

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2421

3

mdf文件导入数据库的方法
mdf文件导入数据库的方法

mdf文件导入数据库的方法有使用SQL Server Management Studio、使用SQL Server命令行工具、使用SQL Server Integration Services等方法。想了解更多mdf文件导入数据库的方法的相关内容,可以阅读本专题下面的文章。

2023.10.23

2613

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习