如何從資料庫 11.2 降級至之前的版本

dbasdk發表於2014-10-29

本文件可用作將之前升級的資料庫從 Oracle 11gR2 降回至下列以前版本資料庫的指南與核對表:Oracle 10gR1、Oracle 10gR2、Oracle 11gR1。該文件內容也適用於從 11.2.0.4 降級至 11.2.0.1

需要特別注意的是,在將資料庫例項從當前版本降級至升級前版本時,資料庫不會返回至與其升級前相同的狀態。升級過程會導致一些不可逆的更改,具體取決於涉及的版本。降級過程允許使用者在之前版本中開啟並訪問資料庫例項。這通常就足夠了。

此外,在降級後可能需要採取一些更正操作(如解除安裝/重新安裝,或重新升級至當前修補程式集級別),以解決殘留問題。

如果目標是將例項完全返回至其升級前的狀態,那麼將會用到包括恰好恢復至升級前狀態在內的其他流程。

 

本文章中討論的過程是基於指令碼的降級。本文章並未討論如何使用匯入/匯出、資料泵或其他方法將資料從一個版本移至另一個版本。

開始降級過程之前,在伺服器上應該有或已安裝要降至版本的 Oracle 二進位制檔案。如果已解除安裝了希望降至版本的 Oracle 可執行檔案,請將該 Oracle 二進位制檔案重新安裝至正確的版本/修補程式級別,以便進行降級。

注意事項:
  1. 該過程用於降級已成功升級至 11gR2 的資料庫。此過程不能用於返回升級失敗的資料庫。
  2. 您只能降級至從其進行升級的版本和修補程式級別。例如,如果是從 Oracle 10gR1 (10.1.0.5) 升級至 Oracle 11gR2 (11.2),則不能降級至 Oracle 10gR2 (10.2)。您只能降級至 Oracle 10gR1 (10.1.0.5)
  3. 支援降級至 9iR2。這是因為在升級過程中,相容引數設定為最低 10.1.0。這可以防止降級。
  4. 如果原資料庫打過patch, 您需要在降級之前把patch進行回滾。 解除安裝和回滾patch的步驟,您可以在patch的readme中找到。解除安裝和回滾patch失敗會導致降級過程的失敗及資料字典物件無法生效。

示例:  對於 Exadata Bundle Patch,過程為:

解除安裝 patch

                 示例:   $ opatch auto /u01/app/oracle/patches/14103267 -rollback

回滾SQL的變更     

                 示例:   SQL> @rdbms/admin/catbundle_EXA__ROLLBACK.sql  rollback SQL 變更.

 

解決方案

降級前步驟:

1: 驗證所有元件和字典物件對於 11gR2 均有效並且版本正確。

set pagesize500 
set linesize 100 
        
select substr(comp_name,1,40) comp_name, status, substr (version,1,10) version from dba_registry order by comp_name; 
        
select substr(object_name,1,40) object_name,substr(owner,1,15) owner, object_type from  dba_objects where status='INVALID' order by owner,object_type; 
        
select owner,object_type,count(*) from dba_objects where status='INVALID'  group by owner,object_type order by owner,object_type;

如果任何元件或 Oracle 提供的物件無效,則需要執行 utlrp.sql 對其進行重新驗證。該指令碼可能需要執行多次以驗證所有物件。

$ cd $ORACLE_HOME/rdbms/admin 
$ sqlplus "/ as sysdba" 
SQL> @utlrp.sql

當完成後,重新執行上述查詢以驗證所有無效物件現在都是有效的。

2: 如果已在資料庫上啟用了 Oracle Database Vault,則必須:

a: 授予 SYS 帳戶 Database Vault DV_PATCH_ADMIN 角色。
b: 降級資料庫之前禁用 Database Vault。

禁用 Oracle Database Vault 觸發器:
      SQL> CONNECT DVSYS/DVSYS  
      SQL> ALTER TRIGGER DV_BEFORE_DDL_TRG DISABLE;  
      SQL> ALTER TRIGGER DV_AFTER_DDL_TRG DISABLE; 

3: 如果設定了作業系統引數 ORA_TZFILE,請取消其設定。如果不取消設定 ORA_TZFILE 變數,連線至資料庫時可能會生成以下錯誤:

SP2-1503: Unable to initialize Oracle call interface 
SP2-0152: ORACLE may not be functioning properly

4: 如果在降級至之前的資料庫版本之前,已執行 DBMS_DST 軟體包將時區版本升級至新版本(例如在 11gR2 升級的升級後步驟期間升級至版本 11),那麼必須將版本 11 時區檔案安裝到舊的 Oracle 資料庫版本上的 $ORACLE_HOME/oracore/zoneinfo 目錄中。

5: 檢查資料庫的相容性級別,以確定資料庫是否可能具有防止降級的不相容性。曾經設定過的 compatible 的最高值就是您能降級到的最低的那個版本。比如:

如果資料庫的相容性級別已經是最新的了(比如11.2.0.4),則無法進行降級。

如果資料庫的相容性級別曾經是 11.2.0 或更高,則無法將資料庫降級到比 11.2.0.1 更低的版本 。
如果要將資料庫降級至 11gR1,COMPATIBLE 初始化引數必須從未比 11.1.0 更高。
如果要將資料庫降級至 10gR2,COMPATIBLE 初始化引數必須從未比 10.2.0 更高。
如果要將資料庫降級至 10gR1,COMPATIBLE 初始化引數必須從未比 10.1.0 更高。

6: 如果資料庫上安裝有 Oracle Application Express,則必須將 apxrelod.sql 檔案從 Oracle 11gR2 (11.2) ORACLE_HOME/apex/ 目錄複製到 Oracle 主目錄之外的某個目錄,如系統上的臨時目錄。記下該檔案的新位置。

7: 在降級之前執行 11gR2 資料庫的備份。

資料庫的降級步驟

如果要從 11.2.0.4 降級至 11.2.0.2,使用 11.2.0.2 catrelod.sql 指令碼會出現一個問題。
針對版本 11.2.0.2 下載並應用修補程式 11811073,其提供了更新版本的 catrelod.sql。

1: 以 Oracle Database 11g Release 2 (11.2) Oracle 主目錄的所有者登入系統。

2: 如果已針對資料庫配置並執行了 Enterprise Manager Database Control,則按如下所示停止Database Control:

a: 將 ORACLE_UNQNAME 環境變數設定為資料庫唯一名稱。
b: 執行以下命令:RACLE_HOME/bin/emctl stop dbconsole

3: 如果要降級的資料庫是 Oracle Real Application Clusters (Oracle RAC) 資料庫,則在所有例項上執行該步驟。

a:  .如果要將 Oracle RAC 資料庫降級至 10g Release 1 (10.1),必須在移除額外的表決磁碟之後才可以關閉 Oracle Clusterware 堆疊。
如果要檢視所用表決磁碟的數量並列出錶盤路徑,請執行以下命令:Oracle_Clusterware_Home/bin/crsctl query css votedisk 

b:  透過執行以下命令移除找到的每一個額外表決磁碟,其中路徑是在之前步驟中發現的表決磁碟路徑:

Oracle_Clusterware_Home/bin/crsctl delete css votedisk path

注意:如果要降級群集資料庫,需完全關閉例項並將 CLUSTER_DATABASE 初始化引數設定為 false。降級後,必須將該引數設定回 true。

SET CLUSTER_DATABASE=FALSE

注意升級後的步驟38

4: 在系統提示符下,轉至 ORACLE_HOME/rdbms/admin 目錄。

5: 啟動 SQL*Plus 並以具有 SYSDBA 許可權的使用者身份連線至資料庫例項。

6: 如果該例項當前正在執行,則將其關閉。
     SQL> SHUTDOWN IMMEDIATE 

7: 在 DOWNGRADE 模式下啟動該例項。
     SQL> STARTUP DOWNGRADE 
如果需要,請指定初始化引數檔案的位置。

8a: 如果升級前在資料庫中配置了 Enterprise Manager 並備份了 Enterprise Manager Database Control Data,則:

Drop the SYSMAN schema:  
DROP USER sysman CASCADE; 

注意:此步驟之後,MGMT* 同義詞可能會無效。請按照“11.2 Upgrade Guide”中“Post-downgrade”部分描述的“Restoring Oracle Enterprise Manager”步驟(6 章第 9 頁,Downgrading Oracle Database to an Earlier Release),恢復備份並驗證同義詞。

8b: 如果升級前在資料庫中配置了 Enterprise Manager 但未備份 Enterprise Manager Database Control Data,則:

刪除 Enterprise Manager 使用者:
@?/sysman/admin/emdrep/sql/core/latest/admin/admin_drop_users.sql SYSMAN
刪除資訊庫使用者:
DEFINE EM_REPOS_USER=SYSMAN @?/sysman/admin/emdrep/sql/core/latest/admin/admin_drop_repos_user.sql SYSMAN 
刪除角色和同義詞:
DEFINE EM_REPOS_USER=SYSMAN @?/sysman/admin/emdrep/sql/core/latest/admin/admin_drop_synonyms.sql 
Drop the SYSMAN schema:  
DROP USER sysman CASCADE; 

注意:此步驟之後,Enterprise Manager 元件將從資料庫例項中移除。Enterprise Manager 元件可以在降級後重新建立。有關更多資訊,請參考

9:  設定系統以將結果記錄到日誌檔案,以備稍後的成功驗證: 
     SQL> SPOOL downgrade.log 

10: 執行 catdwgrd.sql:
     SQL> @catdwgrd.sql

以下是執行該指令碼的注意事項:
該指令碼會將資料庫中的所有 Oracle Database 元件降級至最初從其升級上來的主版本或 Oracle Database 11g 修補程式版。

如果在執行該指令碼時或在其餘步驟中的任何指令碼中遇到任何問題,需找到問題原因並更正,然後重新執行該指令碼。您可以根據需要多次重新執行本章中描述的任何指令碼。

如果某個元件的降級失敗,將會顯示 ORA-39709 錯誤,SQL*Plus 會話終止,Oracle Database 資料字典不降級。在降級 Oracle Database 資料字典之前,所有元件必須成功降級。必須要在重新執行 catdwgrd.sql 指令碼之前識別並修正問題。

11: 關閉將指令碼結果記錄到日誌檔案:
     SQL> SPOOL OFF 

檢視日誌檔案並驗證在降級過程中無錯誤生成。在步驟 9 中命名日誌檔案,建議名稱為 downgrade.log。更正在此檔案中發現的所有問題並根據需要重新執行降級指令碼。

12: 關閉例項:
     SQL> SHUTDOWN IMMEDIATE 

13:  退出 SQL*Plus. 

14: 配置環境指向針對老版本的 ORACLE_HOME。如果作業系統是 Linux 或 UNIX,請更改下列環境變數以指向要降級到的版本所在目錄:
ORACLE_HOME 
LD_LIBRARY_PATH
LIBPATH 
PATH 
還需要檢查 oratab 檔案和所有設定了 ORACLE_HOME 值的客戶端指令碼是否已指向降級的 Oracle 主目錄。

15: 如果作業系統是 Windows,請完成以下步驟:

a: 停止所有 Oracle 服務,包括 Oracle Database 11gR2 (11.2) 資料庫的 OracleServiceSID Oracle 服務,其中 SID 是例項名稱。
例如,如果 SID 是 ORCL,則在命令提示符下輸入以下內容:
C:\> NET STOP OracleServiceORCL 

b: 透過執行 ORADIM 命令在命令提示符下刪除 Oracle 服務。例如,如果 SID 是 ORCL,則輸入以下命令:
C:\> ORADIM -DELETE -SID ORCL

c. 使用 ORADIM 命令建立要在命令提示符下降級的資料庫的 Oracle服務。
C:\> ORADIM -NEW -SID SID -INTPWD PASSWORD -MAXUSERS USERS -STARTMODE AUTO -PFILE ORACLE_HOME\DATABASE\INITSID.ORA



16: 恢復降級所至版本的配置檔案(例如,引數檔案、口令檔案等)。

17: 在系統提示符下,轉至之前版本的 ORACLE_HOME/rdbms/admin 目錄。

18: 啟動 SQL*Plus. 

19: 以具有 SYSDBA 許可權的使用者身份連線至資料庫例項。

20: 啟動例項:
     SQL> STARTUP UPGRADE 

21: 設定系統以將結果記錄到日誌檔案,以備稍後的成功驗證:
     SQL> SPOOL reload.log 

22: 執行 catrelod.sql:
     SQL> @catrelod.sql 

catrelod.sql 指令碼重新載入降級資料庫中所有資料庫元件的相應版本。

23: 如果要降級至 Oracle Database 11g Release 1 (11.1.0.6),請執行 xsrelod.sql 指令碼:
     SQL> @xsrelod.sql

執行 xsrelod.sql 指令碼以避免以下錯誤:
PLS-00306: wrong number or types of arguments in call to 'INVALIDATE_DSD_CACHE' DBMS_XS_DATA_SECURITY_EVENTS PL/SQL: Statement ignored

24: 如果要降級至 Oracle Database 10g Release 1 (10.1.0.5) 並且資料庫中安裝有 XDB,請在執行 catrelod.sql 之後執行以下指令碼:
     SQL> @dbmsxdbt.sql

25: 如果這是一個 Oracle RAC 資料庫,請執行以下命令以將資料庫返回 RAC 模式:

     SQL> SET CLUSTER_DATABASE=TRUE

26: 關閉將指令碼結果記錄到日誌檔案:
     SQL> SPOOL OFF

27: 檢查日誌檔案並驗證軟體包和過程編譯成功。

28: 關閉並重新啟動例項以進行正常執行:
     SQL> SHUTDOWN IMMEDIATE 
     SQL> STARTUP 

29: 如果該資料庫針對 Oracle Label Security 進行了配置並打算降級至 Oracle Database 10g Release 1 (10.1),請執行此步驟。

a. 將 olstrig.sql 指令碼從 Oracle Database 11g Release 2 (11.2) Oracle 主目錄複製到將要降至資料庫版本的 Oracle 主目錄。

b. 執行 olstrig.sql 透過 Oracle Label Security 策略在表上重新建立 DML 觸發器。
     SQL> @olstrig.sql 
請參閱《Oracle Label Security Administrator's Guide》瞭解更多資訊。

30: 執行 utlrp.sql 指令碼:
     SQL> @utlrp.sql

utlrp.sql 指令碼將重新編譯所有之前處於 INVALID 狀態的現有 PL/SQL 模組,如軟體包、過程、型別等。

31: 一些已安裝的元件可能會顯示例項升級前顯示的較早版本。如果要降級至已安裝了修補程式集的版本,請檢視並比較修補程式集 readme.txt 檔案與當前元件版本。如果降級元件的版本更早,則:

在升級模式下重新啟動例項。
執行 catupgrd.sql 指令碼 
按照修補程式集 Readme 檔案重新檢查元件版本。

32: 退出 SQL*Plus。
     資料庫現已降級。

降級後步驟

33: 恢復 Oracle Enterprise Manager 備份。
如果在升級前備份了 Oracle Enterprise Manager 資料,則可將其進行恢復。

如果未進行備份,可根據需要重新建立 Oracle Enterprise Manager。

34: 啟用 Database Vault。
降級後啟用 Data Vault 的步驟:

以已授予 DV_OWNER 角色的使用者身份連線至 SQL*Plus 並執行以下語句:
ALTER TRIGGER DVSYS.DV_BEFORE_DDL_TRG ENABLE; 
ALTER TRIGGER DVSYS.DV_AFTER_DDL_TRG ENABLE;

35: 重新載入 Oracle Application Express 
轉至將 apxrelod.sql 檔案複製到的目錄(降級步驟的第 3 步),透過執行 apxrelod.sql 檔案手動重新載入 Oracle Application Express。請注意:,資料庫必須以 UPGRADE 模式啟動,以執行 apxrelod.sql 指令碼。

36: 如果原 ORACLE_HOME 被解除安裝, 您需要在原 ORACLE_HOME 中停止監聽,移動或重建監聽在低版本的ORACLE_HOME中,並啟動。這個步驟期望您做到但不是必須的。

37: 如果有patch (包括 PSU, CPU, Exadata Bundle Patches 或者 One-off Patches) 被打在原 ORACLE_HOME 中, 那麼這個patch對應的 post installation 步驟 (SQL) 必須被執行.  請檢視每個patch的readme。

38: 如果降級的是叢集資料庫,那麼必須執行以下命令來降級叢集資料庫配置:

$ srvctl downgrade database -d db-unique-name -o oraclehome -t to_version

db-unique-name 為資料庫名(不是例項名),oraclehome 是被降級資料庫的原 Oracle home,to_version 為降級至的版本號。

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

相關文章