mysql迁移达梦数据库纯命令行方案

49 阅读3分钟

1、安装达梦迁移工具dts

官网下载达梦安装包,这里以DM8和CentOS7操作系统为示例

image.png

下载后是一个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

image.png

参数说明:

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

image.png

切换到dmdba用户执行安装

su - dmdba
./DMInstall.bin -i

image.png

安装路径随意,注意要在dmdba用户的家目录下

image.png

切换root用户执行脚本

/home/dmdba/dmdbms/script/root/root_installer.sh

image.png

2、命令行运行迁移工具

进入tool目录下

image.png

新建一个脚本文件

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="{&quot;multi&quot;:false,&quot;java&quot;: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="{&quot;sourceCharset&quot;:&quot;GBK&quot;,&quot;destCharset&quot;:&quot;GBK&quot;,&quot;nationCharset&quot;: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="{&quot;batchSize&quot;:1024,&quot;bufSize&quot;:2,&quot;fetchSize&quot;:1024,&quot;lobBatchSize&quot;:1024,&quot;lobBufSize&quot;:2,&quot;lobFetchSize&quot;: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="{&quot;multi&quot;:false,&quot;java&quot;: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="{&quot;strategy&quot;:&quot;PK_CONFLICT_OVERRIDE&quot;}"/>
          <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

image.png

使用tool目录中的dts_cmd_run.sh脚本运行配置文件

./dts_cmd_run.sh config file=./task.xml

完成对应库的迁移