بنقرة واحدة
data-operations-safety
生产数据操作、备份恢复、批量修复、数据导出和高风险变更前使用。适用于上线门禁、恢复验证、脱敏边界和操作风险评估。融合 SRE 双人复核 + 灰度执行 + 三层备份 + GDPR 脱敏。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
生产数据操作、备份恢复、批量修复、数据导出和高风险变更前使用。适用于上线门禁、恢复验证、脱敏边界和操作风险评估。融合 SRE 双人复核 + 灰度执行 + 三层备份 + GDPR 脱敏。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
设计 API 认证鉴权和权限矩阵时使用。适用于多角色系统、租户隔离、字段级权限。优先使用 OAuth 2.0 / JWT + RBAC + 资源归属检查。
设计具体 API 端点时使用。适用于资源建模后的下一步、列端点清单、HTTP 方法和状态码选择。优先使用 RFC 7231 HTTP 语义 + GitHub REST 命名规范。
设计 API 错误码和错误结构时使用。适用于错误响应规范、调用方错误处理、调试可观测。优先使用 RFC 7807 Problem Details + 业务错误码 + 调用方处理建议。
设计幂等接口和重试策略时使用。适用于支付、扣减、订单、关键写操作。优先使用 Idempotency-Key + 业务去重键 + 并发冲突处理(ETag/版本号)。
输出 OpenAPI 契约和 Mock 服务时使用。适用于 API 设计的最后一步、给前端/后端/QA 的交付。优先使用 OpenAPI 3.1 + Mock 数据覆盖所有路径 + 详细的下游交接清单。
设计列表接口的分页、筛选、排序、搜索时使用。适用于所有列表 API。优先使用 cursor 分页(大数据)或 offset 分页(小数据)+ 统一筛选/排序规范。
| name | data-operations-safety |
| description | 生产数据操作、备份恢复、批量修复、数据导出和高风险变更前使用。适用于上线门禁、恢复验证、脱敏边界和操作风险评估。融合 SRE 双人复核 + 灰度执行 + 三层备份 + GDPR 脱敏。 |
参考来源:Google《Site Reliability Engineering》Postmortem 文化、AWS Well-Architected Framework、PostgreSQL Backup 文档、MySQL Operational Best Practices、GDPR / CCPA 合规规范。
1. 能恢复,才允许变更
未验证恢复的备份 = 没有备份
2. 双人复核(4-eyes principle)
生产 DELETE / UPDATE / DROP 必须 2 人确认
3. 灰度先于全量
1 行 → 100 行 → 10000 行 → 全部
4. 影响面预估必须做
COUNT 受影响行数 / 锁表时长 / 磁盘增量
5. 每次操作有审计
谁、何时、对什么、为什么、结果如何
6. 不可逆操作必须备份
DROP TABLE / DROP COLUMN / DELETE 大批
7. 脱敏永不可逆
测试 / 开发环境的生产数据必须脱敏
8. 操作脚本进版本控制
不在 production console 即兴写
□ 1. 授权
□ 操作目的
□ 操作人 + 审批人
□ 目标环境(dev / staging / prod)
□ 业务方知悉
□ 2. 影响面
□ 受影响表 / 行数
□ 锁表预估时间
□ 磁盘增量预估
□ 复制延迟影响
□ 受影响业务(哪些 API / 用户)
□ 3. 备份
□ 最近备份时间(< 24h)
□ 备份是否已验证恢复
□ 备份恢复 RTO(多久能恢复)
□ 必要时新建备份点
□ 4. 脚本质量
□ 脚本幂等
□ 脚本可暂停
□ 脚本可恢复
□ 分批 + 限速
□ 进度可观测
□ 5. 监控
□ 数据库 CPU / IO / 锁等待
□ 主从复制延迟
□ 磁盘空间
□ 业务指标(错误率 / P99)
□ 6. 回滚
□ 回滚条件清晰(错误率 > X / 延迟 > Y)
□ 回滚步骤可执行
□ 数据恢复路径
□ 7. 灰度
□ 1 行测试(dry-run)
□ 100 行
□ 10000 行
□ 全部
| 操作 | 必备检查 | 灰度策略 |
|---|---|---|
| DDL 变更 | 锁表风险、兼容性、回滚路径 | dev → staging → prod |
| 大表回填 | 分批、限速、幂等、进度记录 | 1k → 10k → 100k → 全部 |
| 批量 UPDATE | WHERE 复核、影响行数、备份 | 1 行 → 100 → 10000 → 全 |
| 批量 DELETE | 同 UPDATE + 强制备份 | 同上 |
| 索引变更 | 建索引耗时、磁盘、写入影响 | CONCURRENTLY 单表 |
| 数据导出 | 授权、脱敏、保存位置、销毁策略 | 小样 → 全量 |
| 恢复操作 | 备份有效性、恢复点、数据一致性 | 隔离环境先验证 |
| TRUNCATE | 备份 + 三人确认 | 无(不可逆) |
-- 阶段 1:DRY RUN(看影响行数)
BEGIN;
SELECT COUNT(*) FROM orders
WHERE status = 'unknown' AND created_at < '2025-01-01';
ROLLBACK;
-- 看到:影响 1234567 行
-- 阶段 2:1 行测试
BEGIN;
UPDATE orders SET status = 'archived'
WHERE id = (SELECT id FROM orders WHERE status = 'unknown' LIMIT 1);
-- 验证结果
SELECT * FROM orders WHERE status = 'archived' LIMIT 5;
COMMIT;
-- 阶段 3:100 行
BEGIN;
UPDATE orders SET status = 'archived'
WHERE id IN (
SELECT id FROM orders
WHERE status = 'unknown' AND created_at < '2025-01-01'
LIMIT 100
);
COMMIT;
-- 阶段 4:分批全量(限速)
DO $$
DECLARE
rows_updated INT;
total INT := 0;
BEGIN
LOOP
UPDATE orders SET status = 'archived'
WHERE id IN (
SELECT id FROM orders
WHERE status = 'unknown' AND created_at < '2025-01-01'
LIMIT 1000
);
GET DIAGNOSTICS rows_updated = ROW_COUNT;
total := total + rows_updated;
-- 进度
RAISE NOTICE 'Updated total: %', total;
EXIT WHEN rows_updated = 0;
PERFORM pg_sleep(0.1); -- 限速
END LOOP;
END $$;
1. 物理备份(每天)
- PostgreSQL: pg_basebackup / pgBackRest
- MySQL: xtrabackup / mysqlbackup
- 用途:完整恢复、克隆环境
2. 逻辑备份(每周或按需)
- PostgreSQL: pg_dump
- MySQL: mysqldump
- 用途:单表恢复、跨版本迁移
3. 持续归档(实时)
- PostgreSQL: WAL 归档(PITR 基础)
- MySQL: binlog
- 用途:Point-In-Time Recovery
#!/bin/bash
# 每月备份恢复演练
# 1. 在隔离环境恢复最近备份
restore_backup_to_test_env
# 2. 验证数据完整性
psql -h test_env -c "SELECT COUNT(*) FROM critical_tables"
# 3. 验证关键查询
psql -h test_env -c "SELECT COUNT(*) FROM orders WHERE created_at > now() - INTERVAL '1 day'"
# 4. 计算 RTO(恢复时间)
# 5. 计算 RPO(数据损失窗口)
# 6. 记录结果
echo "Backup test: PASS, RTO=15min, RPO=5min" >> /var/log/backup-test.log
# PostgreSQL PITR:恢复到任意时间点
pg_basebackup -D /backup/base/
# WAL 持续归档(postgresql.conf)
archive_mode = on
archive_command = 'cp %p /backup/wal/%f'
# 恢复到 2026-05-18 14:30:00
restore_command = 'cp /backup/wal/%f %p'
recovery_target_time = '2026-05-18 14:30:00'
-- 不可逆脱敏脚本(生产 → 测试)
-- 邮箱(保留域名)
UPDATE users SET email = MD5(email) || '@test.example.com';
-- 手机号(替换中间 4 位)
UPDATE users SET phone = SUBSTRING(phone, 1, 3) || '****' || SUBSTRING(phone, 8);
-- 姓名(保留姓 + 假名)
UPDATE users SET name = SUBSTRING(name, 1, 1) || '****';
-- 身份证(替换中间)
UPDATE users SET id_card = SUBSTRING(id_card, 1, 6) || '********' || SUBSTRING(id_card, 15);
-- 地址(仅保留城市级)
UPDATE users SET address = REGEXP_REPLACE(address, '(.*?[市县区]).*', '\1');
-- 银行卡(仅保留前 6 + 后 4)
UPDATE users SET card_number = SUBSTRING(card_number, 1, 6) || '******' || SUBSTRING(card_number, -4);
-- 完全删除
UPDATE users SET
password = NULL,
api_token = NULL,
refresh_token = NULL,
notes = NULL; -- 用户备注可能含 PII
-- 跳过最近的活跃用户(避免泄露)
DELETE FROM users WHERE last_login_at > now() - INTERVAL '30 days';
-- 记录所有导出
CREATE TABLE export_audit (
id bigserial PRIMARY KEY,
exported_by varchar(64) NOT NULL,
exported_at timestamptz DEFAULT now(),
table_name varchar(64) NOT NULL,
row_count bigint,
destination varchar(255) NOT NULL,
reason text,
approved_by varchar(64) NOT NULL,
retention_days integer DEFAULT 30
);
1. 评估影响
- 影响行数 / 用户数
- 业务影响
- 是否需要客户沟通
2. 备份当前状态
- 即使数据已损坏,备份是修复依据
- CREATE TABLE backup_before_fix AS SELECT * FROM ...
3. 在 staging 验证修复脚本
- 完整 dry-run
4. 双人复核
- 第二人 review SQL
- 第二人执行(如可能)
5. 生产执行(灰度)
- 1 行 → 100 行 → 全量
6. 验证
- 修复后状态符合预期
- 业务指标恢复
7. 通知
- 业务方
- 受影响用户(如适用)
8. 复盘
- 写 postmortem
- 沉淀到 field-journal
- 评估流程改进
-- 场景:bug 导致 500 个订单状态错误
-- 阶段 1:备份
CREATE TABLE _backup_orders_2026_05_18 AS
SELECT * FROM orders
WHERE id IN (...) -- 受影响 ID 列表
;
-- 阶段 2:dry run
SELECT id, status, expected_status
FROM (
SELECT id, status,
CASE WHEN ... THEN 'paid' ELSE 'cancelled' END AS expected_status
FROM orders
WHERE id IN (...)
) sub
WHERE status != expected_status;
-- 验证 500 行符合预期
-- 阶段 3:1 行修复
UPDATE orders SET status = 'paid'
WHERE id = (SELECT id FROM ... LIMIT 1);
-- 业务验证:1 个用户的订单状态正常
-- 阶段 4:批量
BEGIN;
UPDATE orders SET status = ... WHERE id IN (...);
-- COMMIT 前再 SELECT 验证
SELECT COUNT(*), status FROM orders WHERE id IN (...) GROUP BY status;
COMMIT;
-- 阶段 5:清理
-- 30 天后删除备份表
DROP TABLE _backup_orders_2026_05_18;
-- PostgreSQL:dry-run 看影响
EXPLAIN (ANALYZE FALSE)
UPDATE orders SET status = 'archived'
WHERE created_at < '2025-01-01';
-- 看 actual rows 估算
-- 实际跑:包在事务里看结果
BEGIN;
UPDATE orders SET status = 'archived'
WHERE created_at < '2025-01-01' LIMIT 100;
SELECT COUNT(*) FROM orders WHERE status = 'archived';
ROLLBACK; -- 或 COMMIT
-- 防止 UPDATE/DELETE 不带 WHERE
SET sql_safe_updates = 1;
-- 现在以下会报错:
DELETE FROM orders; -- ERROR 1175
-- 必须明确条件
DELETE FROM orders WHERE id = 123; -- OK
templates/db-change-safety-checklist-template.md — 操作前完整检查 + 影响评估 + 备份确认 + 灰度方案 + 回滚 + 审计□ 明确环境、授权范围和负责人
□ 双人复核(生产 DELETE / DROP)
□ 备份和恢复验证
□ 估算影响行数、锁、磁盘、耗时
□ 脚本幂等、分批、可重试、可停止
□ 设置监控和回滚条件
□ 灰度执行(1 → 100 → 10k → 全部)
□ 避免泄露敏感数据
□ 记录执行结果和复盘项
□ 操作脚本进版本控制
□ 不在 production console 即兴写 SQL
□ 修复脚本在 staging 验证过
上游:
migration-rollout → 提供迁移计划
consistency-multitenancy → 提供租户和权限边界
schema-design → 提供 DDL
下游:
devops-engineer → 执行窗口、监控、CI/CD
sre-ops → 监控、告警、恢复
security-engineer → 敏感数据和权限审查
field-journal → 记录真实操作经验
qa-engineer → 数据修复后的回归
references/data-operations-safety-guide.md — SRE Postmortem、生产事故案例库、备份恢复演练、脱敏脚本完整库、双人复核流程