在上篇文章中,介绍了使用SDR工具进行Oracle到GaussDB的数据迁移过程,文中提及过在SDR之前还曾使用DataSync工具进行迁移测试;虽然最终采用SDR作为正式迁移方案,但DataSync本身也有其可取之处,本文将对之前的测试过程做一个简单的回顾。
1)硬件配置信息
2)软件配置信息
GaussDB侧操作系统及数据库软件版本如下所示:
ORACLE侧操作系统及数据库软件版本如下所示:
由于本次文章的重点不在于环境的搭建,所以操作系统及GaussDB的安装过程就不细述。
DataSync是华为提供的GaussDB 100数据迁移工具,支持从Sybase、 Oracle、 MySQL、 GaussDB 100V100R003C10和SQL Server迁移数据至GaussDB 100 V300R001数据库。支持在线迁移和离线迁移两种数据迁移方式。配置好源库以及目标库相关配置信息后,启动迁移工具即可,运行过程中会生成相关的日志文件和报告,便于用户进行日常的管理及维护。
Datasync工具约束和限制如下:
1)挂载NFS目录(可选项,Datasync支持部署在源端,目标端,第三方机器等,这次测试中挂载NFS只是为了尽量排除网络传递数据文件可能带来的效率影响)
在源库服务器及目标端服务器同时挂载迁移用的NFS文件系统。
源库操作:
su - root
mkdir /datasync
mount -F nfs -o rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,proto=tcp,suid 192.168.xxx.xx:/vx/tycj_dcmp_tmp /datasync
在目标端操作:
su - root
mkdir /datasync
mount -t nfs -o rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,proto=tcp,suid 188.0.xxx.xx:/vx/tycj_dcmp_tmp /datasync
2)上传和解压介质
① 上传介质到NFS目录
使用FTP工具上传GAUSSDB100-V300R001C00-DATASYNC.tar.gz 至/datasync目录。
② 解压介质
在源库服务器操作:
su - root
cd /datasync
tar -xvf GAUSSDB100-V300R001C00-DATASYNC.tar.gz
进入 GAUSSDB100-V300R001C00-DATASYNC.目录继续解压
tar -xvftar -zxvf DataSync.tar.gz。
3)检查java版本不低于1.8(源端目标端都要更新)
由于Datasync的脚本都需要依赖java驱动,要求服务器的java版本不低于1.8。
#java -version
Java version “1.8.0_231
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot 64-Bit Server VM (build 25.231-b11, mixed mode)
4)把JDBC驱动包迁移到指定目录
由于datasync本身没有Oracle的JDBC的驱动包,需要提前把源库的JDBC驱动包拷贝到dependency-jars目录中(缺失这个驱动包,会在检查配置时提示无法连接Oracle库)。
在源库服务器执行:
su - oracle
cd $ORACLE_HOME/jdbc/
cp ojdbc6.jar/datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/dependency-jars/ojdbc8-12.2.0.1.jar
注意:ojdbc8-12.2.0.1.jar这个命名是固定的,必须要改成同名文件才能识别。
1)Datasync有4个配置文件
如下所示:
2)配置密码密文
出于安全方面的考虑,迁移过程中需要用到的密码都必须使用密文方式记录在配置文件中,使用明文密码会被当做错误密码无法识别。因此在修改配置文件cfg.ini前,需要先将目标库服务器账号、源库数据库账号、目标库数据账号等账号密码生成对应密文。
生成密码密文方法如下:
① 生成导出数据库密码
java -jar DSS.jar -pwd 1
② 生成导入数据库密码
java -jar DSS.jar -pwd 2
③ 生成导入服务器密码
java -jar DSS.jar -pwd 3
-pwd后面跟的数字表示cfg.ini文件中要生成密文的密码类型。取值范围是:整数,[1, 9]。
具体含义如下:
PS:密码如果更新,或者重新生成新密文后,都需要更新配置文件里面的密文;另外往Gaussdb导入的时候不能使用root用户导入,必须使用其他账号。
3)新建存储导出文件目录(如果没有用NFS需要在源端和目标端分别创建)
mkdir -p /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/data
4)修改配置文件cfg.ini(部分配置参数内容)
cd /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/config
vi cfg.ini
{
"flow_type":1,导出程序
"export_db":{
"database_type":2, ##数据库类型Oracle
"db":{
"ip":"192.168.xxx.xxx",
"username":"username",
"password":"B/AaX+yBemxxxxxxxx", ##刚刚生成的密文密码
"port":1522,
"db_name":"db_name",
"server_name":" server_name 1",
"trust_store":"",
"trust_store_password":"",
"key_store":"",
"key_store_password":""
}
},
"import_db":{
"database_type":6, ##数据库类型为GaussDB
"db":{
"ip":"192.168.xxx.xxx",
"username":"username",
"password":"Cbs48z0vL+AUyY1xxxxxxxxx",
"port":40000,
……
……
},
"server":{
"ip":"192.168.xxx.xxx",
"username":"username",
"password":"N2B+M6xIRQxxxxxxxxxxx",
"pub_key_file":"",
"port":22
}
},
"data_path":{
"export_local_path":"/datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/data",
"export_remote_path":{
"ip":"",
"username":"",
"password":"",
"pub_key_file":"",
"port":22,
"path":""
},
"import_local_path":"/datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/data",
……
……
}
},
"option":{
……
……
"ignore_lost_table":3, ##自动创建缺失的表
"disable_trigger":true, ##导入时禁用触发器
"import_total_task":40, ##资源允许下开启更大并行可提高导入效率
"export_total_task":25, ##资源允许下开启更大并行可提高导出效率
……
…….
}
}
部分参数配置可参考下表:
1)进入到datasync安装目录
cd /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync
2)启动导出进程
java -jar DSS.jar -l /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/ -p /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/config/cfg.ini
3)查看导出结果
1)编辑cfg.ini文件,把"flow_type"改为2 表示执行导入操作
vi cfg.ini
“flow_type”:2
2)手动导入源库所有表的DDL(可选)
在cfg.ini中有ignore_lost_table参数控制,可在目标库不存在导入表时,选择忽略该表并继续导入/报错并自动退出/自动创建不存在表。但在实际使用过程中,选择自动创建表时受到的影响因素太多,容易出现较多的创建失败对象,影响整体数据的导入成功率,所以建议手动导入DDL。
导入DDL的方式可通过在源库用dbms_metadata.get_ddl包导出所有DDL,并手动删除DDL中GaussDB不支持的参数(例如storage和maxtrans等)和修改需要转换的数据类型(例如:数据类型long需要改成clob等),在datasync的安装目录下有一个TypeMappers目录,里面有OracleToGauss.json文件,包含大部分Oracle迁移到GaussDB需要转换的数据类型,可作为参考。
OracleToGauss.json部分内容截图:
3)在目标库提前创建用户和表空间
用户、用户权限和用户的默认表空间需要提前手动创建,具体创建语法跟Oracle基本一致。这里就不一一细述。
4)启动导入进程(在目标库执行)
java -jar DSS.jar -l /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/ -p /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/config/cfg.ini
命令和选项都跟导出命令是一样的,区别就在于提前修改cfg.ini文件中的flow_type参数,从1改到2。
5)查看导入结果
导入进程跑完之后可以在安装目录的reports_日期目录下面的LoadReport.csv文件查看详细到的导入情况,下面是部分截图:
虽然Datasync工具本身会有较多的校验过程和日志记录(包括失败的行数和对象等),但是为了确保迁移结果的准确性,在迁入成功之后还是建议人工进行一次数据对象的对比校验(正式的迁移还需要进行更严格的数据对比,这里不一一铺开)。
1、在源库执查看对象情况:
2、在目标库库执查看对象情况:
通过对比可以看到索引、视图等对象都有部分缺失,GaussDB暂时不支持DBLINK和存在索引字段总字节数不能超过3900等限制,这些需要协调业务层进行调整。
而在源库导出时部分表有中文乱码、业务表之间太多外键约束等问题,容易导致部分视图和索引会创建失败。这种情况可以根据报错信息,逐项修改。
上述例子只是datasync最简单的使用测试过程,实际上还可以通过配置exp_obj.ini、exclusive_obj.ini和ignore_ddl.ini等配置文件进行更细化的迁移配置。
在整个迁移过程中,Datasync迁移数据的过程可以简单总结为:把源库数据的DDL和数据按根据定义的格式分别导出,并完成数据的校验和转换,通过load文件的形式导入到GaussDB中,跟ORACLE数据泵的导数迁移过程相似。而在实际操作当中,仍然会有诸如中文乱码/大字段表导出和校验慢/外键约束限制等等问题,需要根据实际报错信息进行逐一修改和调整。
在迁移测试的时候也发现,导出数据过程需要进行较长时间DDL和数据检验,即使开启并行导出也无法明显降低导出时间。另外,本次使用的Datasync版本暂时不支持增量备份,所以如要用Datasync进行数据迁移,可能需要准备较长的工程时间。
作者介绍:
莫熙钟,新炬网络数据库运维专家。精通Oracle、MySQL、PostgreSQL等数据库运维技术,拥有Oracle OCP、MySQL OCP、GaussDB HCIP等认证,拥有丰富的数据库系统架构转型、分布式改造、数据迁移经验,擅长开源数据库转型技术支持,参与多个行业核心系统的Oracle到MySQL转型项目。2019年开始学习和研究华为GaussDB数据库运维技术,目前正在积极参与国产数据库转型改造项目和国产数据库通用型自动化运维工具的研发等工作。
本文由 dbaplus 社群授权转载。
领取专属 10元无门槛券
私享最新 技术干货