备份与恢复 #

一、备份概述 #

1.1 备份类型 #

text
备份类型
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   全量备份:                                                 │
│   ├── 备份所有数据                                         │
│   ├── 独立完整                                             │
│   └── 占用空间大                                           │
│                                                             │
│   增量备份:                                                 │
│   ├── 只备份变化的数据                                     │
│   ├── 依赖基础备份                                         │
│   └── 占用空间小                                           │
│                                                             │
│   时间点恢复:                                               │
│   ├── 恢复到指定时间点                                     │
│   ├── 需要增量备份链                                       │
│   └── 精确恢复                                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 备份存储 #

sql
-- 支持的存储位置
-- 1. 本地文件系统
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb';

-- 2. S3兼容存储
BACKUP DATABASE mydb TO 's3://bucket/backup/mydb?AWS_ACCESS_KEY_ID=xxx&AWS_SECRET_ACCESS_KEY=xxx';

-- 3. Google Cloud Storage
BACKUP DATABASE mydb TO 'gs://bucket/backup/mydb?CREDENTIALS=xxx';

-- 4. Azure Blob Storage
BACKUP DATABASE mydb TO 'azure://container/backup/mydb?AZURE_ACCOUNT_KEY=xxx';

二、全量备份 #

2.1 数据库备份 #

sql
-- 备份单个数据库
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb';

-- 备份多个数据库
BACKUP DATABASE mydb, testdb TO 'nodelocal://1/backup/multi';

-- 备份所有数据库
BACKUP TO 'nodelocal://1/backup/full';

-- 带选项的备份
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb'
    WITH 
        revision_history,  -- 保留版本历史
        encryption_passphrase = 'secret';  -- 加密备份

2.2 表备份 #

sql
-- 备份单个表
BACKUP DATABASE mydb TABLE users TO 'nodelocal://1/backup/users';

-- 备份多个表
BACKUP DATABASE mydb TABLE users, orders TO 'nodelocal://1/backup/tables';

-- 备份带过滤条件
BACKUP DATABASE mydb TABLE orders 
    TO 'nodelocal://1/backup/orders_2024'
    AS OF SYSTEM TIME '2024-01-01';

2.3 时间点备份 #

sql
-- 备份到指定时间点
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb'
    AS OF SYSTEM TIME '2024-01-01 00:00:00';

-- 备份到相对时间
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb'
    AS OF SYSTEM TIME '-1h';

三、增量备份 #

3.1 创建增量备份 #

sql
-- 先创建全量备份
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb_full';

-- 创建增量备份
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb_inc1'
    INCREMENTAL FROM 'nodelocal://1/backup/mydb_full';

-- 多级增量备份
BACKUP DATABASE mydb TO 'nodelocal://1/backup/mydb_inc2'
    INCREMENTAL FROM 
        'nodelocal://1/backup/mydb_full',
        'nodelocal://1/backup/mydb_inc1';

3.2 增量备份策略 #

text
增量备份策略
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   推荐策略:                                                 │
│                                                             │
│   周日: 全量备份                                            │
│   周一-周六: 增量备份                                       │
│                                                             │
│   备份链:                                                   │
│   ├── full_sunday                                          │
│   ├── inc_monday (from full_sunday)                        │
│   ├── inc_tuesday (from full_sunday, inc_monday)           │
│   ├── inc_wednesday (from full_sunday, inc_monday, ...)    │
│   └── ...                                                   │
│                                                             │
│   保留策略:                                                 │
│   ├── 保留最近4周的全量备份                                │
│   └── 保留对应的增量备份                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

四、恢复操作 #

4.1 恢复数据库 #

sql
-- 恢复数据库
RESTORE DATABASE mydb FROM 'nodelocal://1/backup/mydb';

-- 恢复到新数据库
RESTORE DATABASE mydb FROM 'nodelocal://1/backup/mydb'
    WITH OPTIONS (into_db = 'mydb_restored');

-- 恢复并重命名
RESTORE DATABASE mydb FROM 'nodelocal://1/backup/mydb'
    WITH OPTIONS (rename = 'mydb_new');

4.2 恢复表 #

sql
-- 恢复单个表
RESTORE DATABASE mydb TABLE users FROM 'nodelocal://1/backup/users';

-- 恢复多个表
RESTORE DATABASE mydb TABLE users, orders FROM 'nodelocal://1/backup/tables';

-- 恢复表到新表名
RESTORE DATABASE mydb TABLE users FROM 'nodelocal://1/backup/users'
    WITH OPTIONS (rename = 'users_restored');

-- 跳过外键检查
RESTORE DATABASE mydb TABLE orders FROM 'nodelocal://1/backup/orders'
    WITH OPTIONS (skip_missing_foreign_keys);

4.3 时间点恢复 #

sql
-- 恢复到指定时间点
RESTORE DATABASE mydb FROM 
    'nodelocal://1/backup/mydb_full',
    'nodelocal://1/backup/mydb_inc1',
    'nodelocal://1/backup/mydb_inc2'
    AS OF SYSTEM TIME '2024-01-15 10:00:00';

-- 使用增量备份链恢复
RESTORE DATABASE mydb FROM 
    'nodelocal://1/backup/full',
    'nodelocal://1/backup/inc1',
    'nodelocal://1/backup/inc2';

五、备份管理 #

5.1 查看备份 #

sql
-- 查看备份内容
SHOW BACKUP 'nodelocal://1/backup/mydb';

-- 查看备份详情
SHOW BACKUP SCHEMAS 'nodelocal://1/backup/mydb';

-- 查看备份范围
SHOW BACKUP RANGES 'nodelocal://1/backup/mydb';

-- 查看备份文件
SHOW BACKUP FILES 'nodelocal://1/backup/mydb';

5.2 备份调度 #

bash
#!/bin/bash
# backup.sh - 每日备份脚本

DATE=$(date +%Y%m%d)
BACKUP_DIR="nodelocal://1/backup/daily/$DATE"

# 判断是否周日 (全量备份)
if [ $(date +%u) -eq 7 ]; then
    # 全量备份
    cockroach sql --insecure -e "
        BACKUP DATABASE mydb TO '$BACKUP_DIR'
        WITH revision_history;
    "
else
    # 增量备份
    LAST_BACKUP="nodelocal://1/backup/daily/$(date -d 'yesterday' +%Y%m%d)"
    cockroach sql --insecure -e "
        BACKUP DATABASE mydb TO '$BACKUP_DIR'
        INCREMENTAL FROM '$LAST_BACKUP';
    "
fi

# 清理旧备份 (保留30天)
find /backup/daily -type d -mtime +30 -exec rm -rf {} \;

5.3 备份验证 #

sql
-- 验证备份完整性
SHOW BACKUP 'nodelocal://1/backup/mydb';

-- 检查备份是否可恢复
-- 1. 查看备份内容
SHOW BACKUP SCHEMAS 'nodelocal://1/backup/mydb';

-- 2. 测试恢复 (到测试数据库)
RESTORE DATABASE mydb FROM 'nodelocal://1/backup/mydb'
    WITH OPTIONS (into_db = 'mydb_test');

-- 3. 验证数据
SELECT COUNT(*) FROM mydb_test.users;

-- 4. 清理测试数据库
DROP DATABASE mydb_test;

六、最佳实践 #

6.1 备份策略 #

text
备份最佳实践
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 定期备份                                               │
│      ├── 每日增量备份                                      │
│      ├── 每周全量备份                                      │
│      └── 自动化调度                                        │
│                                                             │
│   2. 异地备份                                               │
│      ├── 备份到云存储                                      │
│      ├── 多区域存储                                        │
│      └── 灾难恢复                                          │
│                                                             │
│   3. 加密备份                                               │
│      ├── 使用加密选项                                      │
│      ├── 保护敏感数据                                      │
│      └── 安全存储密钥                                      │
│                                                             │
│   4. 定期验证                                               │
│      ├── 验证备份完整性                                    │
│      ├── 测试恢复流程                                      │
│      └── 定期演练                                          │
│                                                             │
│   5. 保留策略                                               │
│      ├── 根据合规要求设置                                  │
│      ├── 定期清理旧备份                                    │
│      └── 监控存储空间                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

6.2 恢复演练 #

sql
-- 定期进行恢复演练

-- 1. 创建测试环境
CREATE DATABASE recovery_test;

-- 2. 恢复备份到测试环境
RESTORE DATABASE mydb FROM 'nodelocal://1/backup/mydb'
    WITH OPTIONS (into_db = 'recovery_test');

-- 3. 验证数据完整性
SELECT 
    (SELECT COUNT(*) FROM recovery_test.users) AS users_count,
    (SELECT COUNT(*) FROM recovery_test.orders) AS orders_count;

-- 4. 验证数据一致性
SELECT 
    u.id,
    COUNT(o.id) AS order_count
FROM recovery_test.users u
LEFT JOIN recovery_test.orders o ON u.id = o.user_id
GROUP BY u.id
LIMIT 10;

-- 5. 清理测试环境
DROP DATABASE recovery_test;

七、总结 #

备份与恢复要点:

特性 说明
全量备份 BACKUP DATABASE
增量备份 INCREMENTAL FROM
恢复 RESTORE DATABASE
时间点恢复 AS OF SYSTEM TIME
加密 encryption_passphrase

下一步,让我们学习性能优化!

最后更新:2026-03-27