离开图形界面的那些日子 之二:Oracle 11.2.0.3 instance & database upgrade by Command Line

前言:    具体升级过程,请参考11g官方文档。这里仅以个人角度做记录与总结,升级部分过程转自网络,并且经过实际验证与修改,但是基本上都是围绕官方文档展开。


正文:  在Oracle 11.2.0.3 software静默部署完后,紧接着就是升级instance与database


这里可以提前明确的几个问题:

1. 文档参考 /E11882_01/server.112/e23633/upgrade.htm#CACGGHJC

2. 第一步必须要做一次冷备


RMAN冷备:  好处是最大可节省85%的冷备空间,但是如果要恢复,必须使用旧ORACLE_HOME下的RMAN进行。

RUN
{     
  shutdown immediate  
  startup mount      
  BACKUP as compressed backupset DATABASE FORMAT '/u01/coolbackup/gate01/before_upgrade_%u.bk';  
  BACKUP CURRENT CONTROLFILE FORMAT '/u01/coolbackup/gate01/before_upgrade_%u.cl';  
  alter database open;  
}



1. 在升级之前,确保所有的组件和对象都是valid:

col comp_name for a30
select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name; --针对组件

col object_name for a30
select substr(object_name,1,40) object_name,substr(owner,1,20) owner,object_type from dba_objects where status='INVALID' order by owner,object_type;

--针对对象如果有invalid的对象,运行utlrp.sql重新编译对象。


2. 确保sys和system下没有重复的对象:
select object_name, object_type from dba_objects where object_name||object_type in(select object_name||object_type from dba_objects where owner = 'SYS') and owner = 'SYSTEM';
上面这条语句只能返回以下4条记录:
OBJECT_NAME OBJECT_TYPE
---------------------------------------- ---------------
DBMS_REPCAT_AUTH PACKAGE BODY
DBMS_REPCAT_AUTH PACKAGE
AQ$_SCHEDULES_PRIMARY INDEX
AQ$_SCHEDULESTABLE
如果有其它记录返回,则必须根据下面这篇文档把重复记录删除:
How to Clean Up Duplicate Objects Owned by SYS and SYSTEM Schema [ID 1030426.6]


第三部分 - 升级前工作
Step 1. (没有必要,因为前面已经部署好11.2.0.3的software了)
从11gR2的OracleHome下拷贝以下文件至一个临时文件夹:
$ORACLE_HOME/rdbms/admin/utlu112i.sql

Step 2.
[oracle@redhat ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/,再运行: (这里是使用10g的ORACLE_HOME,但是调用11g home的脚本)
$ sqlplus '/ as sysdba'
SQL> spool /tmp/upgrade_info.log
SQL> @utlu112i.sql
SQL> spool off
SQL>
生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。

Step 3. (感觉是非必要的)
从下面这篇文档里可以下载到脚本
dbupgdiag.sql:
Script. to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql) [ID 556610.1]

运行这个脚本:
cd <location of the script>
$ sqlplus / as sysdba
sql> alter session set nls_language='American';
sql> @dbupgdiag.sql
sql> exit
如果该脚本报告有invalid对象,运行以下命令重编译无效对象:
$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus "/ as sysdba"
SQL> @utlrp.sql

Step 4.
从10.2开始,CONNECT角色的权限变少了,所以如果你是从10.2之前升级到11g的话,升级之后,需要重新授予缺少的权限,
但是如果是从10.2及之后升级到11g的话,就不需要重新赋权限了,本例是从10.2.0.4升级到11g的,因此不需要该步骤。

Step 5.
生成重建dblink的脚本,以防万一数据库需要降级。和Step 4一样,本例是从10.2.0.4升级到11g的,因此不需要该步骤。

Step 6.
检查Timezone版本,主要参考:
Actions For DST Updates When Upgrading To Or Applying The 11.2.0.2 Patchset [ID 1201253.1]
注意:11g的软件里已经自带了版本1-14的Timezone。
先检查一下当前timezone版本:
SQL> conn / as sysdba
Connected.
SQL>SELECT version FROM v$timezone_file;
根据当前timezone的版本,又分三种情况:
1)等于14:这已经是11g需要的版本了,所以升级前后都不需要做任何事,这种情况很罕见。
2)高于14:升级前,必须得给11g软件打上该timezone版本的DST补丁,这种情况也很罕见。
3)低于14:大多数都是这种情况,在升级前不需要在11g软件层面打补丁,在升级后需要再数据库层面将Timezone升级至14,具体看后面的步骤

Step 7.
检查国家字符集是否是UTF8或AL16UTF16:
select value from NLS_DATABASE_PARAMETERS where parameter = 'NLS_NCHAR_CHARACTERSET';
如果是,则什么都不用做;如果不是,那你就惨了,跟着下面长长的这篇文档一步一步做吧:
The National Character Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i,10g and 11g [ID 276914.1]

Step 8.
收集统计信息,以减少停机时间:
$ sqlplus "/as sysdba"
SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

Step 9.
如果你有开启Vault,那么你需要先在11gR2软件下禁用Vault,等升级结束后,再启用Vault,否则会在升级过程中报错。

Step 10. (实际上也可以删掉资料库,待升级完后重建)
备份Enterprise Manager Database Control Data,因为本例并没有使用EM,所以不需要该步骤。

删除资料库步骤:
drop user sysman cascade;
drop role MGMT_USER;
drop user MGMT_VIEW cascade;
drop public synonym MGMT_TARGET_BLACKOUTS;
drop public synonym SETEMVIEWUSERCONTEXT; 

重建步骤:在命令行下执行以下命令
emca -repos recreate    如果是第一次安装就  emca -repos create
emctl stop agent
emca -config dbcontrol db
emctl start dbconsole


Step 11.
配置网络ACL's,在本例中不需要配置。

Step 12.
使用以下语句生产分析数据字典的脚本 (as sysdba):
Set verify off
Set space 0
Set line 120
Set heading off
Set feedback off
Set pages 1000
Spool /tmp/analyze_cms01.sql

SELECT 'Analyze cluster "'||cluster_name||'" validate structure cascade;'
FROM dba_clusters
WHERE owner='SYS'
UNION
SELECT 'Analyze table "'||table_name||'" validate structure cascade;'
FROM dba_tables
WHERE owner='SYS'
AND partitioned='NO'
AND (iot_type='IOT' OR iot_type is NULL)
UNION
SELECT 'Analyze table "'||table_name||'" validate structure cascade into invalid_rows;'
FROM dba_tables
WHERE owner='SYS'
AND partitioned='YES';

spool off


生成的脚本名称是:analyze.sql

现在运行该脚本(需要先手动删掉头尾的无用字符串):
$ sqlplus "/ as sysdba"
SQL> @$ORACLE_HOME/rdbms/admin/utlvalid.sql
SQL> @analyze.sql


Step 13.
确保所有的snapshot都已被成功刷新,且replication已被关闭:
SELECT DISTINCT(TRUNC(last_refresh)) FROM dba_snapshot_refresh_times;   

Step 14.
确保当前没有文件需要介质
恢复:
SELECT * FROM v$recover_file;
上面语句没有返回结果才是正确的。

Step 15.
确保当前没有文件运行在备份模式下:
SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';
上面语句没有返回结果才是正确的。

Step 16.
解决分布式事务。
先查询是否还有分布式事务:
SQL> select * from dba_2pc_pending;
如果有返回结果,则:

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

Step 17.
检查是否有Standby数据库存在:

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

如果有返回结果,则在升级之前,要保证Standby和Primary是处于同步的状态。

Step 18.
禁用所有的batch和cron jobs   (##############################################!!!!!!!!!!!!!!!!!!!!!!!!!!!)


Step 19.
确保用户SYS和SYSTEM的默认表空间都是SYSTEM:
SQL> SELECT username, default_tablespace
FROM dba_users
WHERE username in ('SYS','SYSTEM');
如果不是,则要用以下语句修改为SYSTEM:
SQL> ALTER user SYS default tablespace SYSTEM;
SQL> ALTER user SYSTEM default tablespace SYSTEM;

Step 20.
确保AUD$表建在SYS用户下和SYSTEM表空间下:
SQL> SELECT owner,tablespace_name
FROM dba_tables
WHERE table_name='AUD$';
如果不是,则要做相应的修改。

Step 21
.
检查是否有外部认证的SSL用户:
SQL> SELECT name FROM sys.user$ WHERE ext_username IS NOT NULL AND password = 'GLOBAL';
如果有,则在升级之后记得要做Step 34。

Step 22
. (前面已经做过全备了,控制文件也包含在里面,这里是不必要的关心的。并且大版本升级肯定不会公用同一个ORACLE_HOME,旧的tnsname.ora, listener.ora会一直保留)
记下数据文件、联机日志文件和控制文件的位置:
SQL> SELECT name FROM v$controlfile;
SQL> SELECT file_name FROM dba_data_files;
SQL> SELECT group#, member FROM v$logfile;
且备份listener.ora, tnsnames.ora, sqlnet.ora等文件。  (#####################################################################)

Step 23.
停止listener: (不必,特别是在多instance的环境下! 其他实例还要用提供服务的!)
$ lsnrctl stop
停止其它可执行程序,如dbconsole, isqlplus等
$ emctl stop dbconsole
$ isqlplusctl stop


Step 24.
以10g的pfile为模板,并根据Step 2生成的upgrade_info.log里的建议,为11g创建一个新的pfile。  (diagnostic_dest 等于oracle_base)

需要修改的参数有 diagnostic_dest、OPTIMIZER_FEATURES_ENABLE,剩下的两个升级完最后在改。

Step 25.
在10g ORACLE_HOME下 ,关闭数据库:

$ sqlplus "/as sysdba"
SQL> shutdown immediate;
接着对全库做个冷备。(不需要,前面已经备份)

Step 26.
如果数据库原本是运行在archive模式下,最好先改为noarchive,这样可以减少升级停机时间,升级成功后再重新改回archive模式。

Step 27.
该步骤是针对Windows系统的,本例略过。


第四部分 - 升级
Step 28.
升级前的检查步骤基本上已经完成了,在跑升级脚本之前,先临时把把相关参数改为指向11g ORACLE_HOME:

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export SQLPATH=$ORACLE_HOME/sqlplus/admin/:$ORACLE_HOME/rdbms/admin/  
export EDITOR=vi

接着修改oratab中的内容,使其指向新的11g Home目录:

Sample /etc/oratab


#orcl:/opt/oracle/product/10.2/db_1:N
orcl:/opt/oracle/product/11.2.0/dbhome_1:N


Step 29.
前面所有的一切准备,都是为了这一步能成功执行,先把数据库起到upgrade状态: (这里是使用11g的ORACLE_HOME)
(这里也侧面说明了,只要db_name吻合,controlfile及dump 路径正确,一个database是可以被任意instance  open的)
$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus "/ as sysdba"
SQL> startup UPGRADE

接着开始跑升级脚本:

SQL> set echo on
SQL> SPOOL /tmp/upgrade_gate01.log
SQL> ! date
SQL> @catupgrd.sql
SQL> ! date
SQL> spool off


这个脚本大概持续1.5个小时,脚本的最后会自动关闭数据库,并会自动退出sqlplus。升级脚本跑完之后,再跑下面这个脚本,检查数据库状态:

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

如果该报告中包含错误,请查阅相关文档解决,直到没有错误之后,再跑下面的脚本:

SQL> @catuppst.sql

前面的升级脚本是运行在upgrade模式下,该脚本主要是在open模式下做些升级动作,不需要花很多时间。
接着重新编译一下无效对象:

SQL> @utlrp.sql

最后,再跑一下Step 3中的
dbupgdiag.sql,确保数据库是好的。

第五部分 - 升级后工作

Step 30(这里先不做,到 step37 再做)
修改listener.ora,使listener执行新的11g Home,然后重新启动listener:
lsnrctl start

Step 31.
再次检查Step 28中设置的环境变量确实是指向了新的11g Home。

Step 32.
Timezone数据库层面的升级。
注意:该步骤是否执行是和Step 6中的检查结果相关的,只有当Timezone的版本小于14时,才需要执行该步骤。

主要参考:
Updating the RDBMS DST version in 11gR2 (11.2.0.1 and up) using DBMS_DST [ID 977512.1]
1)Timezone升级前的准备工作:
先检查一下当前的timezone版本:
conn / as sysdba
SELECT version FROM v$timezone_file;
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE 'DST_%' ORDER BY PROPERTY_NAME;

一个典型的输出是:
PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 4
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE

然后开始准备工作:

alter session set "_with_subquery"=materialize;
exec DBMS_DST.BEGIN_PREPARE(14);

接着检查准备状态:

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

一个典型的输出是:
PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 4
DST_SECONDARY_TT_VERSION 14
DST_UPGRADE_STATE PREPARE

-- truncate logging tables if they exist.

TRUNCATE TABLE SYS.DST$TRIGGER_TABLE;
TRUNCATE TABLE sys.dst$affected_tables;
TRUNCATE TABLE sys.dst$error_table;

-- log affected data

set serveroutput on
BEGIN
DBMS_DST.FIND_AFFECTED_TABLES
(affected_tables => 'sys.dst$affected_tables',
log_errors => TRUE,
log_errors_table => 'sys.dst$error_table');
END;
/


下面的语句都不能有返回结果:
SELECT * FROM sys.dst$affected_tables;
SELECT * FROM sys.dst$error_table;
SELECT * FROM sys.dst$error_table where ERROR_NUMBER= '1883';
SELECT * FROM sys.dst$error_table where ERROR_NUMBER= '1878';
SELECT * FROM sys.dst$error_table where ERROR_NUMBER not in ('1878','1883');

-- end prepare window, the rows above will stay in those tables.
EXEC DBMS_DST.END_PREPARE;
-- check if this is ended
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

一个典型的输出是:
PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 4
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE

2)真正开始升级Timezone

conn / as sysdba
shutdown immediate;
startup upgrade;
set serveroutput on
purge dba_recyclebin;
TRUNCATE TABLE SYS.DST$TRIGGER_TABLE;
TRUNCATE TABLE sys.dst$affected_tables;
TRUNCATE TABLE sys.dst$error_table;
alter session set "_with_subquery"=materialize;
EXEC DBMS_DST.BEGIN_UPGRADE(14);

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

一个典型的输出是:

PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 14
DST_SECONDARY_TT_VERSION 4
DST_UPGRADE_STATE UPGRADE

下面这条语句应该没有返回结果:
SELECT OWNER, TABLE_NAME, UPGRADE_IN_PROGRESS FROM ALL_TSTZ_TABLES where UPGRADE_IN_PROGRESS='YES';

重启数据库:
shutdown immediate
startup

升级相关的table:
alter session set "_with_subquery"=materialize;
set serveroutput on
VAR numfail number
BEGIN
DBMS_DST.UPGRADE_DATABASE(:numfail,
parallel => TRUE,
log_errors => TRUE,
log_errors_table => 'SYS.DST$ERROR_TABLE',
log_triggers_table => 'SYS.DST$TRIGGER_TABLE',
error_on_overlap_time => FALSE,
error_on_nonexisting_time => FALSE);
DBMS_OUTPUT.PUT_LINE('Failures:'|| :numfail);
END;
/

如果没有错误,则结束升级:

VAR fail number
BEGIN
DBMS_DST.END_UPGRADE(:fail);
DBMS_OUTPUT.PUT_LINE('Failures:'|| :fail);
END;
/

最后一次检查:

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

典型输出是:

PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 14
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE


SELECT * FROM v$timezone_file;
FILENAME VERSION
-------------------- ----------
timezlrg_14.dat 14


Step 33.
该步骤可省略。

Step 34.
升级外部认证SSL用户。
由于本例是从10.2升级到11g,所以可忽略该步骤。

Step 35.
如果在Step 9中,你关闭了Vault,则必须在此步骤重新启用。
Note 453903.1
- Enabling and Disabling Oracle Database Vault in UNIX

Step 36
.
忽略

Step 37.
创建spfile,listener.ora  tnsname.ora ,
SQL> create spfile from pfile;

cp /u01/app/oracle/product/10.2.0/network/admin/listener.ora /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/

修改linstener.ora 中ORACLE_HOME路径,并启动新的linstener

cp /u01/app/oracle/product/10.2.0/network/admin/tnsnames.ora /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/

随后可以用tnsping进行解析测试


Step 38.

锁住系统用户,可忽略。


Step 39.
升级Oracle Text,可忽略。

Step 40.
升级Oracle Clusterware,可忽略。

Step 41.
配置EM,可忽略。

最后,记得修改compatible参数,与core_dump_dest参数:
SQL> ALTER SYSTEM SET COMPATIBLE = '11.2.0' SCOPE=SPFILE;

注意core_dump_dest不修改并不会有错误,但是升级后仍会沿用旧路径,一旦旧ORACLE_HOME被移除,是有出错可能的,所以建议修改好。并且我发现oracle实例启动时,是会自动在正确的位置创建好cdump的。

特别注意 “ OPTIMIZER_FEATURES_ENABLE  ”


Step 41.正式更改oracle用户环境变量

#for oracle 11.2.0.3
stty erase ^?         
EDITOR=vim
ORACLE_BASE=/u01/app/oracle   
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1  
PATH=$ORACLE_HOME/bin:$PATH
SQLPATH=$ORACLE_HOME/sqlplus/admin/:$ORACLE_HOME/rdbms/admin/   
export EDITOR  ORACLE_BASE ORACLE_HOME PATH SQLPATH



Step 43. 核实升级后的组件版本
SQL> col comp_name for a30
SQL> select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;

COMP_NAME               STATUS                        VERSION
------------------------------ -------------------------------------------- ----------------------------------------
JServer JAVA Virtual Machine   VALID                        11.2.0.3.0
OLAP Analytic Workspace        VALID                        11.2.0.3.0
OLAP Catalog               VALID                                      11.2.0.3.0
Oracle Data Mining           VALID                                 11.2.0.3.0
Oracle Database Catalog Views  VALID                        11.2.0.3.0
Oracle Database Java Packages  VALID                        11.2.0.3.0
Oracle Database Packages and T VALID                        11.2.0.3.0
Oracle Expression Filter       VALID                            11.2.0.3.0
Oracle Multimedia           VALID                                   11.2.0.3.0
Oracle OLAP API            VALID                                     11.2.0.3.0
Oracle Rule Manager           VALID                              11.2.0.3.0
Oracle Text               VALID                                            11.2.0.3.0
Oracle Workspace Manager       VALID                        11.2.0.3.0
Oracle XDK               VALID                                             11.2.0.3.0
Oracle XML Database           VALID                        11.2.0.3.0
Spatial                VALID                                                 11.2.0.3.0

16 rows selected.



完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值