1. Oracle 数据库升级前必要
的准备工作
by Maclean.liu
liu.maclean@gmail.com
www.oracledatabase12g.com
2. About Me
l Email:liu.maclean@gmail.com
l Blog:www.oracledatabase12g.com
l Oracle Certified Database Administrator Master 10g
and 11g
l Over 6 years experience with Oracle DBA technology
l Over 7 years experience with Linux technology
l Member Independent Oracle Users Group
l Member All China Users Group
l Presents for advanced Oracle topics: RAC,
DataGuard, Performance Tuning and Oracle Internal.
5. .............
upgrade failed
/* 在升级过程中出现了不可绕过的错误时,我们可能不得不回退数据库到还原点,也就是升级前*/
/* 关闭实例后,还原环境到 10g 下 */
SQL> startup mount;
/* 正式闪回到还原点 pre11gupgrd */
SQL> flashback database to restore point pre11gupgrd;
Flashback complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
/* 以 resetlogs 打开数据库 */
/* 之后有必要删除这一个还原点 */
SQL> select * from v$restore_point;
SCN DATABASE_INCARNATION# GUA STORAGE_SIZE
---------- --------------------- --- ------------
TIME
---------------------------------------------------------------------------
NAME
--------------------------------------------------------------------------------
5081633 3 YES 15941632
08-FEB-11 08.20.33.000000000 PM
PRE11GUPGRD
SQL> drop restore point pre11gupgrd;
Restore point dropped.
6. • 下载最新版本的预升级检查脚本(pre-upgrade check script),如 utlu102i.sql / utlu111i.sql /
utlu112i.sql;Metalink 文档 Note:884522.1 <How to Download and Run Oracle’s Database
Pre-Upgrade Utility> 指出了各版本 utluxxx 脚本的下载地址
/* 将升级信息 spool 到日志文件中 */
SQL> SPOOL /tmp/UPGRADE/utlu112i.log
SQL> @/tmp/UPGRADE/utlu112i.sql
• 需要关注 SYS 和 SYSTEM 用户模式下的失效对象,有必要在升级前修复所有的失效对象:
SELECT UNIQUE object_name, object_type, owner
FROM dba_objects
WHERE status = 'INVALID';
• 在升级完成后推荐执行 utlrp.sql 脚本以重新编译(Recompile)对象,从 11.1.0.7 开始升级前后的失效
对象将自动对比,执行?/rdbms/admin/utluiobj.sql 脚本可以列出对比信息,同时基表
registry$sys_inv_objs 和 registry$nonsys_inv_objs 分别列出了数据库中失效的 sys 或非 sys 对
象:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> @?/rdbms/admin/utluiobj.sql
.
Oracle Database 11.1 Post-Upgrade Invalid Objects Tool 02-08-2011 22:23:22
7. .
This tool lists post-upgrade invalid objects that were not invalid
prior to upgrade (it ignores pre-existing pre-upgrade invalid objects).
.
Owner Object Name Object Type
.
SH FWEEK_PSCAT_SALES_MV MATERIALIZED VIEW
PL/SQL procedure successfully completed.
3.解决升级过程中失效的组件(component)
• 确保该部分组件确实被 link 到目前的 Oracle 软件 2 进制可执行文件或库文件中
• 如果确认不会用到某些组件(component),想要通过手动彻底移除这部分组件(亦或者希望 reinstall 重
新安装这部分组件),那么可以参考以下文档:
Note:472937.1 Information On Installed Database Components/Schemas
Note.300056.1 Debug and Validate Invalid Objects
Note:753041.1 How to diagnose Components with NON VALID status
Note.733667.1 How to Determine if XDB is Being Used in the Database?
组件升级失败实例 1:数据库从 10.2 升级到 11.2,在 10g 的环境中 Database Vault 组件已经安装,
Database Vault 组件在升级 relink 前被 turned off,在升级到 11.2 的过程中 XDB 组件升级失败;
其原因在于安装或切换 Database Vault 将使得 XDB 组件失效,或者由 Bug 8942758 引起。
解决方案是在升级前执行 utlrp.sql 脚本重新编译失效对象和组件,在此例中执行 utlrp.sql 可以使 XDB 组件
valid.
组件升级失败实例 2:数据库从 10.2.0.4 升级到 11.1.0.7,在升级过程中"ORACLE SERVER"组件失效;
其原因在于 DMBS_SQLPA 包引用了某个不存在的列,该问题可以参考 metalink 文档 782735.1 和
Notes:605317.1/736353.1。
有效的解决方案是:
1.在升级前将 SYS.PLAN_TABLE$基表或者同义词 PUBLIC.PLAN_TABLE DROP 掉
2.若已执行了升级操作并遭遇了该问题,那么可以使用以下手段修复该问题:
@catplan.sql -- recreate the plan table
@dbmsxpln.sql -- reload dbms_xplan spec
@prvtxpln.plb -- reload dbms_xplan implementation
@prvtspao.plb -- reload dbms_sqlpa
alter package SYS.DBMS_SUMADVISOR compile ;