前提:

两台不同阿里云账号里的云数据库clickhouse实例需要做数据迁移,阿里云现在不支持跨账号的clickhouse数据迁移,所以需要自己用命令行去操作。

操作:

需安装clickhouse-client工具,请安装与目标实例云数据库ClickHouse版本一致的clickhouse-client工具,下载链接请参见​https://packages.clickhouse.com/deb/pool/stable/?spm=a2c4g.11186623.0.0.1c2948a2ZRCn4K​​​,如何安装和使用​​Installation | ClickHouse Docs​

连接数据库时端口建议选择3306,8123我连接失败。

开始迁移:

步骤一:查看源实例的database列表

clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW databases"  > database.list

参数解释如下:

参数

描述

old host

源实例的地址。

old port

源实例的端口。

old user name

登录源实例的账号,拥有DML读写和设置权限,允许DDL权限。

old password

上述账号对应的密码。

说明 system是系统数据库,不需要迁移,可以直接过滤掉。

步骤二:查看源实例的table列表

clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW tables from <database_name>"  > table.list

说明 查询到的表名中,如果有以.inner.开头的表,则它们是物化视图的内部表示,不需要迁移,可以直接过滤掉。


步骤三:导出源实例的建表DDL

clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW CREATE TABLE <database_name>.<table_name>"  > table.sql

步骤四:将建表DDL导入到目标实例云数据库ClickHouse

clickhouse-client --host="<new host>" --port="<new port>" --user="<new user name>" --password="<new password>"  < table.sql

这一步如果失败可以登录阿里云DMS源库,选择需要导出的数据库,右键导出建表语句。

阿里云clickhouse实例跨账号数据迁移_数据迁移

再登录到目标库的DMS,创建database,再导入建表语句执行。

阿里云clickhouse实例跨账号数据迁移_数据迁移_02


步骤五:导入数据到目标实例云数据库ClickHouse

​通过Linux pipe管道进行流式导出导入

clickhouse-client --host="<old host>" --port="<old port>" --user="<user name>" --password="<password>"  --query="select * from <database_name>.<table_name> FORMAT CSV" | 
clickhouse-client --host="<new host>" --port="<new port>" --user="<user name>" --password="<password>" --query="INSERT INTO <database_name>.<table_name> FORMAT CSV"


批量导入多个表的数据

for i in `cat table.list`;do clickhouse-client --host="<old host>" --port="<old port>" --user="<user name>" --password="<password>" --query="select *  from import.$i FORMAT CSV"| clickhouse-client --host="<new host>" --port="<new port>" --user="<user name>" --password="<password>" --query="INSERT INTO import.$i FORMAT CSV" ;done


在dms上查看有数据,完成。



遇到的坑

阿里云clickhouse实例跨账号数据迁移_clickhouse_03

导入数据时会遇到报错说partitions不够,这个不能在阿里云实例中修改,需要登录DMS里修改。

set global max_partitions_per_insert_block = 5000

阿里云clickhouse实例跨账号数据迁移_clickhouse_04