Oracle 遷移到 OB 過程中有哪些不相容的 DDL 語法?

爱可生开源社区發表於2024-11-19

本文將總結 Oracle 遷移到 OB 4.x 過程中,那些還不相容的 DDL 語法。

作者:夏彬勝,愛可生 DBA 團隊成員,熟悉 OceanBases,Oracle 等資料庫。想到和得到,中間還有個做到

愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。

本文約 900 字,預計閱讀需要 3 分鐘。

將 Oracle 資料遷移至 OceanBase(Oracle 模式)可以透過 OMS 或 DSG 等工具。無論哪種,本質上就是獲取 Oracle 端的 DDL 語句進行改造,然後發往 OB 目標端進行寫入,其中最大問題就是 OB 對 Oracle 的語法的相容程度。

OMS 遷移

1. 約束類

不支援 references_clause 子句定義外來鍵,會忽略該 option。

references_clause:
REFERENCES [ schema_name. ] object [ (column [, column ]...) ][on delete { cascade | set null } ]

不支援 constraint_state 約束狀態屬性,會忽略該 option。

constraint_state:
[ [NOT] DEFERRABLE [INITIALLY {IMMEDIATE | DEFERRED}]
| INITIALLY { IMMEDIATE | DEFERRED } [ NOT ] [ DEFERRABLE ]
][ rely | norely ]
[ using_index_clause ][ enable | disable ]
[ VALIDATE | NOVALIDATE ][ exceptions_clause ]

2. 索引類

不支援 bitmap_join_index_clause 子句定義 BITMAP INDEX 會報錯。關鍵字 BITMAP INDEX 點陣圖索引,會忽略 BITMAP,建立普通索引。

bitmap_join_index_clause:
[ schema.]table
( [ [ schema. ]table. | t_alias. ]column
[ ASC | DESC ], [ [ schema. ]table. | t_alias. ]column
[ ASC | DESC ]
]...
)
FROM [ schema. ]table [ t_alias ], [ schema. ]table [ t_alias ]
]...
WHERE condition
[ local_partitioned_index ] index_attributes

3. 索引表空間

同步的 DDL 中包含以下屬性的定義,則這些屬性不會被解析和轉換,最終會被忽略:

Global 索引分割槽定義 RANGE 分割槽 index_partitioning_clause 中的 segment_attributes_clause 子句指定物理屬性和表空間儲存,會忽略該 option。

index_attributes:
[ { physical_attributes_clause
| logging_clause
| ONLINE
| TABLESPACE { tablespace | DEFAULT }
| index_compression
| { SORT | NOSORT }
| REVERSE
| VISIBLE | INVISIBLE
| partial_index_clause
| parallel_clause
}...
]

4. 表分割槽

不支援 enable_disable_other_clause 子句定義啟用或禁用與表關聯的所有觸發器、啟用禁用表鎖、啟用或禁用查詢 CONTAINER MAP 對映後的表、啟用或禁用該 CONTAINERS 的表,會報錯。

enable_disable_other_clause:
{ ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS | CONTAINER_MAP | CONTAINERS_DEFAULT }

不支援 set_subpartition_template 子句為每個表分割槽建立或替換現有的預設 RANGE、LIST 或 HASH 子分割槽,會報錯。

set_subpartition_template:
SET SUBPARTITION TEMPLATE
{ ( range_subpartition_desc [, range_subpartition_desc]... )
| ( list_subpartition_desc [, list_subpartition_desc]... )
| ( individual_hash_subparts [, individual_hash_subparts]... )
| ()
| hash_subpartition_quantity
}
modify_table_partition:
{ modify_range_partition
| modify_hash_partition
| modify_list_partition
}

不支援 exchange_partition_subpart 子句來交換資料和索引 segment,會報錯。

exchange_partition_subpart:
EXCHANGE { partition_extended_name
| subpartition_extended_name
}
WITH TABLE [ schema. ] table
[ { INCLUDING | EXCLUDING } INDEXES ][ { with | without } validation ]
[ exceptions_clause ] update_index_clauses [ parallel_clause ] ]
[ CASCADE ]

不支援 parallel_clause 子句更改表中查詢和 DML 的預設並行度,會忽略該 option。

不支援使用 CREATE TABLE DDL 建立分割槽時, SUBPARTITION TEMPLATE 和 SUBPARTITION subpartiton_name VALUES (int) 子句同時存在的情況。

5. COMMENT 註釋

不支援 COMMENT ON MATERIALIZED VIEW 。

6. RENAME 表

遷移過程中需要確認是否存在 RENAME 表物件。

7. TRUNCATE 表

遷移過程中不能做 DDL 操作,表分割槽建立以及表分割槽刪除和 TRUNCATE 均不能進行。

OMS 遷移中確認支援的 DDL

  1. 建立表 CREATE TABLE

    包括分割槽表,不包括 CREATE TABLE AS SELECT。

  2. 刪除表 DROP TABLE
  3. 清空表 TRUNCATE TABLE
  4. 新增分割槽 ADD PARTITION

    支援新增一級分割槽和二級分割槽。其中一級和二級分割槽均支援新增 RANGE/LIST 分割槽,不支援新增 HASH 分割槽。

  5. 刪除分割槽 DROP PARTITION

    支援刪除單個或多個分割槽,以及刪除二級分割槽。

  6. 清空分割槽 TRUNCATE PARTITION

    支援清空單個或多個分割槽,以及清空二級分割槽。

  7. 表重新命名 RENAME TABLE 或 ALTER TABLE RENAME
  8. 新增列 ALTER TABLE ADD COLUMN
  9. 修改列 ALTER TABLE MODIFY COLUMN

使用 DSG 工具遷移

DSG 工具會在 Oracle 端獲取 DDL 然後直接傳輸到 OB 進行寫入,其中需要注意的相容問題:Oracle 源端匯出的 DDL 語句,會存在 EDITIONABLE 關鍵字。

DSG 工具匯出的 DDL 語句存在 EDITIONABLE 關鍵字(包括:VIEW、TABLE、PROCEDURE 等),到 OB 端都無法執行,需要進行過濾。例如:

CREATE OR REPLACE -FORCE EDITIONABLE- VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

其中的 FORCE EDITIONABLE 到 OB(Oracle 模式)下將支援,需要額外處理。

在使用 DSG 工具進行 Oracle 到 OB 的物件遷移時,建議使用 DBCAT。

相關文章