如果您需要将ClickHouse中的数据备份至OSS实现低成本的长期归档,或者计划将自建ClickHouse迁移至云数据库ClickHouse中,可以使用BACKUP
和RESTORE
命令。该命令是ClickHouse内置的SQL命令,用于对数据库、表等对象进行备份和恢复。本文介绍BACKUP
和RESTORE
命令的语法与使用示例。
注意事项
由于库表引擎不兼容,不支持在社区兼容版和企业版之间进行数据备份与恢复。
备份恢复执行期间,集群的CPU使用率会有所升高,可通过调整相关参数(如
backup_threads
、restore_threads
)限制资源消耗;内存使用率基本无影响。
前提条件
OSS:
授权ClickHouse访问OSS Bucket。具体操作,请参见Bucket Policy常见示例。
获取对应地域的Endpoint信息。
语法
BACKUP|RESTORE
TABLE [db.]table_name [AS [db.]table_name_in_backup]
[PARTITION[S] partition_expr [,...]] |
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
DATABASE database_name [AS database_name_in_backup]
[EXCEPT TABLES ...] |
TEMPORARY TABLE table_name [AS table_name_in_backup] |
VIEW view_name [AS view_name_in_backup] |
ALL [EXCEPT {TABLES|DATABASES}...] } [,...]
[ON CLUSTER 'cluster_name']
TO|FROM File('<path>/<filename>') | Disk('<disk_name>', '<path>/') | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Access key Secret>')
[SETTINGS base_backup = File('<path>/<filename>') | Disk(...) | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Access key Secret>')]
社区兼容版
BACKUP
和RESTORE
命令支持实例、数据库、表级别的数据备份恢复。本节以表为例,介绍数据上传的使用方法。
备份数据至OSS
直接上传至OSS
BACKUP TABLE default.data ON CLUSTER default TO S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')
备份到本地再上传至OSS
云数据库ClickHouse不支持备份到本地。
配置备份。
添加文件
/etc/clickhouse-server/config.d/backup_disk.xml
,并指定备份目标。示例如下,在
<storage_configuration>
标签内,自定义磁盘名称为backups
,并指定了磁盘对应的物理路径为/backups/
;在<backups>
标签内,表示只能使用名为backups
的磁盘,并且最终文件路径必须在/backups/
目录内。<clickhouse> <storage_configuration> <disks> <backups> <type>local</type> <path>/backups/</path> </backups> </disks> </storage_configuration> <backups> <allowed_disk>backups</allowed_disk> <allowed_path>/backups/</allowed_path> </backups> </clickhouse>
备份数据到本地。
BACKUP TABLE test.table TO Disk('backups', 'data_1.zip')
使用ossutil上传至OSS。
ossutil cp data_1.zip oss://<yourBucketName>/data/data_1.zip -i <yourAccessKeyID> -k <yourAccessKeySecret> -e <yourEndpoint>
从OSS恢复数据
RESTORE TABLE default.data ON CLUSTER default FROM S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')
企业版
备份数据至OSS
BACKUP TABLE default.data TO S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')
从OSS恢复数据
RESTORE TABLE default.data FROM S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')
性能调优参数
查看方式
-- 用户级参数
SELECT * FROM system.settings WHERE name LIKE '%backup%' OR name LIKE '%restore%';
-- server级参数
SELECT * FROM system.server_settings WHERE name LIKE '%backup%' OR name LIKE '%restore%';
参数说明
backup
参数类型
参数名
说明
server级参数
backup_threads
需重启,限制backup的线程数量。默认最大线程数16。
max_backup_bandwidth_for_server
需重启,限制单个server内所有backup的带宽。
max_backups_io_thread_pool_size
需重启,限制backup的IO操作线程数量。
max_backups_io_thread_pool_free_size
需重启,限制backup的IO操作线程池内Idle线程数量。
user级参数
max_backup_bandwidth
限制单个backup任务的带宽。
restore
参数类型
参数名
说明
server级参数
restore_threads
需重启,限制restore的线程数量。默认最大线程数16。
常见问题
如何解决报错“Not found backup engine S3”?
低版本实例不支持备份数据到OSS,会出现类似“Not found backup engine S3”的异常信息。建议升级实例版本到23.8及以上。如果是自建ClickHouse,也可以通过备份至本地再上传OSS。
如何解决报错“Using archives with backups on clusters is disabled”?
多节点实例的集群备份不支持ZIP归档格式。S3路径可以使用目录,示例如下。
BACKUP TABLE default.data ON CLUSTER default TO S3('https://<yourBucketName>.<yourEndpoint>/data/', 'yourAccessKeyID', 'yourAccessKeySecret')
执行BACKUP
命令后,客户clickhouse-client和clickhouse断开连接怎么办?
备份任务后台运行,连接断开并不影响正常备份。可以通过select * from system.backups;
查看进度。
如果想要异步执行,可以在BACKUP
执行后加ASYNC
。
BACKUP TABLE default.data ON CLUSTER default TO S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret') ASYNC;
BACKUP
和RESTORE
命令速度能达到多少?
整条链路包括CPU、磁盘吞吐、网络吞吐、OSS带宽,速度取决于整条链路的其中一个链路的瓶颈。
云数据库ClickHouse:您可以通过垂直升配集群规格的方式提升CPU、磁盘吞吐和网络吞吐。
OSS侧:请参见使用限制及性能指标。
云数据库ClickHouse如何实现逐个节点备份恢复?
查询节点IP。
SELECT * FROM system.clusters;
通过clickhouse-client直连实例节点,设置不强制
ON CLUSTER default
。说明以下参数设置仅适用于阿里云云数据库ClickHouse,自建ClickHouse无需设置。
set enforce_on_cluster_default_for_ddl = 0;
执行
BACKUP
命令。BACKUP TABLE default.data TO S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')
执行
RESTORE
命令。RESTORE TABLE default.data FROM S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')