官网说明
参考官网:
https://clickhouse.com/docs/zh/operations/backup
不同公司有不同的可用资源和业务需求,因此不存在一个通用的解决方案可以应对各种情况下的ClickHouse备份和恢复。 适用于 1GB 数据的方案可能并不适用于几十 PB 数据的情况。 有多种具备各自优缺点的可能方法,将在下面对其进行讨论。最好使用几种方法而不是仅仅使用一种方法来弥补它们的各种缺点。
将源数据复制到其它地方
通常摄入到ClickHouse的数据是通过某种持久队列传递的,例如 Apache Kafka
https://kafka.apache.org
在这种情况下,可以配置一组额外的订阅服务器,这些订阅服务器将在写入ClickHouse时读取相同的数据流,并将其存储在冷存储中。 大多数公司已经有一些默认推荐的冷存储,可能是对象存储或分布式文件系统,如 HDFS
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
这种方法较为一般,相当于在别的地方又存了一份。
文件系统快照
某些本地文件系统提供快照功能(例如, ZFS
https://en.wikipedia.org/wiki/ZFS
),但它们可能不是提供实时查询的最佳选择。 一个可能的解决方案是使用这种文件系统创建额外的副本,并将它们与用于SELECT
查询的 分布式
https://clickhouse.com/docs/zh/engines/table-engines/special/distributed
表分离。 任何修改数据的查询都无法访问此类副本上的快照。 作为回报,这些副本可能具有特殊的硬件配置,每个服务器附加更多的磁盘,这将是经济高效的。
这种方式将需要更多的存储资源。
clickhouse-copier
https://clickhouse.com/docs/zh/operations/utilities/clickhouse-copier
clickhouse-copier是一个多功能工具,最初创建它是为了用于重新切分pb大小的表。 因为它能够在ClickHouse表和集群之间可靠地复制数据,所以它也可用于备份和还原数据。
对于较小的数据量,一个简单的 INSERT INTO ... SELECT ...
到远程表也可以工作。
part操作
ClickHouse允许使用 ALTER TABLE ... FREEZE PARTITION ...
查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 /var/lib/clickhouse/shadow/
文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由ClickHouse服务器处理,所以你可以把它们留在那里:你将有一个简单的备份,不需要任何额外的外部系统,但它仍然容易出现硬件问题。 出于这个原因,最好将它们远程复制到另一个位置,然后删除本地副本。 分布式文件系统和对象存储仍然是一个不错的选择,但是具有足够大容量的正常附加文件服务器也可以工作(在这种情况下,传输将通过网络文件系统或者也许是 rsync
https://en.wikipedia.org/wiki/Rsync
来进行).
数据可以使用 ALTER TABLE ... ATTACH PARTITION ...
从备份中恢复。
有关与分区操作相关的查询的详细信息,请参阅 更改文档
https://clickhouse.com/docs/zh/sql-reference/statements/alter#alter_manipulations-with-partitions
第三方工具可用于自动化此方法: clickhouse-backup
https://github.com/AlexAkulov/clickhouse-backup
手动备份及恢复
此处方式即官网中的part操作。
备份
创建备份路径:
创建用户存放备份数据的目录shadow并授权
sudo mkdir -p /var/lib/clickhouse/shadow/
chown clickhouse:clickhouse /var/lib/clickhouse/shadow/
如果目录已存在,需要先清空目录下的数据
执行备份命令:
echo -n 'alter table t_order_mt freeze' | clickhouse-client
执行命令不会锁表
默认不备份元数据
将备份数据保存到其他路径:
sudo mkdir -p /var/lib/clickhouse/backup/
sudo cp -r /var/lib/clickhouse/shadow/ /var/lib/clickhouse/backup/my-backup-name
为下次备份准备,删除shadow下的数据:
sudo rm -rf /var/lib/clickhouse/shadow/*
恢复
模拟删除备份过的表
echo 'drop table t_order_mt' | clickhouse-client
通过show tables检查
重新创建表
cat t_order_mt.sql | clickhouse-client
将备份复制到detached目录并授权,仅拷贝分区目录
sudo cp -rl backup/my-backup-name/1/store/cb1/uuid/* data/default/t_order_mt/detached
clickhouse使用文件系统硬链接来实现即时备份,而不会导致Clickhouse服务停机(或锁定)。这些硬链接可以进一步用于有效的备份存储。在支持硬链接的文件系统(例如本地文件系统或NFS)上,将cp与-l标志一起使用(或将rsync与-hard-links和-numeric-ids标志一起使用)以避免复制数据。
然后执行attach
按分区恢复(注意授权得给clickhouse):
echo 'alter table t_order_mt attach partition 20200601' | clickhouse-client
clickhouse-backup
上面FREEZE,DETACH手动备份数据的过程可使用clickhouse备份工具clickhouse-backup自动化实现。
还支持增量备份,支持元数据备份。
工具地址:
https://github.com/AlexAkulov/clickhouse-backup
我们进入后选择tags进入到版本选择,选择最新版,然后在assets中选择安装方式
我们选择rpm包,上传后安装:
sudo rpm -ivh clickhouse-backup-2.4.2-1.x86_64.rpm
用rpm方式安装后,默认配置文件在/etc/clickhouse-backup/,可执行文件在/usr/bin下,一共就这俩文件。
如果用二进制压缩包,解压后也需要手动将文件挪位置:
cp clickhouse-backup /usr/local/bin/
cp config.yml /etc/clickhouse-backup/
查看使用说明:
clickhouse-backup help
查看哪些表可以备份(默认过滤掉system):
clickhouse-backup tables
配置文件config.yml如下:
general:
remote_storage: sftp # 通过sftp,上传到远程服务器的话,需要这个参数,否则为none
max_file_size: 1099511627776
disable_progress_bar: false
backups_to_keep_local: 2 # 本地备份的个数,大于2则自动删除旧的备份,默认为0,不删除备份
backups_to_keep_remote: 2 # 远程备份的个数
log_level: info
allow_empty_backups: false
clickhouse:
username: default # 本地clickhouse的连接参数
password: ""
host: localhost
port: 9010
disk_mapping: {}
skip_tables:
- system.*
- db.*
- information_schema.*
- INFORMATION_SCHEMA.*
timeout: 5m
freeze_by_part: false
secure: false
skip_verify: false
sync_replicated_tables: true
skip_sync_replica_timeouts: true
log_sql_queries: false
s3:
access_key: ""
secret_key: ""
bucket: ""
endpoint: ""
region: us-east-1
acl: private
force_path_style: false
path: ""
disable_ssl: false
part_size: 536870912
compression_level: 1
compression_format: tar
sse: ""
disable_cert_verification: false
storage_class: STANDARD
gcs:
credentials_file: ""
credentials_json: ""
bucket: ""
path: ""
compression_level: 1
compression_format: tar
cos:
url: ""
timeout: 2m
secret_id: ""
secret_key: ""
path: ""
compression_format: tar
compression_level: 1
api:
listen: localhost:7171
enable_metrics: true
enable_pprof: false
username: ""
password: ""
secure: false
certificate_file: ""
private_key_file: ""
create_integration_tables: false
ftp:
address: ""
timeout: 2m
username: ""
password: ""
tls: false
path: ""
compression_format: tar
compression_level: 1
sftp:
address: "host"
port: 端口号
username: "用户名"
password: "密码"
key: ""
path: "/home/data_dev/clickhouse_backup" # 上传文件到远程服务器的路径
compression_format: tar
compression_level: 1
azblob:
endpoint_suffix: core.windows.net
account_name: ""
account_key: ""
sas: ""
container: ""
path: ""
compression_level: 1
compression_format: tar
sse_key: ""
备份
创建备份:
sudo clickhouse-backup create
查看现有的本地备份(根据配置文件中备份路径来的):
sudo clickhouse-backup list
备份文件存储在/ar/lib/clickhouse/backup/BACKUPNAME。备份名称默认为时间戳,但是可以选择使用-name标志指定备份名称。备份包含两个目录:一个"metadata"目录,其中包含重新创建架构所需的DDL SQL语句;以及一个"shadow"目录,其中包含作为ALTER TABLE...FREEZE操作结果的数据(即备份数据)。
备份部份表:
clickhouse-backup create -t 数据库.表名1,数据库.表名2
恢复
查看恢复数据相关参数:
clickhouse-backup restore --help
模拟删除备份过的表
echo 'drop table t_order_mt' | clickhouse-client
模拟删除备份过的库
echo 'drop database default' | clickhouse-client
从备份还原:
sudo clickhouse-backup restore 2020-0601T13-00-00
-- schema:只还原表结构
--data:只还原数据
--table:备份(或还原)特定表。也可以使用一个正则表达式,例如针对特定的数据库:--table=dbname.*
如果报目录已存在则可能是原路径下文件未被删除。
clickhouse-backup参考
https://blog.csdn.net/qq_36602951/article/details/127353925