手動升級到資料庫 12c 版本1(12.1)的完整核對清單 (文件 ID 2047701.1)

mosdoc發表於2016-12-04

文件內容


用途

適用範圍

詳細資訊
  第1步: 升級到 Oracle 12c 版本1(12.1)的升級路徑
  第2步:推薦在源庫上完成的
  第3步:檢查源庫的一致性
  第4步:升級前步驟
  4.1 棄用的 CONNECT 角色
  4.2 更改 Access Control Lists 和 Network Utility 包
  4.3 Network Utility 包的依賴關係
  4.4 處理源庫帶密碼的 DBLINK
  4.5 檢查 TIMESTAMP WITH TIMEZONE 型別的資料
  4.6 最佳化器統計資訊
  4.7  使用 emdwgrd 工具備份 Database Control 的檔案及資料
  4.8  在升級資料庫前確認所有的物化檢視都已經完成了重新整理
  4.9 在升級資料庫前確認沒有資料檔案需要介質恢復
  4.10 在升級資料庫前確認沒有資料檔案處於備份狀態
  4.11 在升級前把未決的分散式事務處理掉
  4.12 在升級前清空資料庫的 Recycle Bin
  4.13 同步 standby 資料庫
  4.14 禁用所有的 cron job
  4.15 檢查 SYS 和 SYSTEM 使用者的預設表空間
  4.16 檢查資料庫是否有外部驗證的的 SSL 使用者(externally authenticated SSL users)
  4.17 記錄資料檔案,重做日誌和控制檔案的路徑
  4.18 刪除 Enterprise Manager Database Control repository
  4.19 執行 olspreupgrade.sql
  4.20 如果源庫中存在 Oracle 12c 版本1自帶的使用者或者 Role,刪除它們
  4.21 檢查並刪除不必要的隱藏引數
  4.22 檢查 XDB ACLs 是否有 start_date and end_date ACE 屬性
  4.23 如果 JVM 的 Mitigation patch 已應用至源庫,那麼 Oracle JVM 元件是被禁用的。您會在升級資料庫時碰到錯誤
  4.24 修改或者選擇資料庫字符集
  4.25 如果是對10g資料庫做升級
  4.26 如果從11.2.0.3升級
  第5步:推薦/需要在目標庫上完成的
  第6步:升級資料庫到 12cR1
  第7步:升級後步驟
  7.1 環境變數及 oratab檔案
  7.2 初始化引數檔案
  7.3 密碼檔案
  7.4 COMPATIBLE 引數
  7.5 修改 Oracle 自帶使用者的密碼
  7.6  在升級資料庫後升級 Recovery Catalog
  7.7  在升級資料庫後升級 Time Zone檔案版本
  7.8  升級那些使用 DBMS_STATS 建立的統計資訊表(Statistics Tables)
  7.9  升級外部驗證的的 SSL 使用者
  7.10  升級後安裝 Oracle Text Supplied Knowledge Bases
  7.11  更新 Oracle Application Express(APEX)的配置
  7.12  對外部網路服務(External Network Services)配置細粒度的訪問控制
  7.13  啟用 Database Vault
  7.14  使用 utluiobj 指令碼來發現失效物件
  7.15 啟用之前在第4.14步驟停掉的所有 batch 和 cron job

參考


適用於:

Oracle Database - Enterprise Edition - 版本 10.2.0.5 和更高版本
Oracle Database - Standard Edition - 版本 10.2.0.5 和更高版本
本文件所含資訊適用於所有平臺

用途

本文件可用作手工將 Oracle 10gR2 (10.2),Oracle 11gR1 (11.1) 或者 Oracle 11gR2(11.2) 版本資料庫升級至 Oracle 12c 版本1 (12.1) 資料庫的指南與核對表。

適用範圍

 資料庫管理人員/技術支援

詳細資訊

第1步: 升級到 Oracle 12c 版本1(12.1)的升級路徑

能夠直接升級到 Oracle 12c Release 1 的資料庫最小版本:

源資料庫 目標資料庫
10.2.0.5 12.1.x
11.1.0.7 12.1.x
11.2.0.2 或者更高 12.1.x

以下的資料庫版本需要間接升級:

源資料庫   升級路徑   目標資料庫
11.2.0.1 ----> 11.2.0.2 或更高 ----> 12.1.x
11.1.0.6 ----> 11.1.0.7 或 11.2.0.2 或更高 ----> 12.1.x
10.2.0.4(或更低) ---->  10.2.0.5 或其它更高的可以直接升級的版本 ----> 12.1.x
10.1.0.5(或更低) ----> 10.2.0.5 或其它更高的可以直接升級的版本 ----> 12.1.x
9.2.0.8(或更低) ---->   9.2.0.8 --> 11.2.0.2 或更高 ----> 12.1.x

比如:

  •  如果源庫是 11.2.0.1 或者 11.1.0.6,那麼你需要先升級至 11.2.0.2。
  •  如果源庫是 10.2.0.2,10.2.0.4 或者 10.1.0.5,需要先升級至 10.2.0.5 或更高。
  •  對於 9.2.0.8 版本的資料庫,需要先升級至一箇中間版本,比如:9.2.0.8 -> 11.2.0.2 或 11.2.0.3 -> 12.1。

提醒:
參考下面的兩個文件來快速得到各個補丁集對應的 patch 號碼:

Note 438049.1 : How To Find RDBMS patchsets on My Oracle Support
Note 753736.1 : Quick Reference to Patchset Patch Numbers

第2步:推薦在源庫上完成的

  • 對源庫做備份,冷備份或熱備份都可以(推薦冷備份)。

a) 做冷備份(如果使用的是非歸檔模式)
            或者
b) 使用 rman 做備份

Connect to RMAN:

rman "target / nocatalog"

RUN
{
ALLOCATE CHANNEL chan_name TYPE DISK;
BACKUP DATABASE FORMAT '<db_backup_directory>%U' TAG before_upgrade;
BACKUP CURRENT CONTROLFILE TO '<controlfile_backup_directory>';
}

--> db_backup_directory >> 存放資料庫備份的目錄。
--> controlfile_backup_directory >> 存放控制檔案備份的目錄。

  • 在升級前確保所有 oracle 提供的元件和物件都是有效的。
  • 除了下面的物件外,確保在 sys 和 system schema 下沒有重複存在的物件。

         下面的物件是允許重複的:

 OBJECT_NAME                         OBJECT_TYPE
---------------------------         ------------------
AQ$_SCHEDULES                          TABLE
AQ$_SCHEDULES_PRIMARY            INDEX
DBMS_REPCAT_AUTH                    PACKAGE
DBMS_REPCAT_AUTH                    PACKAGE BODY 
  •  禁用所有使用者自定義的 before/after DDL 型別的觸發器,完成升級後再啟用它們。
  •  在11g,建立帶有 timestamp with timezone 資料型別的 ACL 不會失敗,但是在升級到 12c 後就會碰到"ORA-01830: date format picture ends before converting entire input string" 錯誤而失敗,請參照 Note 1958876.1 Upgrade to 12.1 fails with ORA-01830 date format picture ends before converting entire input string ORA-06512: at "SYS.XS_OBJECT_MIGRATION"。
  • 要避免升級後執行datapump碰到ora-7445錯誤,請參照  Note 2017572.1 ORA-7445 [qcsIsColInFro] Querying After Upgrade to 12c,需要在升級前打這個patch
  •  在升級前,如果統計資訊收集的'concurrent statistics gathering'沒有設定為 false,那麼必須修改它

    在源庫,比如 11.2 上檢查當前的設定:

    SQL> SELECT dbms_stats.get_prefs('CONCURRENT') from dual;

    如果 concurrent statistics gathering 沒有設定為 false,那麼在升級前把它改為 false。

    BEGIN
    DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT','FALSE');
    END;
    /


    在 11.2 和 12.1 上,手工或者自動收集統計資訊時預設 concurrency 都是關閉的,如果需要啟用,那麼請在升級後再改回來。

    具體請參照文件   Note 2037154.1 DBMS_STATS.GATHER_DICTIONARY_STATS Fails with "ORA-06502: PL/SQL: numeric or value error: character string buffer too small"

第3步:檢查源庫的一致性

在升級前從 My Oracle Support 文件下載並執行 dbupgdiag.sql 指令碼來檢查源庫的一致性:

Note 556610.1  Script to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql)

如果 dbupgdiag.sql 指令碼報告了任何無效物件,則執行 $ORACLE_HOME/rdbms/admin/utlrp.sql(可能需要多次)以使資料庫中的無效物件變為有效,直至無效物件數目不發生變化為止:

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

如果有 Oracle 自帶的物件仍處於失效狀態,建議在 Oracle Community 上發帖或者開一個 SR 來進一步分析為什麼這些物件仍然有問題。
使無效物件有效之後,再次在資料庫中重新執行 dbupgdiag.sql,確保一切正常。

建議使用 hcheck.sql 指令碼對資料庫做一個健康檢查,請從下面的文件中下載指令碼。

Note 136697.1 hcheck.sql" script to check for known problems in Oracle8i, Oracle9i, Oracle10g and Oracle 11g

  

第4步:升級前步驟

  • Pre-Upgrade Information Tool 需要在舊的資料庫上執行。
  • 每個步驟都需要執行。
  • 源資料庫必須處於正常執行的狀態。

如果是間接升級,下載並執行最新版本的 Pre-Upgrade Information Tool,參照下列文件

Note 884522.1 How to Download and Run Oracle's Database Pre-Upgrade Utility

或者

直接執行 Pre-Upgrade Information Tool 來收集安裝前需要檢查的資訊。

 第1步:

    * 使用新 12c 軟體的所有者使用者登入作業系統。
    * 把 12c 的 $ORACLE_HOME/rdbms/admin 目錄中的 Pre-Upgrade Information Tool 工具(即 preupgrd.sqlutluppkg.sql 指令碼)複製到源庫的 $ORACLE_HOME/rdbms/admin 目錄下。

  第2步:

     * 執行 Pre-Upgrade Information Tool。比如,如果已經把 preupgrd.sql 指令碼複製到了源庫的 $ORACLE_HOME/rdbms/admin 目錄下。

SQL> @$ORACLE_HOME/rdbms/admin/preupgrd.sql

preupgrade.log,preupgrade_fixups.sql 和 postupgrade_fixups.sql 檔案會建立在源庫的 $ORACLE_HOME/cfgtoollogs/$ORACLE_SID/preupgrade/ 目錄下。

4.1 棄用的 CONNECT 角色

在資料庫從 9.2 版本或 10.1 版本升級到 12.1 版本之後,CONNECT 角色就只包含 CREATE SESSION 許可權了;在低版本資料庫中賦予 CONNECT 角色的其它許可權在升級的過程中都被收回了。要在資料庫中找到哪個使用者或者角色被賦予 CONNECT 角色,可以使用下面的語句:

SQL> SELECT grantee FROM dba_role_privs
WHERE granted_role = 'CONNECT' and
grantee NOT IN (
'SYS', 'OUTLN', 'SYSTEM', 'CTXSYS', 'DBSNMP',
'LOGSTDBY_ADMINISTRATOR', 'ORDSYS',
'ORDPLUGINS', 'OEM_MONITOR', 'WKSYS', 'WKPROXY',
'WK_TEST', 'WKUSER', 'MDSYS', 'LBACSYS', 'DMSYS',
'WMSYS', 'EXFSYS', 'SYSMAN', 'MDDATA',
'SI_INFORMTN_SCHEMA', 'XDB', 'ODM');

如果這些使用者或者角色需要除了 CREATE SESSION 以外其它的許可權,可以在升級前顯式的賦予這些許可權。升級的指令碼會自動調整 ORACLE 自帶的使用者的相關許可權。

在 9.2.x 和 10.1.x 資料庫中, CONNECT 角色包含下面的許可權:

SQL> SELECT GRANTEE,PRIVILEGE
FROM DBA_SYS_PRIVS
WHERE GRANTEE ='CONNECT'

GRANTEE PRIVILEGE
------- ----------------------
CONNECT CREATE VIEW
CONNECT CREATE TABLE
CONNECT ALTER SESSION
CONNECT CREATE CLUSTER
CONNECT CREATE SESSION
CONNECT CREATE SYNONYM
CONNECT CREATE SEQUENCE
CONNECT CREATE DATABASE LINK

從 ORACLE 資料庫 10.2 開始,CONNECT 角色就只包含 CREATE SESSION 許可權了。

4.2 更改 Access Control Lists 和 Network Utility 包

從 12c 開始,UTL 包(UTL_TCP,UTL_SMTP,UTL_MAIL,UTL_HTTP,和 UTL_INADDR)的訪問控制由 Oracle Database Real Application Security 來實現,不再依賴 Oracle XML DB 功能。

 參照 

4.3 Network Utility 包的依賴關係

執行下面的語句:

SQL> SELECT * FROM DBA_DEPENDENCIES
WHERE referenced_name IN ('UTL_TCP','UTL_SMTP','UTL_MAIL','UTL_HTTP','UTL_
INADDR','DBMS_LDAP')
AND owner NOT IN ('SYS','PUBLIC','ORDPLUGINS');

具體的步驟參照安裝後步驟 7.12,因為需要使用的包 DBMS_NETWORK_ACL_ADMIN 是在升級後才有的,升級前沒有。

4.4 處理源庫帶密碼的 DBLINK

為 DBLINKs 建立指令碼(如果這個庫稍後還要被降級)。

在資料庫升級到 12c 版本時,所有 dblink 的密碼會被加密。
在需要降級資料庫到之前版本的時候, 所有擁有加密的密碼的 dblink 都需要在降級前被刪除掉,因此降級後的資料庫中就沒有 dblink 了。
如果有預感這個資料庫還要被降級到之前的版本,那麼從 SYS.LINK$ 表儲存受到影響的 dblink 的資訊,這樣在降級後可以重建這些 dblink:

SQL> SELECT 'CREATE '||DECODE(U.NAME,'PUBLIC','public ')||'DATABASE LINK '||CHR(10)
||DECODE(U.NAME,'PUBLIC',Null, 'SYS','',U.NAME||'.')|| L.NAME||chr(10)
||'CONNECT TO ' || L.USERID || ' IDENTIFIED BY "'||L.PASSWORD||'" USING
'''||L.HOST||''''
||chr(10)||';' TEXT
FROM SYS.LINK$ L, SYS.USER$ U
WHERE L.OWNER# = U.USER#;

4.5 檢查 TIMESTAMP WITH TIMEZONE 型別的資料

資料庫 12c 版本1的預設 time zone 檔案版本是 18。

要檢查是否需要更新 DST 檔案,請檢查如下文件:

Note 1665676.1 Actions For DST Updates When Upgrading To Or Applying The 12.1.0.2 Patchset
或者
Note 1522719.1 Actions For DST Updates When Upgrading To 12.1.0.1 Base Release

 

4.6 最佳化器統計資訊

Oracle 推薦在升級前夜收集統計資訊來減少升級時間。

為了減少在升級過程中收集統計資訊所花的時間,Oracle 推薦在真正升級資料庫前收集統計資訊。
如果要升級的庫是 10.1,Oracle 推薦使用 DBMS_STATS.GATHER_DICTIONARY_STATS 來收集統計資訊,比如:

$ sqlplus "/as sysdba"
SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

4.7  使用 emdwgrd 工具備份 Database Control 的檔案及資料

如果在升級資料庫到 12c 版本後,有需要把 Oracle Enterprise Manager Database Control 降級,那麼我們必須在升級前備份 Database Control 的檔案才可以。
emdwgrd 可以用來在升級前儲存 Database Control 的資料,這個工具存在於 12c 版本的資料庫的 ORACLE_HOME/bin 目錄下。

1. 設定 ORACLE_HOME 到舊的資料庫版本
2. 設定 ORACLE_SID 為要升級的資料庫 SID
3. 設定 PATH, LD_LIBRARY_PATH 和 SHLIB_PATH 到舊的 ORACLE_HOME 相關的目錄下
4. 切換目錄到 12c 資料庫軟體的 ORACLE_HOME/bin
5. 執行 emdwgrd 命令
   a. 對於單資料庫例項 (非 RAC) 執行下面的命令:

$ emdwgrd -save -sid old_SID -path save_directory

old_SID 是要升級的那個資料庫的 SID, save_directory 是用來存放 Database Control 檔案和資料的目錄。

 b. 對於 RAC 資料庫,需要跨節點遠端複製。定義一個環境變數來指向遠端複製的命令。如 setenv EM_REMCP /usr/bin/scp

$ emdwgrd -save -cluster -sid old_SID -path save_directory

注意,如果 10g 資料庫的 ORACLE_HOME 是放在共享儲存上的,那麼上面的命令還需要指定 -shared 引數。

上面的命令可能會在 HPUX 上失敗,這是一個已知問題,請參照下面的文件:

Note 562980.1 - emdwgrd core dumps : emdwgrd[228]: 10366 Memory fault(coredump)

6. 輸入 SYS 使用者的密碼。
注意:在 RAC 資料庫上,還需要在每個節點上執行'/tmp/racdwgrd_dbctl.sh' 。

4.8  在升級資料庫前確認所有的物化檢視都已經完成了重新整理

在升級資料庫前,我們需要確認所有的物化檢視都已經完成了重新整理,並且複製已經停止。
用下面的語句檢查當前是否有物化檢視正在重新整理:

SQL> select s.obj#,o.obj#,s.containerobj#,lastrefreshdate,pflags,xpflags,o.name,o.owner#, bitand(s.mflags, 8) from obj$ o, sum$ s
where o.obj# = s.obj# and o.type# = 42 AND bitand(s.mflags, 8) = 8;

如果語句返回一些行, 請參照文件 Note 1442457.1 : During 11g Upgrade, Mview refresh warning 來操作。

4.9 在升級資料庫前確認沒有資料檔案需要介質恢復

確保沒有資料檔案需要介質恢復

SQL> SELECT * FROM v$recover_file;

4.10 在升級資料庫前確認沒有資料檔案處於備份狀態

執行下面的語句確保沒有資料檔案處於備份狀態

SQL> SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';

4.11 在升級前把未決的分散式事務處理掉

要處理未決的分散式事務:
1. 執行下面的語句:

SQL> SELECT * FROM dba_2pc_pending;

2. 如果它有返回行,那麼用下面的命令處理掉未決的分散式事務:

SQL> SELECT local_tran_id FROM dba_2pc_pending;
SQL> EXECUTE dbms_transaction.purge_lost_db_entry('');
SQL> COMMIT;

4.12 在升級前清空資料庫的 Recycle Bin

要清空資料庫的 Recycle Bin,使用下面的命令:

SQL> PURGE DBA_RECYCLEBIN

注意:必須要清空資料庫的 recycle bin 來避免可能的 ora-600 錯誤及減少升級時間。

4.13 同步 standby 資料庫

檢查是否配置了 standby 資料庫:
1. 執行下面的命令

SQL> SELECT SUBSTR(value,INSTR(value,'=',INSTR(UPPER(value),'SERVICE'))+1)
FROM v$parameter
WHERE name LIKE 'log_archive_dest%' AND UPPER(value) LIKE 'SERVICE%';

2. 如果上面的語句有返回行,那麼把相應的 standby 資料庫與主庫進行同步。

  •  確保最後一次 log switch 之後的所有日誌都已經傳輸到 standby 庫中。
  •  在 standby 庫中,使用 NODELAY 的選項來恢復 standby 庫。

4.14 禁用所有的 cron job

對於 Oracle 資料庫的 job,可以使用 DBMS_JOB,DBMS_SCHEDULER 去停掉它們。
對於 cron job(由 OS 控制的 job), 需要您的系統管理員來幫忙禁掉它們。

以下文件可以參考:
Note 404238.1 : How to Disable an Entry from DBMS_SCHEDULER
Note 1335741.1 : How To Stop A Running Job Using DBMS_JOB
Note 67695.1 : PROCEDURE DBMS_JOB.BROKEN Specification

4.15 檢查 SYS 和 SYSTEM 使用者的預設表空間

確保 sys 和 system 使用者的預設 tablespace 是 SYSTEM。
必須確保 system tablespace 裡有足夠的空間或者設定成 extents 無限制。

SQL> SELECT username, default_tablespace
     FROM dba_users
     WHERE username in ('SYS','SYSTEM');

default_tablespace 的值應該是 SYSTEM, 如果不是的話,可以用下面命令糾正:

SQL> ALTER user SYS default tablespace SYSTEM;
SQL> ALTER user SYSTEM default tablespace SYSTEM;

4.16 檢查資料庫是否有外部驗證的的 SSL 使用者(externally authenticated SSL users)

執行下面的語句

SQL> SELECT name FROM sys.user$
     WHERE ext_username IS NOT NULL
     AND password = 'GLOBAL';

If any SSL users are found then Step 7.9 has to be followed after the upgrade.

4.17 記錄資料檔案,重做日誌和控制檔案的路徑

記下資料檔案,重做日誌和控制檔案的路徑,並且備份所有的配置檔案,如 listener.ora, tnsnames.ora 等等。

SQL> SELECT name FROM v$controlfile;
SQL> SELECT file_name FROM dba_data_files;
SQL> SELECT group#, member FROM v$logfile;

4.18 刪除 Enterprise Manager Database Control repository

Enterprise Manager Database Control 在 12c 裡被 Oracle Enterprise Manager Express 所替代。

     因此我們不再需要 Database Control repository。

     使用下面的方式手工刪除 Database Control  repository。

     注意:你可以從 Oracle 12c 的 Home 裡找到 emremove.sql 指令碼。

    從 12c 的 $ORACLE_HOME/rdbms/admin 下複製 emremove.sql 指令碼到源庫的 $ORACLE_HOME/rdbms/admin 下並在升級前在源庫執行下面的命令:

$emctl stop dbcontrol

SQL> @ ?/rdbms/admin/emremove.sql

  如果 EM repository 未被刪除,那麼在升級後執行 catuppst.sql 時會被自動刪除。

  也可以參照文件 Is it Possible to Validate Invalid Objects related to DBControl Configuration in a Database Upgraded to 12c? (Doc ID 2118740.1)

  注意:如果資料庫中存在EM元件,這步才是需要的。並且如果使用了Cloud Control,但是EM不存在,那麼這步就不需要了。

4.19 執行 olspreupgrade.sql

如果在升級資料庫前 OLS(Lable Security)或者 DV(Database Vault)已經安裝在資料庫中了,那麼在升級前執行下面的步驟。
注意:你可以從 Oracle 12c 的 Home 裡找到 olspreupgrde.sql 指令碼。
從 12c 的 $ORACLE_HOME/rdbms/admin 下複製 olspreupgrde.sql 指令碼到源庫的 $ORACLE_HOME/rdbms/admin 下並於升級前在源庫執行下面的命令:
SQL> @ ?/rdbms/admin/olspreupgrade.sql

   - 它會把 AUD$ 從 SYSTEM 使用者遷移到 SYS 使用者下。

   - 它會處理 audit 的記錄來減少停機時間。

   - 它會把記錄移動到另一個臨時表中。

關於更多資訊,請參照  Requirements for Upgrading Databases That Use Oracle Label Security and Oracle Database Vault

4.20 如果源庫中存在 Oracle 12c 版本1自帶的使用者或者 Role,刪除它們

在 Oracle 12.1 存在一些新的自帶的使用者和 Role,如果同名的使用者或者 Role 已經在源庫存在,那麼升級前必須刪除它們。

執行 preupgrade tool 檢查源庫中是否有和 12.1 自帶的使用者和 Role 同名的使用者及 Role。

注意:如果這樣的使用者存在,那麼在刪除這些使用者前,可以把它所擁有的資料先移動到另一個使用者下。

必須清理這樣的使用者,否則升級會碰到"ORA-01722: invalid number"並失敗。

4.21 檢查並刪除不必要的隱藏引數

在升級前請檢查並刪除不必要的隱藏引數,除非應用提供商或者 Oracle 技術支援特意要求,Oracle 推薦刪除隱藏引數。

要檢查資料庫中已設定的隱藏引數,可以使用 AS SYSDBA 許可權執行下面的命令:


SQL> SELECT name, value from SYS.V$PARAMETER WHERE name LIKE '\_%' ESCAPE '\' order by name;

 

4.22 檢查 XDB ACLs 是否有 start_date and end_date ACE 屬性

在升級至 12c 前,使用 SYS 使用者執行下面的查詢:
 

SQL> select aclid, start_date, end_date from xds_ace where start_date is not null;  

如果查詢有返回資料,那麼按照文件 Note 1958876.1 Upgrade to 12.1 fails with ORA-01830 date format picture ends before converting entire input string ORA-06512: at "SYS.XS_OBJECT_MIGRATION"  操作來避免 XDB 升級失敗。

4.23 如果 JVM 的 Mitigation patch 已應用至源庫,那麼 Oracle JVM 元件是被禁用的。您會在升級資料庫時碰到錯誤

注意:此步驟僅適用於源庫已經打了Mitigation patch的情況

在升級資料庫前啟用 JVM 元件:

使用 sysdba 使用者連線到資料庫
  SQL> exec dbms_java_dev.enable;

 

請參照文件 Note 1985725.1 Database Upgrade failed with Errors “ORA-02290: check constraint (SYS.JAVA_DEV_DISABLED) violated” & “ORA-04045: SYS.DBMS_ISCHED”。

 

4.24 修改或者選擇資料庫字符集

在12c資料庫多租戶架構下,同一個CDB內的所有的PDB的

字符集(NLS_CHARACTERSET)必須是一致的,或者NLS_CHARACTERSET必須是CDB NLS_CHARACTERSET的子集(可相容插入的)
國家字符集(NLS_NCHAR_CHARACTERSET)必須和CDB的一致

 如果pdb要使用Unicode的字符集,那麼推薦CDB的字符集為AL32UTF8。請注意我們無法使用DMU來遷移CDB的字符集

請參照
Note 1968706.1 12c Multitenant Container Databases (CDB) and Pluggable Databases (PDB) Character set restrictions / ORA-65116/65119: incompatible database/national character set ( Character set mismatch: PDB character set CDB character set )
Note ID 225912.1 [Section E] Changing Or Choosing the Database Character Set ( NLS_CHARACTERSET )

 

 

4.25 如果是對10g資料庫做升級

如果是對10g資料庫做升級,確認下面的資訊

SQL> select DBMS_STATS.GET_PARAM('METHOD_OPT') from dual;

DBMS_STATS.GET_PARAM('METHOD_OPT')
-------------------------------------------------------------
FOR COLUMNS ID SIZE 1

如果返回結果"FOR COLUMNS ID SIZE 1",那麼可能會在升級中碰到問題。  執行下面的命令來繞過問題:

SQL>exec DBMS_STATS.SET_PARAM('METHOD_OPT','FOR ALL COLUMNS SIZE AUTO');

參照非公開BUG 22454765 - CARRYING METHOD_OPT = "FOR COLUMNS ID SIZE 1" FROM 10G WILL BREAK UPGRADE


 

4.26 如果從11.2.0.3升級

建議在12.1.0.2的ORACLE_HOME中打 ,來解決升級前與物化檢視有關的問題。

第5步:推薦/需要在目標庫上完成的

  •      在下載安裝 12cR1 軟體之前,需要先檢查軟體版本與您的硬體平臺/作業系統是否相容。您可以透過 網站來確認這一點。
  •      下載安裝 Oracle 12c 版本1 軟體到一個新的 ORACLE_HOME 並確認沒有編譯錯誤。
  •      如果有的話,安裝最新的補丁集(PatchSet)。
  •      如果有的話,安裝最新的 OPatch(要安裝跟作業系統平臺及資料庫版本一致的 OPatch)。
  •      如果有的話,安裝最新的 Critical Patch Update。
  •      請參照文件: Things to Consider to Avoid Poor Performance or Wrong Results on 12.1.0.2 (Doc ID 2034610.1)來獲知 12.1.0.2 上的和效能相關的問題。
  •     把如下配置檔案從源庫的 $ORACLE_HOME 下複製至 12c 軟體的 $ORACLE_HOME 下

          - 引數檔案(spfile 或者 pfile)
          - 密碼(orapwsid)

  •  刪除或者註釋掉被廢棄的引數

            註釋掉被廢棄的引數並且修改所有不推薦的引數().

           SEC_CASE_SENSITIVE_LOGON 在 12.1 已經不推薦使用,請參照 。

  •  DIAGNOSTIC_DEST 初始化引數替換掉了 USER_DUMP_DEST,BACKGROUND_DUMP_DEST 兩個初始化引數。

            根據 Bug 8937877,CORE_DUMP_DEST 並沒有被廢棄。

          要理解 11g 的目錄結構和 DIAGNOSTIC_DEST 引數,請參考下面的文件:

            Note 454442.1 11g Install : Understanding about Oracle Base, Oracle Home and Oracle Inventory locations

  • 如果升級的是 RAC 資料庫,那麼在升級前把 CLUSTER_DATABASE 設定成 false 並在升級後改回成 true。
    如果源庫是 RAC 資料庫,那麼兩個節點的 init<SID>.ora 檔案需要一致。
  • 確保引數檔案中的路徑名是完整正確的,引數檔案中的路徑名不能是相對路徑。
  •  停掉資料庫的 listener。
$ lsnrctl stop
  • 建立一個 12.1 的 listener

之前版本的 listener 不能用在 12c 的資料庫上,但是 12c 的 listener 可以用在之前版本的資料庫上。
如果是從 10.2.0.5 升級或者手工升級,那麼需要在升級 RAC 資料庫之前執行 netca。

它包含兩個步驟:
 需要先執行舊的 Oracle_home 裡的 netca 刪除當前的 listener。
- 執行 Netca
- 選擇配置 => 選擇 Listener Configuration
- 選擇刪除選項 => Delete
- 選擇要刪除的 listener 來刪除它

 然後在新的 12cR1 ORACLE_HOME 裡執行 netca 來新增新 listener。
- 執行 Netca
- 選擇配置 => 選擇 Listener Configuration
- 選擇新增選項 => Add
- 提供詳細資訊來新增 listener

必須在新增新 listener 之前刪掉舊的,如果新 listener 和舊 listener 用到了相同的名字或者埠號,netca 會返回錯誤。

注意:如果要手工升級 RAC 資料庫,那麼這一步是必須要做的。

  • 停掉其它的相關程式,如 dbconsole, isqlplus 等。
$ emctl stop dbconsole
$ isqlplusctl stop
  •  停掉資料庫。
$ sqlplus "/as sysdba"
SQL> shutdown immediate;
  • 對於 Windows 作業系統,建立一個新的 SID(這一步僅適用於 Windows)

         如果你的作業系統是 Windows,那麼需要做這一步,如果不是那麼可以忽略掉這一步。

         設定相應的環境變數對應到源庫上(10.2/11.1)

         停掉要升級的那個資料庫的服務 OracleServiceSID, SID 是 instance 的名字。比如,如果 SID 是 ORCL,那麼執行下面的命令:
      
 a). 停掉資料庫服務。

C:\> NET STOP OracleServiceORCL

b). 使用 ORADIM 命令刪掉源庫的服務:

C:\> ORADIM -DELETE -SID ORCL

c). 用新庫的 ORADIM 工具建立一個 12c 版本1 的資料庫 servicese:

C:\> ORADIM -NEW -SID SID -INTPWD PASSWORD  -STARTMODE AUTO -PFILE %ORACLE_HOME%\DATABASE\INIT<SID>.ORA

比如:

C:\> ORADIM -NEW -SID ORCL -INTPWD <PASSWORD> -STARTMODE AUTO -PFILE %ORACLE_HOME%\DATABASE\INIT<SID>.ORA
  • 確認下面的環境變數指向了新版本資料庫的目錄:

               - ORACLE_BASE
               - ORACLE_HOME
               - PATH, LD_LIBRARY_PATH and SHLIB_PATH

$ export ORACLE_HOME=<location of Oracle 12.1>
$ export PATH=$ORACLE_HOME/bin:$PATH
$ export ORACLE_BASE=<Oracle_Base set during installation>

注意: 如果不知道 ORACLE_BASE, 在 PATH 變數包含了 12cR1 的 Oracle Home 之後,執行 'orabase' 會提示 ORACLE_BASE 的值。

$ orabase
/uo1/app/oracle
  • 更改 /etc/oratab 檔案,讓 ORCL 指向新的 ORACLE_HOME 並且禁用自動啟動。
Sample : cat /etc/oratab

            #orcl:/opt/oracle/product/11.2/db_1:N
            orcl:/opt/oracle/product/12.2/db_1:N

注意:在改掉 /etc/oratab 之後可以使用 oraenv(/usr/local/bin/oraenv)來設定新的環境變數,需要輸入 /etc/oratab 中的指向 12cR1 的那個 SID。
比如:

[oracle@localhost ~]$ . oraenv
ORACLE_SID = [orcl] ? orcl
The Oracle base for ORACLE_HOME=/opt/oracle/product/12.1/db_1 is /u01/app/oracle
[oracle@localhost ~]$

第6步:升級資料庫到 12cR1

在 OS 裡,進入 12cR1 的 $ORACLE_HOME/rdbms/admin 裡:

$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus "/ as sysdba"
SQL> startup UPGRADE
SQL> exit

在新的 Oracle Home 下執行 catctl.pl 指令碼。
在這個版本下,新的升級工具 catctl.pl 替代了catupgrd.sql。

在 Linux 下執行 catctl.pl:

例子: 當並行度為 6 ( n=6)

 cd $ORACLE_HOME/rdbms/admin
 $ORACLE_HOME/perl/bin/perl catctl.pl -n  6 -l $ORACLE_HOME/diagnostics catupgrd.sql

在 Windows 下執行 catctl.pl:

例子: 當並行度為 6 ( n=6)
                                                             
cd %ORACLE_HOME%\rdbms\admin
%ORACLE_HOME%\perl\bin\perl catctl.pl -n  6 -l %ORACLE_HOME%\diagnostics catupgrd.sql

關於catctl.pl的更多選項,請參照Oracle Database 12c Release 1 (12.1) Upgrade New Features Note 1515747.1

執行 Post-Upgrade Status Tool $ORACLE_HOME/rdbms/admin/utlu121s.sql 它會提供一個關於升級的總結。
它會顯示升級後各個資料庫元件的狀態和各個元件升級花費的時間。任何在升級中碰到的錯誤也會被列出,這些錯誤必須得到妥善的處理。

$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @utlu121s.sql

重要:catuppst.sql 指令碼會作為升級過程的一部分而執行,除非這個過程碰到錯誤而終止。檢查升級的日誌中是否包含"BEGIN catuppst.sql"來驗證是否這個指令碼 catuppst.sql 已執行。
如果 catuppst.sql 並沒有得到執行,那麼按照下面的步驟執行它。如果 catuppst.sql 並未得到執行,那麼 catctl.pl 也會報錯。

執行 $ORACLE_HOME/rdbms/admin 目錄下的 catuppst.sql,完成不需要在資料庫處於 UPGRADE 模式下操作的其它升級的動作:

SQL> @catuppst.sql

這個指令碼可以和 utlrp.sql 並行執行。在另一個 session 裡執行 utlrp.sql 來重新編譯剩下的 PL/SQL 和 Java 程式碼:

SQL> @utlrp.sql

執行從下面文件中得到的 dbupgdiag.sql 來檢查升級後資料庫的完整性。

Note 556610.1  Script to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql)

如果 dbupgdiag.sql 發現了一些失效物件,那麼多次執行 $ORACLE_HOME/rdbms/admin/utlrp.sql 來重新編譯這些失效物件,直到失效物件的數目不再變化。

在重新編譯這些失效物件之後,再次執行 dbupgdiag.sql 確認一切都是正常的。

退出 SQL*Plus。

如果升級的是版本 10.2,11.1 或者 11.2 的 RAC 資料庫,那麼在叢集軟體中更新資料庫的配置:

$ srvctl upgrade database -d db-unique-name -o oraclehome

這裡 db-unique-name 是資料庫的名字(不是例項名字),oraclehome 是資料庫的 ORACLE_HOME 路徑。

第7步:升級後步驟

7.1 環境變數及 oratab檔案

  • 確認下面的環境變數指向了新的 Oracle 12c Release 1 (12.1) 目錄            

               - ORACLE_BASE
               - ORACLE_HOME
               - PATH, LD_LIBRARY_PATH and SHLIB_PATH

  • 並且檢查 oratab 檔案和其它的客戶端指令碼,確認是指向了正確的 12c 的路徑。

7.2 初始化引數檔案

編輯 init.ora

  • 如果在升級前改動過 CLUSTER_DATABASE,那麼需要再把它改回來。
  • 把 pfile 檔案改回到 spfile。

從 pfile 建立 spfile:

SQL> create spfile from pfile;

它會根據 $ORACLE_HOME/dbs(UNIX)或者 %ORACLE_HOME%\database (Windows)目錄下的 pfile 產生一個新的 spfile。

7.3 密碼檔案

a) 如果 REMOTE_LOGIN_PASSWORDFILE 引數設定為 exclusive 或者 shared,使用 ORAPWD 建立密碼檔案。

b) 參照下面的文件來避免在執行post upgrade時碰到ORA-28017錯誤

ORA-28017: The password file is in the legacy format (Doc ID 2112456.1)

7.4 COMPATIBLE 引數

COMPATIBLE 引數控制了資料庫的相容版本(compatibility level)。
如果你確定不會再降級資料庫到之前的版本

  • 那麼在加大COMPATIBLE引數之前備份資料庫(可選項)。
  • 如果使用的是 spfile,那麼執行下面的步驟:

              a. 更改 spfile 來設定或者改變 COMPATIBLE 引數的值
                 比如,設定 COMPATIBLE 引數為 12.0.0,執行下面的命令:

SQL> ALTER SYSTEM SET COMPATIBLE = '12.0.0' SCOPE=SPFILE;

              b. 關閉並重新啟動例項。

  • 如果使用的是 pfile,那麼執行下面的步驟:

              a. 如果例項正在執行,那麼關閉它:

SQL> SHUTDOWN IMMEDIATE

              b. 更改 pfile 來設定或者改變 COMPATIBLE 引數的值。
                 比如,設定 COMPATIBLE 引數為 12.1.0,修改下面的引數:
                 COMPATIBLE = 12.1.0
              c. 使用 STARTUP 命令啟動資料庫。

7.5 修改 Oracle 自帶使用者的密碼

根據升級前資料庫的版本,可能會存在一些 Oracle 自帶的使用者。Oracle 推薦把除了 SYS 和 SYSTEM 之外的這樣的使用者都鎖住並讓它們的密碼過期。
這樣再把這些使用者解鎖的時候就會提示重新設定新密碼。

可以用下面的命令檢查所有帳號的狀態:

SQL> SELECT username, account_status FROM dba_users ORDER BY username;

使用下面的命令鎖定使用者並讓它的密碼過期:

SQL> ALTER USER username PASSWORD EXPIRE ACCOUNT LOCK;

7.6  在升級資料庫後升級 Recovery Catalog

可以透過命令 UPGRADE CATALOG 來升級 Recovery catalog。

關於具體的步驟資訊,請參照 。

7.7  在升級資料庫後升級 Time Zone檔案版本

如果 Pre-Upgrade Information Tool 要求我們在升級資料庫後升級 time zone 檔案,那麼使用 DBMS_DST PL/SQL package 來升級 RDBMS DST(timezone)版本
(Note 1585343.1 : Scripts to automatically update the RDBMS DST (timezone) version in an 11gR2 or 12cR1 database . )

注意:即使升級了 DST 版本,在執行 postupgrade_fixups.sql 後仍然可以看到下面的錯誤:

******************************************************************************************
Check Tag:     OLD_TIME_ZONES_EXIST
Check Summary: Check for use of older timezone data file
Fix Summary:   Update the timezone using the DBMS_DST package after upgrade is complete.
*******************************************************************************************

 
請直接忽略這個錯誤,它是由於一個已知的 bug 導致的: : UPGRADE DATABASE FROM 11.1.0.7 TO 12.1.0.1, "OLDER TIMEZONE IN USE" OCCURRED

如果這些錯誤出現了,那麼執行下面的語句:

SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%' ORDER BY PROPERTY_NAME;

如果返回的不是 DSTv18,此時請升級 DST 版本;否則就是因為 bug 17303129 導致的,可以忽略這些錯誤。

7.8  升級那些使用 DBMS_STATS 建立的統計資訊表(Statistics Tables)

如果我們使用 DBMS_STATS.CREATE_STAT_TABLE 手工建立了一些統計資訊表(statistics tables),那麼執行下面的命令來升級這些表(如果沒有建立過統計資訊表,那這一步驟可以忽略)。例如:

EXECUTE DBMS_STATS.UPGRADE_STAT_TABLE('SYS','dictstattab');

在上面的例子裡, 'SYS' 是統計資訊表的 owner, 'dictstattab' 是統計資訊表的表名。對每個統計資訊表都要執行一遍上面的命令。

7.9  升級外部驗證的的 SSL 使用者

如果資料庫是從 9.2.0.x 或 10.1.0.x 升級上來的並且之前使用了外部驗證的的 SSL 使用者,那麼需要執行下面的命令來升級這些使用者:

ORACLE_HOME/rdbms/bin/extusrupgrade --dbconnectstring
<hostname:port_no:sid> --dbuser <db admin> --dbuserpassword
<password> -a

如果是從 10.2.0.x(或更高)升級上來的,那麼這個步驟可以忽略。

7.10  升級後安裝 Oracle Text Supplied Knowledge Bases

Oracle Text-supplied knowledge bases 是 12c 的 companion products 的一部分,並且不會在升級後立刻可用。
升級後所有依賴 supplied knowledge bases 的 Oracle Text 特性都不能正常工作。
要啟用這些特性,必須安裝 Oracle Text supplied knowledge bases。

升級後,Oracle Text supplied knowledge bases 相關的使用者擴充套件都必須重新生成。這個問題影響 $ORACLE_HOME 下所有的資料庫。

7.11  更新 Oracle Application Express(APEX)的配置

如果源庫安裝的的 APEX 是版本 3.2 或更高,那麼需要額外的配置。

如果源庫安裝的 APEX 低於 3.2,那麼在升級的過程中會自動安裝最新版本的 APEX。
要在新的 Oracle 12c 裡執行 APEX,必須完成一系列的安裝後步驟來配置 APEX。

7.12  對外部網路服務(External Network Services)配置細粒度的訪問控制

為了避免在執行和網路相關的 UTL 程式包的時候引發 "ORA-24247: network access denied by access control list (ACL)"的錯誤,訪問許可權需要賦給使用這些程式包的使用者。

下面的例子先查詢當前已經分配給 host_name 的訪問控制列表(ACL), 如果發現了就賦給 user_name CONNECT 的許可權(如果它沒有的話)。
如果沒有訪問控制列表(ACL)存在,就建立叫做 ACL_name 的訪問控制列表(ACL),並且把 CONNECT 許可權賦給 user_name,然後把這個 ACL 分配給 host_name。

DECLARE
acl_path VARCHAR2(4000);
BEGIN
SELECT acl INTO acl_path FROM dba_network_acls
WHERE host = 'host_name' AND lower_port IS NULL AND upper_port IS NULL;
IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(acl_path,'principal','privilege') IS NULL THEN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl_path,'principal', is_grant, 'privilege');
END IF;
EXCEPTION
WHEN no_data_found THEN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('ACL_name.xml','ACL description', 'principal', is_grant, 'privilege');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('ACL_name.xml','host_name');
END;

COMMIT;

acl_name.xml => 指定訪問控制列表的 XML 檔案的名字,
ACL description => '檔案的描述',
principal => '使用者或者角色',
is_grant => TRUE|FALSE,
privilege => 'connect|resolve',
host_name => 主機名

關於如何使用 DBMS_NETWORK_ACL_ADMIN 程式包並避免 ORA-24247 : network access denied by access control list (ACL)。

請參照下面的文件:

Note 453786.1 ORA-24247 When Executing UTL_HTTP UTL_INADDR Packages

7.13  啟用 Database Vault

如果資料庫之前使用了 Database Vault,那麼參考下面的文件來啟用 Database Value

Note 453903.1 - Enabling and Disabling Oracle Database Vault in UNIX
Note 453902.1 - Enabling and Disabling Oracle Database Vault in WINDOWS

7.14  使用 utluiobj 指令碼來發現失效物件

升級前,Pre-Upgrade Information Tool 工具會把所有失效的 SYS/SYSTEM 物件寫入 registry$sys_inv_objs,把所有失效的非 SYS/SYSTEM 物件寫入 registry$nonsys_inv_objs。
 
升級後,可以執行 $ORACLE_HOME/rdbms/admin/ 下的 utluiobj.sql 來比較升級導致的新失效物件。

7.15 啟用之前在第4.14步驟停掉的所有 batch 和 cron job

參考


NOTE:1585343.1 - Scripts to automatically update the RDBMS DST (timezone) version in an 11gR2 or 12cR1 database .
- UPGRADE DATABASE FROM 11.1.0.7 TO 12.1.0.1, "OLDER TIMEZONE IN USE" OCCURRED
NOTE:1565816.1 - Upgrading to a higher release throws ORA-01031: insufficient privileges

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

相關文章