ClickHouse库的备份和恢复

一、问题

  1. 如何做ClickHouse单表的备份和恢复
  2. 如何做ClickHouse全库的备份和恢复

二、方案

相同点:备份操作是在线进行的,不会阻塞正常的读写操作

方案一:内置的BACKUP和RESTORE

ClickHouse 在 22.3 版本中引入了 内置的 BACKUP 和 RESTORE

优点:

  1. 系统内置功能(从21开始),支持简单的全量库或者表的备份和恢复
  2. 官方支持,兼容性好一些,恢复快一些

缺点:

  1. 需要修改clickhouse config.xml文件中备份目录设置并重启clickhouse服务
  2. 备份数据格式是ClickHouse内部格式,不能直接读取或用于其他用途。

方案二:三方的clickhouse-backup

基于 ALTER TABLE … FREEZE 创建分区快照(shadow目录),然后复制到备份目录

优点:

  1. 支持灵活的备份策略(如增量备份、远程存储支持)

缺点:

  1. 需要安装三方工具;社区支持,非官方支持
  2. 仅支持 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;

方案二

  1. 安装最新的clickhouse-backup-2.6.5-1.x86_64.rpm
  2. 更新/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。