場景:由於oracle數據庫從11.2.0.4 升級到19c之后,發現諸多問題,需要回退到原來的 11.2.0.4 版本。
數據庫降級前:
SQL> select name from v$database;
NAME
------------------
TESTUP
SQL> select * from v$version;
BANNER
----------------------------------------------------------------------------
BANNER_FULL
----------------------------------------------------------------------------
BANNER_LEGACY
----------------------------------------------------------------------------
CON_ID
----------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.6.0.0.0
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
0
SQL> show parameter compatible
NAME TYPE VALUE
---------------------------- ------------------- -------------------------
compatible string 11.2.0.4.0
19c降級矩陣如下:
Downgrade Compatible Matrix |
|
Oracle Database release Downgradable |
( Yes / No ) |
18c |
Yes |
12.2.0.1 |
Yes |
12.1.0.2 |
Yes |
11.2.0.4 |
Yes for non-CDBs |
一、降級前檢查
1.1 如果數據庫啟用了 Oracle Database Vault, 則降級之前需要禁用
SQL> SELECT * FROM CDB_DV_STATUS;
如果輸出為TRUE,則需要禁用,輸出為FALSE則進行下一步。
1.2 如果數據庫使用了 Oracle Label Security, 則需要在19c ORACLE_HOME下執行olspredowngrade.sql 腳本
查詢下面視圖,查看Oracle Label Security是否使用,輸出為FALSE則進行下一步。
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Oracle Label Security';
如果返回TRUE,執行 olspredowngrade.sql 腳本:
SQL> @ORACLE_HOME/rdbms/admin/olspredowngrade.sql
1.3 如果數據庫啟用了 Unified Auditing, 建議備份和清除審計文件
a . 查看是否有unified audit 記錄,輸出為0則進行下一步。
SQL> SELECT COUNT(*) FROM UNIFIED_AUDIT_TRAIL;
b. 備份現有的審計數據到表格中
SQL> CREATE TABLE UA_DATA AS (SELECT * FROM UNIFIED_AUDIT_TRAIL);
c. 清除審計記錄
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => FALSE);
1.4 降級之前,確保目標數據庫中有當前版本的timezone文件
查詢V$TIMEZONE_FILE視圖,當前使用的timezone文件
SQL> select * from V$TIMEZONE_FILE;
FILENAME VERSION CON_ID
-------------------- ---------- ----------
timezlrg_32.dat 32 0
注: 需要將19c $ORACLE_HOME/oracore/zoneinfo 下的timezlrg_32.dat 文件拷貝到 11gR2 的$ORACLE_HOME/oracore/zoneinfo 目錄下
cp /u01/app/oracle/product/19.0.0/db_1/oracore/zoneinfo/timezlrg_32.dat /u01/app/oracle/product/11.2.0/db_1/oracore/zoneinfo
1.5 如果配置了EM,則需要刪掉sysman用戶 ,重建EM
若沒有配置EM,則進行下一步
DROP USER sysman CASCADE;
1.6 降級前11.2.0.4 需要安裝的補丁
Downgrade from 19c to 11.2.0.4.0
23054359: DATABASE PATCH SET UPDATE 11.2.0.4
20898997: XMLTYPESUP: QCTOXSNLB SHOULD NOT CHECK AGAINST SNAPSHOT SIZE
20348910: ALTER TYPE REPLACE IN PRVTAQJI.SQL TO BE REPLACE WITH CREATE OR REPLACE TYPE
[oracle@db-server ~]$ opatch lspatches
30670774;Database Patch Set Update : 11.2.0.4.200414 (30670774)
20898997;
20348910;
二、數據庫降級
從19c開始,oracle提供了dbdowngrade工具腳本,如有必要,也可使用和老版本一樣的catdwgrd.sql腳本。
執行降級之前,建議數據庫做個全備。
2.1 使用sqlplus 降級模式啟動數據庫,並且需要使用pfile 啟動,然后執行dbdowngrade腳本。
如果是RAC數據庫,設置參數CLUSTER_DATABASE=FALSE,保留一個實例,關閉其它實例
sqlplus / as sysdba
SQL> alter system set CLUSTER_DATABASE=FALSE scope=spfile sid=’*’;
SQL> shutdown immediate;
以19c ORACLE_HOME 啟動數據庫
export ORACLE_HOME= /u01/app/oracle/product/19.0.0/db_1
sqlplus / as sysdba
SQL> startup downgrade;
$cd $ORACLE_HOME/bin
$ chmod +x dbdowngrade
$./dbdowngrade
或者手動跑腳本的方法
cd $ORACLE_HOME/rdbms/admin
sqlplus / as sysdba
set echo on termout on serveroutput on timing on
SQL> SPOOL downgrade.log
SQL> @catdwgrd.sql
SQL> SPOOL off
2.2 關閉數據庫實例
SQL> SHUTDOWN IMMEDIATE;
2.3 修改環境變量指向11.2.0.4
export ORACLE_HOME= /u01/app/oracle/product/11.2.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH
2.4 執行catrelod.sql 重載組件版本
sqlplus / as sysdba
SQL> STARTUP UPGRADE;
SQL> @$ORACLE_HOME/rdbms/admin/catrelod.sql
2.5 重啟數據庫,執行重新編譯腳本
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
如果是RAC 數據庫,則設回CLUSTER_DATABASE參數為TRUE
sqlplus / as sysdba
SQL> alter system set CLUSTER_DATABASE=TRUE scope=spfile sid=’*’;
更新CRS中注冊的數據庫版本信息
$ srvctl downgrade database -d db-unique-name -o oraclehome -t to_version
降級完成后結果:
SQL> select name from v$database;
NAME
------------------
TESTUP
1 row selected.
SQL> select * from v$version;
BANNER
----------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
5 rows selected.
三、降級后報錯處理
降級后 數據庫alert 日志每隔5分鍾就有報錯:
ORA-1400 encountered when generating server alert SMG-4121
MOS 解決方案(ORA-1400 encountered when generating server alert SMG-4121 after downgrade from 12c to 11.2.0.4 (Doc ID 2169006.1))如下:
Recreate the the SYS.ALERT_QUE using the following steps:
1. Drop the alert_QT
sqlplus / as sysdba
alter system enable restricted session;
exec dbms_aqadm.drop_queue_table('ALERT_QT',true);
2. Drop tables wri$_alert_history and WRI$_ALERT_OUTSTANDING
drop table WRI$_ALERT_OUTSTANDING;
drop table WRI$_ALERT_HISTORY;
3. Recreate the alert_que and associated objects:
SQL>@$ORACLE_HOME/rdbms/admin/dbmsslrt.sql
SQL>@$ORACLE_HOME/rdbms/admin/catalrt.sql
SQL>@$ORACLE_HOME/rdbms/admin/catmwin.sql
SQL>@$ORACLE_HOME/rdbms/admin/exechae.sql
SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql
SQL>alter system disable restricted session;
經過驗證,處理后alert日志不再有ORA-1400報錯了。