事件背景
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的知識體系,所以要不斷更新自己的知識儲備與理解,這次的分享到此結束,希望這次的分享能幫助到大家。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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(...
閱讀 1359·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1908·2023-01-11 13:20
閱讀 4166·2023-01-11 13:20
閱讀 2759·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3673·2023-01-11 13:20