SQL 级备份是什么
BACKUP 与 RESTORE 是语句形式的备份恢复:目标可以是本地磁盘、文件路径或对象存储,范围可以是整库、单表甚至指定分区,也可以把多次备份追加到同一目标形成增量链。任务进度记录在 system.backups 表里,用普通 SQL 就能查询状态。
与旧做法相比省了什么
在 BACKUP 语句出现之前,常见做法是先用 FREEZE 冻结分区,再拷贝硬链接并自行管理元数据;SQL 级备份把调度与状态记录交给服务端,恢复时也只需一条 RESTORE 语句。前提是备份目标磁盘要预先在存储配置里定义好,否则语句会因为找不到磁盘而失败。
基本信息
| 语法 | BACKUP TABLE db.t TO Disk('backups', 't.zip');RESTORE TABLE ... FROM ... |
|---|---|
| 范围 | TABLE、DICTIONARY、DATABASE,可按 PARTITION 备份 |
| 增量 | 把多次备份追加到同一目标形成增量链 |
| 进度 | system.backups 的 status、num_files、total_size、error |
| 前提 | 备份目标磁盘需在存储配置中预先定义 |
示例
示例
-- 备份单表到预定义磁盘
BACKUP TABLE analytics.events
TO Disk('backups', 'events-2024-07.zip');
-- 从备份恢复
RESTORE TABLE analytics.events
FROM Disk('backups', 'events-2024-07.zip');
-- 查看备份任务状态与体积
SELECT status, num_files, formatReadableSize(total_size) AS size, error
FROM system.backups
ORDER BY start_time DESC LIMIT 5;典型使用场景
- 迁移前整库备份:把库与表结构一起备份到对象存储
- 单表保护:只备份核心业务表,压缩备份窗口
- 分区级备份:历史大分区单独备份,避免每次全表重跑
- 恢复演练:在测试环境用 RESTORE 验证备份真的可用
- 审计排查:通过 system.backups 确认每天的备份是否成功
要素说明
| 要素 | 含义 | 注意 |
|---|---|---|
| TO Disk(...) | 写入预定义磁盘 | 磁盘需在存储配置中预先声明 |
| PARTITION | 只备份指定分区 | 适合历史分区归档 |
| RESTORE | 从备份恢复 | 目标表已存在时默认报错 |
| system.backups | 任务与状态记录 | 重点看 status 与 error |
备份与恢复都占用 IO,大库备份放在低峰执行并监控磁盘水位;恢复到本地磁盘时还要预留足够临时空间,空间不足会让恢复中途失败。
恢复目标表已存在时默认报错,需要先删除或改名再恢复;直接在承载业务的生产表上做恢复操作风险很高,应先在测试环境验证流程。