浅谈国产数据库OceanBase

目录

传送门

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方式

链接:部署OceanBase数据库容器环境

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的启动做的有些复杂了,对内存要求实在是高,如果这些简化些,那么新手入门就很舒服很舒服了。

相关推荐
有一个好名字2 小时前
Spring AI 工具调用(Tool Calling):解锁智能应用新能力
java·人工智能·spring
五阿哥永琪2 小时前
SpringAOP的底层实现原理
java·spring
JosieBook2 小时前
【大模型】用 AI Ping 免费体验 GLM-4.7 与 MiniMax M2.1:从配置到实战的完整教程
数据库·人工智能·redis
bjzhang752 小时前
Alpine Linux 也能当桌面版用
linux·alpine linux
鹿野素材屋2 小时前
帧同步场景下的确定性随机数生成:基于时间戳的固定种子设计与实践
java·开发语言
weixin_425023002 小时前
MybatisPlusJoin 完整样例
java·数据库·sql
float_六七2 小时前
Java JAR包运行与反编译全攻略
java·开发语言·jar
运维行者_2 小时前
不同规模企业如何选 OPM?参考局域网管理软件与 cpu 温度监控适配指南
大数据·运维·服务器·网络·数据库·postgresql·snmp
Lolo_fi2 小时前
Linux pinctrl 子系统
linux