备份恢复
目前Clickhouse的备份方式有以下几种:
- 文本文件导入导出
- 表快照【略,类似 insert into a_new select * from a】
- 磁盘快照【略】
- ALTER TABLE…FREEZE
- 备份工具Clickhouse-Backup
- 当前版本0.6.3还无法很好的备份clickhouse 20.10+
- 不会备份metadata的数据
- 无法直接使用 restore 功能
- Clickhouse-Copier【需要ZK环境,未做演示】
1. 导出csv方式备份
1.1 导出csv
clickhouse中,数据文件大小为 900M,实际导出会远大于900M,语句 20G左右【测试时没执行完成】
clickhouse-client --query="select * from yqtest.hits_v1" > /clickhouse/backup/yqtest.hits_v1.tsv
1.2 从csv导入
需要先建好表,因此最好备份下metadata数据
cat hits_v1.tsv | clickhouse-client --query "INSERT INTO yqtest.hits_v1 FORMAT TSV" --max_insert_block_size=100000
2. ALTER TABLE…FREEZE
语法:
ALTER TABLE table_name FREEZE [PARTITION partition_expr]
该操作为指定分区创建一个本地备份。
如果 PARTITION 语句省略,该操作会一次性为所有分区创建备份。整个备份过程不需要停止服务
注意:FREEZE PARTITION 只复制数据, 不备份元数据. 元数据默认在文件 /var/lib/clickhouse/metadata/database/table.sql
2.1 备份
2.1.1 确认shadow目录为空:
默认位置:/var/lib/clickhouse/shadow/,若没执行过则还不存在此文件,会生成在设置的数据路径下
2.1.2 把临时分区的数据,合并到已有分区中
OPTIMIZE TABLE yqtest.visits_v1 PARTITION '2014-03' FINAL;
或
OPTIMIZE TABLE yqtest.visits_v1 FINAL;
2.1.3 冻结备份
echo -n 'alter table yqtest.visits_v1 freeze' | clickhouse-client
查看备份
[root@localhost ~]# ll /clickhouse/data/shadow/
total 4
drwxr-x---. 3 clickhouse clickhouse 19 Jan 13 01:17 1
-rw-r-----. 1 clickhouse clickhouse 2 Jan 13 01:17 increment.txt
[root@localhost ~]# du -sh /clickhouse/data/shadow/*
529M /clickhouse/data/shadow/1
4.0K /clickhouse/data/shadow/increment.txt
2.1.4 将备份保存
因为 /shadow/ 目录下次备份时候需要清空,因此将备份迁移到指定路径
mv /clickhouse/data/shadow/* /clickhouse/backup/
-- 同时备份下表结构
cp /clickhouse/data/metadata/yqtest/visits_v1.sql /clickhouse/backup/
2.2 手动恢复
- drop table visits_v1;
- 创建表,表不存在则根据备份的表结构创建,只需要将ATTACH修改为CREATE即可
- 目录数据恢复
cp -rl /clickhouse/backup/shadow/1/store/965/9653cc71-1378-40a1-9790-881a375c0717/* /clickhouse/data/data/yqtest/visits_v1/detached
chown -R clickhouse.clickhouse /clickhouse/data/data/yqtest/visits_v1/detached/*
- 将数据添加到表
根据/clickhouse/data/data/yqtest/visits_v1/detached看分区名称,结合表分区键PARTITION BY toYYYYMM(StartDate)
# 授权
echo 'alter table yqtest.visits_v1 attach partition 201403' | clickhouse-client
3. Clickhouse-Backup
特征
- 轻松创建和还原所有或特定表的备份
- 在文件系统上高效存储多个备份
- 通过流压缩上传和下载
- 支持远程存储上的增量备份
- 适用于AWS,Azure,GCS,腾讯COS,FTP
局限性
- 支持高于1.1.54390和20.10之前的ClickHouse
- 仅MergeTree系列表引擎
- 备份“分层存储”或storage_policy不支持!
- 不支持在ClickHouse 20.10中默认启用的“原子”数据库引擎!
- 云存储上的最大备份大小为5TB
- AWS S3上的最大零件数为10,000(如果您的数据库大于1TB,则增加part_size)
3.1 rpm安装
wget https://github.com/AlexAkulov/clickhouse-backup/releases/download/v0.6.3/clickhouse-backup-0.6.3-1.x86_64.rpm
rpm -ivh clickhouse-backup-0.6.3-1.x86_64.rpm
[root@localhost ~]# clickhouse-backup -v
Version: 0.6.3
Git Commit: 3a8f0619478b8b997ab520e9ae75b45f7f134bc7
Build Date: 2020-12-15
3.2 更改配置文件
vi /etc/clickhouse-backup/config.yml
general:
remote_storage: none
disable_progress_bar: false
backups_to_keep_local: 7
backups_to_keep_remote: 31
clickhouse:
username: default
password: ""
host: localhost
port: 9000
data_path: "/clickhouse/data"
skip_tables:
- system.*
timeout: 5m
freeze_by_part: false
secure: false
skip_verify: false
- backups_to_keep_local: 7 # 本地备份保留个数,默认0表示不自动做备份清理
- backups_to_keep_remote: 31 # 远程备份保留个数
3.3 查看可备份的表
clickhouse-backup tables
3.4 备份
3.4.1 创建全库备份
- 全库备份,默认会在数据目录下新建一个backup目录,数据存放在backup下
- 默认创建一个时间目录(时间是UTC的)
[root@localhost ~]# clickhouse-backup create `date "+%Y-%m-%dT%H-%M-%S"`
2021/01/13 05:49:32 Create backup '2021-01-13T05-49-31'
2021/01/13 05:49:32 Skip 'system.asynchronous_metric_log'
2021/01/13 05:49:32 Skip 'system.metric_log'
2021/01/13 05:49:32 Skip 'system.query_log'
2021/01/13 05:49:32 Skip 'system.query_thread_log'
2021/01/13 05:49:32 Skip 'system.trace_log'
2021/01/13 05:49:32 Freeze 'yqtest.hits_v1'
2021/01/13 05:49:32 Freeze 'yqtest.visits_v1'
2021/01/13 05:49:32 Freeze 'yqtest.visits_v1_1'
2021/01/13 05:49:32 Copy part hashes
2021/01/13 05:49:32 Skip 'system.asynchronous_metric_log'
2021/01/13 05:49:32 Skip 'system.metric_log'
2021/01/13 05:49:32 Skip 'system.query_log'
2021/01/13 05:49:32 Skip 'system.query_thread_log'
2021/01/13 05:49:32 Skip 'system.trace_log'
2021/01/13 05:49:32 Writing part hashes
2021/01/13 05:49:32 Copy metadata
2021/01/13 05:49:32 Done.
2021/01/13 05:49:32 Move shadow
2021/01/13 05:49:32 Done.
默认情况下备份包含两个目录
- metadata 目录: 包含重新创建所需的 DDL SQL
- shadow 目录: 包含作为ALTER TABLE ... FREEZE操作结果的数据。
注意:截止当前版本【0.6.3】,还不支持clickhouse 20.10+的版本,数据会备份,但是元数据不被备份
3.4.2 单表备份
备份语法:
clickhouse-backup create [-t, --tables=<db>.<table>] <backup_name>
# 单表备份
clickhouse-backup create -t yqtest.hits_v1 `date "+%Y-%m-%dT%H-%M-%S"`
3.4.3 多表备份
# 多表备份
clickhouse-backup create -t yqtest.hits_v1,yqtest.visits_v1 `date "+%Y-%m-%dT%H-%M-%S"`
3.5 恢复
恢复语法:
clickhouse-backup restore 备份名称
[root@localhost ~]# clickhouse-backup restore --help
NAME:
clickhouse-backup restore - Create schema and restore data from backup
USAGE:
clickhouse-backup restore [--schema] [--data] [-t, --tables=<db>.<table>] <backup_name>
OPTIONS:
--config FILE, -c FILE Config FILE name. (default: "/etc/clickhouse-backup/config.yml") [$CLICKHOUSE_BACKUP_CONFIG]
--table value, --tables value, -t value
--schema, -s Restore schema only
--data, -d Restore data only
--rm, --drop Drop table before restore
- --table,--tables,-t 恢复特定的表
- --schema, -s 只恢复表结构
- --data, -d 只恢复数据
- --rm, --drop 在恢复前删除表
3.5.1 恢复被删除的表
[root@localhost ~]# clickhouse-backup restore -t yqtest.test2 2021-01-13T15-04-09;
2021/01/13 15:06:04 Create table 'yqtest.test2'
2021/01/13 15:06:04 Prepare data for restoring 'yqtest.test2'
2021/01/13 15:06:04 ALTER TABLE `yqtest`.`test2` ATTACH PART '20140317_20140319_2_2_0'
2021/01/13 15:06:04 ALTER TABLE `yqtest`.`test2` ATTACH PART '20140317_20140323_1_1_0'
3.5.2 仅恢复表结构
clickhouse-backup restore -t yqtest.test2 --schema
3.5.3 仅表数据
clickhouse-backup restore -t yqtest.test2 --data
3.6 查看删除备份
3.6.1 查看备份
clickhouse-backup list
3.6.2 删除备份文件
clickhouse-backup delete local 2021-01-12T10-14-50
3.6.3 清除shadow下的临时备份文件
clickhouse-backup clean
3.7 恢复测试
3.7.1 测试数据
localhost :) use yqtest;
localhost :) show tables;
┌─name──────┐
│ hits_v1 │
│ test1 │ # 50000
│ test2 │ # 152000
│ test3 │ # 10000
│ v_test │
│ visits_v1 │
└───────────┘
3.7.2 进行一次备份
[root@localhost backup]# clickhouse-backup create `date "+%Y-%m-%dT%H-%M-%S"`
2021/01/13 15:46:33 Create backup '2021-01-13T15-46-33'
2021/01/13 15:46:33 Skip 'system.asynchronous_metric_log'
2021/01/13 15:46:33 Skip 'system.metric_log'
2021/01/13 15:46:33 Skip 'system.query_log'
2021/01/13 15:46:33 Skip 'system.query_thread_log'
2021/01/13 15:46:33 Skip 'system.trace_log'
2021/01/13 15:46:33 Freeze 'yqtest.hits_v1'
2021/01/13 15:46:33 Freeze 'yqtest.test1'
2021/01/13 15:46:33 Freeze 'yqtest.test2'
2021/01/13 15:46:33 Freeze 'yqtest.test3'
2021/01/13 15:46:33 Freeze 'yqtest.v_test'
2021/01/13 15:46:33 Freeze 'yqtest.visits_v1'
2021/01/13 15:46:33 Copy part hashes
2021/01/13 15:46:33 Skip 'system.asynchronous_metric_log'
2021/01/13 15:46:33 Skip 'system.metric_log'
2021/01/13 15:46:33 Skip 'system.query_log'
2021/01/13 15:46:33 Skip 'system.query_thread_log'
2021/01/13 15:46:33 Skip 'system.trace_log'
2021/01/13 15:46:33 Writing part hashes
2021/01/13 15:46:33 Copy metadata
2021/01/13 15:46:33 Done.
2021/01/13 15:46:33 Move shadow
2021/01/13 15:46:33 Done.
# 备份的文件,可看到缺少了metadata文件
[root@localhost backup]# ll /clickhouse/data/backup/2021-01-13T15-46-33/
total 4
-rw-r--r--. 1 root root 3455 Jan 13 15:46 parts.hash
drwxr-xr-x. 8 root root 72 Jan 13 15:46 shadow
# 手动复制下metadata过来
[root@localhost ~]# cd /clickhouse/data/backup/test_backup/
[root@localhost test_backup]# cp -r /clickhouse/data/metadata ./
[root@localhost test_backup]# ll
total 4
drwxr-x---. 2 root root 104 Jan 13 15:48 metadata
-rw-r--r--. 1 root root 3455 Jan 13 15:46 parts.hash
drwxr-xr-x. 8 root root 72 Jan 13 15:46 shadow
3.7.2 数据破坏
localhost :) truncate table test1;
localhost :) insert into test2 select * from test3 limit 1000;
localhost :) drop table test3;
localhost :) show tables;
┌─name──────┐
│ hits_v1 │
│ test1 │ # 0
│ test2 │ # 153000
| | # test3被drop了
│ v_test │
│ visits_v1 │
└───────────┘
3.7.3 恢复被删除表
当前测试恢复数据的版本是 20.5.4.40,备份是直接存在 metadata 信息的
[root@localhost ~]# clickhouse-backup restore -t yqtest.test3 2021-01-13T15-04-09;
2021/01/13 15:06:04 Create table 'yqtest.test3'
2021/01/13 15:06:04 Prepare data for restoring 'yqtest.test2'
2021/01/13 15:06:04 ALTER TABLE `yqtest`.`test3` ATTACH PART '20140317_20140319_2_2_0'
2021/01/13 15:06:04 ALTER TABLE `yqtest`.`test3` ATTACH PART '20140317_20140323_1_1_0'
实测复制 metadata过来在使用新引擎的情况下【20.10+】,当前备份工具无法正常恢复【0.6.3】
4 当前版本clickhouse-backup[0.6.3]无法支持20.10+的问题处理方案
- 当前版本【0.6.3】备份 20.10+ 的clickhouse时,因为不支持 Atomic 引擎,无法正常备份元数据
- 也无法直接使用 restore 进行恢复
4.1 处理思路
4.2 测试
4.2.1 测试数据
show tables;
┌─name──────┐
│ test1 │ # 50000
│ test2 │ # 151000
│ test3 │ # 10000
└───────────┘
4.2.2 备份数据
[root@localhost ~]# clickhouse-backup create `date "+%Y-%m-%dT%H-%M-%S"`
2021/01/14 15:44:40 Create backup '2021-01-14T15-44-40'
2021/01/14 15:44:40 Skip 'system.asynchronous_metric_log'
2021/01/14 15:44:40 Skip 'system.metric_log'
2021/01/14 15:44:40 Skip 'system.query_log'
2021/01/14 15:44:40 Skip 'system.query_thread_log'
2021/01/14 15:44:40 Skip 'system.trace_log'
2021/01/14 15:44:40 Freeze 'yqtest.test1'
2021/01/14 15:44:40 Freeze 'yqtest.test2'
2021/01/14 15:44:40 Freeze 'yqtest.test3'
2021/01/14 15:44:40 Copy part hashes
2021/01/14 15:44:40 Skip 'system.asynchronous_metric_log'
2021/01/14 15:44:40 Skip 'system.metric_log'
2021/01/14 15:44:40 Skip 'system.query_log'
2021/01/14 15:44:40 Skip 'system.query_thread_log'
2021/01/14 15:44:40 Skip 'system.trace_log'
2021/01/14 15:44:40 Writing part hashes
2021/01/14 15:44:40 Copy metadata
2021/01/14 15:44:40 Done.
2021/01/14 15:44:40 Move shadow
2021/01/14 15:44:40 Done.
当前备份
[root@localhost ~]# ll /clickhouse/data/backup/2021-01-14T15-44-40/
total 4
-rw-r--r--. 1 root root 3087 Jan 14 15:44 parts.hash
drwxr-xr-x. 8 root root 72 Jan 14 15:44 shadow
4.2.4 备份metadata
由于clickhouse-backup 当前版本不会备份metadata,因此自己复制一份metadata数据
cp -r /clickhouse/data/metadata /clickhouse/data/backup/2021-01-14T15-44-40/
[root@localhost 2021-01-14T15-44-40]# ll /clickhouse/data/backup/2021-01-14T15-44-40/
total 4
drwxr-x---. 2 root root 104 Jan 14 15:45 metadata # 复制过来了
-rw-r--r--. 1 root root 3087 Jan 14 15:44 parts.hash
drwxr-xr-x. 8 root root 72 Jan 14 15:44 shadow
4.2.3 破坏数据
truncate table test1;
insert into test2 select * from test3 limit 1000;
drop table test3;
show tables;
┌─name──────┐
│ test1 │ # 0
│ test2 │ # 152000
│ │ # 表test3被删除
└───────────┘
4.2.4 恢复
4.2.4.1 恢复被truncate的表
- 表结构还存在,数据不存在了,需要恢复数据
- 可以使用 cat parts.hash 查看备份目录记录的表对应关系
# 1.拷贝数据到原始目录下
[root@localhost ~]# cp -rl /clickhouse/data/backup/2021-01-14T15-44-40/shadow/a83/a83cbe35-16c7-417b-b59f-a72cec7d9d54/* /clickhouse/data/data/yqtest/test1/detached/
# 2.授权
[root@localhost ~]# chown -R clickhouse.clickhouse /clickhouse/data/data/yqtest/test1/detached/
[root@localhost ~]# ll /clickhouse/data/data/yqtest/test1/detached/
total 20
drwxr-xr-x. 2 clickhouse clickhouse 16384 Jan 14 16:38 201403_1_1_0
# 3.恢复,可查看到数据已恢复
[root@localhost ~]# echo 'alter table yqtest.test1 attach partition 201403' | clickhouse-client
localhost :) select count(*) from test1;
┌─count()─┐
│ 50000 │
└─────────┘
4.2.4.1 恢复被drop的表
- 表test3被删除了,表结构不存在了,需要从metadata备份中获取表结构
# 1.获取表结构,修改第一行 ATTACH TABLE _ UUID 'xxxx' 为 create,然后执行创建表
cat /clickhouse/data/backup/2021-01-14T15-44-40/metadata/yqtest/test3.sql
# 2.拷贝数据到目标目录下
[root@localhost ~]# cp -rl /clickhouse/data/backup/2021-01-14T15-44-40/shadow/b62/b62958a6-7a52-47ca-9707-2ed9db0eaa93/* /clickhouse/data/data/yqtest/test3/detached/
# 3.授权
chown -R clickhouse.clickhouse /clickhouse/data/data/yqtest/test3/detached/
# 4.恢复,可查看到数据已恢复
[root@localhost ~]# echo 'alter table yqtest.test3 attach partition 201403' | clickhouse-client
localhost :) show tables;
┌─name──────┐
│ test1 │ # 50000
│ test2 │ # 152000
│ test3 │ # 10000
└───────────┘