對PDB執行 alter pluggable database pdbprod2 open; 操作后提示:Warning: PDB altered with errors. 來自AskScuti博客園
目錄
1. 狀況
2. 原因
3. 方案
1. 狀況
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDBPROD1 MOUNTED 5 PDBPROD2 MOUNTED SQL> alter pluggable database pdbprod2 open; Warning: PDB altered with errors.
2. 原因
用種子 PDB 或插入或克隆方法創建 PDB 后,可以通過查詢 CDB_PDBS 視圖的STATUS 列查看新 PDB 的狀態。如果在打開新 PDB 之前創建了公用用戶和角色,必須同步 PDB 才能從根檢索新的公用用戶和角色。當 PDB 在讀/寫模式下打開時,會自動執行同步。如果在只讀模式下打開 PDB,則會返回錯誤。可以通過查詢 PDB_PLUG_IN_VIOLATIONS 視圖查看違規說明。
SQL> select CAUSE,CON_ID,MESSAGE from pdb_plug_in_violations; CAUSE -------- CON_ID -------- MESSAGE -------- Sync Failure 4 Sync PDB failed with ORA-959 during 'CREATE USER "C##AAA" IDENTIFIED BY VALUES * DEFAULT TABLESPACE "IMPDATA" container = all'
因為之前在容器數據庫中創建了一個公共用戶C##AAA,現在還需要在所有可插入的數據庫中創建該用戶。這個用戶是在數據庫正常打開的情況下建立的,但是使用的是自定義表空間《IMPDATA》,當打開可插入數據庫PDBPROD2時將同步這個操作,也就是同步創建這個公共用戶。但是 PDBPROD2 這個可插入數據庫中是沒有 IMPDATA 表空間的,因此無法同步創建這個公共用戶,最終可插入數據庫 PDBPROD2 僅以受限模式打開,如下所示:
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDBPROD1 MOUNTED 5 PDBPROD2 READ WRITE YES
3. 方案
這時候去刪除公共用戶依然不行,因為同步動作已經在隊列里面了。因此,唯一能做的就是在 PDBPROD2 中創建該表空間,關閉數據庫,再次進行同步即可。
SQL> alter session set container=pdbprod2; Session altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/CDBOCP/pdbprod2/CDBOCP/8EE4C86D91688487E053C81212AC968B/ datafile/o1_mf_system_gn08jj5k_.dbf /u01/app/oracle/oradata/CDBOCP/pdbprod2/CDBOCP/8EE4C86D91688487E053C81212AC968B/ datafile/o1_mf_sysaux_gn08jj5p_.dbf /u01/app/oracle/oradata/CDBOCP/pdbprod2/CDBOCP/8EE4C86D91688487E053C81212AC968B/ datafile/o1_mf_undotbs1_gn08jj63_.dbf SQL> create tablespace impdata datafile '/u01/app/oracle/oradata/CDBOCP/pdbprod2/CDBOCP/8EE4C86D91688487E053C81212AC968B/datafile/impdata01.dbf' size 10m; Tablespace created. SQL> alter session set container=cdb$root; Session altered. SQL> alter pluggable database pdbprod2 close; Pluggable database altered. SQL> alter pluggable database pdbprod2 open; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- --------- ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDBPROD1 MOUNTED 5 PDBPROD2 READ WRITE NO