ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase

2024年 5月 7日 67.2k 0

作者简介:罗呈祥,数据库管理员。

1.工具准备

mysqldump 可以使用 mysql 自带的 mysqldump 。datax 需要下载并编译。编译 datax 需要 maven,使用 maven 需要 java 环境,所以。。。

1.1 安装 openjdk

yum install java-1.8.0-openjdk -y
yum install java-1.8.0-openjdk-devel.x86_64 -y

1.2 部署 maven

从 Apache 官网下载:https://maven.apache.org/download.cgi

wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.zip --no-check-certificate
mkdir /usr/local/maven
unzip apache-maven-3.8.4-bin.zip -d /usr/local/maven
ll /usr/local/maven

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-1

 

1.3 配置环境变量

vi .bash_profile
# 新增下面几行
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64
export JRE_HOME=$JAVA8_HOME/jre
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin

source .bash_profile

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-2

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-3

 

1.4 配置 maven 镜像源为阿里镜像源

修改配置文件 settings.xml,文件在 /usr/local/maven/conf 中。

<mirror>
   <id>aliyun</id>
   <mirrorOf>central</mirrorOf>
   <name>aliyun-public</name>
   <url>https://maven.aliyun.com/repository/public/</url>
</mirror>

<mirror>
   <id>aliyun-spring</id>
   <mirrorOf>spring</mirrorOf>
   <name>aliyun-spring</name>
   <url>https://maven.aliyun.com/repository/spring</url>
</mirror>

1.5 编译 DataX 可执行二进制文件

按以下步骤编译 DataX 可执行二进制文件:

运行以下命令,下载源代码。

git clone https://github.com/alibaba/DataX.git
速度慢的可以从gitee拉取,或者使用别人打包好的。
git clone https://gitee.com/yongfuxie/DataX.git

注释 DataX/pom.xml 文件中的以下内容,其他组件也可能遇到问题,遇到时从 pom文件删除即可

<module>oscarwriter</module>
<module>mongodbreader</module>
<module>mongodbwriter</module>

运行以下命令,使用 Maven 将 DataX 打包。

$ cd {DataX_source_code_home} $ mvn -U clean package assembly:assembly -Dmaven.test.skip=true

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-4

生成的文件在 target 目录下

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-5

tar zxvf datax.tar.gz
mv datax /usr/local/
cd /usr/local/datax/

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-6

 

2. 使用 mysqldump 迁移数据

与 mysql 之间的迁移没什么不同,如果只迁移表结构,指定-d参数

-d, --no-data      No row information.

现在全量迁移一个库:

mysqldump -h 127.0.0.1 -uroot -proot123 -d lcxtest > lcxtest_nodata.sql
mysqldump -h 127.0.0.1 -uroot -proot123 lcxtest > lcxtest.sql

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-7

 

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-8

把文件传到 observer 的机器上,或者在本地连接 observer 集群:

mysql --no-defaults -h192.168.32.111 -uroot@test_tenant#obcluster -P2883 -proot13 -Dlcxtest

导入时会报错,因为有表用了 latin1 字符集,修改掉。

sed -i 's/CHARACTER\ SET\ latin1//g' lcxtest_nodata.sql
mysql --no-defaults -h192.168.32.111 -uroot@test_tenant#obcluster -P2883 -proot13 -Dlcxtest
source lcxtest_nodata.sql

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-9

仍然会有报错,影响不大,建表语句是正确的

看一下表已经创建出来了。

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-10

如果是连数据一起导入,操作相同。

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-11

看下数据:

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-12

数据迁移成功。

3. 使用 datax 迁移数据

mysql 创建 datax 用户,并赋予了 all,使用它来迁移数据。( mysql 版本5.7)

注意修改相关的配置

{
   "job": {
       "setting": {
           "speed": {
               "channel": 4
           },
           "errorLimit": {
               "record": 0,
               "percentage": 0.1
           }
       },
       "content": [
           {
               "reader": {
                   "name": "mysqlreader",
                   "parameter": {
                       "username": "datax",
                       "password": "root123",
                       "column": [
                           "*"
                       ],
                       "connection": [
                           {
                               "table": [
                                   "lcxtest1"
                               ],
                               "jdbcUrl": ["jdbc:mysql://192.168.32.130:3306/lcxtest?useUnicode=true&characterEncoding=utf8&useSSL=false"]
                           }
                       ]
                   }
               },

               "writer": {
                   "name": "oceanbasev10writer",
                   "parameter": {
                       "obWriteMode": "insert",
                       "column": [
                           "*"
                       ],
                       "preSql": [
                           "truncate table lcxtest1"
                       ],
                       "connection": [
                           {
                               "jdbcUrl": "||_dsc_ob10_dsc_||obcluster:test_tenant||_dsc_ob10_dsc_||jdbc:oceanbase://192.168.32.111:2883/lcxtest?useLocalSessionState=true&allowBatch=true&allowMultiQueries=true&rewriteBatchedStatements=true",
                               "table": [
                                   "lcxtest1"
                               ]
                           }
                       ],
                       "username": "root",
                       "password":"root123",
                       "writerThreadCount":10,
                       "batchSize": 1000,
                       "memstoreThreshold": "0.9"
                   }
               }
           }
       ]
   }
}

这里格式是 集群:租户

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-13

删除已经迁移的四张表

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-14

迁移之前需要在 ob 端创建相应的表结构。

source lcxtest_nodata.sql

启动 datax

./datax.py ../job/mysql2ob.json

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-15

 

表迁移成功。

第二张表使用同样的方式,修改配置文件中的表名字即可。

第三涨使用csv格式来导入到OceanBase。

{
   "job": {
       "setting": {
           "speed": {
               "channel": 4
           },
           "errorLimit": {
               "record": 0,
               "percentage": 0.1
           }
       },
       "content": [
           {
               "reader": {
                   "name": "mysqlreader",
                   "parameter": {
                       "username": "datax",
                       "password": "root123",
                       "column": [
                           "*"
                       ],
                       "connection": [
                           {
                               "table": [
                                   "lcxtest1"
                               ],
                               "jdbcUrl": ["jdbc:mysql://192.168.32.130:3306/lcxtest?useUnicode=true&characterEncoding=utf8&useSSL=false"]
                           }
                       ]
                   }
               },

               "writer": {
                   "name": "txtfilewriter",
                   "parameter": {
                       "path": "/tmp/lcxtest3",
                       "fileName": "lcxtest3.csv",
                       "encoding": "UTF-8",
                       "writeMode": "truncate",
                       "dateFormat": "yyyy-MM-dd hh:mm:ss" ,
                       "nullFormat": "\\N" ,
                       "fileFormat": "csv" ,
                       "fieldDelimiter": ","
                 }
               }
           }
       ]
   }
}

第三张表数据比较少,只有80条。

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-16

导入到 OceanBase

{
   "job": {
       "setting": {
           "speed": {
               "channel": 4
           },
           "errorLimit": {
               "record": 0,
               "percentage": 0.1
           }
       },
       "content": [
           {
               "reader": {
                   "name": "txtfilereader",
                   "parameter": {
                       "path": ["/tmp/lcxtest3"],
                       "fileName": "lcxtest3.csv",
                       "encoding": "UTF-8",
                       "column": ["*"],
                       "dateFormat": "yyyy-MM-dd hh:mm:ss" ,
                       "nullFormat": "\\N" ,
                       "fieldDelimiter": ","
                   }
             },

               "writer": {
                   "name": "oceanbasev10writer",
                   "parameter": {
                       "obWriteMode": "insert",
                       "column": [
                           "*"
                       ],
                       "preSql": [
                           "truncate table lcxtest3"
                       ],
                       "connection": [
                           {
                               "jdbcUrl": "||_dsc_ob10_dsc_||obcluster:test_tenant||_dsc_ob10_dsc_||jdbc:oceanbase://192.168.32.111:2883/lcxtest?useLocalSessionState=true&allowBatch=true&allowMultiQueries=true&rewriteBatchedStatements=true",
                               "table": [
                                   "lcxtest3"
                               ]
                           }
                       ],
                       "username": "root",
                       "password":"root123",
                       "writerThreadCount":10,
                       "batchSize": 1000,
                       "memstoreThreshold": "0.9"
                   }
               }
           }
       ]
   }
}

但如前后数据查询:

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-1

OceanBase 社区版入门到实战教程直播正在进行中~

快和小伙伴一起进群交流学习吧~

加入直播群方式一:

钉钉群号 3582 5151

加入直播群方式二:

扫码下方二维码加入

ClassIn 实践:使用 Datax 从 MySQL 迁移到 OceanBase-18

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论