目录
- 传送门
- 零、前言
- 一、视图
- 二、数据类型
-
- [1. 数据类型映射差异](#1. 数据类型映射差异)
- [2. 精度调整限制](#2. 精度调整限制)
- [3. 特殊类型处理](#3. 特殊类型处理)
- [4. 数据转换建议](#4. 数据转换建议)
- [5. 验证与测试](#5. 验证与测试)
- 三、语法
- 四、备份与恢复
- 五、数据迁移计划
- 六、总结
传送门
SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口
零、前言
OceanBase叫做海扬数据库,可以说是阿里体系的,属于蚂蚁金融旗下的数据库,承担了双十一10%的数据库压力。是一款分布式数据库。笔者在初次接触的时候,感觉很好奇,研究下来发现条条框框也不少,官方文档可以看到是下了很大功夫维护的,可惜让人学起来还是觉得困难。笔者目前也是入门状态,就浅谈一种MySQL迁移到OceanBase的经验和坑,笔者标明不建议的,基本都是因为有工具直接搞定,不用那么麻烦的用脚本一个一个处理。还有本文脚本都是基于CentOS7语法的。前面几章节主要让大家看个大概情况。最重要的就是第五章-数据迁移计划,是实操,也是精华所在。

一、视图
1.OceanBase视图
OceanBase 数据库支持视图(Views)。视图在数据库中是一个非常重要的概念,它允许用户通过一个预定义的查询结果来访问数据,而不需要直接访问底层的表。视图可以简化复杂的查询操作,隐藏数据的复杂性,以及提供数据安全性的保护(通过限制哪些用户可以访问特定的视图)
bash
在这里插入代码片1.创建视图
在 OceanBase 中,你可以使用 CREATE VIEW 语句来创建一个视图。例如:
CREATE VIEW view_name AS
SELECT column1, column2
FROM table_name
WHERE condition;
2.使用视图
创建视图后,你可以像查询普通表一样查询视图:
SELECT * FROM view_name;
3.修改和删除视图
你可以使用 ALTER VIEW 来修改已存在的视图,例如更改其定义。使用 DROP VIEW 来删除视图:
DROP VIEW view_name;
总结:OceanBase数据库与MySQL数据的视图语法基本保持一致,只有系统视图不一样,在OceanBase中,需将MySQL的information_schema替换为__all_virtual_information_columns等内部视图。
2.命令行方式迁移(不建议)
bash
#!/bin/bash
# 1. 备份MySQL视图结构,导出表结构但不含数据
mysqldump -u root -p --no-data --routines mydb > view_backup.sql
# 2. 转换视图依赖(示例:替换information_schema),将information_schema替换为OceanBase底层表
sed -i 's/information_schema.columns/__all_virtual_information_columns/g' view_backup.sql
# 3. 导入OceanBase
obclient -u root@ob_host:ob_port -D mydb -A < view_backup.sql
# 4. 验证视图,检查视图是否成功创建。支持通过mysqldump导出多个视图
obclient -u root@ob_host:ob_port -D mydb -e "SHOW CREATE VIEW myview"
二、数据类型

1. 数据类型映射差异
数值类型:如TINYINT(1)在MySQL中通常表示布尔值,需转换为OceanBase的BOOL类型。
时间类型:MySQL的TIMESTAMP在OceanBase中需转换为TIMESTAMP WITH TIME ZONE。
二进制类型:MySQL的LONG VARBINARY、BLOB等需指定长度,OceanBase不支持无长度限制的BLOB类型。
文本类型:MySQL的LONGTEXT、MEDIUMTEXT等需指定长度,OceanBase不支持无长度限制的TEXT类型。
JSON类型:MySQL的JSON类型在OceanBase中不被支持。
2. 精度调整限制
数值精度:在OceanBase中,不能直接降低数值类型的精度(如从NUMBER(10,0)降为NUMBER(10,2)),需先增加精度再修改。
时间精度:MySQL的DATETIME(6)(微秒精度)在OceanBase中需转换为TIMESTAMP(6)。
3. 特殊类型处理
枚举类型:MySQL的ENUM和SET类型在OceanBase中完全兼容。
序列类型:MySQL的AUTO_INCREMENT需转换为OceanBase的SEQUENCE。
例如:
bash
-- MySQL CREATE TABLE t1 (id INT AUTO_INCREMENT PRIMARY KEY);
-- OceanBase CREATE SEQUENCE seq_t1;
CREATE TABLE t1 (id INT DEFAULT NEXT VALUE FOR seq_t1 PRIMARY KEY);
4. 数据转换建议
使用mysqldump导出数据后,手动修改SQL文件中的数据类型定义。或者通过数据迁移工具(如OMS)进行自动转换,但需验证转换结果。
5. 验证与测试
迁移后,使用SELECT COUNT(*)等SQL语句验证数据一致性。对关键表进行数据校验,确保无数据截断或类型转换错误。迁移前需备份MySQL数据,确保目标端字段类型精度不低于源端。
三、语法


1.关键字与排序规则
关键字与标识符:OceanBase对大小写敏感,且保留关键字(如USER)需用反引号(MySQL模式)或双引号(Oracle模式)括起。
例如:
bash
-- MySQL模式CREATE TABLE `order` (`key` VARCHAR(20));
-- Oracle模式CREATE TABLE "ORDER"("KEY"VARCHAR2(20));
字符集与排序规则:确保源端和目标端字符集兼容。例如,MySQL的utf8mb4可映射为OceanBase的utf8mb4,但需注意排序规则(如utf8mb4_0900_ai_ci与utf8mb4_general_ci可能导致查询结果不同)。


2.索引与约束重构
索引策略调整:OceanBase采用分布式索引机制,需重新设计索引以优化分布式查询性能。例如,避免在分布式表上创建过多本地索引。
约束兼容性:OceanBase不支持CHECK约束和非NO ACTION属性的外键,需通过应用逻辑或触发器实现类似功能。例如,使用存储过程验证数据完整性。
命令行方式迁移(不建议)
bash
#!/bin/bash
# 1. 备份MySQL索引结构
mysqldump -u root -p --no-data --routines mydb > index_backup.sql
# 2. 转换索引类型(示例:B-Tree转Hash),将B-Tree索引转换为OceanBase支持的Hash索引
sed -i 's/USING BTREE/USING HASH/g' index_backup.sql
# 3. 导入OceanBase
obclient -u root@ob_host:ob_port -D mydb -A < index_backup.sql
# 4. 验证索引,检查OceanBase中索引是否成功创建,支持通过mysqldump导出多个表索引
obclient -u root@ob_host:ob_port -D mydb -e "SHOW INDEX FROM mytable"
3.存储引擎与分区键
存储引擎限制:OceanBase仅支持自身存储引擎,需将MySQL的InnoDB/MyISAM表转换为OceanBase兼容格式。与 MySQL 数据库基于数据块的 InnoDB 和 Myisam 引擎不同,OceanBase 数据库使用的是基于 LSM-Tree 架构的存储引擎。
分区键选择:OceanBase的NUMERIC类型不能作为分区键,若MySQL表使用该类型分区,需改为INT或VARCHAR类型。
四、备份与恢复


1.命令行方式备份与恢复(不推荐)
bash
#!/bin/bash
# 备份配置
TENANT="mytenant"
BACKUP_PATH="/obbackup/$TENANT"
LOG_ARCHIVE="LOCATION=file://$BACKUP_PATH BINDING=Optional PIECE_SWITCH_INTERVAL=1d"
# 启用日志归档,配置租户级别的日志归档路径
obclient -u root@sys -A -e "ALTER SYSTEM SET LOG_ARCHIVE_DEST='$LOG_ARCHIVE' TENANT=$TENANT"
# 执行物理备份,使用BACKUP命令备份数据到指定路径
obclient -u root@$TENANT -A -e "BACKUP DATABASE TO '$BACKUP_PATH'"
# 恢复操作,创建新租户、挂载备份数据、验证恢复结果
# 1. 创建恢复租户(示例:ob_restore)
obclient -u root@sys -A -e "CREATE TENANT ob_restore"
# 2. 挂载备份
obclient -u root@ob_restore -A -e "RESTORE DATABASE FROM '$BACKUP_PATH'"
# 3. 验证恢复
obclient -u root@ob_restore -A -e "SELECT COUNT(*) FROM mytable"
2.使用工具
全量迁移:使用mysqldump或OceanBase Data Migration(OMS)工具导出数据,确保脚本兼容性。例如,导出时添加--compact参数减少冗余信息。OMS工具:支持全量+增量迁移,适合大规模数据迁移。需配置源端和目标端连接信息,并设置并发数以控制迁移速度。
增量同步:配置MySQL的binlog为ROW模式,并设置binlog_row_image=FULL,确保OceanBase能捕获所有数据变更。增量日志需保留至少24小时(建议3天以上),避免同步中断。
五、数据迁移计划
1.环境准备
| 角色 | 版本 |
|---|---|
| 银河麒麟高级服务器操作系统 | V11 |
| OceanBase社区版 | V4.5.0 |
| Docker-CE社区稳定版 | V26.0.0 |
| oceanbase-all-in离线安装包 | V4.5.0-el7 |
| 角色 | 机器 | 备注 |
|---|---|---|
| Obd | 10.10.10.4 | 安装在中控机上的自动化部署软件 |
| OBServer 节点 | 10.10.10.1 | OceanBase 数据库Zone1 |
| OBServer 节点 | 10.10.10.2 | OceanBase 数据库Zone2 |
| OBServer 节点 | 10.10.10.3 | OceanBase 数据库Zone3 |
备注:这里特别说明一下,银河麒麟高级服务器操作系统语法是CentOS7,关于OBServer节点也没必要特别关注。环境准备最重要的其实就一个东西,就是oceanbase-all-in离线安装包,其他都不重要。
2.部署OceanBase数据库容器环境
~/.oceanbase-all-in-one/obd/usr/obd/example有yml配置文件,OceanBase和MySQL部署区别最大的特色就在这里了。OceanBase数据库可以看做是一个SpringBoot项目,你部署它就需要配置yml文件,把服务器该设置的设置后,然后改好yml文件(简单修改,主要改下用户密码和ip地址),启动就好了。如果没有设置好,启动会有很多报错,而且对系统内存要求极高。需要free -m的剩余内存6GB以上,最好是8GB以上,这是硬指标,如果做集群,就需要3台8GB以上的机器了。这也是这个数据库很坑的地方之一。官方建议内存在64GB,我们普通学习的,自己机器哪里有这么大。所以笔者穷B的自己的Linux服务器才2GB,果断跑不起来,然后电脑上弄了虚拟机也跑不起集群,只能单机看看。yml配置三台ip地址就是集群三台,配置一台就是单机,集群和单机的配置文件基本差不多。下面文章建议先看 2.3 Linux方式(重新整理版本)。
2.1 Docker方式
bash
拉取 OceanBase 数据库最新镜像
sudo docker pull oceanbase/oceanbase-ce
启动OceanBase 数据库实例
sudo docker run -p 2881:2881 -p 2886:2886 -v $PWD/ob:/root/ob -v $PWD/obd/cluster:/root/.obd/cluster --name obstandalone -e MODE=NORMAL -e OB_TENANT_PASSWORD=***** -d oceanbase/oceanbase-ce
启动预计需要 2~5 分钟。执行以下命令,如果返回 boot success!,则表示启动成功。
sudo docker logs obstandalone | tail -1
boot success!
2.2 Linux方式
bash
tar -xzf oceanbase-all-in-one-4.5.0_20251127.el7.x86_64.tar.gz #解压离线包
cd oceanbase-all-in-one/bin/
./install.sh
source ~/.oceanbase-all-in-one/bin/env.sh
# 备注:~/.oceanbase-all-in-one/obd/usr/obd/example有配置文件
# 部署集群
obd cluster deploy test -c fe-test.yaml
# 启动集群
obd cluster start test
# 销毁集群
obd cluster destroy test -f [--igs]
# 查看集群
obd cluster list
# 根据目标机器资源自动生成最大规格的完整配置并部署启动集群
obd cluster autodeploy test -c fe-test.yaml
# 清除缓存
echo1>/proc/vm/drop_caches
启动正常截图:

obclient -h192.168.23.130 -P2881 -uroot@sys -p'a8l1wDZN1tcEgR72Y5Cp' -Doceanbase -A
启动集群错误1:

错误1解决:

bash
# 错误1解决命令,注意3台都要处理:
echo -e "* soft nofile 20000\n* hard nofile 20000" >> /etc/security/limits.d/nofile.conf
grep UsePAM /etc/ssh/sshd_config
systemctl restart sshd
ulimit -n # 应输出20000
启动集群错误2:

bash
错误2解决:(改swap效果不佳->将yml中的memory_limit改小即可)
# 配置swap为8G,需根据实际需求调整count值
dd if=/dev/zero of=/swapfile bs=1G count=8 && mkswap /swapfile && swapon /swapfile
# 持久化配置,确保系统重启后swap生效
echo '/swapfile none swap sw 0 0' >> /etc/fstab
#降低swap使用频率,优先使用物理内存,swap作为补充内存,频繁使用会显著降低性能,swap配置为物理内存的1.5-2倍
echo 'vm.swappiness=10' >> /etc/sysctl.conf && sysctl -p
启动集群错误3

根据提示对yml配置进行修改。
2.3 Linux方式(重新整理版本)
bash
# 1、解压数据库安装包
chmod 777 -R /java
tar -xzf oceanbase-all-in-one-4.5.0_20251127.el7.x86_64.tar.gz
cd oceanbase-all-in-one/bin/
./install.sh
source ~/.oceanbase-all-in-one/bin/env.sh
# 2、解除SSH数量限制
echo -e "* soft nofile 20000\n* hard nofile 20000" >> /etc/security/limits.d/nofile.conf
grep UsePAM /etc/ssh/sshd_config
systemctl restart sshd
ulimit -n # 重新打开ssh,应输出20000
# 3、关闭防火墙
# 验证状态
systemctl status firewalld
# 临时关闭
systemctl stop firewalld
# 永久禁用防火墙,需重启生效
systemctl disable firewalld
# 4、部署数据库 备注:~/.oceanbase-all-in-one/obd/usr/obd/example有配置文件
# 找到mini-single-example.yaml修改ip地址和user属性,确保free内存8G以上,重命名为single.yaml
# 部署集群
obd cluster deploy single-c single.yaml
# 启动集群
obd cluster start single
# 销毁集群
obd cluster destroy single-f [--igs]
# 查看集群
obd cluster list
# 根据目标机器资源自动生成最大规格的完整配置并部署启动集群(暂时不推荐)
obd cluster autodeploy single -c single.yaml
# 清除缓存
echo1>/proc/vm/drop_caches
3.连接数据库
bash
# 验证状态
systemctl status firewalld
# 临时关闭
systemctl stop firewalld
# 永久禁用防火墙,需重启生效
systemctl disable firewalld
Navicat15通过MySQL模式连接OceanBase数据库。

4.迁移数据
Navicat15迁移数据


5.微服务改造
这里就是OceanBase超级强大的地方了,什么叫完全兼容MySQL,这步微服务完全可以不做,也就是完全可以不修改任何代码,yml和pom都不用改,就用MySQL驱动去链接OceanBase,代码完全不做任何改变,就能链接起来数据库,让项目跑起来。(当然MySQL和OceanBase的ip地址不一样的时候,肯定要改下ip地址,其他参数都不用变),如果要具体改也可以,就是如下。笔者经过测试,改和不改效果基本一样。这就是OceanBase强大的兼容能力,给力。
yml修改
bash
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
# driverClassName: com.mysql.cj.jdbc.Driver
driverClassName: com.oceanbase.jdbc.Driver
druid:
# 主库数据源
master:
# url: jdbc:mysql://47.108.159.221:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:oceanbase://192.168.23.130:2881/ry?useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: a8l1wDZN1tcEgR72Y5Cp
核心变更:
bash
driverClassName: com.oceanbase.jdbc.Driver
url: jdbc:oceanbase://192.168.23.130:2881/ry?useSSL=false&useUnicode=true&characterEncoding=utf-8
pom.xml修改
bash
<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.3</version>
</dependency>

6.验证
OceanBase官方建议:
使用SELECT COUNT(*)等SQL语句验证数据一致性。
对关键表随机抽取3条数据进行数据校验,确保无数据截断或类型转换错误。
六、总结
MySQL迁移OceanBase数据库,最难的点在于部署OceanBase数据库(启动报错多,要一个一个解决),其他的只要Navicat工具迁移过去数据就OK了,如果MySQL和OceanBase的IP是同一个,那么一点代码都不用改,哪怕不是同一个IP地址,微服务也只需要把url地址的IP地址改下即可。如此强大的兼容能力,确实让人感慨。
笔者只是觉得OceanBase的启动做的有些复杂了,对内存要求实在是高,如果这些简化些,那么新手入门就很舒服很舒服了。
