oracle 更改分割槽表資料 ora-14402
在一次更改分割槽表某條資料時,報錯ora-14402
該分割槽表的分割槽鍵為account_date,主鍵為id。
檢視該條資料的rowid:
在更新記錄中的Partition Key時,可能會導致該記錄超出當前所在分割槽的範圍,需要將其轉移到其他對應分割槽上,因此要求開啟ROW MOVEMENT。
檢視該條資料行遷移是否開啟:
select OWNER ,TABLE_NAME,STATUS,PARTITIONED,ROW_MOVEMENT from dba_tables where table_name='BIL_INVOICE_DETAIL'
可以看到該錶行遷移沒有開啟,開啟行遷移:
alter table HOSTDB.BIL_INVOICE_DETAIL enable row movement;
再次執行update:
執行成功,且rowid發生改變。
關閉該表的行遷移:
alter table HOSTDB.BIL_INVOICE_DETAIL disable row movement;
關於行遷移:
ROW MOVEMENT特性最初是在8i時引入的,其目的是提高分割槽表的靈活性,這一特性預設是關閉,在使用一下3個功能時需要開啟:
1.flashback 表
這一功能能幫助我們及時回滾一些誤操作,防止資料意外丟失。在使用該功能之前,必須先開啟ROW MOVEMENT,否則就會拋ORA-08189錯誤。
這個過程的內部操作, 可以透過對Flashback Table做SQL Trace來進一步觀察。透過Trace,我們不難發現,
Flashback Table實際是透過Flashback Query將表中資料進行了一次刪除、插入操作,因此ROWID會發生變化。
2.Shrink Segment (降低表的高水位)
Shrink Segment能幫助我們壓縮資料段、整理資料碎片、降低高水位,以提高效能、節省空間。它也同樣要求開啟ROW MOVEMENT。
--這個時候 shrink space 會報10636錯誤
alter table test_move enable row movement;
alter table test_move shrink space;
我們可以看到在Shrink後,ROWID也變化了。從對其過程的Trace來看,Shrink對資料的改變不是透過SQL實現的,而是透過更底層的函式來實現的。
3.更新Partition Key
在更新記錄中的Partition Key時,可能會導致該記錄超出當前所在分割槽的範圍,需要將其轉移到其他對應分割槽上,因此要求開啟ROW MOVEMENT。
--這個時候update會報14402錯誤
這一操作產生影響的特殊之處在於這是個DML操作,是和online transaction密切相關。對於這樣一個UPDATE,實際上分為3步:先從原有分割槽將資料刪除;將原資料轉移到新分割槽上;更新資料。
其影響就在於以下幾個方面:
一個UPDATE被分解為DELET、INSERT、UPDATE三個操作,增加了效能負擔。其中,DELETE的查詢條件與原UPDATE的查詢條件相同,新的UPDATE的查詢條件是基於INSERT生成的新的ROWID;
相應的Redo Log、Undo Log會增加;
如果Update語句還涉及到了Local Index的欄位的話,新、舊2個分割槽上的Local Index都要被更新。
還有一點,Row Movement會和域索引(Domain Index)產生衝突:如果表上定義了域索引,開啟Row Movement就會失敗;反之亦然。
部分引用:https://blog.csdn.net/enmotech/article/details/79294945
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69993859/viewspace-2754324/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle分割槽表和分割槽表exchangeOracle
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- ORACLE刪除-表分割槽和資料Oracle
- oracle分割槽表和非分割槽表exchangeOracle
- Oracle查詢Interval partition分割槽表內資料Oracle
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- ORACLE分割槽表梳理系列Oracle
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- MySQL資料表分割槽手記MySql
- 對oracle分割槽表的理解整理Oracle
- Oracle SQL調優之分割槽表OracleSQL
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- Oracle資料庫分割槽表SPLIT操作導致歸檔瘋漲Oracle資料庫
- hive 動態分割槽插入資料表Hive
- Oracle分割槽表基礎運維-07增加分割槽(4 RANGE_HASH)Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(5RANGE_LIST)Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(6RANGE_RANGE)Oracle運維
- Oracle drop分割槽表單個分割槽無法透過閃回恢復Oracle
- oracle分割槽表的分類及測試Oracle
- oracle 19C新特性——混合分割槽表Oracle
- MySql資料分割槽操作之新增分割槽操作MySql
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- Oracle 12C新特性-線上把非分割槽錶轉為分割槽表Oracle
- PG的非分割槽表線上轉分割槽表
- zabbix上對mysql資料庫做分割槽表MySql資料庫
- MySQL的nnodb引擎表資料分割槽儲存MySql