备份与恢复 #
一、备份概述 #
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