背景 / 为什么写这篇
首先肯定有这种需求,虽说原厂答复是不兼容,搭建可能不会报错,但是不能正常工作,这个想法一出现就勾起了我的好奇心。
客户也有需要,那就验证下OceanBase 能不能社区和商用混合部署,找了两套主备环境:
• 主库:OceanBase 社区版
• 备库:OceanBase 商用版
目标是通过归档 + NFS + 恢复机制,实现数据从社区版向商用版的同步,并验证位点推进与数据一致性。
*再次声明,纯属娱乐测试,出问题概不负责。
核心架构
[主库:社区版OB]
↓
开启归档 → 日志写入 NFS
↓
[NFS 共享目录]
↓
[备库:商用 OB ]
从 NFS 拉取日志 → 恢复 + 开启同步版本一致:主备均为
4.2.1.10
关键步骤与命令
首先前置条件,两个集群都挂载同一个nfs。
1. 主库配置(社区版)
#创建测试表
MySQL [test]> create table t1 (a int ,b int);
Query OK, 0 rows affected (0.183 sec)
MySQL [test]> insert into t1 values(1,1);
Query OK, 1 row affected (0.048 sec)
#开启归档,发起备份
MySQL [test]> ALTER SYSTEM SET LOG_ARCHIVE_DEST = 'LOCATION=file:///nfs/nfs1/st_Cs/sh_archive';
ERROR 1235 (0A000): change archive dest when archive is running is not supported
MySQL [test]> SELECT DEST_ID, ROUND_ID, DEST_NO, STATUS, CHECKPOINT_SCN, CHECKPOINT_SCN_DISPLAY, PATH FROM oceanbase.dba_OB_ARCHIVELOG;
+---------+----------+---------+--------+---------------------+----------------------------+-----------------------------------+
| DEST_ID | ROUND_ID | DEST_NO | STATUS | CHECKPOINT_SCN | CHECKPOINT_SCN_DISPLAY | PATH |
+---------+----------+---------+--------+---------------------+----------------------------+-----------------------------------+
| 1001 | 1 | 0 | DOING | 1755226057826202220 | 2025-08-15 10:47:37.826202 | file:///nfs/nfs1/st_Cs/sh_archive |
+---------+----------+---------+--------+---------------------+----------------------------+-----------------------------------+
MySQL [test]> ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///nfs/nfs1/st_Cs/sh_data';
Query OK, 0 rows affected (0.041 sec)
MySQL [test]> ALTER SYSTEM BACKUP DATABASE;
Query OK, 0 rows affected (0.026 sec)
MySQL [test]> SELECT * FROM oceanbase.dba_OB_BACKUP_JOBS;
+--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+---------------+--------+--------+---------+-------------+--------------------------------+
| JOB_ID | INCARNATION | BACKUP_SET_ID | INITIATOR_TENANT_ID | INITIATOR_JOB_ID | EXECUTOR_TENANT_ID | PLUS_ARCHIVELOG | BACKUP_TYPE | JOB_LEVEL | ENCRYPTION_MODE | PASSWD | START_TIMESTAMP | END_TIMESTAMP | STATUS | RESULT | COMMENT | DESCRIPTION | PATH |
+--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+---------------+--------+--------+---------+-------------+--------------------------------+
| 1 | 1 | 1 | 1134 | 0 | 1134 | OFF | FULL | USER_TENANT | NONE | | 2025-08-15 10:51:25.293037 | NULL | DOING | 0 | | | file:///nfs/nfs1/st_Cs/sh_data |
+--------+-------------+---------------+---------------------+------------------+--------------------+-----------------+-------------+-------------+-----------------+--------+----------------------------+---------------+--------+--------+---------+-------------+--------------------------------+
1 row in set (0.034 sec)2. 备库配置(商用版)
#创建恢复资源
MySQL [oceanbase]> CREATE RESOURCE UNIT stcs_unit_config
-> MEMORY_SIZE = '6G',
-> MAX_CPU = 2, MIN_CPU = 2,
-> LOG_DISK_SIZE = '200G',
-> MAX_IOPS = 100000, MIN_IOPS = 100000, IOPS_WEIGHT=1;
Query OK, 0 rows affected (0.016 sec)
MySQL [oceanbase]> CREATE RESOURCE POOL zry_pool_01
-> UNIT='stcs_unit_config',
-> UNIT_NUM=1,
-> ZONE_LIST=('zone1','zone2','zone3');
Query OK, 0 rows affected (0.028 sec)3. 构建主备
主备搭建方式有三种,这个不详细说了,官网有说明,我之前也写过一篇 https://open.oceanbase.com/blog/15644177220
#备库操作
-恢复数据
MySQL [oceanbase]> ALTER SYSTEM RESTORE st_cs1 FROM 'file:///nfs/st_Cs/sh_data,file:///nfs/nfs1/st_Cs/sh_archive' until time='2025-08-15 10:55:38.093481' WITH 'pool_list=zry_pool_01';
Query OK, 0 rows affected (53.677 sec)
-恢复完成
MySQL [oceanbase]> SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SYNC_SCN FROM oceanbase.DBA_OB_TENANTS where tenant_name='st_cs1';
+-------------+-------------+----------------------------+--------+-------------+---------------------+
| TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SYNC_SCN |
+-------------+-------------+----------------------------+--------+-------------+---------------------+
| st_cs1 | USER | 2025-08-15 11:00:04.905501 | NORMAL | STANDBY | 1755226538093481000 |
+-------------+-------------+----------------------------+--------+-------------+---------------------+
1 row in set (0.692 sec)
-构建实时同步
MySQL [test]> ALTER SYSTEM RECOVER STANDBY UNTIL UNLIMITED;
Query OK, 0 rows affected (0.012 sec)
MySQL [test]> SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS ;
+-------------+-------------+----------------------------+--------+-------------+----------------------------+
| TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) |
+-------------+-------------+----------------------------+--------+-------------+----------------------------+
| st_cs1 | USER | 2025-08-15 11:00:04.905501 | NORMAL | STANDBY | 2025-08-15 11:13:38.655101 |
+-------------+-------------+----------------------------+--------+-------------+----------------------------+
1 row in set (0.122 sec)4. 验证
#主库插入新的数据
#备库等待scn更新后检查验证
MySQL [test]> SELECT TENANT_NAME, TENANT_TYPE, CREATE_TIME, STATUS, TENANT_ROLE,SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS ;
+-------------+-------------+----------------------------+--------+-------------+----------------------------+
| TENANT_NAME | TENANT_TYPE | CREATE_TIME | STATUS | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) |
+-------------+-------------+----------------------------+--------+-------------+----------------------------+
| st_cs1 | USER | 2025-08-15 11:00:04.905501 | NORMAL | STANDBY | 2025-08-15 11:15:38.720919 |
+-------------+-------------+----------------------------+--------+-------------+----------------------------+
1 row in set (0.011 sec)
MySQL [test]> select * from t1;
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 2 |
+------+------+
2 rows in set (0.001 sec)5.进一步验证
#主库创建一个包含各种类字段型的表并插入10001条数据
MySQL [test]> CALL insert_large_data(10000); -- 先试 1 万条
Query OK, 0 rows affected (8.138 sec)
MySQL [test]> select count(*) from test_large_data
->
-> ;
+----------+
| count(*) |
+----------+
| 10001 |
+----------+
1 row in set (0.019 sec)
#备库检查
MySQL [test]> select count(*) from test_large_data
-> ;
+----------+
| count(*) |
+----------+
| 10001 |
+----------+
1 row in set (0.166 sec)6.切换验证
为了省事,我只做了Failover
#备库操作
MySQL [test]> ALTER SYSTEM ACTIVATE STANDBY VERIFY;
Query OK, 0 rows affected (0.036 sec)
MySQL [test]> ALTER SYSTEM ACTIVATE STANDBY;
Query OK, 0 rows affected (1.635 sec)
MySQL [test]> SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;
+-------------+-------------+-------------+-------------------+
| TENANT_NAME | TENANT_TYPE | TENANT_ROLE | SWITCHOVER_STATUS |
+-------------+-------------+-------------+-------------------+
| st_cs1 | USER | PRIMARY | NORMAL |
+-------------+-------------+-------------+-------------------+
1 row in set (0.050 sec)总结
本次测试仅仅是满足了我的一个好奇心,不建议大家直接使用该方案生产使用。
因为是测试,场景比较简单,不能证明OceanBase 社区版 → 商用版的主备同步的完全可行性。
行之所向,莫问远方。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




