Hologres支持多种方式的导入导出,如数据集成、Holo Shipper、跨库查询等,提供非常方便快捷的数据传输功能,在实际应用场景中经常有Hologres实例之间数据互访迁移的情况。本文为您介绍Hologres实例间数据迁移最佳实践。
Hologres元数据迁移
将实例中的元数据(只包含表结构,不包含数据)全部迁移至另外一个实例,可以使用Holo Shipper工具导出元数据。操作步骤如下。
下载holo-shipper-1.2.4.jar的Jar包,并进行相关配置,详情请参见Holo Shipper。
只迁移元数据,Holo Shipper的配置如下。
--将一个Hologres实例中的某些表结构ship到另一个Hologres实例中,保留源表owner和权限,不同步与这些表无关的用户,不同步源数据库的guc参数和extension java -jar holo-shipper.jar -s holo -h <源实例endpoint> -p 80 -u <源实例用户名> -w <源实例密码> -d holo -h <目标实例endpoint> -p 80 -u <目标实例用户名> -w <目标实例密码> -l <配置文件路径> --no-data --no-all-roles --no-guc --no-ext
配置中文件JSON模板如下。
shipList
中元素为SchemaName
必须显式逐个指定,表名可以用通配符指代所有(模板中是将数据库中的public Schema下的所有表同步)。[ { "dbName": "<DataBaseName>", "shipList": { "public": ["*"], "<SchemaName1>" :["<TableName1>","<TableName2>"], "<SchemaName2>" :["<TableName3>"] } } ]
配置中文件JSON具体示例如下。
[ { "dbName": "DB1", "shipList": { "schema1": ["*"], "schema2": ["table1", "table2"] }, "blackList": { "schema1": ["table3"] } }, { "dbName": "DB2", "shipList": { "schema3": ["*"], "schema4": ["table4", "table5"] }, "schemaMapping": { "schema4": "schema5" }, "tgMapping": { "tablegroup1": "tablegroup2" } }, { "dbName": "DB3", "shipList": { "public": ["*"] }, "sinkDB" : "DB3_backup" } ]
文件为一个JSONArray,Array中每一个JSONObject代表一个数据库。
每个数据库的JSONObject包含元素信息如下。
Key
Value
是否必填
说明
dbName
数据库名称。
是
无
shipList
JSONObject(其中每个Key为Schema名,Value为要
ship
的表名的List)。是
在
shipList
中的表和它们的子表(且不在blackList
中)都会被ship
,选择这个Schema中的所有表用*
。blackList
JSONObject(其中每个Key为Schema名,Value为不需要
ship
的表名的List)。否
在
blackList
中的表和他们的子表不会被ship
。sinkDB
目的地数据库名称(String类型)。
否
不提供的话默认和
dbName
相同。 当原和目的实例为同一个Hologres实例时可以视为将表从dbName
移到sinkDB
。schemaMapping
JSONObject(其中每个Key为源Schema名, Value为目标的Schema名)。
否
需要改变Schema就在Value指定,不指定默认与原Schema不变。
tgMapping
JSONObject(其中每个Key为源Table Group名, Value为在目标的Table Group名)。
否
需要改变Table Group就在Value指定,不指定将默认使用目标库的默认Table Group。
Hologres实例间全量数据迁移
DataWorks数据集成实现Hologres整库迁移(推荐)
DataWorks数据集成支持将Hologres实例数据整库同步至另一个Hologres实例,实现整库表结构和数据同步的能力。详情请参见Hologres整库数据离线同步至Hologres。
Holo-Shipper实现Hologres实例迁移
将一个实例的全量数据迁移至另一个实例,可以使用Hologres提供的迁移工具Holo Shipper,只需要一个命令语句,即可简单方便地实现全量数据迁移操作,详情请参见Holo Shipper。
如果实例中的数据量较大,如TB级别或者以上的数据量,建议不要使用Holo Shipper,否则会因为ECS带宽不足等原因导致数据传输时间过长。超大数据量的迁移建议使用DataWorks数据集成Hologres整库同步功能。
迁移全量数据包括账号、权限等,代码示例如下:
$ java -jar holo-shipper.jar -s holo -h xx.xx.xx.xx -p xxxx -u username -w password -d holo -h xx.xx.xx.xx -p xxxx -u username2 -w password2 -l ship_list_json_path
ship_list_json_path
中JSON的内容如下。
[
{
"dbName": "DB",
"shipList": {
"schema1": ["*"],
"schema2": ["*"]
}
}
]
Hologres实例间部分表的全量数据迁移
DW数据集成迁移Hologres部分表数据(推荐)
DataWorks数据集成支持将Hologres实例数据整库同步至另外一个Hologres实例,实现整库表结构和数据同步的能力。在同步时可以选择需要迁移的部分表,实现部分表数据的全量迁移。详情请参见Hologres整库数据离线同步至Hologres。
Holo-Shipper迁移Hologres部分表数据
将实例的部分表全量数据迁移至另外一个实例,也可以通过迁移工具Holo Shipper实现,只需要一个命令语句即可实现数据迁移,操作简单方便。如下示例将一个Hologres实例中的某些表迁移到另一个Hologres实例中,保留源表Owner和权限,代码示例如下:
将一个Holo实例中的某些表ship到另一个Holo实例中,保留源表owner和权限,不同步与这些表无关的用户
$ java -jar holo-shipper.jar -s holo -h xx.xx.xx.xx -p xxxx -u username -w password -d holo -h xx.xx.xx.xx -p xxxx -u username2 -w password2 -l ship_list_json_path --no-all-roles
ship_list_json_path
中JSON的内容如下(不需要迁移的表,配置迁移blackList
,则不会被迁移)。
--迁移table1和table2表的全量数据,不迁移table3表的数据
[
{
"dbName": "DB1",
"shipList": {
"schema1": ["*"],
"schema2": ["table1", "table2"]
},
"blackList": {
"schema1": ["table3"]
}
}
]
下载超过10000行的数据
HoloWeb、DataStudio的Hologres SQL模块仅支持10000行以内的数据下载,如果要下载超过10000行的结果集,建议使用COPY
命令语句将数据先导入至OSS,再下载,详情请参见导出至本地文件。