如何从MySQL数据库迁移数据到OceanBase

经过一段时间的学习,我对OceanBase有了一些基本的了解,当前社区版只支持MySQL数据库,今天我们来看一下如何处理MySQL数据库迁移到OceanBase,因为OceanBase基本支持MySQL5.5/6/7的语法,所以迁移过程会比较顺滑。整个过程大家也能体会到一个简单完整的数据库迁移的过程,希望对大家有所帮助。

1.在OceanBase中创建一个新租户

首先我们依照OB的逻辑,创建一个新租户,因为OB的资源隔离都是用租户来实现的。包含如下步骤:


  • 创建一个资源单元 unit1
  • 创建一个资源池 pool1
  • 创建一个租户 test_tenant使用上面创建的资源池和资源单元
MySQL [oceanbase]> CREATE RESOURCE UNIT unit1 MAX_CPU 1, MAX_MEMORY '1G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY='1G', MIN_IOPS=128;
Query OK, 0 rows affected (0.01 sec)

MySQL [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='unit1',UNIT_NUM=1,ZONE_LIST=('zone1','zone2','zone3');
Query OK, 0 rows affected (0.03 sec)

MySQL [oceanbase]> CREATE TENANT IF NOT EXISTS test_tenant CHARSET='utf8mb4',ZONE_LIST=('zone1','zone2','zone3'), PRIMARY_ZONE='zone1;zone2,zone3', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%' ;
Query OK, 0 rows affected (1.12 sec)

创建完租户后,在该租户下创建一个数据库 test2 ,创建数据库纯粹是为了体验一下租户和数据库的区别,如果您还想创建新用户,也可以自行创建,我这里使用默认root:

# 注意下面的命令连接到了test_tenant租户
[admin@obproxy ~]$ obclient -h 10.211.55.54 -uroot@test_tenant -P2883  -c -A oceanbase
MySQL [oceanbase]> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8;
Query OK, 1 row affected (0.02 sec)

MySQL [oceanbase]> show databases;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
| test2              |
+--------------------+
5 rows in set (0.01 sec)

2.采用DBeaver连接上数据库看看

在第一步,我们已经准备好了如下信息:

  • 用户名:root
  • 密码:默认为空,未进行修改,生产环境建议及时修改密码
  • 租户:test_tenant
  • 数据库:test2

下面我们使用市面上常见的数据库连接工具DBeaver进行链接,配置如下:

 做好上述设置后,点击【测试连接】确认可以正常连通,如果出现

Access Denied

的错误,可能存在密码错误或者没有开启远程访问白名单的问题,这个问题也是小白经常遇到的问题,可以参考文档相应章节进行配置,这里不再赘述。3.导出MySQL表结构

接下来,我们先将MySQL的表结构导出来,我这里的源端迁移数据库采用已有的MariaDB中的:gfva 库,给大家看一下当前数据库中的表:

接下来,使用mysqldump命令导出数据,这个操作我是在obproxy主机上做的,因为之前装了mysql的命令,所以比较方便。您可以在任何能提供mysqldump的机器上进行,建议是在OB侧进行,文件不大可以省去来回拖文件的操作:

[admin@obproxy ~]$ mysqldump -h 192.168.0.200 -uroot -P3306 -p  -d gfva --compact > gfva_ddl.sql
Enter password:

# 文件内容节选:
[admin@obproxy ~]$ head  gfva_ddl.sql
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `casbin_rule` (
  `p_type` varchar(100) DEFAULT NULL,
  `v0` varchar(100) DEFAULT NULL,

4.表结构恢复到OceanBase

下面我们把备份的表结构恢复到OB中,该操作仍然在OB侧的obproxy机器上进行。

OceanBase有一些语法不兼容MySQL,脚本需要略作调整,请根据链接中的介绍进行修改即可:https://open.oceanbase.com/docs/tutorials-cn/V1.0.0/10000000000012266

采用obclient重新登录到test2数据库,用

source

命令手动调用刚才备份的脚本

gfva_ddl.sql
 。[admin@obproxy ~]$ obclient -h 10.211.55.54 -uroot@test_tenant -P2883 -c -A oceanbase
MySQL [oceanbase]> use test2;
Database changed
MySQL [test2]> source /home/admin/gfva_ddl.sql
Query OK, 0 rows affected (0.001 sec)
Query OK, 0 rows affected, 1 warning (0.063 sec)
...


从下图可以看到,表结构已经恢复到test_tenant租户的test2数据库中了:

5.配置数据同步

接下来我使用我本地搭建的一套 datax + datax-web的测试环境进行数据同步的演示,该资源均可从网络获取,配置简单,此处略过。


以表 

casbin_rule

 为例进行数据同步配置,首先如下配置,分别把MySQL源头和OB目标连接配置好:MySQL

OB


大家需要注意,测试过程中发现,datax不支持密码为空的行为,所以我在最后执行同步时报错了,然后我又返回去给OB root用户加了密码,这里密码为空是不允许的,还请大家提前操作,注意避坑。

然后我们在配置同步任务过程中,会生成以下json文件,如果大家没有使用datax-web,直接使用datax可以参考如下:

{
  "job": {
    "setting": {
      "speed": {
        "channel": 3,
        "byte": 1048576
      },
      "errorLimit": {
        "record": 0,
        "percentage": 0.02
      }
    },
    "content": [
      {
        "reader": {
          "name": "mysqlreader",
          "parameter": {
            "username": "yRjwDFuoPKlqya9h9H2Amg==",
            "password": "yrxjf9cYw0YSmB+OdrNrkA==",
            "column": [
              "`p_type`",
              "`v0`",
              "`v1`",
              "`v2`",
              "`v3`",
              "`v4`",
              "`v5`"
            ],
            "splitPk": "",
            "connection": [
              {
                "table": [
                  "casbin_rule"
                ],
                "jdbcUrl": [
                  "jdbc:mysql://192.168.0.200:3306/gfva"
                ]
              }
            ]
          }
        },
        "writer": {
          "name": "mysqlwriter",
          "parameter": {
            "username": "ZavoX0wUIT+NXZLci1dvPX8sxuRddOv83hdqDOVR+i0=",
            "password": "yrxjf9cYw0YSmB+OdrNrkA==",            "column": [
              "`p_type`",
              "`v0`",
              "`v1`",
              "`v2`",
              "`v3`",
              "`v4`",
              "`v5`"
            ],
            "connection": [
              {
                "table": [
                  "casbin_rule"
                ],
                "jdbcUrl": "jdbc:mysql://10.211.55.54:2883/test2"


在网页上,我们点击【执行一次】按钮,执行一下刚才配置的同步任务:

等待执行结果,显示【成功】:


上图显示执行成功,让我们来确认一下数据库中的表数据有没有过来:

[admin@obproxy ~]$ obclient -h 10.211.55.54 -uroot@test_tenant -P2883 -proot -c -A oceanbase
MySQL [oceanbase]> use test2;
Database changed
MySQL [test2]> select count(*) from casbin_rule;
+----------+
| count(*) |
+----------+
|      155 |
+----------+


到此为止,将数据从MySQL数据库迁移到OceanBase的操作完成了,大家是不是觉得还蛮简单的,尽快上手试一下吧,有问题请留言交流,我是阿福,希望我们在OB社区成以技术为媒介成为好朋友,各位加油~

666

1 个赞

荣获CSDN 数据库分类排名第36位的文章!阿福老师太强了

1 个赞

666

1 个赞

使用ODC连接数据库进行开发 体验更丝滑~~

1 个赞

下一步出个文章带大家体验一下ODC,感谢建议哦~

向大佬学习

还没有体验ODC,找时间体验一下

mysqldump备份出来直接到ob执行有些语法错误,有洁癖的人会焦虑。

datax每次只能一张表,很麻烦。。。

obdumper什么时候支持直接备份mysql就好了。