升級可能導致資料庫不可用(二)

yangtingkun發表於2010-08-20

升級過程也是一個危險的過程,操作不當可能造成資料庫無法開啟,因此在升級之前應該做好備份。

嘗試解決問題。

升級可能導致資料庫不可用(一):http://yangtingkun.itpub.net/post/468/504017

 

 

在上一篇的文章中,由於升級過程中犯了個小錯誤,倒是資料庫無法開啟,且升級過程無法正常繼續。

其實這個錯誤都不是很嚴重,本來是有辦法解決的。但是由於當前的資料庫環境必須設定COMPATIBLE,而且11.2升級過程中,也比較確保COMPATIBLE大於10.1,這就導致COMPATIBLE引數不能保持原始值不變,從而導致了嚴重的後果。

如果升級之前備份了資料庫,那麼只需要關閉資料庫,並利用備份恢復,然後改成錯誤,重新執行升級過程即可。

在沒有備份的情況下,只能採用一些極端的手段進行恢復了。

由於執行catupgrd.sql指令碼報錯,下面之後修改指令碼中檢查錯誤的地方,將catupstr.sql指令碼的下列語句註釋掉:

DOC
#######################################################################
#######################################################################
   The following statement will cause:
   - "ORA-00942: table or view does not exist" ; or
   - "ORA-00904: "TZ_VERSION": invalid identifier"" ; or
   - "ORA-01722: invalid number"
     if the pre-upgrade utility (utlu112i.sql) has not been run to:
     a) create and update registry$database table to include the current
        database timezone file version used in the old release; or
     b) do inserts into sys.props$.

     o Action:
       Shutdown ABORT and revert to the original ORACLE_HOME.  Then run
       utlu112i.sql to populate registry$database with the database timezone
       file version used by the lower version database and to populate
       sys.props$ with Day Light Saving Time (DST) properties information.

   OR
   - An "ORA-01722: invalid number"
     if the old release uses a timezone file version newer than 8 (shipped with
     11.2) but the new release has not been patched yet.

     o Action:
       Shutdown ABORT and patch new ORACLE_HOME to the same timezone file
       version as used in the old ORACLE_HOME.


#######################################################################
#######################################################################
#

SELECT TO_NUMBER('MUST_BE_SAME_TIMEZONE_FILE_VERSION')
   FROM sys.props$
   WHERE
     (
      (name = 'DST_PRIMARY_TT_VERSION' AND
       TO_NUMBER(value$) != (SELECT tz_version from registry$database))
      AND
      ((SELECT version from v$timezone_file) !=
       (SELECT tz_version from registry$database))
     )
     OR
     (
      (name = 'DST_PRIMARY_TT_VERSION' AND TO_NUMBER(value$) > 8)
      AND
      (0 = (select count(*) from v$timezone_file))
     );

由於沒有執行utlu112i.sql,導致registry$database表不存在,因此這裡執行報錯,為了整個語句可以順利執行,先把這個SQL註釋掉。

再次呼叫catupgrd.sql,升級過程開始。

但是由於缺少表的支援,升級過程必然會出現錯誤,導致升級到一半,出現了大量的ORA-3113錯誤:

ORA-00603: ORACLE server session terminated by fatal error
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸 ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
ERROR:
ORA-03114:
脦麓脕盧陸脫碌陸
ORACLE
.
.
.

升級失敗。不過這時在意料之中的,將catupstr.sql中註釋的部分去掉,關閉資料庫,重啟以upgrade方式啟動,再次執行catupgrd.sql指令碼,重新升級過程。

執行最終仍然出現了上面的錯誤資訊。重複多次升級步驟,問題依舊。

但是雖然升級過程失敗,但是資料庫可以短暫的開啟:

[oracle@bjtest ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 4 29 23:07:20 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

已連線到空閒例程。

SQL> startup pfile=inittest9.ora
ORA-32006: BACKGROUND_DUMP_DEST initialization parameter has been deprecated
ORA-32006: USER_DUMP_DEST initialization parameter has been deprecated
ORACLE
例程已經啟動。

Total System Global Area  618012672 bytes
Fixed Size                  2215784 bytes
Variable Size             343933080 bytes
Database Buffers          268435456 bytes
Redo Buffers                3428352 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select instance_name, status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
test9            OPEN

SQL> select name, open_mode from v$database;

NAME      OPEN_MODE
--------- --------------------
TEST9     READ WRITE

SQL> exit
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
斷開

[oracle@bjtest ~]$ exp system/test file=full.dp full=y buffer=20480000 log=full.log

Export: Release 11.2.0.1.0 - Production on 星期四 4 29 23:09:31 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即將匯出整個資料庫...
.
正在匯出表空間定義

.
正在匯出概要檔案
.
正在匯出使用者定義
.
正在匯出角色
EXP-00008:
遇到 ORACLE 錯誤 4045
ORA-04045:
在重新編譯/重新驗證 SYS.DBMS_DATAPUMP 時出錯

ORA-00600:
內部錯誤程式碼, 引數: [ktfbbsearch-8], [128], [15], [], [], [], [], [], [], [], [], []
ORA-06508: PL/SQL:
無法找到正在呼叫 : "SYS.DBMS_DATAPUMP" 的程式單元

ORA-06512:
"SYS.DBMS_LOGREP_EXP", line 3242
ORA-06512:
"SYS.DBMS_FILE_GROUP_EXP", line 813
ORA-06512:
line 1
EXP-00083:
呼叫 SYS.DBMS_FILE_GROUP_EXP.grant_sysprivs_exp 時出現前一問題

.
正在匯出資源成本
.
正在匯出回退段定義
.
正在匯出資料庫連結
.
正在匯出序號
.
正在匯出目錄別名
.
正在匯出上下文名稱空間
.
正在匯出外部函式庫名
.
匯出 PUBLIC 型別同義詞
.
正在匯出專用型別同義詞
.
正在匯出物件型別定義
.
正在匯出系統過程物件和操作
EXP-00008:
遇到 ORACLE 錯誤 4063
ORA-04063: package body "SYS.DBMS_DATAPUMP"
有錯誤

ORA-06508: PL/SQL:
無法找到正在呼叫 : "SYS.DBMS_DATAPUMP" 的程式單元
ORA-06512:
"SYS.DBMS_REPCAT_EXP", line 113
ORA-06512:
line 1
EXP-00083:
呼叫 SYS.DBMS_REPCAT_EXP.system_info_exp 時出現前一問題

.
正在匯出 pre-schema 過程物件和操作
EXP-00008:
遇到 ORACLE 錯誤 4063
ORA-04063: package body "SYS.DBMS_AW_EXP"
有錯誤

ORA-06508: PL/SQL:
無法找到正在呼叫 : "SYS.DBMS_AW_EXP" 的程式單元
ORA-06512:
line 1
EXP-00083:
呼叫 SYS.DBMS_AW_EXP.schema_info_exp 時出現前一問題

EXP-00008:
遇到 ORACLE 錯誤 4063
ORA-04063: package body "SYS.DBMS_DATAPUMP"
有錯誤

ORA-06508: PL/SQL:
無法找到正在呼叫 : "SYS.DBMS_DATAPUMP" 的程式單元
ORA-06512:
"SYS.DBMS_RULE_EXP_UTL", line 50
ORA-06512:
"SYS.DBMS_RULE_EXP_RULES", line 147
ORA-06512:
line 1
EXP-00083:
呼叫 SYS.DBMS_RULE_EXP_RULES.schema_info_exp 時出現前一問題

.
正在匯出簇定義
.
即將匯出 SYSTEM 的表透過常規路徑...
. .
正在匯出表                     DEF$_AQCALL匯出了           0

. .
正在匯出表                    DEF$_AQERROR匯出了           0
. .
正在匯出表                   DEF$_CALLDEST匯出了           0
. .
正在匯出表                DEF$_DEFAULTDEST匯出了           0
. .
正在匯出表                DEF$_DESTINATION匯出了           0
.
.
.
. .
正在匯出表        REPCAT$_USER_PARM_VALUES匯出了           0
. .
正在匯出表         SQLPLUS_PRODUCT_PROFILE匯出了           1
.
即將匯出 OUTLN 的表透過常規路徑...
. .
正在匯出表                             OL$匯出了           0

. .
正在匯出表                        OL$HINTS匯出了           0
. .
正在匯出表                        OL$NODES匯出了           0
.
即將匯出 U1 的表透過常規路徑...
. .
正在匯出表                      PLAN_TABLE匯出了           0

. .
正在匯出表                               T匯出了           0
.
正在匯出同義詞
.
正在匯出檢視
.
正在匯出引用完整性約束條件
.
正在匯出儲存過程
.
正在匯出運算子
.
正在匯出索引型別
.
正在匯出點陣圖, 功能性索引和可擴充套件索引
.
正在匯出後期表活動
.
正在匯出觸發器
.
正在匯出實體化檢視
.
正在匯出快照日誌
.
正在匯出作業佇列
.
正在匯出重新整理組和子組
.
正在匯出維
.
正在匯出 post-schema 過程物件和操作
EXP-00008:
遇到 ORACLE 錯誤 4063
ORA-04063: package body "SYS.DBMS_AW_EXP"
有錯誤

ORA-06508: PL/SQL:
無法找到正在呼叫 : "SYS.DBMS_AW_EXP" 的程式單元
ORA-06512:
line 1
EXP-00083:
呼叫 SYS.DBMS_AW_EXP.schema_info_exp 時出現前一問題

EXP-00008:
遇到 ORACLE 錯誤 4063
ORA-04063: package body "SYS.DBMS_DATAPUMP"
有錯誤

ORA-06508: PL/SQL:
無法找到正在呼叫 : "SYS.DBMS_DATAPUMP" 的程式單元
ORA-06512:
"SYS.DBMS_RULE_EXP_UTL", line 50
ORA-06512:
"SYS.DBMS_RULE_EXP_RULES", line 147
ORA-06512:
line 1
EXP-00083:
呼叫 SYS.DBMS_RULE_EXP_RULES.schema_info_exp 時出現前一問題

.
正在匯出使用者歷史記錄表
.
正在匯出預設值和系統審計選項
.
正在匯出統計資訊
匯出成功終止, 但出現警告。

開啟資料庫後,馬上利用EXP可以將資料庫進行邏輯匯出,可以看到,雖然資料庫中部分元件仍然存在錯誤,但是使用者資料部分已經匯出了。這樣就有機會重建資料庫了。

資料庫雖然可以開啟,但是狀態並不正常,執行一段時間,資料庫自動報錯關閉:

[oracle@bjtest ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期五 4 30 01:00:19 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     10240
SQL> show parameter compat 
ORA-03135:
連線失去聯絡
程式 ID: 25948
會話 ID: 48 序列號: 65


SQL> EXIT
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
斷開

雖然資料庫可以匯出,但是很可能會導致資料出現不一致或其他的問題,為了避免這種情況的出現,應該在升級之前備份好資料庫。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-671515/,如需轉載,請註明出處,否則將追究法律責任。

相關文章