在这里插入图片描述

🎬 鸽芷咕个人主页

 🔥 个人专栏: 《C++干货基地》《创作指南》

⛺️生活的理想,就是为了理想的生活!

前言

在数据库迁移场景中,当面临堡垒机访问、远程终端操作或系统无图形化界面等情况时,金仓KDTS迁移工具的SHELL版成为高效迁移数据到KingbaseES的关键选择。下面我们就聚焦SHELL版使用说明,从配置、运行日志、迁移报告到数据库优化,完整还原实战流程。

一、SHELL版迁移前配置:基础参数设置

SHELL版迁移需通过修改配置文件完成参数定义,核心配置集中在kdts-plus/conf目录下,需按步骤完成源库、目标库、运行模式等关键参数设置。

1.1 源库类型配置:确定激活配置文件

迁移程序按源数据库类型生成独立配置文件,需先指定当前激活的源库类型。进入kdts-plus/conf目录,打开application.yml文件,设置spring -> profiles -> active的值为目标源库类型,示例如下:

spring:
  profiles:
    active: oracle # 准备迁移的数据库,如dm(达梦)、gbase、kingbase、mysql、oracle等,具体的配置在kdts-XXX.yml文件中

若配置为mysql,则对应的配置文件为kdts-mysql.yml,以此类推。

1.2 运行模式配置:迁移与数据对比切换

SHELL版支持“数据迁移”和“数据对比”两种模式,默认是数据迁移模式。若需切换为数据对比模式,在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 # 数据比较,注释掉则为默认数据迁移模式

1.3 源数据库配置:细粒度定义迁移范围

根据已设置的源库类型,打开对应的配置文件(如kdts-oracle.yml),完成连接信息、模式筛选、对象迁移规则等配置。

1.3.1 源库连接基础设置

以Oracle 11g为例,配置数据库类型、版本、连接地址、账号密码等信息:

# 源数据库类型
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,需按对应关系配置dbVersion,如下表所示:

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
1.3.2 模式与对象筛选配置
  • 包含/排除模式:指定需迁移或排除的模式,多个模式用英文逗号隔开,也可填入"*"迁移当前用户可访问的所有模式:
    # 要迁移的模式
    schemas: Sehcma1,Sehcma2
    # 不迁移的模式
    schema-excludes: SYS,SYSTEM,MGMT_VIEW,DBSNMP,SYSMAN
    
  • 表、视图等对象筛选:通过配置文件或创建txt文件指定仅迁移或排除的对象,例如:
    # 只迁移的表,多个表用英文逗号隔开,也可创建conf/tableIncludes.txt文件配置(文件优先)
    table-includes: Table1,Schema1.Table2
    # 不迁移的表,多个表用英文逗号隔开,也可创建conf/tableExcludes.txt文件配置(文件优先)
    table-excludes: Table3,Schema2.Table4
    # 只迁移的视图,多个视图用英文逗号隔开,也可创建conf/viewIncludes.txt文件配置(文件优先)
    view-includes: View1,Schema1.View2
    
  • 迁移对象类别选择:开启或关闭序列、表结构、数据等对象的迁移开关:
    # 是否迁移序列
    migrate-sequence: true
    # 是否迁移表结构
    migrate-table-structure: true
    # 是否迁移数据
    migrate-table-data: true
    # 是否迁移主键
    migrate-table-primary-key: true
    # 是否迁移索引
    migrate-table-index: true
    # 是否迁移视图
    migrate-view: false
    # 是否迁移函数
    migrate-function: false
    
1.3.3 大表拆分设置

当表数据量较大时,可通过拆分阈值和最大块数设置,将大表拆分后并行迁移:

# 大表拆分阈值行数(当表的行数超过此值时,将对表进行拆分)
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

1.4 目标数据库配置:适配KingbaseES

目标数据库仅支持KingbaseES,以KingbaseES V8R6为例,在对应配置文件中设置连接信息和数据写入规则:

# 目标数据库类型
dbType: KINGBASE
# 目标数据库版本(V7,V8R3,V8R6,V8R6C7,V9)
dbVersion: V8R6
# 简单JDBC连接(V8R3和V8R6使用)
url: jdbc:kingbase8://1.2.3.4:54321/test1
# 驱动类名(V8R6使用)
driver-class-name: com.kingbase8.Driver
# 用户名
username: kingbase
# 密码
password: 123456
# 目标模式,多个模式用英文逗号隔开,填入"*"则目标模式与源模式同名
schemas: "*"
# 数据库连接验证SQL
validation-query: select 1
# 批量提交记录数(行数据)
write-batch-size: 1000
# 批量提交数据大小(单位M)
write-batch-byte-size: 100
# 删除目标库中已存在的对象(如表、视图等)
drop-existing-object: true
# 是否截断表(清空表数据)
truncate-table: false
# 是否创建目标模式
create-target-schema: true

注意:若迁移程序与目标数据库在同一台Linux服务器上,可使用Unix Domain Socket连接提升传输效率,配置如下:

url: jdbc:kingbase8:///db?currentSchema=db&socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/tmp/.s.KINGBASE.54321&sslMode=disable

1.5 线程池配置:优化并发效率

数据迁移为IO密集型操作,进入kdts-plus/conf目录,打开kb-thread-config.xml文件,按服务器配置调整线程参数。以下为基于Intel Xeon Gold 6330(28核心56线程)、256G内存、JVM内存16G的示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <!-- 默认线程池 -->
    <pool name="default">
        <corePoolSize>1</corePoolSize><!-- 核心线程数-->
        <maxPoolSize>1</maxPoolSize><!-- 最大线程数(设置为和核心线程数一致)-->
        <keepAliveTime>15</keepAliveTime><!-- 线程空闲存活时间(单位:秒)-->
        <workQueueSize>8</workQueueSize><!-- 工作队列大小-->
    </pool>
    <!-- 表数据读线程池 -->
    <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>
    <!-- 大对象数据(Clob和Blob)写线程池 -->
    <pool name="writeLargeObject">
        <corePoolSize>16</corePoolSize><!-- 单条数据大时适当降低,避免内存不足-->
        <maxPoolSize>16</maxPoolSize><!-- 和corePoolSize一致-->
        <keepAliveTime>300</keepAliveTime><!-- 保持不变-->
        <workQueueSize>16</workQueueSize><!-- 和maxPoolSize一致-->
    </pool>
</config>

IO密集型操作的线程数公式为线程数= CPU核心数/(1-阻塞系数),阻塞系数通常取0.8~0.9,例如双核CPU线程数可设为20(2/(1-0.9))。

二、执行迁移任务与日志查看

2.1 启动迁移任务

配置完成后,执行启动脚本启动迁移任务。Linux平台在kdts-plus/bin目录下执行:

startup.sh

Windows平台执行:

startup.bat

Linux平台启动后程序在后台运行,若需查看运行日志,可使用tail命令:

tail -f kdts-plus/logs/kdtsplus_2022-06-24_22-22-22.log

若需停止运行中的程序,Linux平台执行shutdown.sh,Windows平台关闭命令窗口即可。

2.2 运行日志查看

迁移程序会在kdts-plus/logs目录下按迁移日期和时间创建日志目录,该目录下包含3个日志文件(error.loginfo.logwarn.log)及不同模式名的子目录,每个子目录下存放对应模式的日志。示例目录结构如下:

logs/
├─2024-10-30_14_30_00/
│  ├─Schema1/
│  │  ├─error.log
│  │  ├─info.log
│  │  └─warn.log
│  ├─Schema2/
│  │  ├─error.log
│  │  ├─info.log
│  │  └─warn.log
│  ├─error.log
│  ├─info.log
│  └─warn.log
└─kdts-plus-2024-10-30_14_30_00.log  # Linux平台下的完整日志(Windows无此文件)

“数据对比”的日志目录名有“DataCompare-”前缀,迁移失败时需重点查看error.log中的内容,定位错误原因。

三、迁移报告查看与KingbaseES优化

3.1 迁移报告查看

迁移程序会在kdts-plus/result目录下按迁移日期和时间创建报告目录,该目录下有index.html及不同模式名的子目录,每个子目录下存放该模式的详细报告。示例目录结构如下:

result/
├─2024-10-30_14_30_00/
│  ├─AcrpyRegisterScript/  # ArcGIS注册脚本(迁移GIS数据时使用)
│  ├─FailedScript/  # 失败脚本目录
│  ├─IgnoredScript/  # 略过脚本目录
│  ├─SuccessScript/  # 成功脚本目录
│  ├─detail_check_constraint.html  # 检查约束详细报告
│  ├─detail_comment.html  # 注释详细报告
│  ├─detail_table.html  # 表详细报告
│  └─index.html  # 模式信息首页

打开index.html可查看各模式下对象的迁移成功数、失败数和忽略数;FailedScriptIgnoredScriptSuccessScript目录下会生成对应脚本,例如成功的表结构脚本(SuccessScript/table.sql):

CREATE TABLE "PUBLIC"."TEST_TABLE" (
    "ID" INTEGER NOT NULL,
    "NAME" VARCHAR(50) NOT NULL,
    PRIMARY KEY ("ID")
);

3.2 KingbaseES优化配置参数

为提升目标库性能,修改KingbaseES的kingbase.conf文件,推荐配置如下:

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)
max_locks_per_transaction=1024
max_wal_size=100GB
checkpoint_timeout=5min
checkpoint_completion_target=0.9
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'

四、SHELL版迁移注意事项

  1. 迁移顺序:由于对象之间存在依赖关系,可按“1、序列;2、表结构、表数据、主键约束、索引、唯一性约束;3、外键约束;4、检查约束、视图、函数、存储过程、包;5、同义词;6、触发器;7、注释”的顺序进行迁移。
  2. 大表拆分:自动拆分机制仅针对Oracle和达梦数据库,其它数据库需手动拆分;对表的排序和拆分不影响迁移结果,只影响效率。
  3. 大对象数据迁移:若表中有大对象数据字段(BLOB、CLOB等),单行数据大小达到100M以上,需增大JVM内存(修改startup.sh/startup.bat中的-Xms-Xmx参数),并控制大对象表的读写并发度。
  4. 网络抖动处理:迁移时若出现网络异常,可设置“网络读取超时”参数。例如KingbaseES的url配置:jdbc:kingbase8://localhost:54321/db1?socketTimeout=900(单位为秒);MySQL的url配置:jdbc:mysql://localhost:3306/db1?socketTimeout=900000(单位为毫秒)。

结语

SHELL 版 KDTS 迁移工具凭借对无图形化、堡垒机等特殊场景的适配能力,成为 KingbaseES 迁移的重要选择。通过 “配置文件调整→启动任务→日志监控→报告验证” 的实战流程,可完成多源数据库的迁移任务。

人大金仓官网:【点击直达】

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐