ワンクリックで
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、生产事故案例库、备份恢复演练、脱敏脚本完整库、双人复核流程