1.下载clickhouse-backup
wget https://github.com/AlexAkulov/clickhouse-backup/releases/download/v1.0.0/clickhouse-backup.tar.gz
tar -zxvf clickhouse-backup.tar.gz # 解压
cd clickhouse-backup
cp clickhouse-backup /usr/local/bin/ # 将可执行文件复制到/usr/local/bin
mkdir /etc/clickhouse-backup # /etc下创建一个目录,用来放置配置文件config.yml
cp config.yml /etc/clickhouse-backup/
vim /etc/clickhouse-backup # 修改配置文文件
配置文件/etc/clickhouse-backup/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: ""
2.本地和远程创建备份
clickhouse-backup tables # 查看可以备份的表
clickhouse-backup create # 全库备份,一般这个备份的位置是原clickhouse数据存储路径下新建了一个backup文件夹,这个文件夹下会存备份
clickhouse-backup create --database=<database_name> <backup_name>
其中 <database_name> 是你想要备份的数据库名称,<backup_name> 是你给这次备份指定的名字。如果省略 <backup_name>,则默认使用当前日期和时间作为备份名称。 例如,如果你要备份名为 mydb 的数据库,并将其命名为 mydb_backup_20230401,命令将是:
clickhouse-backup create --database=mydb mydb_backup_20230401
clickhouse-backup create -t 数据库名称.* 备份名称 备份某个数据库的全部表
clickhouse-backup create -t 数据库.表名1,数据库.表名2 # 多表备份,单表类似
clickhouse-backup list # 查看已经生成的备份,如果设置了remote_storage: sftp,此条命令还会检测是否成功连接上了远程服务器
clickhouse-backup restore --help # 查看数据恢复相关参数
# 使用scp,将备份上传到服务器上,如果config.yml中设置了sftp,则不需要这一步
scp -rp /var/lib/clickhouse/backup/备份名 name@host:/data/clickhouse-backup/
# 通过配置文件里的sftp上传备份到服务器
clickhouse-backup upload 备份名
# 删除单个本地备份
clickhouse-backup delete local ck_backup_20260610
#批量删除旧本地备份(保留最近 N 个,常用定时清理)
clickhouse-backup clean local --keep-backups 7
#删除单个远程备份
clickhouse-backup delete remote ck_backup_20260610
#批量清理远程,只保留最近 N 份
clickhouse-backup clean remote --keep-backups 7
3.crontab定时备份
crontab -e 或者vim /etc/crontab
输入以下内容
40 15 * * * sh /data/clickhouse_backup.sh > /data/a.log 2>&1 # 表示每天15:40分会运行clickhouse_backup.sh
vim /data/clickhouse_backup.sh
clickhouse_backup.sh内容如下:
#!/bin/bash
BACKUP_NAME=ch_backup_$(date +%Y-%m-%dT%H-%M-%S)
/usr/local/bin/clickhouse-backup create $BACKUP_NAME #本地备份
/usr/local/bin/clickhouse-backup upload $BACKUP_NAME # 本地备份之后,上传到远程服务器
4、如何恢复远程备份的文件
首先把远程备份的文件上传到数据服务器上
scp -r webfunny_cloud_db_backup_2025-08-20T00-00-01/** root@服务器ip地址:/var/lib/clickhouse/backup/webfunny_cloud_db_backup_2025-08-20T00-00-01/
备:如果想恢复,必须在数据库服务器本地/var/lib/clickhouse/backup/下建个和备份在远程服务器上的文件夹名称必须一致才行,比如远程备份保存的文件夹叫webfunny_cloud_db_backup_2024-08-20T00-00-01,那么在本地也要建个webfunny_cloud_db_backup_2024-08-20T00-00-01的文件夹,然后把远程备份下的文件上传到这个文件夹下,
本地的文件夹名称一定要和远程里面的文件夹名称一致,不然就找不到(报clickhouse-backup -c /etc/clickhouse-backup/config.yml restore 20250820 -s -d --rm
2025/08/20 04:49:33 error can't restore: backup '20250820' is not found)
远程文件夹:
本地/var/lib/clickhouse/backup/下
因为备份的文件都是压缩的tar文件,所以要先对每个tar进行解压
写个解压脚本命令
#!/bin/bash
# 指定包含 .tar文件的目录
dir="/var/lib/clickhouse/backup/webfunny_cloud_db_backup_2024-08-20T00-00-01/shadow/webfunny_cloud_db/"
# 遍历目录中的所有 .tar 文件
for tar_file in $(find "$dir" -type f -name "*.tar"); do
# 检查文件是否存在
if [ -f "$tar_file" ]; then
# 解压每个 .tar 文件
echo "Extracting $tar_file..."
result="${tar_file%.tar}"
aw=$(echo "$tar_file" | awk -F 'default_' '{print $1}')
a="default"
#mkdir "$result"
mkdir "$aw$a"
tar -xvf "$tar_file" -C "$aw$a"
else
echo "File does not exist: $tar_file"
fi
done
然后执行恢复命令
clickhouse-backup restore webfunny_cloud_db_backup_2025-08-20T00-00-01 -s -d --rm
-s 恢复schma
-d 恢复数据
--rm是先删除后恢复
显示下面这个就说明在恢复中:
单个表恢复:
# 恢复单个表
clickhouse-backup restore --table=db_name.table_name backup_name
# 示例:恢复 default 库的 users 表
clickhouse-backup restore --table=default.users my_full_backup
恢复表结构和数据:clickhouse-backup restore --table=webfunny_cloud_db.event_20240430_192356218_72 webfunny_cloud_db_backup_2025-08-20T00-00-01
只恢复表结数据:cclickhouse-backup restore --data --table=webfunny_cloud_db.event_20240430_192356218_72 webfunny_cloud_db_backup_2025-08-20T00-00-01
只恢复表结构:cclickhouse-backup restore --schma --table=webfunny_cloud_db.event_20240430_192356218_72 webfunny_cloud_db_backup_2025-08-20T00-00-01
5、docker部署的clickhouse备份和恢复
a、docker安装的时候需要对外放开9000端口
启动docker命令如下:
sudo docker run --privileged=true --net=bridge \
-p 8123:8123 \
-p 9000:9000 \
--name clickhouse-server \
--ulimit nofile=262144:262144 \
-v /data/docker/clickhouse/data:/var/lib/clickhouse \
-v /data/docker/clickhouse/config/config.xml:/etc/clickhouse-server/config.xml \
-v /data/docker/clickhouse/config/users.xml:/etc/clickhouse-server/users.xml \
-v /data/docker/clickhouse/log:/var/log/clickhouse-server \
-e CLICKHOUSE_USER=root \
-e CLICKHOUSE_PASSWORD=clickhouse \
-e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 \
-e TZ=Asia/Shanghai \
-d clickhouse/clickhouse-server:24.3.2.23
-p 9000 9000是为了备份预留端口
b.恢复的话和上面恢复步骤一样,参考上面如何恢复操作即可
问题:如果备份发现少了shawod文件夹,说明容器内部挂载目录和宿主机外路径不一致
在容器中执行:
# 1. 确认 ClickHouse 容器的数据目录挂载
docker inspect <container_name> | grep -A 5 Mounts
打印:
oot@iZ0xi685gzyetiiqbh5cgpZ:/home/tools# docker inspect 713f7f195b4e | grep -A 5 Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/data/docker/clickhouse/data",
"Destination": "/var/lib/clickhouse",
"Mode": "",
}]
找到了,数据目录挂载是:
```
宿主机: /data/docker/clickhouse/data → 容器内: /var/lib/clickhouse
```
问题很明确了。你的 `clickhouse-backup` 运行在**宿主机**上,但配置中 `disk_mapping: {}` 为空,它默认去找 `/var/lib/clickhouse/shadow/`(宿主机上不存在这个路径),所以只上传了 metadata,没有 shadow 数据。
## 修复方法
修改 `clickhouse-backup` 的 config.yml:
```yaml
clickhouse:
# ... 其他配置不变
disk_mapping:
default: /data/docker/clickhouse/data
这样 `clickhouse-backup` 就会在宿主机的 `/data/docker/clickhouse/data/shadow/` 下找到 FREEZE 产生的数据文件。
修改后验证:
```bash
# 1. 先清理旧的无效备份
clickhouse-backup delete remote <旧备份名>
# 2. 验证 shadow 目录是否可访问
ls /data/docker/clickhouse/data/shadow/
# 3. 重新执行备份
BACKUP_NAME=webfunny_cloud_db_backup_$(date +%Y-%m-%dT%H-%M-%S)
clickhouse-backup create -t webfunny_cloud_db.* $BACKUP_NAME
# 4. 检查本地备份是否包含 shadow
ls /data/docker/clickhouse/data/backup/$BACKUP_NAME/
# 5. 上传到远程
clickhouse-backup upload $BACKUP_NAME
```
本地备份的目录结构应该包含 `shadow/` 文件夹,如果没有就说明 FREEZE 本身也有问题,需要同时检查 ClickHouse 容器内 shadow 目录的权限(确保 ClickHouse 用户有写权限)。