ClickHouse 备份恢复

备份恢复

目前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

官方路径:https://github.com/AlexAkulov/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=.

]

# 单表备份
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=.
] 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
└───────────┘

你可能感兴趣的:(ClickHouse 备份恢复)