数据备份与恢复
ClickHouse提供原生的BACKUP和RESTORE命令,支持将表、数据库或全部数据备份到本地磁盘,并在需要时从备份中恢复。
功能说明
ClickHouse的多副本机制可以防止硬件故障导致的数据丢失,但无法防止人为误操作,例如误删数据、删错表或软件Bug导致数据损坏。因此需要提前规划备份恢复策略。
ClickHouse支持以下备份类型:
- 全量备份(Full backups):完整备份指定对象的全部数据,恢复时不依赖其他备份。
- 增量备份(Incremental backups):仅备份相对于基准备份的变化数据,恢复时需要基准备份可用。
前提条件
- 已创建BMR ClickHouse集群,且集群状态为运行中。
配置备份磁盘
执行备份操作前,需在集群节点配置备份存储磁盘。创建配置文件/etc/clickhouse-server/config.d/backup_disk.xml,内容如下:
1<clickhouse>
2 <storage_configuration>
3 <disks>
4 <backups>
5 <type>local</type>
6 <path>/backups/</path>
7 </backups>
8 </disks>
9 </storage_configuration>
10 <backups>
11 <allowed_disk>backups</allowed_disk>
12 <allowed_path>/backups/</allowed_path>
13 </backups>
14</clickhouse>
说明:配置完成后需重启ClickHouse服务使配置生效。
备份语法
1BACKUP
2 TABLE [db.]table_name [AS [db.]table_name_in_backup]
3 [PARTITION[S] partition_expr [,...]] |
4 DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
5 DATABASE database_name [AS database_name_in_backup] |
6 TEMPORARY TABLE table_name [AS table_name_in_backup] |
7 VIEW view_name [AS view_name_in_backup] |
8 ALL [EXCEPT TABLES ... | EXCEPT DATABASES ...]
9[ON CLUSTER 'cluster_name']
10TO Disk('<disk_name>', '<path>/')
11[SETTINGS ...]
12[ASYNC]
恢复语法
1RESTORE
2 TABLE [db.]table_name [AS [db.]table_name_in_backup]
3 [PARTITION[S] partition_expr [,...]] |
4 DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
5 DATABASE database_name [AS database_name_in_backup] |
6 TEMPORARY TABLE table_name [AS table_name_in_backup] |
7 VIEW view_name [AS view_name_in_backup] |
8 ALL [EXCEPT TABLES ... | EXCEPT DATABASES ...]
9[ON CLUSTER 'cluster_name']
10FROM Disk('<disk_name>', '<path>/')
11[SETTINGS ...]
12[ASYNC]
备份表
1BACKUP TABLE test_db.test_table TO Disk('backups', '1.zip')
恢复表
恢复到原表(表必须不存在或为空):
1RESTORE TABLE test_db.test_table FROM Disk('backups', '1.zip')
恢复为新表名:
1RESTORE TABLE test_db.test_table AS test_db.test_table_renamed FROM Disk('backups', '1.zip')
恢复到非空表(可能导致数据重复,请谨慎使用):
1RESTORE TABLE test_db.test_table FROM Disk('backups', '1.zip')
2SETTINGS allow_non_empty_tables=true
增量备份
增量备份仅存储相对于基准备份的变化数据。基准备份必须保持可用,否则无法从增量备份恢复。
创建全量基准备份:
1BACKUP TABLE test_db.test_table TO Disk('backups', 'd.zip')
创建增量备份:
1BACKUP TABLE test_db.test_table TO Disk('backups', 'incremental-a.zip')
2SETTINGS base_backup = Disk('backups', 'd.zip')
从增量备份恢复:
1RESTORE TABLE test_db.test_table AS test_db.test_table2
2FROM Disk('backups', 'incremental-a.zip')
说明:恢复增量备份时,系统会自动关联基准备份数据,无需手动指定基准备份位置。
分区级备份
支持仅备份和恢复指定分区:
1BACKUP TABLE test_db.partitioned PARTITIONS '1', '4'
2TO Disk('backups', 'partitioned.zip')
恢复指定分区:
1RESTORE TABLE test_db.partitioned PARTITIONS '1', '4'
2FROM Disk('backups', 'partitioned.zip')
3SETTINGS allow_non_empty_tables=true
压缩备份
支持自定义压缩算法和压缩级别:
1BACKUP TABLE test_db.test_table
2TO Disk('backups', 'filename.zip')
3SETTINGS compression_method='lzma', compression_level=3
支持的归档格式后缀:.zip、.tar、.tar.gz、.tgz、.tar.bz2、.tar.lzma、.tar.zst、.tzst、.tar.xz。
密码保护
ZIP格式的备份支持设置密码保护:
1BACKUP TABLE test_db.test_table
2TO Disk('backups', 'password-protected.zip')
3SETTINGS password='qwerty'
恢复时需提供相同密码:
1RESTORE TABLE test_db.test_table
2FROM Disk('backups', 'password-protected.zip')
3SETTINGS password='qwerty'
注意:密码保护仅支持ZIP格式(
.zip、.zipx),其他归档格式不支持。
备份整个数据库
1BACKUP DATABASE test_db TO Disk('backups', 'database_backup.zip')
恢复整个数据库:
1RESTORE DATABASE test_db FROM Disk('backups', 'database_backup.zip')
备份全部数据
1BACKUP ALL TO Disk('backups', 'all_backup.zip')
恢复全部数据:
1RESTORE ALL FROM Disk('backups', 'all_backup.zip')
集群级备份
对于分布式集群,使用ON CLUSTER子句在集群范围执行备份和恢复:
1BACKUP TABLE test_db.test_table ON CLUSTER 'default_cluster'
2TO Disk('backups', 'cluster_backup.zip')
1RESTORE TABLE test_db.test_table ON CLUSTER 'default_cluster'
2FROM Disk('backups', 'cluster_backup.zip')
说明:集群级备份依赖ZooKeeper/ClickHouse Keeper进行节点间协调。
异步执行
添加ASYNC关键字后,命令立即返回操作ID和状态,不阻塞当前会话:
1BACKUP TABLE helloworld.my_first_table TO Disk('backups', '1.zip') ASYNC
返回结果:
1┌─id───────────────────────────────────┬─status──────────┐
2│ 7678b0b3-f519-4e6e-811f-5a0781a4eb52 │ CREATING_BACKUP │
3└──────────────────────────────────────┴─────────────────┘
并发控制
默认允许多个备份/恢复操作同时执行。如需限制为串行执行:
1<clickhouse>
2 <backups>
3 <allow_concurrent_backups>false</allow_concurrent_backups>
4 <allow_concurrent_restores>false</allow_concurrent_restores>
5 </backups>
6</clickhouse>
仅备份表结构
如仅需备份CREATE语句(不含数据):
1BACKUP TABLE test_db.test_table TO Disk('backups', 'schema_only.zip')
2SETTINGS structure_only=true
查看备份状态
通过system.backups系统表查看备份操作状态:
1SELECT *
2FROM system.backups
3WHERE id = '7678b0b3-f519-4e6e-811f-5a0781a4eb52'
4FORMAT Vertical
返回结果示例:
1Row 1:
2──────
3id: 7678b0b3-f519-4e6e-811f-5a0781a4eb52
4name: Disk('backups', '1.zip')
5status: BACKUP_FAILED
6num_files: 0
7uncompressed_size: 0
8compressed_size: 0
9error: Code: 598. DB::Exception: Backup Disk('backups', '1.zip') already exists. (BACKUP_ALREADY_EXISTS)
10start_time: 2022-08-30 09:21:46
11end_time: 2022-08-30 09:21:46
通过system.backup_log系统表查看详细操作日志:
1SELECT *
2FROM system.backup_log
3WHERE id = '7678b0b3-f519-4e6e-811f-5a0781a4eb52'
4ORDER BY event_time_microseconds ASC
5FORMAT Vertical
SETTINGS参数说明
表一 通用参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| id | 备份操作ID,未指定时自动生成UUID。 | 自动生成 |
| compression_method | 压缩算法。 | - |
| compression_level | 压缩级别。 | - |
| password | 归档密码,仅支持ZIP格式。 | - |
| base_backup | 增量备份的基准备份位置。 | - |
| structure_only | 仅备份/恢复CREATE语句,不含数据。 | - |
| storage_policy | 恢复时使用的存储策略(仅RESTORE,仅MergeTree系列)。 | - |
| allow_non_empty_tables | 允许恢复到非空表(可能导致数据重复)。 | 0 |
| max_backup_bandwidth | 单个备份的最大读取速度(字节/秒),0为不限制。 | 0 |
| backup_threads | 执行BACKUP请求的最大线程数。 | - |
| max_backup_bandwidth_for_server | 服务器所有备份的最大读取速度(字节/秒),0为不限制。 | 0 |
| shutdown_wait_backups_and_restores | 关闭前是否等待正在执行的备份/恢复操作完成。 | 1 |
注意事项
- 备份目标路径下如已存在同名备份文件,操作将报错(错误码598 BACKUP_ALREADY_EXISTS),需更换文件名或删除旧备份后重试。
- 增量备份恢复时需确保基准备份可访问,如基准备份丢失将无法恢复。
allow_non_empty_tables设置允许向非空表恢复数据,但可能导致数据重复,应谨慎使用。- 通过SQL命令管理的访问控制对象(用户、角色、配额等)会包含在备份中,但通过配置文件(如
users.xml)定义的访问控制不会被备份。 - 集群级备份操作的协调依赖ZooKeeper/ClickHouse Keeper,需确保Keeper服务正常运行。
- 密码保护仅支持ZIP格式,对tar格式使用密码参数会产生BAD_ARGUMENTS错误。
更多参考
更多详细内容可参考ClickHouse官网相关文档。
评价此篇文章
