本文將總結 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
建立表 CREATE TABLE
包括分割槽表,不包括 CREATE TABLE AS SELECT。
- 刪除表 DROP TABLE
- 清空表 TRUNCATE TABLE
新增分割槽 ADD PARTITION
支援新增一級分割槽和二級分割槽。其中一級和二級分割槽均支援新增 RANGE/LIST 分割槽,不支援新增 HASH 分割槽。
刪除分割槽 DROP PARTITION
支援刪除單個或多個分割槽,以及刪除二級分割槽。
清空分割槽 TRUNCATE PARTITION
支援清空單個或多個分割槽,以及清空二級分割槽。
- 表重新命名 RENAME TABLE 或 ALTER TABLE RENAME
- 新增列 ALTER TABLE ADD COLUMN
- 修改列 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。