1、安装达梦迁移工具dts
官网下载达梦安装包,这里以DM8和CentOS7操作系统为示例
下载后是一个zip包,直接解压
dm8_20251016_x86_CentOS7_64.zip
解压后找到.iso镜像文件,再次解压,并将该文件上传到服务器中
DMInstall.bin
接下来的命令在服务器中执行
注意
安装前必须创建 dmdba 用户,达梦数据库禁止使用 root 用户安装数据库。
创建用户组dinstall
groupadd dinstall -g 2001
创建用户dmdba并设置家目录为/home/dmdba
useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
修改用户密码
passwd dmdba
查看系统限制参数
ulimit -a
参数说明:
data seg size:建议用户设置为 1048576(即 1GB)以上或 unlimited(无限制),此参数过小将导致数据库启动失败。
file size:建议用户设置为 unlimited(无限制),此参数过小将导致数据库安装或初始化失败。
open files:建议用户设置为 65536 以上或 unlimited(无限制)。-- 需和 stack size 一同配置才会生效
virtual memory:建议用户设置为 1048576(即 1GB)以上或 unlimited(无限制),此参数过小将导致数据库启动失败。
如果不符合要求,需要修改参数
vi /etc/security/limits.conf
在文件最后添加以下配置
dmdba soft nice 0
dmdba hard nice 0
dmdba soft as unlimited
dmdba hard as unlimited
dmdba soft fsize unlimited
dmdba hard fsize unlimited
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft data unlimited
dmdba hard data unlimited
切换到dmdba用户执行安装
su - dmdba
./DMInstall.bin -i
安装路径随意,注意要在dmdba用户的家目录下
切换root用户执行脚本
/home/dmdba/dmdbms/script/root/root_installer.sh
2、命令行运行迁移工具
进入tool目录下
新建一个脚本文件
vi gen_transform_xml.sh
填写内容
#!/usr/bin/env bash
set -eu
# ================== 环境配置(按需修改) ==================
# 源端 MySQL 配置(既用于查表,也写入 XML)
SOURCE_IP="127.0.0.1"
SOURCE_PORT="3306"
SOURCE_USER="root"
SOURCE_PASSWORD="root"
SOURCE_DB="database_name" # MySQL 中的数据库名/Schema 名
# 目标端 DM 配置(只写入 XML,不参与查表)
DESTINATION_IP="127.0.0.1"
DESTINATION_PORT="5236"
DESTINATION_USER="SYSDBA"
DESTINATION_PASSWORD="SYSDBA001"
DESTINATION_SCHEMA="SCHEMA_NAME" # DM 目标 Schema 名
# JDBC 驱动配置(按你的实际环境修改)
DRIVER_PATH="/home/dmdba/drivers"
DRIVER_NAME="mysql-connector-j-8.0.31.jar"
DRIVER_CLASS_NAME="com.mysql.cj.jdbc.Driver"
# 输出文件路径
OUTPUT_DIR="/home/dmdba/dts_xml"
FULL_XML="${OUTPUT_DIR}/${SOURCE_DB}_task.xml"
# mysql路径
MYSQL_DIR="mysql"
# =========================================================
log() {
echo "[*] $*" >&2
}
ensure_parent_dir() {
local file="$1"
local dir
dir=$(dirname "$file")
if [ -n "$dir" ] && [ ! -d "$dir" ]; then
mkdir -p "$dir"
fi
}
# ============= 1. 查询库中所有表,读入变量 =============
log "正在查询库 ${SOURCE_DB} 的所有表..."
TABLES=$(${MYSQL_DIR} \
-h"$SOURCE_IP" -P"$SOURCE_PORT" -u"$SOURCE_USER" -p"$SOURCE_PASSWORD" \
--default-character-set=utf8mb4 \
-N -e "SELECT table_name FROM information_schema.tables WHERE table_schema = '${SOURCE_DB}' ORDER BY table_name;"
)
TABLE_NUMS=$(printf '%s\n' "$TABLES" | sed '/^$/d' | wc -l | tr -d ' ')
log "共找到 ${TABLE_NUMS} 个表。"
# ============= 2. 生成完整任务 XML (头部) =============
ensure_parent_dir "$FULL_XML"
# 先写头部和 <TransformItems> 起始标签
cat > "$FULL_XML" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!--本文件由DM数据迁移工具生成,请不要手工修改,生成时间$(date "+%Y-%m-%d %H:%M:%S").-->
<TransformTask transform="13" name="mysql5.7-dm">
<Source type="db" useCustomDriver="true" useDefaultURL="true">
<Server>$SOURCE_IP</Server>
<Port>$SOURCE_PORT</Port>
<DriverPath>$DRIVER_PATH</DriverPath>
<DriverName>$DRIVER_NAME</DriverName>
<DriverClassName>$DRIVER_CLASS_NAME</DriverClassName>
<AuthType>0</AuthType>
<Compress>false</Compress>
<User>$SOURCE_USER</User>
<Password>$SOURCE_PASSWORD</Password>
<Catalog>$SOURCE_DB</Catalog>
</Source>
<Destination type="db" useCustomDriver="false" useDefaultURL="true">
<Server>$DESTINATION_IP</Server>
<Port>$DESTINATION_PORT</Port>
<AuthType>0</AuthType>
<Compress>false</Compress>
<DmType>dm</DmType>
<User>$DESTINATION_USER</User>
<Password>$DESTINATION_PASSWORD</Password>
</Destination>
<Config selectObjType="1">
<Strategy name="batchMaxSize" value="0"/>
<Strategy name="charSetConvert" value="false"/>
<Strategy name="createPkParallel" value="false"/>
<Strategy name="createTableParallel" value="false"/>
<Strategy name="createIndexParallel" value="false"/>
<Strategy name="retryConnect" value="true"/>
<Strategy name="globalFldrOption" value="{"multi":false,"java":false}"/>
<Strategy name="batchLobMaxSize" value="0"/>
<Strategy name="taskBufSize" value="4"/>
<Strategy name="batchMaxTime" value="60"/>
<Strategy name="mysqlCharToVarchar" value="false"/>
<Strategy name="itemBatchSize" value="50"/>
<Strategy name="globalFldr" value="false"/>
<Strategy name="partColUseVirtual" value="false"/>
<Strategy name="allParallel" value="false"/>
<Strategy name="mysqlUnsignedToCheck" value="true"/>
<Strategy name="retryConnectCount" value="3"/>
<Strategy name="charSetConvertOption" value="{"sourceCharset":"GBK","destCharset":"GBK","nationCharset":false}"/>
<Strategy name="fillThreadCount" value="2"/>
<Strategy name="sessionCompile" value="true"/>
<Strategy name="retryConnectInterval" value="15"/>
<Strategy name="indexRename" value="true"/>
<Strategy name="itemBufSize" value="4"/>
<Strategy name="lengthInChar" value="1.0"/>
<Strategy name="continueWhenError" value="true"/>
<Strategy name="threadCount" value="2"/>
<Strategy name="objectNameToUpperCase" value="false"/>
</Config>
<Mode simple="false">
<DBStrategies>
<Strategy>TRANSFORM_SCHEMAS</Strategy>
</DBStrategies>
<Schema source="$SOURCE_DB" destination="$DESTINATION_SCHEMA">
<Strategies>
<Strategy name="schObjectStrategys" value="TRANSFORM_TABLES"/>
</Strategies>
</Schema>
</Mode>
<TransformItems ItemCount="${TABLE_NUMS}">
EOF
# ============= 3. 循环写入每个 TransformItem =============
idx=0
# 只按换行切表名,避免空格被拆
while IFS= read -r tbl; do
[ -z "$tbl" ] && continue
source_table="$tbl"
destination_table=$(printf '%s' "$tbl" | tr '[:lower:]' '[:upper:]')
cat >> "$FULL_XML" <<EOF
<TransformItem id="$idx" type="table" sourceSchema="$SOURCE_DB" destSchema="$DESTINATION_SCHEMA" source="$source_table" destination="$destination_table" isDefinitionAutoGenerated="true" customColumnMap="false" partitionAsList="false">
<Strategies>
<Strategy name="dontTransformIfExist" value="false"/>
<Strategy name="data" value="true"/>
<Strategy name="fk" value="true"/>
<Strategy name="transformOnUpdate" value="false"/>
<Strategy name="displayRow" value="true"/>
<Strategy name="dataBatch" value="{"batchSize":1024,"bufSize":2,"fetchSize":1024,"lobBatchSize":1024,"lobBufSize":2,"lobFetchSize":1024}"/>
<Strategy name="onlineIndex" value="false"/>
<Strategy name="ignoreErrorData" value="false"/>
<Strategy name="fkKeepSchema" value="true"/>
<Strategy name="fkWithIndex" value="true"/>
<Strategy name="uk" value="true"/>
<Strategy name="sourceReadUncommitted" value="false"/>
<Strategy name="destIfExist" value="DROP_AND_CREATE"/>
<Strategy name="create" value="true"/>
<Strategy name="truncateCascadeData" value="false"/>
<Strategy name="identityInsert" value="true"/>
<Strategy name="parallelImp" value="2"/>
<Strategy name="useIdentity" value="false"/>
<Strategy name="fldrOption" value="{"multi":false,"java":false}"/>
<Strategy name="ck" value="true"/>
<Strategy name="index" value="true"/>
<Strategy name="cascadeDrop" value="true"/>
<Strategy name="pkConflict" value="false"/>
<Strategy name="truncateData" value="true"/>
<Strategy name="pkConflictOption" value="{"strategy":"PK_CONFLICT_OVERRIDE"}"/>
<Strategy name="constraint" value="true"/>
<Strategy name="comment" value="true"/>
<Strategy name="pk" value="true"/>
<Strategy name="fldr" value="false"/>
</Strategies>
</TransformItem>
EOF
idx=$((idx + 1))
done <<EOF
$TABLES
EOF
# ============= 4. 写入尾部标签 =============
cat >> "$FULL_XML" <<EOF
</TransformItems>
<Agents>
<Strategy name="remoteExecute" value="false"/>
</Agents>
<Summay/>
</TransformTask>
EOF
log "完整任务 XML 已写入: $FULL_XML"
log "完成。"
修改环境配置,然后运行脚本
bash gen_transform_xml.sh
使用tool目录中的dts_cmd_run.sh脚本运行配置文件
./dts_cmd_run.sh config file=./task.xml
完成对应库的迁移