赞
踩
本章节包括的主题如下:
迁移程序支持迁移多种源数据库,为了避免不同源数据库配置相互的干扰,按不同的源数据库类型进行生成独立的配置文件,因此需要知道当前激活的配置。进入kdts-plus/conf目录,打开application.yml文件,把“active”的值设置当前激活的源数据库类型(spring -> profiles -> active):
active: oracle #准备迁移的数据库,如dm(达梦)、gbase、kingbase、mysql、oracle等,具体的配置在kdts-XXX.yml文件中
当前设置的是oracle,激活的“数据库连接”配置就是kdts-oracle.yml,如果配置的是mysql,则对应kdts-mysql.yml,以此类推。
迁移工具除了进行数据迁移还可进行源库和目标库的数据对比,可根据需要切换运行模式。进入kdts-plus/conf目录,打开application.yml文件,去掉“running-mode”前的#号(注释)后设置需要的运行模式:
datasource: type: source: Hikari # Hikari、Druid、Simple #源库为gbase8g时,只能选择Simple target: Hikari # Hikari、Druid、Simple log: home: logs # 日志主目录 level: #日志级别 console-appender: INFO # 控制台输出(OFF、TRACE、DEBUG、INFO、WARN、ERROR) file-appender: INFO # 文件输出(OFF、TRACE、DEBUG、INFO、WARN、ERROR) #running-mode: DataCompare #数据比较
注意
注释掉“running-mode”即为缺省的数据迁移模式,以后若有新运行模式,按注释说明填写。
根据设置的“源库类型”,打开conf目录中与之对应的配置文件(如kdts-oracle.yml),按实际环境中的运行参数进行配置。
#源数据库类型 dbType: oracle #源数据库版本(9i,10g,11g,12c,19c) dbVersion: 11g #连接字符串 url: jdbc:oracle:thin:@1.2.3.4:1521/orcl #驱动类名 driver-class-name: oracle.jdbc.OracleDriver #用户名 username: oracle #密码 password: 123456 #数据库连接验证SQL validationQuery: select 1 from dual
注意
如果源库的类型为MariaDB时使用与Mysql使用相同的接口和配置文件,不再单独处理,请按照下表中的版本对应关系进行配置:
MariaDb
MySql
kdts-plus对应的dbVersion
5.5、10.0
5.5
5.5
10.1
5.6
5.7
10.2、10.3、10.4
5.7
5.7
10.5、10.6、10.7
8.0
8.0
配置“连接字符串”时需要考虑数据库的初始化字符集等因素,例如当MySQL数据库的字符集是GBK或GB2312时,应在url中添加“useUnicode=true&characterEncoding=utf-8”。
#要迁移的模式,多个模式用英文逗号隔开,如:A,B,C(不要回车换行),也可填入"*"(需要双引号,将迁移源库中此用户所能访问的所有模式) #schemas: Sehcma1,Sehcma2,Sehcma3 #schemas: "*" schemas: Sehcma1 #不迁移的模式,多个模式用英文逗号隔开,如:A,B,C(不要回车换行) schema-excludes: SYS,SYSTEM,MGMT_VIEW,DBSNMP,SYSMAN,OUTLN,FLOWS_FILES,MDSYS,ORDSYS,EXFSYS,WMSYS,APPQOSSYS,APEX_030200,OWBSYS_AUDIT,ORDDATA,CTXSYS,ANONYMOUS,XDB,ORDPLUGINS,OWBSYS,SI_INFORMTN_SCHEMA,OLAPSYS,SCOTT,ORACLE_OCM,XS$NULL,BI,PM,MDDATA,IX,SH,DIP,OE,APEX_PUBLIC_USER,HR,SPATIAL_CSW_ADMIN_USR,SPATIAL_WFS_ADMIN_USR
#大表拆分阈值行数(当表的行数超过此值时,将对表进行拆分,每块的记录数为此值和表总记录数除以“拆分最大块数”中的最大值) large-table-split-threshold-rows: 5000000 #大表拆分阈值大小(单位为M)(当表的数据大小(普通字段+大对象字段)超过此值时,将对表进行拆分) large-table-split-threshold-size: 5000 #大表拆分最大块数(每张表的最大拆分块数,应不超过总的读线程数) large-table-split-max-chunk-num: 24 #大表拆分条件定义文件(优先于按行数和大小拆分) large-table-split-condition-file: largetable-split-condition.json
#表数据过滤条件定义文件 table-data-filter-condition-file: table-data-filter-condition.json
#注意:在下面使用英文逗号隔开的配置项中,如果对象名称中包含!@#$%^&*(_+}{]|\\'g;:?/,<等特殊字符时可使用双引号,但双引号需加斜杠转义,如\"Schema1\".\"Table!@#$%^&*(_+}{]|\\,<ABC\" #只迁移的表,多个表用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/tableIncludes.txt文件后在文件中配置(文件优先) table-includes: #不迁移的表,多个表用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/tableExcludes.txt文件后在文件中配置(文件优先) table-excludes: #只迁移的字段,多个字段用英文逗号隔开,如:A,B,Table1.C,Schema1.Table1.D(不要回车换行,可指定表名、模式名),也可创建conf/columnIncludes.txt文件后在文件中配置(文件优先) column-includes: #不迁移的字段,多个字段用英文逗号隔开,如:A,B,Table1.C,Schema1.Table1.D(不要回车换行,可指定表名、模式名),也可创建conf/columnExcludes.txt文件后在文件中配置(文件优先) column-excludes: #只迁移的视图,多个视图用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/viewIncludes.txt文件后在文件中配置(文件优先) view-includes: #不迁移的视图,多个视图用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/viewExcludes.txt文件后在文件中配置(文件优先) view-excludes: #只迁移的函数,多个函数用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/functionIncludes.txt文件后在文件中配置(文件优先) function-includes: #不迁移的函数,多个函数用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/functionExcludes.txt文件后在文件中配置(文件优先) function-excludes: #只迁移的存储过程,多个存储过程用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/procedureIncludes.txt文件后在文件中配置(文件优先) procedure-includes: #不迁移的存储过程,多个存储过程用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/procedureExcludes.txt文件后在文件中配置(文件优先) procedure-excludes: #只迁移的包,多个包用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/packageIncludes.txt文件后在文件中配置(文件优先) package-includes: #不迁移的包,多个包用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/packageExcludes.txt文件后在文件中配置(文件优先) package-excludes: #只迁移的序列,多个序列用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/sequenceIncludes.txt文件后在文件中配置(文件优先) sequence-includes: #不迁移的序列,多个序列用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/sequenceExcludes.txt文件后在文件中配置(文件优先) sequence-excludes: #只迁移的同义词,多个同义词用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/synonymIncludes.txt文件后在文件中配置(文件优先) synonym-includes: #不迁移的同义词,多个同义词用英文逗号隔开,如:A,B,Schema1.C,D(不要回车换行,可指定模式名),也可创建conf/synonymExcludes.txt文件后在文件中配置(文件优先) synonym-excludes:
#是否迁移序列 migrate-sequence: true #序列仅更新值(不创建) sequence-only-updating-value: false #序列是否使用CurrVal做当前值(Oracle调用CurrVal前需要调用NextVal,会耗费一个序列值) sequence-use-current-value: false #是否迁移表结构 migrate-table-structure: true #是否迁移数据 migrate-table-data: true #是否迁移主键 migrate-table-primary-key: true #是否迁移索引 migrate-table-index: true #是否迁移唯一性约束 migrate-table-unique: true #是否迁移外键 migrate-table-foreign-key: true #是否迁移检查约束 migrate-table-check: true #是否迁移视图 migrate-view: false #是否迁移函数 migrate-function: false #是否迁移存储过程 migrate-procedure: false #是否迁移包 migrate-package: false #是否迁移同义词 migrate-synonym: false #是否包含公共同义词 include-public-synonym: false #是否迁移触发器 migrate-trigger: false #是否迁移注释 migrate-comment: true
#是否使用kdms做转换(视图、函数、存储过程、包、触发器) use-kdms: false #kdms访问地址 kdms-url: http://192.168.0.25:12580/kdms/ #kdms源数据库类型 kdms-source-db-type: Oracle #kdms目标数据库类型 kdms-target-db-type: Kingbase_ES_V8_R6
#网络读取超时时长(秒,0表示永不超时,若出现类似“Socket read timed out”异常时,可增大此值) net-read-timeout: 0 #源数据库游标读取记录数(一次性从源库读取的行数,在一定范围内增加该值可提升读取效率,但会增加内存开销) fetch-size: 1000 #源数据库含大对象数据表的游标读取记录数(同上,只是此参数针对有大对象字段的表) table-with-large-object-fetch-size: 100 #源数据库含大大对象数据表的游标读取记录数(同上,只是此参数针对大对象字段长度超过1G的表) table-with-big-large-object-fetch-size: 50 #是否使用数据库系统统计信息(如表的记录数、大小等) use-dbms-stats: false #是否使用手工脚本 use-manual-script: false #读数据超时时长(单位毫秒,0表示永不超时) read-data-timeout: 0 #最大重试次数 max-retries: 0 #重试间隔(毫秒) retry-interval: 500 #读数据(中断后)能否恢复 read-data-can-resume: false #字符是否需要解码(从源库作转码),用于处理类似Oracle us7ascii编码 character-need-decoding: false
注意
如果源库的数据在保存时做过编码转换,例如源库为Oracle的为us7asii编码时,保存中文字符时需要转成“ISO_8859_1”编码,则迁移时需作解码处理,应将“字符是否需要解码”设置未ture(character-need-decoding: true)。
#数据对比缓冲区大小(源端) data-compare-buffer-size: 50000 #数据对比摘要算法 data-compare-algorithm: MD5 #CRC32、MD5、SHA1、SHA256、SHA384、SHA512
#源数据库最大连接数 maximum-poolsize: 200
根据设置的“源库类型”,打开conf目录中与之对应的配置文件(如kdts-oracle.yml),按实际环境中的运行参数进行配置。
#目标数据库类型 dbType: KINGBASE #目标数据库版本(V7,V8R3,V8R6,V8R6C7,V9) dbVersion: V8R6 #Unix Domain #url: jdbc:kingbase8:///db?currentSchema=db&socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/tmp/.s.KINGBASE.54321&sslMode=disable #simple jdbc url: jdbc:kingbase8://1.2.3.4:54321/test1 #V8R3和V8R6使用 #url: jdbc:kingbase://1.2.3.4:54321/TEST #V7使用 #driver-class-name: com.kingbase.Driver #V7使用 #driver-class-name: com.kingbase8.r3.Driver #V8R3使用 driver-class-name: com.kingbase8.Driver #V8R6使用 username: kingbase password: 123456 #目标模式,多个模式用英文逗号隔开,如:A,B,C(不要回车换行),也可填入"*"(需要双引号,则目标模式与源模式同名) #schemas: Sehcma1,Sehcma2,Sehcma3 #schemas: Sehcma1 schemas: "*" #数据库连接验证SQL validation-query: select 1
注意
如果迁移程序和目标数据库(KingbaseES)在同一台计算机上,并且操作系统是Linux,可以使用Unix Domain进行连接,可提高数据传输效率。
#批量提交记录数(行数据) write-batch-size: 1000 #批量提交数据大小(单位M) write-batch-byte-size: 100 #删除目标库中已存在的对象(如表、视图等) drop-existing-object: true #是否截断表(清空表数据) truncate-table: false #目标数据库对象重命名-除表名、列名外的其他对象: pk、fk、constraint、unique constraint、index 等 rename-object: true #检查约束不验证已存在数据 check-constraint-not-validated: true #是否记录成功脚本 log-success-script: true #是否创建目标模式 create-target-schema: true #迁移结果保留时长(单位为天) result-retention-days: 7 #是否删除空字符(解决 无效的 "UTF8" 编码字节顺序(invalid byte sequence for encoding "UTF8": 0x00)) remove-null-character: false #是否将分区表当作普通表迁移 partition-table-as-normal: false #写数据超时时长(单位毫秒,0表示永不超时) write-data-timeout: 0 #最大重试次数 max-retries: 0 #重试间隔(毫秒) retry-interval: 500
注意
如果只迁移表数据,应将“drop-existing-object”设置为false,避免删除目标库中表。
如果将大表拆分为多次迁移,应将“truncate-table”设置为false。
#数据对比缓冲区大小(目标端) data-compare-buffer-size: 200000 #数据对比查询并行度 data-compare-query-parallelism: 5
#目标数据库最大连接数 maximum-poolsize: 200
数据迁移属于IO密集型操作,涉及网络络IO和磁盘IO的交互,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。为提升数据迁移的效率可以多设置⼀些线程池中线程的数量,避免任务等待,线程可以去做更多的迁移任务,提高并发处理效率。但不是线程数设置的越高,效率就越高,线程上下文切换是有代价的。 对于对于IO密集型线程数的设置公式为:线程数 = CPU核心数/(1-阻塞系数) ,其中阻塞系数一般为0.8~0.9之间,取0.9则:
双核CPU: 2/(1-0.9) = 20 64核2路CPU: 64*2/(1-0.9) = 1280
进入 kdts-plus/conf目录下,打开:kb-thread-config.xml
<?xml version="1.0" encoding="UTF-8"?> <config> <pool name="default"><!-- 至少要有一个线程池default --> <corePoolSize>1</corePoolSize><!-- 核心线程数 --> <maxPoolSize>1</maxPoolSize><!-- 最大线程数(设置为和核心线程数一致) --> <keepAliveTime>15</keepAliveTime><!-- 线程空闲存活时间(单位:秒) --> <workQueueSize>8</workQueueSize><!-- 工作队列大小 --> </pool> <!-- 以下参数是基于Intel Xeon Gold 6330(28核心56线程),256G内存,JVM内存16G(详见/bin/startup.sh中的-Xms和-Xmx) --> <!-- 请根据实际运行环境按比例调整 --> <!-- 表数据读线程池 --> <pool name="read"> <corePoolSize>8</corePoolSize><!-- 可根据服务器配置作调整,如果源库读慢,可适当提升读、写线程的比例 --> <maxPoolSize>8</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>150000</workQueueSize><!-- 保持不变 --> </pool> <!-- 表数据写线程池 --> <pool name="write"> <corePoolSize>48</corePoolSize><!-- 可根据服务器配置作调整,如果源库读慢,可适当提升读、写线程的比例 --> <maxPoolSize>48</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>75</workQueueSize><!-- maxPoolSize的1.5倍 --> </pool> <!-- 元数据读线程池 --> <pool name="metaRead"> <corePoolSize>8</corePoolSize><!-- 可根据服务器配置作调整 --> <maxPoolSize>8</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>300000</workQueueSize><!-- 保持不变 --> </pool> <!-- 元数据写线程池 --> <pool name="metaWrite"> <corePoolSize>8</corePoolSize><!-- 可根据服务器配置作调整,需考虑与目标库创建索引等的并行度匹配(正向+逆向一共16个并发) --> <maxPoolSize>8</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>20</workQueueSize><!-- maxPoolSize的1.5倍 --> </pool> <!-- 数据读取线程池(逆序) --> <pool name="readZ2A"> <corePoolSize>8</corePoolSize><!-- 可根据服务器配置作调整,如果源库读慢,可适当提升读、写线程的比例 --> <maxPoolSize>8</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>150000</workQueueSize><!-- 保持不变 --> </pool> <!-- 表数据写线程池(逆序) --> <pool name="writeZ2A"> <corePoolSize>48</corePoolSize><!-- 可根据服务器配置作调整,如果源库读慢,可适当提升读、写线程的比例 --> <maxPoolSize>48</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>75</workQueueSize><!-- maxPoolSize的1.5倍 --> </pool> <!-- 元数据读线程池(逆序) --> <pool name="metaReadZ2A"> <corePoolSize>8</corePoolSize><!-- 可根据服务器配置作调整 --> <maxPoolSize>8</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>300000</workQueueSize><!-- 保持不变 --> </pool> <!-- 元数据写线程池(逆序) --> <pool name="metaWriteZ2A"> <corePoolSize>8</corePoolSize><!-- 可根据服务器配置作调整,需考虑与目标库创建索引等的并行度匹配(正向+逆向一共16个并发) --> <maxPoolSize>8</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>20</workQueueSize><!-- maxPoolSize的1.5倍 --> </pool> <!-- 大对象数据(Clob和Blob)写线程池 --> <pool name="writeLargeObject"> <corePoolSize>16</corePoolSize><!-- 可根据源库表中大对象数据来设置,如果单条数据较大,可适当降低线程数,以避免内存不足 --> <maxPoolSize>16</maxPoolSize><!-- 和corePoolSize一致 --> <keepAliveTime>300</keepAliveTime><!-- 保持不变 --> <workQueueSize>16</workQueueSize><!-- 和maxPoolSize一致 --> </pool> <!-- 线程池状态收集汇总配置 switch: on-开; off-关 interval: 单位(秒) --> <threadpoolstate switch="off" interval="600000"></threadpoolstate> <!-- 线程状态收集汇总配置 switch: on-开; off-关 interval: 单位(秒)600000 --> <threadstate switch="off" interval="600000"></threadstate> <!-- 线程堆栈收集配置 switch: on-开; off-关 interval: 单位(秒) --> <threadstack switch="off" interval="600000"></threadstack> </config>
{安装目录}/conf 目录下的配置项功能说明:
conf └─manual_script --手工脚本,用于迁移编辑后的迁移失败的对象 └─mapping_rule └─column --自定义表字段映射规则 └─data_type --自定义数据类型映射规则 └─default_value --自定义字段缺省值映射规则 └─table_data --自定义数据映射规则
每个目录下都有对应的使用说明文档readme.md和示例文件example.json,请参考对应文档使用。
迁移程序会在kdts-plus/logs目录下按迁移日期和时间创建日志目录,该目录下会有3个日志文件以及不同模式名的子目录,每个子目录下存放该模式相关的日志(error.log、info.log、warn.log),请注意查看error.log中的内容。
Schema1 #模式1的日志 Schema2 #模式2的日志 Schema2 #模式3的日志 error.log #错误 info.log #信息 warn.log #警告
注意
Linux平台下在logs根目录下会有一个名为“kdts-plus-日期+时间.log”的日志,里面会包含全部的日志内容,Windows平台受限于操作系统,无此日志。
“数据对比”的日志目录名有“DataCompare-”前缀。
迁移程序会在kdts-plus/result目录下按迁移日期和时间创建报告目录,该目录下会有index.html以及不同模式名的子目录,每个子目录下存放该模式的详细报告,可打开index.html进行查看。每个模式名子目录下内容如下:
AcrpyRegisterScript #ArcGIS注册脚本(迁移GIS数据时从此目录下取注册数据的脚本文件) FailedScript #失败脚本目录 IgnoredScript #略过脚本目录 SuccessScript #成功脚本目录 index.html #模式信息首页 detail_check_constraint.html #检查约束详细信息页 detail_comment.html #注释详细信息页 detail_foreign_key_constraint.html #外键详细信息页 detail_function.html #函数详细信息页 detail_index.html #索引详细信息页 detail_package.html #包详细信息页 detail_primary_key_constraint.html #主键详细信息页 detail_procedure.html #存储过程详细信息页 detail_sequence.html #序列详细信息页 detail_synonym.html #同义词详细信息页 detail_table.html #表详细信息页 detail_table_data.html #表数据详细信息页 detail_trigger.html #触发器详细信息页 detail_unique_constraint.html #唯一性约束详细信息页 detail_view.html #视图详细信息页
迁移报告目录
模式信息首页(index.html)
XXX详细信息(如表结构、表数据、表主键等, detail_XXX.html)
失败脚本目录 (FailedScript)
成功脚本目录 (SuccessScript)
在FailedScript、IgnoredScript和SuccessScript目录下会生成与之对应(失败、略过、成功)的脚本:
check_constraint.sql #检查约束SQL脚本 comment.sql #注释SQL脚本 foreign_key_constraint.sql #外键SQL脚本 function.sql #函数SQL脚本 index.sql #索引SQL脚本 package.sql #包SQL脚本 primary_key_constraint.sql #主键SQL脚本 procedure.sql #存储过程SQL脚本 sequence.sql #序列SQL脚本 synonym.sql #同义词SQL脚本 table.sql #表SQL脚本 table_data.sql #表数据SQL脚本 trigger.sql #触发器SQL脚本 unique_constraint.sql #唯一性约束SQL脚本 view.sql #视图SQL脚本
迁移成功表结构 SQL 脚本
迁移失败表结构 SQL 脚本
注意
“数据对比”的日志目录名有“DataCompare-”前缀。
max_connections=2000 shared_buffers=RAM*0.4GB #RAM指内存,最大设置为64GB work_mem =10MB maintenance_work_mem=6GB effective_cache_size=RAM*0.5GB #RAM指内存(free -g)RAM*0.5GB max_locks_per_transaction=1024 #wal_level = minimal max_wal_size=100GB checkpoint_timeout=5min checkpoint_completion_target=0.9 max_parallel_workers_per_gather=0 logging_collector=on log_destination='stderr' log_directory='sys_log' log_filename='kingbase-%d.log' log_truncate_on_rotation=on log_rotation_age=1440 log_connections=on log_disconnections=on log_statement='ddl' log_checkpoints=on log_lock_waits=on log_autovacuum_min_duration=0 log_temp_files=0 lc_messages='C' log_min_duration_statement=1000 log_line_prefix='%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h' ignore_char_null_check=true max_worker_processes=100 max_parallel_workers=80 #max_parallel_workers_per_gather=64 max_parallel_maintenance_workers=64 #maintenance_work_mem=16GB
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。