经过一段时间的学习,我对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社区成以技术为媒介成为好朋友,各位加油~