ClickHouse库的备份和恢复
ClickHouse库的备份和恢复
一、问题
- 如何做ClickHouse单表的备份和恢复
- 如何做ClickHouse全库的备份和恢复
二、方案
相同点:备份操作是在线进行的,不会阻塞正常的读写操作
方案一:内置的BACKUP和RESTORE
ClickHouse 在 22.3 版本中引入了 内置的 BACKUP 和 RESTORE
优点:
- 系统内置功能(从21开始),支持简单的全量库或者表的备份和恢复
- 官方支持,兼容性好一些,恢复快一些
缺点:
- 需要修改clickhouse config.xml文件中备份目录设置并重启clickhouse服务
- 备份数据格式是ClickHouse内部格式,不能直接读取或用于其他用途。
方案二:三方的clickhouse-backup
基于 ALTER TABLE … FREEZE 创建分区快照(shadow目录),然后复制到备份目录
优点:
- 支持灵活的备份策略(如增量备份、远程存储支持)
缺点:
- 需要安装三方工具;社区支持,非官方支持
- 仅支持 MergeTree 系列表引擎
三、操作步骤:备份和恢复
方案一
- 备份目录需要预先在/etc/clickhouse-server/config.xml配置文件中定义
1 | <storage_configuration> <disks> <data1> <keep_free_space_bytes>xxx</keep_free_space_bytes> <path>/data1/clickhouse/</path> </data1> <data2> <keep_free_space_bytes>xxx</keep_free_space_bytes> <path>/data2/clickhouse/</path> </data2> <data3> <keep_free_space_bytes>xxx</keep_free_space_bytes> <path>/data3/clickhouse/</path> </data3> <backups> <type>local</type> <path>/var/lib/clickhouse/backups-202503/</path> </backups> </disks> </storage_configuration> <backups> <allowed_disk>backups</allowed_disk> <allowed_path>/var/lib/clickhouse/backups-202503/</allowed_path> </backups> |
1 | <storage_configuration> <disks> <data1> <keep_free_space_bytes>xxx</keep_free_space_bytes> <path>/data1/clickhouse/</path> </data1> <data2> <keep_free_space_bytes>xxx</keep_free_space_bytes> <path>/data2/clickhouse/</path> </data2> <data3> <keep_free_space_bytes>xxx</keep_free_space_bytes> <path>/data3/clickhouse/</path> </data3> <backups> <type>local</type> <path>/var/lib/clickhouse/backups-202503/</path> </backups> </disks> </storage_configuration> <backups> <allowed_disk>backups</allowed_disk> <allowed_path>/var/lib/clickhouse/backups-202503/</allowed_path> </backups> |
1 | -- 备份单个表BACKUP TABLE 库名.表名 TO Disk('backups', '文件名');-- 备份库BACKUP DATABASE 库名 TO Disk('backups', '文件名');-- 查看backup状态SELECT id, name, status, start_time, end_time, error FROM system.backups;-- 恢复库RESTORE DATABASE 库名 FROM Disk('backups', '文件名');-- 恢复表RESTORE TABLE 库名.表名 FROM Disk('backups', '文件名');-- 查看restore状态SELECT id, name, base_backup_name, status, error, start_time, end_time FROM system.backups; |
1 | -- 备份单个表BACKUP TABLE 库名.表名 TO Disk('backups', '文件名');-- 备份库BACKUP DATABASE 库名 TO Disk('backups', '文件名');-- 查看backup状态SELECT id, name, status, start_time, end_time, error FROM system.backups;-- 恢复库RESTORE DATABASE 库名 FROM Disk('backups', '文件名');-- 恢复表RESTORE TABLE 库名.表名 FROM Disk('backups', '文件名');-- 查看restore状态SELECT id, name, base_backup_name, status, error, start_time, end_time FROM system.backups; |
方案二
- 安装最新的clickhouse-backup-2.6.5-1.x86_64.rpm
- 更新/etc/clickhouse-backup/config.yml。注意需要配置成远程存储remote_storage: sftp才会对shadow数据文件打包;远程存储不开启时remote_storage: none时shadow文件分散在各个数据目录中,不会集中存储在/var/lib/clickhouse/backup/备份目录下。网上一些资料提到的–backup-path参数也不能生效,这个比较坑
1 | remote_storage: sftp |
1 | remote_storage: none |
1 | --backup-path |
1 | general: remote_storage: sftpclickhouse: username: xxx password: "xxx" host: localhost port: 9000 disk_mapping: {} skip_tables: - system.* - INFORMATION_SCHEMA.* - information_schema.* - _temporary_and_external_tables.*sftp: address: "xxx" port: 22 username: "xxx" password: "xxx" key: "" path: "xxx" object_disk_path: "" compression_format: tar compression_level: 1 |
1 | general: remote_storage: sftpclickhouse: username: xxx password: "xxx" host: localhost port: 9000 disk_mapping: {} skip_tables: - system.* - INFORMATION_SCHEMA.* - information_schema.* - _temporary_and_external_tables.*sftp: address: "xxx" port: 22 username: "xxx" password: "xxx" key: "" path: "xxx" object_disk_path: "" compression_format: tar compression_level: 1 |
1 | -- 单表备份并上传(注意只有上传才打包shadow数据到tar文件)clickhouse-backup create -t 库名.表名 文件名clickhouse-backup upload 文件名-- 库备份clickhouse-backup create 全量备份名clickhouse-backup upload 全量备份名-- 检查进度clickhouse-backup listselect * from system.backup_list;clickhouse-backup download 全量备份名# 重复操作数据不会重复插入,因为恢复表以前会先DROP TABLE IF EXISTSclickhouse-backup restore 全量备份名 |
1 | -- 单表备份并上传(注意只有上传才打包shadow数据到tar文件)clickhouse-backup create -t 库名.表名 文件名clickhouse-backup upload 文件名-- 库备份clickhouse-backup create 全量备份名clickhouse-backup upload 全量备份名-- 检查进度clickhouse-backup listselect * from system.backup_list;clickhouse-backup download 全量备份名# 重复操作数据不会重复插入,因为恢复表以前会先DROP TABLE IF EXISTSclickhouse-backup restore 全量备份名 |
四、结论
需要灵活的备份策略比如远程备份,建议采用clickhouse-backup;如果希望使用原生命令不安装三方工具的使用BACKUP/RESTORE。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 石头记!