使用BACKUP和RESTORE命令实现数据备份恢复

如果您需要将ClickHouse中的数据备份至OSS实现低成本的长期归档,或者计划将自建ClickHouse迁移至云数据库ClickHouse中,可以使用BACKUPRESTORE命令。该命令是ClickHouse内置的SQL命令,用于对数据库、表等对象进行备份和恢复。本文介绍BACKUPRESTORE命令的语法与使用示例。

注意事项

  • 由于库表引擎不兼容,不支持在社区兼容版企业版之间进行数据备份与恢复。

  • 备份恢复执行期间,集群的CPU使用率会有所升高,可通过调整相关参数(如backup_threadsrestore_threads)限制资源消耗;内存使用率基本无影响。

前提条件

语法

 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>')]

社区兼容版

BACKUPRESTORE命令支持实例、数据库、表级别的数据备份恢复。本节以表为例,介绍数据上传的使用方法。

备份数据至OSS

直接上传至OSS

BACKUP TABLE default.data ON CLUSTER default TO S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')

备份到本地再上传至OSS

重要

云数据库ClickHouse不支持备份到本地。

  1. 配置备份。

    添加文件/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>
  2. 备份数据到本地。

    BACKUP TABLE test.table TO Disk('backups', 'data_1.zip')
  3. 使用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

    需重启,限制backupIO操作线程数量。

    max_backups_io_thread_pool_free_size

    需重启,限制backupIO操作线程池内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-clientclickhouse断开连接怎么办?

备份任务后台运行,连接断开并不影响正常备份。可以通过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;

BACKUPRESTORE命令速度能达到多少?

整条链路包括CPU、磁盘吞吐、网络吞吐、OSS带宽,速度取决于整条链路的其中一个链路的瓶颈。

  • 云数据库ClickHouse:您可以通过垂直升配集群规格的方式提升CPU、磁盘吞吐和网络吞吐。

  • OSS侧:请参见使用限制及性能指标

云数据库ClickHouse如何实现逐个节点备份恢复?

  1. 查询节点IP。

    SELECT * FROM system.clusters;
  2. 通过clickhouse-client直连实例节点,设置不强制ON CLUSTER default

    说明

    以下参数设置仅适用于阿里云云数据库ClickHouse,自建ClickHouse无需设置。

    set enforce_on_cluster_default_for_ddl = 0;
  3. 执行BACKUP命令。

    BACKUP TABLE default.data TO S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')
  4. 执行RESTORE命令。

    RESTORE TABLE default.data FROM S3('https://<yourBucketName>.<yourEndpoint>/data/data_1.zip', 'yourAccessKeyID', 'yourAccessKeySecret')