使用DBMS_SPACE_ADMIN包傳輸TableSpace
?
??? 傳輸表空間這個特性是一個很好用的東西,因為其操作方便,所以在數據的傳輸過程中經常會用到。另外如果想修改Tablespace的某些屬性(例如名字),但又無法修改時,可以通過表空間傳輸來解決。當然表空間傳輸有比較大的局限性,下文詳述。
?
?
一、表空間的傳輸
?
??? 表空間的用途有以下幾方面:
?
??? * 將數據從OLTP系統移動到數據倉庫分級系統
??? * 從分級系統更新數據倉庫和數據中心
??? * 從中心數據倉庫裝載數據中心
??? * 啟用存檔OLTP和數據倉庫系統
??? * 對內部和外部使用者發布數據
??? * 執行表空間Point-in-Time恢復
?
??? 傳輸表空間比進行數據導出/導入要快很多,而且可以進行索引數據異動,避免了導入數據后必須執行的索引重建
?
1、約束條件
?
??? ① 必須在同一數據平臺之間傳輸
??? ② 源/目標數據庫必須使用相同字符集和本國字符集
??? ③ 不可重名
??? ④ 不支持以下內容
??????? * 物化視圖/復制
??????? * 基于函數的索引
??????? * 規定范圍的REF
??????? * 帶有多個接受者的高級查詢
?
2、具體的操作過程
?
? ① 選擇一個自含式表空間集合
?
??? “自含式”表示沒有從表空間集合內指向表空間外的引用,具體的違反例子有:
?
??? 1) 一個該表空間集合內部的索引用于一個該表空間集合外的表。(本集表的索引為集外不違例)
??? 2) 分區表部分包含在該表空間集合外,或包含集外分區表的某分區
??? 3) 指向一個表的指示完整性約束條件越過設置的界限(當選擇傳輸時包含指示完整性的約束條件)
??? 4) 表空間集內的表包含集外的LOB列
?
??? 可以使用DBMS_TTS包中的TRANSPORT_SET_CHECK過程
?
??? 注:DBMS_TTS包僅供SYS用戶使用,即使有DBA權限的用戶也無法使用
?
??? 具體操作是:EXECUTE dbms_tts.transport_set_check('INDX',TRUE);?
??????????????? ?? --true表示需要考慮約束條件,空間名稱忽略大小寫
?
??? 執行完成后查詢:SELECT * FROM transport_set_violations;
?????????????????? ? --會列出所有的違例條目,但REF越界不包含其中
?
? ② 生成可傳輸表空間集合
?
??? 1) 使正在復制的集合中所有表空間只讀
??????? ALTER TABLESPACE ... READ ONLY;
?
??? 2) 使用Export工具,并指定哪些表空間在可傳輸集合中
??????? EXP TRANSPORT_TABLESPACE=y TABLESPACE=(sales_1,sales_2)
??????? TRIGGERS=y CONSTRANTS=n GRANTS=n FILE=expdat.dmp
?
?????? 說明:
??????????? * 只輸出表空間的數據字典結構信息,無實際數據
??????????? * 觸發器內輸出(y輸出 n不輸出)
??????????? * 指示完整性的約束條件不被輸出
??????????? * 授權不被輸出
??????????? * 要創建的結構信息輸出文件名expdat.dmp
?
? ③ 傳輸該表空間集合
?
??? 將表空間數據文件和輸出文件傳輸到一個目標數據庫可訪問位置即可。
?
? ④ 插入該表空間集合
?
??? 若塊大小不同,則需要在目標數據庫加入參數DB_nK_CACHE_SIZE(n為源數據塊大小)
?
??? 使用Import工具插入該表空間和繼承結構信息
??? IMP TRANSPORT_TABLESPACE=y FILE=expdat.dmp
??? DATAFILES=('/db/sales_jan','/db/sales_feb',...)
??? TABLESPACES=(sales_1,sales_2) TTS_OWNERS=(dcranney,jfee)
??? FROMUSER=(dcranney,jfee) TOUSER=(smith,williams)
???????
??? 說明:
???????? * TRANSPORT_TABLESPACE=y 通知Export工具正在傳輸一個表空間
???????? * FILE=exdat.dmp 指名包含元數據的輸出文件是exdat.dmp
???????? * TTS_OWNERS列出在該表空間集合中擁有數據的所有用戶(與輸出一致)
???????? * FROMUSER、TOUSER改變數據庫對象的所有權
???????? * 可以將語句寫入文本,再調用。 IMP PARFILE='par.f'
?
3、傳輸后不能正常工作的對象
?
??? ① ROWID
??????? ROWID不再唯一,僅在單獨表中是唯一的。
?
??? ② REF
??????? REF在監測自含式時不監測,當非自含時插入虛懸REF,查詢時出錯
?
??? ③ 權限
??????? 權限賦予可能會失敗,例如用戶不存在等
?
??? ④ 分區表
??????? 若交換分區后進行傳輸,要交換回分區時可能會出錯
?
??? ⑤ 索引
??????? 基于函數的索引不可被傳輸,必須在傳輸前取消
?
??? ⑥ 觸發器
??????? 觸發器在傳輸前也不用檢查,所以可能會發生編譯錯誤
?
??? ⑦ 物化視圖/復制
???????
?
?
二、使用DBMS_SPACE_ADMIN解決表空間問題
?
??? DBMS_SPACE_ADMIN包為本地管理的表空間提供帶有故障診斷和修復功能的管理程序。
?
??? SEGMENT_VERIFY:驗證該段盤區映射的一致性
??? SEGMENT_CORRUPT:標注該段為損壞或有效,以便執行恰當的錯誤恢復
??? SEGMENT_DROP_CORRUPT:取消一個當前標注為損壞的段(不回收空間)
??? SEGMENT_DUMP:卸下一個給定段的段頭部和盤區映射
??? TABLESPACE_VERIFY:驗證該表空間中段的位圖和盤區映射是否同步
??? TABLESPACE_REBUILD_BITMAPS:重建適當的位圖
??? TABLESPACE_FIX_BITMAPS:位圖中標注適當的數據塊地址范圍(盤區)為空閑或已用
??? TABLESPACE_REBUILD_QUOTAS:為給定的表空間重建權限
??? TABLESPACE_MIGRATE_FROM_LOCAL:將一個本地管理表空間移植為字典管理的表空間
??? TABLESPACE_MOGRATE_TO_LOCAL:將一個表空間從字典管理的格式移植為本地管理格式
??? TABLESPACE_RELOCATE_BITMAPS:將位圖重定位到指定的目的地
??? TABLESPACE_FIX_SEGMENT_STATES:修改移植被放棄的表空間中數據段的狀態
???
1、分配的塊標注為空閑(沒有重疊)時修改位圖
?
??? SEGMENT_VERIFY過程發現一個段擁有位圖中標注為空閑的已分配塊,但沒有段之間重疊的報告
??? ① 調用SEGMENT_DUMP過程卸下管理沖虛分配給該段的區域
??? ② 對每個區域調用帶有TABLESPACE_EXTENT_MAKE_USED選項的TABLESPACE_FIX_BITMAPS過程標注為已用
??? ③ 調用TABLESPACE_REBUILD_QUOTAS過程來確定限額
?
2、取消一個損壞的段
?
??? ① 調用帶有SEGMENT_VERIFY_EXTENTS_GLOBAL選項的SEGMENT_VERIFY過程,無重疊報告則繼續
??? ② 調用SEGMENT_DUMP過程卸下分配給該段的DBA區域
??? ③ 對每個區域調用帶有TABLESPACE_EXTENT_MAKE_FREE選項的TABLESPACE_FIX_BITMAPS過程標注為空閑
??? ④ 調用SEGMENT_DROP_CORRUPT過程來取消SEG$入口
??? ⑤ 調用TABLESPACE_REBUILD_QUOTAS過程來修改限額
?
3、在報告重疊處修改位圖
?
??? TABLESPACE_VERIFY過程報告一些重疊現象,一些實際數據因原先內部錯誤必須被犧牲。
??? 選擇將表t1犧牲,則執行一下步驟:
??? ① 生成一個t1重疊的所有對象的列表
??? ② 取消表t1.如果必要,通過調用SEGMENT_DROP_CORRUPT過程繼續進行
??? ③ 對t1重疊的所有對象調用SEGMENT_VERIFY過程,若必要,調用TABLESPACE_FIX_BITMAPS將合適的位圖標注為已用
??? ④ 返回到TABLESPACE_VERIFY過程來驗證該位圖是否一致
?
4、糾正位圖塊的介質損壞
?
??? ① 對所有位圖塊或單個快,若只有一個塊則調用TABLESPACE_REBUILD_BITMAPS
??? ② 調用TABLESPACE_REBUILD_QUOTAS過程來重建限額
??? ③ 調用TABLESPACE_VERIFY過程來驗證該位圖是否一致
?
5、從字典管理移植為本地管理的表空間
?
??? EXEC DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL;
?
?
?
三、表空間信息的數據字典
?
??? V$TABLESPACE:來自控制文件的所有TableSpace的名稱和編號
??? DBA_TABLESPACES:所有TableSpace的說明(用戶可訪問)
??? DBA_EXTENTS:所有TableSpace中段的信息(用戶可訪問)
??? DBA_FREE_SPACE:所有TableSpace中的數據盤區信息(用戶可訪問)
??? V$DATAFILE:所有數據文件信息,包括所屬TableSpace的ID
??? V$TEMPFILE:所有臨時文件信息,包括所屬TableSpace的ID
??? DBA_DATA_FILES:屬于TableSpace的文件(數據文件)
??? DBA_TEMP_FILES:屬于臨時TableSpace的文件(臨時文件)
?? V$TEMP_EXTENT_MAP:所有本地管理的臨時TableSpace中所有盤區信息
??? V$TEMP_EXTENT_POOL:本地管理的臨時表空間由每個實例緩存和使用的臨時表空間狀態
??? V$TEMP_SPACE_HEADER:臨時文件的已用/空閑空間
??? DBA_USERS:所有用戶的默認和臨時的TableSpace
??? DBA_TS_QUOTAS:列出所有用戶的TableSpace限額
??? V$SORT_SEGMENT:給定實例的每個排序段的信息
??? V$SORT_USAGE:用戶使用的臨時排序空間信息
?
?