亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1、背景介紹

在進(jìn)行國(guó)產(chǎn)化改造過(guò)程中,我們需要將 Oracle 數(shù)據(jù)庫(kù)遷移到 OceanBase(Oracle 模式)數(shù)據(jù)庫(kù),雖然 OceanBase 對(duì)于 Oracle 兼容性已經(jīng)足夠好,但依舊還有一些特殊語(yǔ)法或?qū)ο笮枰獑为?dú)處理,下面是遇到的一些不完全兼容對(duì)象的處理邏輯。

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

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

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

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

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

我們可以構(gòu)建一個(gè)實(shí)驗(yàn)生成 CLOB 及 BLOB 類(lèi)型數(shù)據(jù),使用 Oracle 自帶的 DBMS_LOB 包獲取對(duì)應(yīng)類(lèi)型的最大值。

2.1.1 構(gòu)建包含LOB類(lèi)型的數(shù)據(jù)表

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

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

隨機(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 查詢?cè)摫碇?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 獲取整個(gè)數(shù)據(jù)庫(kù)中 LOB 字段值較大的清單

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

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 遷移過(guò)程中的處理邏輯

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

3.1 問(wèn)題分析

從 OMS 界面中獲取 DDL 的語(yǔ)句可以看到有 2 個(gè) WARN,且類(lèi)型是 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 問(wèn)題結(jié)論

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

3.3 約束校驗(yàn)時(shí)提前排除 DISABLE 的約束

可以通過(guò)以下語(yǔ)句觀測(cè)源端 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 后,帶有的自動(dòng)分區(qū)屬性丟失

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

4.1 問(wèn)題分析

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

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

4.2 問(wèn)題結(jié)論

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

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

4.3.1 Oracle 側(cè)模擬自動(dòng)分區(qū)

-- 創(chuàng)建基于天的自動(dò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')));

-- 查詢當(dāng)前分區(qū),默認(rèn)生成了1個(gè)定義好的分區(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ù)(不在默認(rèn)分區(qū)內(nèi))
SQL> INSERT INTO INTERVAL_SALES VALUES(001, TO_DATE('2015-02-01', 'yyyy-mm-dd'));

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

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

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

4.3.2 統(tǒng)計(jì) Oracle 側(cè)有哪些表是自動(dòng)分區(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);

總結(jié)

以上總結(jié)分析了 3 種 Oracle 對(duì)象和 OB 對(duì)象不兼容時(shí)的處理方法和提前統(tǒng)計(jì)發(fā)現(xiàn)的操作方式,在遷移前提前發(fā)現(xiàn)這類(lèi)問(wèn)題能有效避免在遷移過(guò)程中報(bào)錯(cuò)的問(wèn)題。

關(guān)于 SQLE

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

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

相關(guān)文章

  • Oracle監(jiān)聽(tīng)口令及監(jiān)聽(tīng)器安全詳解

    Oracle監(jiān)聽(tīng)口令及監(jiān)聽(tīng)器安全詳解

    這篇文章主要介紹了Oracle監(jiān)聽(tīng)口令及監(jiān)聽(tīng)器安全的解決方法,需要的朋友可以參考下
    2014-07-07
  • 淺析如何在tnsnames.ora中配置監(jiān)聽(tīng)

    淺析如何在tnsnames.ora中配置監(jiān)聽(tīng)

    以下是對(duì)如何在tnsnames.ora中配置監(jiān)聽(tīng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • Oracle數(shù)據(jù)泵實(shí)現(xiàn)不同用戶導(dǎo)入導(dǎo)出表級(jí)

    Oracle數(shù)據(jù)泵實(shí)現(xiàn)不同用戶導(dǎo)入導(dǎo)出表級(jí)

    這篇文章主要介紹了Oracle數(shù)據(jù)泵實(shí)現(xiàn)不同用戶導(dǎo)入導(dǎo)出表級(jí),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Oracle 的入門(mén)心得 強(qiáng)烈推薦

    Oracle 的入門(mén)心得 強(qiáng)烈推薦

    oracle的體系太龐大了,對(duì)于初學(xué)者來(lái)說(shuō),難免會(huì)有些無(wú)從下手的感覺(jué),什么都想學(xué),結(jié)果什么都學(xué)不好,所以把學(xué)習(xí)經(jīng)驗(yàn)共享一下,希望讓剛剛?cè)腴T(mén)的人對(duì)oracle有一個(gè)總體的認(rèn)識(shí),少走一些彎路。
    2009-05-05
  • Oracle?Database?23c新特性之關(guān)聯(lián)更新和刪除示例詳解

    Oracle?Database?23c新特性之關(guān)聯(lián)更新和刪除示例詳解

    這篇文章主要介紹了Oracle?Database?23c新特性之關(guān)聯(lián)更新和刪除的相關(guān)資料,Oracle database 23c開(kāi)始支持在UPDATE和DELETE語(yǔ)句中使用JOIN連接,獲取更新和刪除的數(shù)據(jù)源,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 淺析Oracle體系結(jié)構(gòu)

    淺析Oracle體系結(jié)構(gòu)

    這篇文章主要介紹了Oracle體系結(jié)構(gòu)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Oracle基礎(chǔ)學(xué)習(xí)之簡(jiǎn)單查詢和限定查詢

    Oracle基礎(chǔ)學(xué)習(xí)之簡(jiǎn)單查詢和限定查詢

    相信對(duì)于每個(gè)剛接觸數(shù)據(jù)庫(kù)的朋友們來(lái)說(shuō),查詢是首先要學(xué)會(huì)的,本文主要給大家介紹了Oracle中的簡(jiǎn)單查詢和限定查詢,文中通過(guò)示例代碼與文字說(shuō)明給大家介紹的很詳細(xì),相信對(duì)大家的的理解和學(xué)習(xí)會(huì)很有幫助,下面感興趣的朋友們一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • Oracle索引(B*tree與Bitmap)的學(xué)習(xí)總結(jié)

    Oracle索引(B*tree與Bitmap)的學(xué)習(xí)總結(jié)

    本篇文章是對(duì)Oracle索引(B*tree與Bitmap)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Oracle中字符串截取常用方法總結(jié)【推薦】

    Oracle中字符串截取常用方法總結(jié)【推薦】

    這篇文章主要介紹了Oracle中字符串截取常用方法總結(jié),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Windows server 2008 R2(win7)登陸sqlplus錯(cuò)誤ORA-12560和ORA-12557的解決方法

    Windows server 2008 R2(win7)登陸sqlplus錯(cuò)誤ORA-12560和ORA-12557的解

    這篇文章主要為大家詳細(xì)介紹了Windows server 2008 R2(win7)登陸sqlplus錯(cuò)誤ORA-12560和ORA-12557的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評(píng)論