如何从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,脚本需要略作调整,请根据链接中的介绍进行修改即可:OceanBase 社区

采用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就好了。