最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle中部分不兼容對象遷移到OceanBase的三種處理方式

 更新時間:2024年03月29日 10:17:48   作者:愛可生開源社區(qū)  
本文總結分析了 3 種 Oracle 對象和 OB 對象不兼容時的處理方法和提前統(tǒng)計發(fā)現(xiàn)的操作方式,在遷移前提前發(fā)現(xiàn)這類問題能有效避免在遷移過程中報錯的問題,需要的朋友可以參考下

1、背景介紹

在進行國產(chǎn)化改造過程中,我們需要將 Oracle 數(shù)據(jù)庫遷移到 OceanBase(Oracle 模式)數(shù)據(jù)庫,雖然 OceanBase 對于 Oracle 兼容性已經(jīng)足夠好,但依舊還有一些特殊語法或對象需要單獨處理,下面是遇到的一些不完全兼容對象的處理邏輯。

2、Oracle 中 LOB 類數(shù)據(jù)遷移到 OB 時的處理邏輯

Oracle 中 CLOB 和 BLOB 類型均可達到 4G 大?。ㄒ?Oracle 11.2 為例),而 OceanBase 數(shù)據(jù)庫當前版本(3.2.3.x)所支持的大對象數(shù)據(jù)類型的信息如下表所示:

類型BLOBCLOB
長度變長變長
自定義長度上限(字符)48MB48MB
字符集BINARY與租戶字符集一致

考慮到從 Oracle 遷移到 OceanBase,如果涉及 LOB 類字段,可能會存在當 LOB 數(shù)據(jù)大于 48M 時數(shù)據(jù)丟失的問題,需要提前發(fā)現(xiàn)這類數(shù)據(jù)并進行處理。

2.1 找到 Oracle 中 LOB 數(shù)據(jù)最大長度

我們可以構建一個實驗生成 CLOB 及 BLOB 類型數(shù)據(jù),使用 Oracle 自帶的 DBMS_LOB 包獲取對應類型的最大值。

2.1.1 構建包含LOB類型的數(shù)據(jù)表

CREATE TABLE t_lob(
    c_ID NUMBER,
    c_clob CLOB,
    c_blob BLOB
);

2.1.2 創(chuàng)建造數(shù)據(jù)存儲過程

隨機插入 100 條記錄到 t_lob 表。

CREATE OR REPLACE PROCEDURE insert_random_lob_data AS
BEGIN
  DECLARE
    l_random_string VARCHAR2(10000);
    l_random_blob BLOB;
  BEGIN
    FOR i IN 1..100 LOOP
      l_random_string := dbms_random.string('U', dbms_random.value(1, 10000));
      dbms_lob.createtemporary(l_random_blob, TRUE);
      dbms_lob.writeappend(l_random_blob, LENGTH(l_random_string), utl_raw.cast_to_raw(l_random_string));

      INSERT INTO t_lob(c_ID, c_clob, c_blob)
      VALUES(i, l_random_string, l_random_blob);

      dbms_lob.freetemporary(l_random_blob);
    END LOOP;
    COMMIT;
  END;
END;
/

2.1.3 查詢該表中 CLOB 和 BLOB 字段的最大值

SELECT MAX(DBMS_LOB.GETLENGTH(C_CLOB)) AS LONGEST_CLOB,
       MAX(DBMS_LOB.GETLENGTH(C_BLOB)) AS LONGEST_BLOB
  FROM T_LOB;

2.2 獲取整個數(shù)據(jù)庫中 LOB 字段值較大的清單

排除了系統(tǒng)用戶,獲取 LOB 字段清單后再基于清單中的 LOB 字段單獨分析其最大值。

SELECT COL.OWNER,
       COL.TABLE_NAME,
       COL.COLUMN_NAME,
       COL.DATA_TYPE,
       COL.AVG_COL_LEN,
       COL.CHAR_LENGTH,
       TAB.NUM_ROWS
  FROM DBA_TABLES TAB, DBA_TAB_COLUMNS COL
 WHERE TAB.OWNER = COL.OWNER
   AND TAB.TABLE_NAME = COL.TABLE_NAME
   AND COL.DATA_TYPE IN ('CLOB', 'BLOB')
   AND COL.OWNER NOT IN ('SYS', 'SYSTEM')
   AND COL.OWNER IN
       (SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS = 'OPEN')
   AND COL.TABLE_NAME NOT LIKE 'BIN%';

3、Oracle 中 disable 約束在 OMS 遷移過程中的處理邏輯

在對 Oracle 中的約束類非表對象做一致性校驗時,發(fā)現(xiàn)部分約束在 OMS 遷移完成后丟失了,需要分析其 OMS 丟失的原因。

3.1 問題分析

從 OMS 界面中獲取 DDL 的語句可以看到有 2 個 WARN,且類型是 DISCARD,表示 OMS 判斷其是 DISABLE 狀態(tài)的約束,直接選擇了舍棄掉。

-- [WARN] [DISCARD] CONSTRAINT "PK_T_PARTKEY_IS_PK" PRIMARY KEY ("CRT_DTTM") DISABLE NOVALIDATE -> [NULL]
-- [WARN] [DISCARD] CHECK ("ACT_ID" IS NOT NULL) DISABLE NOVALIDATE -> [NULL]
CREATE TABLE "T_PARTKEY_IS_PK" (
    "ACT_ID" NUMBER(10,0),
    "SRT_ID" NUMBER(10,0),
    "SRT_ORIGNAL_ID" NUMBER(10,0),
    "CRT_DTTM" DATE,
    "LASTUPT_DTTM" DATE
)

3.2 問題結論

Oracle 側處于 DISABLE 狀態(tài)的約束通過 OMS 遷移時會被舍棄,不會在 OB 側創(chuàng)建,在對約束對象比對時,需要額外注意 Oracle 端約束的 status 是否處于 DISABLE 狀態(tài),本身對業(yè)務和功能沒有影響。

3.3 約束校驗時提前排除 DISABLE 的約束

可以通過以下語句觀測源端 Oracle 約束狀態(tài)。

-- 手工將T_PARTKEY_IS_PK表的約束都disable
ALTER TABLE ZHENXING.T_PARTKEY_IS_PK DISABLE NOVALIDATE CONSTRAINT PK_T_PARTKEY_IS_PK;
ALTER TABLE ZHENXING.T_PARTKEY_IS_PK DISABLE CONSTRAINT SYS_C0011109;

SELECT OWNER,
       TABLE_NAME,
       CONSTRAINT_NAME,
       CONSTRAINT_TYPE,
       INDEX_NAME,
       STATUS
  FROM DBA_CONSTRAINTS
 WHERE OWNER = 'ZHENXING'
   AND TABLE_NAME = 'T_PARTKEY_IS_PK';

4、Oracle 中分區(qū)表遷移到 OB 后,帶有的自動分區(qū)屬性丟失

自動分區(qū)屬性是 Oracle 11g 的特性,可以用 INTERVAL 語法基于天、月、年做自動分區(qū)創(chuàng)建。 在通過 OMS 遷移到 OB 后,發(fā)現(xiàn)自動分區(qū)屬性丟失了,會導致當分區(qū)未自動創(chuàng)建時導致新增數(shù)據(jù)沒法寫入分區(qū)表,導致報錯。

4.1 問題分析

從 OMS 界面中獲取 DDL 的語句可以看到有 1 個 WARN,且類型是 DISCARD,表示 OMS 判斷其不完全兼容,直接選擇了舍棄掉。

-- OMS 遷移表結構時記錄的WARN信息,表示自動分區(qū)屬性由于不兼容會自動DISCARD舍棄
[WARN] [DISCARD]  INTERVAL (NUMTOYMINTERVAL (1,'MONTH')) -> [NULL]

4.2 問題結論

所以在 Oracle 遷移到 OB 前,需要把 Oracle 端存在自動分區(qū)屬性的表提前找出,避免由于遷移到 OB 后分區(qū)為未自動創(chuàng)建導致的數(shù)據(jù)無法插入的報錯,并且找出這類分區(qū)后,先在 Oracle 端創(chuàng)建足夠的多分區(qū),避免遷移過程中源端分區(qū)數(shù)增加導致比對不一致的情況。并記錄清單告知業(yè)務開發(fā)待后續(xù)用其他方式定期生成新分區(qū)。

4.3 如何找出 Oracle 中自動分區(qū)的表

4.3.1 Oracle 側模擬自動分區(qū)

-- 創(chuàng)建基于天的自動分區(qū)表
SQL> create table interval_sales (
    prod_id number(6),
    time_id date)
    partition by range (time_id)
    INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
    (partition p1 values less than (to_date('2015-01-01','yyyy-mm-dd')));

-- 查詢當前分區(qū),默認生成了1個定義好的分區(qū)
SQL> SELECT TABLE_NAME, PARTITION_NAME
  FROM USER_TAB_PARTITIONS
 WHERE TABLE_NAME = 'INTERVAL_SALES';

TABLE_NAME                       PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_SALES                       P1

-- 插入數(shù)據(jù)(不在默認分區(qū)內)
SQL> INSERT INTO INTERVAL_SALES VALUES(001, TO_DATE('2015-02-01', 'yyyy-mm-dd'));

-- 自動生成了新分區(qū)
TABLE_NAME                       PARTITION_NAME
------------------------------ ------------------------------
INTERVAL_SALES                       P1
INTERVAL_SALES                       SYS_P221

-- 單獨查看該分區(qū)數(shù)據(jù)(驗證數(shù)據(jù)確實存在新分區(qū))
SQL> SELECT * FROM INTERVAL_SALES PARTITION(SYS_P221);

   PROD_ID TIME_ID
---------- ---------
         1 01-FEB-15

4.3.2 統(tǒng)計 Oracle 側有哪些表是自動分區(qū)的表

/*
PARTITION_COUNT: Number of partitions in the table. For interval partitioned tables, the value of this column is always 1048575.
*/
SELECT T1.OWNER,
       T1.TABLE_NAME,
       T1.INTERVAL,
       T1.PARTITIONING_TYPE,
       T1.PARTITION_COUNT,
       T1.SUBPARTITIONING_TYPE      AS SUB_TYPE,
       T1.SUBPARTITIONING_KEY_COUNT SUB_COUNT,
       T1.STATUS
  FROM DBA_PART_TABLES T1
 WHERE 1 = 1
   AND TABLE_NAME NOT LIKE 'BIN%'
   AND (INTERVAL IS NOT NULL OR PARTITION_COUNT = 1048575);

總結

以上總結分析了 3 種 Oracle 對象和 OB 對象不兼容時的處理方法和提前統(tǒng)計發(fā)現(xiàn)的操作方式,在遷移前提前發(fā)現(xiàn)這類問題能有效避免在遷移過程中報錯的問題。

關于 SQLE

SQLE 是一款全方位的 SQL 質量管理平臺,覆蓋開發(fā)至生產(chǎn)環(huán)境的 SQL 審核和管理。支持主流的開源、商業(yè)、國產(chǎn)數(shù)據(jù)庫,為開發(fā)和運維提供流程自動化能力,提升上線效率,提高數(shù)據(jù)質量。

到此這篇關于Oracle中部分不兼容對象遷移到OceanBase的三種處理方式的文章就介紹到這了,更多相關Oracle對象遷移到OceanBase內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • oracle設置mybatis自動生成id插入方式

    oracle設置mybatis自動生成id插入方式

    這篇文章主要介紹了oracle設置mybatis自動生成id插入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Oracle數(shù)據(jù)庫中的觸發(fā)器詳解

    Oracle數(shù)據(jù)庫中的觸發(fā)器詳解

    這篇文章主要給大家介紹了關于Oracle數(shù)據(jù)庫中觸發(fā)器的相關資料,觸發(fā)器也是保護數(shù)據(jù)完整性的一種重要方法,于存儲過程不同的是,觸發(fā)器是通過事件進行觸發(fā)被執(zhí)行,存儲過程需要被調用執(zhí)行,需要的朋友可以參考下
    2024-02-02
  • Oracle鎖處理、解鎖方法

    Oracle鎖處理、解鎖方法

    本文通過實例代碼較詳細的給大家介紹了Oracle鎖處理、解鎖方法,需要的朋友可以參考下
    2018-06-06
  • oracle—SQL技巧之(一)連續(xù)記錄查詢sql案例測試

    oracle—SQL技巧之(一)連續(xù)記錄查詢sql案例測試

    有這樣一個需求:需要查詢出某個客戶某一年那些天是有連續(xù)辦理過業(yè)務,本文給予sql實現(xiàn)語句并測試,感興趣的朋友可以了解下
    2013-01-01
  • oracle 字符串轉成行

    oracle 字符串轉成行

    oracle 將以逗號隔開的字符串'85,86,87' 轉成行
    2009-06-06
  • Oracle如何設置密碼復雜度

    Oracle如何設置密碼復雜度

    這篇文章主要介紹了Oracle如何設置密碼復雜度問題,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • oracle 11g em重建報唯一約束錯誤解決方法

    oracle 11g em重建報唯一約束錯誤解決方法

    今天在手工配置Oracle11g的EM時總是報如下錯誤,也沒有找到解決辦法,以下是我的解決過程,希望可以幫助你們
    2012-11-11
  • Oracle?DG?的歸檔缺失修復方法

    Oracle?DG?的歸檔缺失修復方法

    文章介紹了Oracle DG歸檔缺失的修復方法,包括檢查歸檔同步情況、查看GAP日志應用情況以及不同的修復思路,如歸檔還在主庫、歸檔已在備庫或歸檔已被刪除等,感興趣的朋友一起看看吧
    2025-02-02
  • Oracle to_char函數(shù)的使用方法

    Oracle to_char函數(shù)的使用方法

    在Oracle數(shù)據(jù)庫中,to_char函數(shù)是我們最常用的函數(shù)之一,下文對to_char函數(shù)的應用作了詳細的介紹,如果您感興趣的話,不妨一看
    2014-08-08
  • WINDOWS下使用DOS命令行連接oracle數(shù)據(jù)庫

    WINDOWS下使用DOS命令行連接oracle數(shù)據(jù)庫

    本文講述了通過windows下的DOS命令連接oracle數(shù)據(jù)庫并進行簡單操作的方法
    2018-03-03

最新評論

阿勒泰市| 邯郸县| 淅川县| 龙里县| 绥滨县| 新郑市| 轮台县| 偃师市| 许昌县| 师宗县| 南岸区| 阿巴嘎旗| 武强县| 包头市| 陕西省| 牟定县| 宁化县| 班戈县| 罗山县| 清水河县| 牟定县| 弥渡县| 得荣县| 紫阳县| 太保市| 岳阳县| 鱼台县| 时尚| 科技| 讷河市| 东兰县| 武功县| 麦盖提县| 鄂托克旗| 鲜城| 小金县| 中方县| 沈阳市| 翁牛特旗| 新竹县| 昂仁县|