一、問題現象:在對資料庫進行expdp導出時發生報錯ora-16000,腳本如下: 報錯如下: 由上報錯可知,資料庫read—only,查看資料庫狀態: 果然,資料庫是只讀狀態。 二、expdp研究 將資料庫設置為讀寫狀態,觀察expdp 重新執行expdp導出腳本,觀察執行情況 通過plsql查看 ...
一、問題現象:在對資料庫進行expdp導出時發生報錯ora-16000,腳本如下:
nohup expdp "'/ as sysdba'" schemas=shp DIRECTORY=DATA_PUMP_DIR dumpfile=shp1.dmp logfile=shp1.log &
報錯如下:
ORA-31626: job does not exist ORA-31633: unable to create master table "SYS.SYS_EXPORT_SCHEMA_05" ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$FT", line 1038 ORA-16000: database open for read-only access
由上報錯可知,資料庫read—only,查看資料庫狀態:
SQL> select OPEN_MODE from v$database; OPEN_MODE -------------------- READ ONLY
果然,資料庫是只讀狀態。
二、expdp研究
將資料庫設置為讀寫狀態,觀察expdp
SQL> shutdown immediate SQL> startup mount SQL> alter database open read write;
重新執行expdp導出腳本,觀察執行情況
SQL> select job_name,state from dba_datapump_jobs; JOB_NAME STATE ------------------------------ ------------------------------ SYS_EXPORT_SCHEMA_01 EXECUTING
通過plsql查看dba_datapump_jobs這個視圖的詳細信息,發現
SQL> col COMMENT$ for a50 SQL> select * from sys.com$ c WHERE SUBSTR (c.comment$, 1, 22) = 'Data Pump Master Table'; OBJ# COL# COMMENT$ ---------- ---------- -------------------------------------------------- 91600 Data Pump Master Table EXPORT SCHEMA
通過object_id找到對應的表,其實就是SYS.SYS_EXPORT_SCHEMA_01
在導出數據的過程中可以看到其表結構(截取了部分列名稱)
查看這張表的數據,發現這張表記錄了字元集,路徑,導出的對象,時間,並行度等信息
在導出結束後,這張表將會自動清除。
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded ****************************************************************************** Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is: /oracle/admin/orcl/dpdump/shp1.dmp Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Mar 16 03:14:49 2019 elapsed 0 00:00:18
三、總結
在使用expdp導出數據時,系統會自動創建數據泵主表(Data Pump Master Table)並插入相關數據,如果資料庫是只讀模式,無法創建失敗,無法導出數據。在expdp導出完畢後,系統會自動刪除數據泵主表,註意此表預設表空間為system表空間,在數據量大並行度高的導出需要關註一下表空間使用情況。
四、建議
在對只讀庫進行數據導出的時候可以採用exp導出,或者使用expdp+network_link方式進行數據導出。