事件背景
OceanBase数据库是蚂蚁集团不基于任何开源产品,完全自研的企业级分布式关系数据库,在普通硬件上实现金融级高可用,首创“三地五中心”城市级故障自动无损容灾新标准,具备卓越的水平扩展能力,全球首家通过TPC-C标准测试的分布式数据库,2020年5月,OceanBase以7.07亿tpmC的在线事务处理性能,打破了去年自己创造的TPC-C世界纪录。截止至目前,OceanBase是第一个也是唯一一个上榜的中国数据库。产品立项于2010年,具有数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系数据库、低成本等特点。
OceanBase中开创性的可以创建两种模式(mysql模式、oracle模式),因为我们现场使用Oracle模式,虽然兼容很多,但还是有些细微的差别,因为OMS迁移中涉及到了外键约束的问题,所以我简单做了下测试,给大家分享下测试结论。
如果有兴趣的同学可以登录OB的官网找最新的文档了解学习下。目前OB最新文档是2.2.5版本中说目前OceanBase不支持通过ALTERTABLE语句增加或修改约束,2.2.7版本是支持alter的。
场景测试
在OMS迁移的时候因为要起增量所以会创建四个隐藏列和一个约束,所以表上原来的外键约束会取消,约束语句会放在OMS机器的/home/admin/logs/post_ddl_1000068.sql中,这里的1000068是任务ID,在数据迁移完成后可以手工去创建。另外OB在创建约束时不支持NOVALIDATE,我就针对这个问题做了以下测试。
(1)环境准备
在Oracle和OB分别创建测试表
oracle:
SQL> create table emp(empno number(4) primary key,ename varchar2(10),depno number(4));
Table created.
SQL> create table depth(deptno number(4) primary key,dname varchar2(14));
Table created.
OB:
obclient> create table emp(empno number(4) primary key,ename varchar2(10),depno number(4));
Query OK, 0 rows affected (0.09 sec)
obclient> create table depth(deptno number(4) primary key,dname varchar2(14));
Query OK, 0 rows affected (0.04 sec)
插入数据:
insert into depth values (440,董事会);
insert into depth values (330,财务部);
insert into emp values(1002,风华,440);
insert into emp values(1003,白露,330);
oracle:
SQL> select * from emp;
EMPNO ENAME DEPNO
---------- ---------- ----------
1002 风华 440
1003 白露 330
SQL> select * from depth;
DEPTNO DNAME
---------- --------------
440 董事会
330 财务部
OB:
obclient> select * from emp;
+-------+--------+-------+
| EMPNO | ENAME | DEPNO |
+-------+--------+-------+
| 1003 | 白露 | 330 |
| 1002 | 风华 | 440 |
+-------+--------+-------+
2 rows in set (0.00 sec)
obclient> select * from depth;
+--------+-----------+
| DEPTNO | DNAME |
+--------+-----------+
| 440 | 董事会 |
| 330 | 财务部 |
+--------+-----------+
2 rows in set (0.01 sec)
(2)不加NOVALIDATE创建约束测试
ORACLE:
SQL> ALTER TABLE emp ADD CONSTRAINT "FK_EMP" FOREIGN KEY (DEPNO) REFERENCES depth (DEPTNO);
Table altered.
SQL> select constraint_name,constraint_type,status,validated from user_constraints where constraint_name=FK_EMP;
CONSTRAINT_NAME C STATUS VALIDATED
------------------------------ - -------- -------------
FK_EMP R ENABLED VALIDATED
OB:
obclient> ALTER TABLE emp ADD CONSTRAINT "FK_EMP" FOREIGN KEY (DEPNO) REFERENCES depth (DEPTNO);
Query OK, 0 rows affected (0.25 sec)
obclient> select constraint_name,constraint_type,status,validated from user_constraints where constraint_name=FK_EMP;
+-----------------+-----------------+--------+-----------+
| CONSTRAINT_NAME | CONSTRAINT_TYPE | STATUS | VALIDATED |
+-----------------+-----------------+--------+-----------+
| FK_EMP | R | NULL | NULL |
+-----------------+-----------------+--------+-----------+
1 row in set (0.02 sec)
可以看到不加NOVALIDATE在oracle和OB端都是可以正常创建外键约束的
(3)外键约束功能测试
不符合约束条件数据插入:
oracle:
SQL> insert into emp values (1004,松风阁,550);
insert into emp values (1004,松风阁,550)
*
ERROR at line 1:
ORA-02291: integrity constraint (ZY_TEST.FK_EMP) violated - parent key not found
ob:
obclient> insert into emp values (1004,松风阁,550);
ORA-02291: integrity constraint violated - parent key not found
符合约束条件数据插入:
oracle:
SQL> insert into depth values (550,业务部);
1 row created.
SQL> insert into emp values (1004,松风阁,550);
1 row created.
ob:
obclient> insert into depth values (550,业务部);
Query OK, 1 row affected (0.01 sec)
obclient> insert into emp values (1004,松风阁,550);
Query OK, 1 row affected (0.01 sec)
经过插入数据测试,可以看到外键约束功能是正常的
(4) NOVALIDATE创建约束测试
oracle:
SQL> ALTER TABLE emp DROP CONSTRAINT "FK_EMP" ;
Table altered.
ob:
obclient> ALTER TABLE emp DROP CONSTRAINT "FK_EMP" ;
Query OK, 0 rows affected (0.14 sec)
oracle:
SQL> ALTER TABLE DEPTH ADD CONSTRAINT "FK_DEPTH" FOREIGN KEY (deptno) REFERENCES EMP (empno) NOVALIDATE;
Table altered.
ob:
obclient> ALTER TABLE DEPTH ADD CONSTRAINT "FK_DEPTH" FOREIGN KEY (deptno) REFERENCES EMP (empno) NOVALIDATE;
ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near NOVALIDATE at line 1
加上NOVALIDATE条件之后在oracle可以正常创建外键约束,在OB端会报错
分析总结
OB国产化数据库还未大规模商业化,本身产品也处于不断的发展和完善阶段,随着OB产品版本的快速迭代,官网文档的更新也会有些滞后,所以我们在熟悉OB产品过程中不仅要学习文档中的知识,更要多去实践,验证。现在网上公开资料很少,需要我们在实践过程中学会总结经验和知识积累,完善自己的知识库。
在工作过程中,因为OB属于新数据库,我们本身固有的经验也不一定完全适用OB的知识体系,所以要不断更新自己的知识储备与理解,这次的分享到此结束,希望这次的分享能帮助到大家。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130050.html
摘要:采用一套固化的认知来建立生产环境准备的应用。我们采用一套关于固化平台和第三包依赖库的认知,以至于你可以通过最小的烦恼来启动。大多数的应用程序只需要非常少的配置。 1 Spring Boot官网[2.1.5 CURRENT GA] 1.1 Pivotal Wiki Pivotal Software, Inc. is a software and services company base...
摘要:原理分析的核心就是通过观察某一个变量,当该变量产生变化时,对应的内的回调函数就会发生变化。回调函数若依赖外部环境,则无法进行收集很好理解,的回调函数在预执行的时候无法到达那一行代码,所以收集不到。 Mobx解决的问题 传统React使用的数据管理库为Redux。Redux要解决的问题是统一数据流,数据流完全可控并可追踪。要实现该目标,便需要进行相关的约束。Redux由此引出了dispa...
摘要:写文章不容易,点个赞呗兄弟专注源码分享,文章分为白话版和源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧研究基于版本如果你觉得排版难看,请点击下面链接或者拉到下面关注公众号也可以吧原理依赖收集源码版之引用数据类型上 写文章不容易,点个赞呗兄弟专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧研究基于...
摘要:响应式原理为了探究这一切的原因,我再次点开了的官网。在官网很下面的位置,找到了关于响应式原理的说明。因此,新添加到数组中的对象中的属性,就成了非响应式的属性了,改变它自然不会让组件重新渲染。响应式属性的对象,有这个对象就代表是响应式的。 最近在用Vue开发一个后台管理的demo,有一个非常常规的需求。然而这个常规的需求中,包含了大量的知识点。有一个产品表格,用来显示不同产品的信息。...
摘要:如果说要使用数据校验,我十分相信小伙伴们都能够使用,但估计大都是有个前提的环境。具体使用可参考小家让支持对平铺参数执行数据校验默认使用只能对进行校验级联校验什么叫级联校验,其实就是带校验的成员里存在级联对象时,也要对它完成校验。 每篇一句 NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(...
阅读 1249·2023-01-11 13:20
阅读 1557·2023-01-11 13:20
阅读 1011·2023-01-11 13:20
阅读 1680·2023-01-11 13:20
阅读 3971·2023-01-11 13:20
阅读 2518·2023-01-11 13:20
阅读 1310·2023-01-11 13:20
阅读 3485·2023-01-11 13:20