梁長青,OceanBase 高級研發(fā)工程師,從事 SQL 執(zhí)行引擎相關(guān)工作,目前主要負責 DBLink、單機引擎優(yōu)化等方面工作。
沈大川,OceanBase 高級研發(fā)工程師,從事 SQL 執(zhí)行引擎相關(guān)工作,曾參與 TPC-H 項目攻堅,目前主要負責并行執(zhí)行、DBLink、數(shù)據(jù)類型等方面的工作。
我們發(fā)現(xiàn),由于不同業(yè)務(wù)需求之間存在較大差異,不少用戶會在實際業(yè)務(wù)中同時使用多種數(shù)據(jù)庫產(chǎn)品。這些不同的數(shù)據(jù)庫之間并不能直接進行數(shù)據(jù)訪問,這為數(shù)據(jù)共享和流轉(zhuǎn)帶來了障礙。我們假設(shè)這樣一個場景:某公司各部門的銷售數(shù)據(jù)存儲在各自的數(shù)據(jù)庫中,當需要統(tǒng)計全公司的銷售數(shù)據(jù)時,就得對所有數(shù)據(jù)庫中的數(shù)據(jù)進行匯總??梢灶A想到,一種可行的方式是使用 ETL 工具,或自行編寫腳本來實現(xiàn)數(shù)據(jù)的抽取和轉(zhuǎn)換,進而將所有數(shù)據(jù)導入到同一數(shù)據(jù)庫中再進行分析。很明顯,這種方式需要編寫更多的代碼和腳本,開發(fā)和維護成本較高。進一步講,如果用戶頻繁執(zhí)行匯總操作,數(shù)據(jù)導出、導入的時間成本,以及數(shù)據(jù)存儲成本也將變得非常高。
是否有方法能省去業(yè)務(wù)跨數(shù)據(jù)庫時的繁瑣步驟呢?數(shù)據(jù)庫鏈接(Database Link,簡稱為 DBLink)可以為我們提供解決思路,這是一項在不同數(shù)據(jù)庫之間進行連接和通信的功能。使用 DBLink,用戶可以將一個數(shù)據(jù)庫視為另一數(shù)據(jù)庫的外部表,從而執(zhí)行跨數(shù)據(jù)庫的查詢和數(shù)據(jù)操作。針對上述場景,我們便可以在一個數(shù)據(jù)庫中建立到各個部門數(shù)據(jù)庫的 DBLink,通過 DBLink 讀取各個部門的銷售數(shù)據(jù)并進行匯總分析。使用 DBLink 的優(yōu)點是可以實時獲取遠端數(shù)據(jù)庫的最新數(shù)據(jù),同時,可以利用 DBLink 進行數(shù)據(jù)寫入,將匯總數(shù)據(jù)同步給各個部門。
此前,OceanBase 已經(jīng)支持了 OceanBase 到 Oracle 數(shù)據(jù)庫的 DBLink 讀功能。4.1 版本中,我們以 XA 事務(wù)能力為基礎(chǔ),進一步支持了跨 OceanBase 和 Oracle 的寫事務(wù)能力,并支持了 OceanBase 到 OceanBase 的寫事務(wù)能力。讀寫兼?zhèn)涞?DBLink 能力,可以讓用戶輕松實現(xiàn)跨數(shù)據(jù)庫的數(shù)據(jù)共享與一體化,使得數(shù)據(jù)處理分析更便捷。本文將分享我們對 DBLink 功能的認識及使用方法。
OceanBase DBLink 功能對于用戶來說,在跨庫數(shù)據(jù)訪問,數(shù)據(jù)遷移,數(shù)據(jù)一致性等方面具有實際意義。
-
數(shù)據(jù)遷移:在數(shù)據(jù)庫需要遷移數(shù)據(jù)時,使用 DBLink 可以簡化遷移過程。通過建立 DBLink,用戶可以在原數(shù)據(jù)庫中查詢并獲取需要遷移的數(shù)據(jù),然后在目標數(shù)據(jù)庫中插入這些數(shù)據(jù),從而快速實現(xiàn)數(shù)據(jù)遷移;
-
跨庫數(shù)據(jù)訪問:有些應(yīng)用需要將數(shù)據(jù)分散到不同的集群或同一集群的不同租戶中,這時可以使用 DBLink 來實現(xiàn)跨集群、跨租戶的數(shù)據(jù)共享和交互。如本文開頭介紹的場景,某公司各部門的數(shù)據(jù)記錄在各自的數(shù)據(jù)庫中,在需要匯總分析全公司數(shù)據(jù)時,使用 DBLink 即可實時訪問各部門數(shù)據(jù);
-
數(shù)據(jù)一致性:基于 OceanBase 本身的 XA 事務(wù)能力,OceanBase 的 DBLink 不僅提供了讀取遠程數(shù)據(jù)的能力,還支持寫事務(wù)。例如,一個應(yīng)用程序需要在多個數(shù)據(jù)庫中進行數(shù)據(jù)更新和插入,使用 DBLink 可以保證前述操作在一個事務(wù)中執(zhí)行,從而保證數(shù)據(jù)的一致性和可靠性。
DBLink 功能主要分為讀功能和寫功能,下表是對讀寫功能的使用場景和版本支持情況的介紹。
為了驗證 OceanBase 的 DBLink 能力,我們假設(shè)以下業(yè)務(wù)場景進行實驗:A 客戶需要將業(yè)務(wù)系統(tǒng)從 Oracle 遷移至 OceanBase:大部分業(yè)務(wù)場景完全遷移至 OceanBase 的多個 Oracle 模式租戶,小部分業(yè)務(wù)場景仍保留在 Oracle,最終數(shù)據(jù)分散存放在 OceanBase 的 Oracle 租戶 1、Oracle 租戶 2 以及 Oracle 數(shù)據(jù)庫上。
此時創(chuàng)建一個從 Oracle 租戶 1 到 Oracle 租戶 2 的 DBLink,命名為 OB_LINK;創(chuàng)建一個從 Oracle 租戶 1 到 Oracle 數(shù)據(jù)庫的 DBLink,命名為 ORCL_LINK。下文將具體展示 OceanBase DBLink 功能可以在實際業(yè)務(wù)中為用戶帶來的便利。
一、無需修改代碼,正常使用 Oracle DBLink 功能
A 客戶原本在業(yè)務(wù)系統(tǒng)上使用了 Oracle 的 DBLink 功能,將業(yè)務(wù)場景遷移至 OceanBase 之后,A 客戶無需修改原有業(yè)務(wù)代碼,在 Oceanbase 的 Oracle 租戶下創(chuàng)建同名的 DBLink 即可無縫使用原有的業(yè)務(wù)代碼。
二、平滑遷移 Oracle 表數(shù)據(jù)或 OceanBase 租戶表數(shù)據(jù)
A 客戶的大部分業(yè)務(wù)數(shù)據(jù)都已通過 OMS 從 Oracle 遷移至 OceanBase 的 Oracle 租戶 1 上,臨時發(fā)現(xiàn)還有名為 orders 的表被遺漏在 Oracle 數(shù)據(jù)庫上未完成遷移。此時,可以使用 OceanBase DBLink 功能方便快捷地遷移數(shù)據(jù),避免導出導入數(shù)據(jù)的繁瑣操作。
obclient> create table orders as select * from orders@ORCL_LINK;
Query OK, 9999 rows affected (0.36 sec)
A 客戶的業(yè)務(wù)數(shù)據(jù)分布在不同的 OceanBase 的 Oracle 租戶上,如果需要將 Oracle 租戶 1 的 lineitem 表數(shù)據(jù)遷移到 Oracle 租戶 2,OceanBase DBLink 功能同樣可以進行遷移操作。
???????
obclient> create table lineitem as select * from lineitem@OB_LINK;
Query OK, 37641 rows affected (1.66 sec)
三、OceanBase 讀異構(gòu)的 Oracle 數(shù)據(jù)
A 客戶的完成了業(yè)務(wù)數(shù)據(jù)的遷移過渡,有部分 sql 查詢場景要同時訪問位于 OceanBase 租戶 1 上的 orders 表和 Oracle 上的 customer 表數(shù)據(jù),OceanBase DBLink 支持從 Oracle 租戶查詢 Oracle 表數(shù)據(jù)的能力。???????
obclient> select a.O_CUSTKEY, b.C_NAME from orders a, customer@ORCL_LINK b where a.O_CUSTKEY = b.C_CUSTKEY;
+-----------+--------------------+
| O_CUSTKEY | C_NAME |
+-----------+--------------------+
| 665509 | Customer#000665509 |
| 1978019 | Customer#001978019 |
| 1855835 | Customer#001855835 |
| 525559 | Customer#000525559 |
| 103387 | Customer#000103387 |
| 28801 | Customer#000028801 |
+-----------+--------------------+
6 rows in set (0.01 sec)
四、OceanBase 跨租戶讀數(shù)據(jù)
A 客戶的業(yè)務(wù)數(shù)據(jù)分布在不同的 OceanBase 的 Oracle 租戶上, 有部分 sql 查詢場景要同時訪問位于 OceanBase 的 Oracle 租戶 1 的 lineitem 表數(shù)據(jù)和 Oracle 租戶 2 上的 partsupp 表數(shù)據(jù),OceanBase DBLink 支持跨租戶查詢表數(shù)據(jù)的能力。
???????
obclient> select a.L_ORDERKEY, b.PS_SUPPKEY from lineitem a, partsupp@OB_LINK b where a.L_PARTKEY = b.PS_PARTKEY;
+------------+------------+
| L_ORDERKEY | PS_SUPPKEY |
+------------+------------+
| 5010944 | 291423 |
| 5010944 | 41423 |
| 5010944 | 791423 |
| 5010944 | 541423 |
| 7808165 | 903434 |
| 7808165 | 653434 |
| 7808165 | 403434 |
+------------+------------+
7 rows in set (0.01 sec)
五、XA 事務(wù)保證下的寫異構(gòu) Oracle 或?qū)懫渌?OceanBase 租戶
A 客戶的業(yè)務(wù)數(shù)據(jù)分布在不同的 OceanBase 的 Oracle 租戶上, 業(yè)務(wù)需要在 OceanBase 的 Oracle 租戶 1 上向 Oracle 租戶 2 和 Oracle 數(shù)據(jù)庫寫入數(shù)據(jù)并提交事務(wù)修改,三方將共同參與一個 XA 事務(wù)。XA 事務(wù)在使用 DBLink 寫入數(shù)據(jù)前將自動開啟,事務(wù)內(nèi)有以下操作:
第一,向 Oracle 數(shù)據(jù)庫的 customer 表的插入數(shù)據(jù)
???????
obclient> insert into Customer@ORCL_LINK values(9989, 'Customer#01', 'abcdefg', 8, '123456789', -240.92, 'building', 'etc.');
Query OK, 1 row affected (0.32 sec)
obclient> select * from Customer@ORCL_LINK where C_CUSTKEY = 9989;
+-----------+-------------+-----------+-------------+-----------------+-----------+--------------+-----------+
| C_CUSTKEY | C_NAME | C_ADDRESS | C_NATIONKEY | C_PHONE | C_ACCTBAL | C_MKTSEGMENT | C_COMMENT |
+-----------+-------------+-----------+-------------+-----------------+-----------+--------------+-----------+
| 9989 | Customer#01 | abcdefg | 8 | 123456789 | -240.92 | building | etc. |
+-----------+-------------+-----------+-------------+-----------------+-----------+--------------+-----------+
1 row in set (0.00 sec)
第二,將 OceanBase 的 Oracle 1 租戶的 lineitem 表的指定數(shù)據(jù)插入到 OceanBase 的 Oracle 2 租戶的 lineitem 表上。
???????
obclient> select * from lineitem@OB_LINK where L_ORDERKEY = 897;
Empty set (0.04 sec)
obclient> insert into lineitem@OB_LINK select * from lineitem where L_ORDERKEY = 897;
Query OK, 4 rows affected (0.03 sec)
obclient> select * from lineitem@OB_LINK where L_ORDERKEY = 897;
+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+---------------------+---------------------+---------------------+---------------------------+------------+--------------------------------------+
| L_ORDERKEY | L_PARTKEY | L_SUPPKEY | L_LINENUMBER | L_QUANTITY | L_EXTENDEDPRICE | L_DISCOUNT | L_TAX | L_RETURNFLAG | L_LINESTATUS | L_SHIPDATE | L_COMMITDATE | L_RECEIPTDATE | L_SHIPINSTRUCT | L_SHIPMODE | L_COMMENT |
+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+---------------------+---------------------+---------------------+---------------------------+------------+--------------------------------------+
| 897 | 9044941 | 544960 | 1 | 15 | 28282.35 | .07 | .04 | R | F | 1995-05-25 00:00:00 | 1995-05-09 00:00:00 | 1995-06-07 00:00:00 | COLLECT COD | REG AIR | r ideas. slyly spec |
| 897 | 18316926 | 66981 | 2 | 26 | 50492.26 | .05 | .08 | N | O | 1995-07-01 00:00:00 | 1995-06-10 00:00:00 | 1995-07-14 00:00:00 | COLLECT COD | MAIL | tions sleep according to the special |
| 897 | 12570365 | 820378 | 3 | 13 | 18651.62 | .07 | 0 | A | F | 1995-03-30 00:00:00 | 1995-05-17 00:00:00 | 1995-04-21 00:00:00 | TAKE BACK RETURN | MAIL | bold accounts mold carefully! braids |
| 897 | 10118182 | 618203 | 4 | 2 | 2399.36 | .08 | .08 | R | F | 1995-05-22 00:00:00 | 1995-05-07 00:00:00 | 1995-06-16 00:00:00 | COLLECT COD | RAIL | into beans. slyly special fox |
+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+---------------------+---------------------+---------------------+---------------------------+------------+--------------------------------------+
4 rows in set (0.03 sec)
第三,將 Oracle 上更新后 customer 表和 Oracle 租戶 2 上更新后的 lineitem 表做 join,并把 join 結(jié)果插入到 Oracle 租戶 1 的 lineitem 表。
???????
obclient> insert into lineitem select b.* from customer@ORCL_LINK a, lineitem@OB_LINK b where a.C_CUSTKEY = b.L_ORDERKEY;
Query OK, 9990 rows affected (1.12 sec)
Records: 9990 Duplicates: 0 Warnings: 0
第四,提交 XA 事務(wù),OceanBase 的 Oracle 租戶 1、OceanBase 的 Oracle 租戶 2 和 Oracle 上對應(yīng)的表更新一起提交事務(wù)內(nèi)改動。
??????????????
obclient> commit;
Query OK, 0 rows affected (0.04 sec)
通過以上場景的實際操作,我們驗證了 OceanBase DBLink 功能的讀能力和支持 XA 事務(wù)的寫能力,在幫助用戶降低從 Oracle 到 OceanBase 數(shù)據(jù)遷移成本的同時,提供跨租戶遷移數(shù)據(jù)、查詢 Oracle 或其他租戶數(shù)據(jù)以及 XA 事務(wù)保證下的寫數(shù)據(jù)能力。
本文介紹了 OceanBase 數(shù)據(jù)庫目前 DBLink 功能的具體情況,未來我們將持續(xù)升級這些功能。
近期我們會從兩方面對 DBLink 功能進行增強:一是支持訪問更多的遠程對象類型,例如近期將支持訪問遠程 PROCEDURE 和 SEQUENCE 對象;二是為了更好地支持 OLAP 場景,我們也將支持更多的數(shù)據(jù)源類型,支持連接 OceanBase 和 Oracle 以外的數(shù)據(jù)庫。文章來源:http://www.zghlxwxcb.cn/news/detail-694550.html
在即將發(fā)布的 4.2 版本中,OceanBase 將會提供跨 MySQL 租戶的 DBLink 讀能力。我們相信 OceanBase DBLink 功能可以讓用戶的業(yè)務(wù)數(shù)據(jù)共享與流轉(zhuǎn)更簡單便捷,也歡迎大家向我們反饋使用感受。文章來源地址http://www.zghlxwxcb.cn/news/detail-694550.html
到了這里,關(guān)于OceanBase 4.1解讀:讀寫兼?zhèn)涞腄BLink讓數(shù)據(jù)共享“零距離”的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!