oracle linux 11.2.0.4 单实例升级到upgrade 19c(single instance)
背景:
由于现上的rds数据库需要在2021年1月1日之前,从oracle 11.2.0.4升级到19c,现在需要我测试升级后业务兼容不,所以,需要我把准生产linux 11.2.0.4的oracle升级到19c
文章参考资料来自support文档 ID 2548962.1,Doc ID 2577572.1
oracle升级到19C有直接和间接升级,11.2.0.4以下的版本需要先升级到11.2.0.4然后再升级到19c;11.2.0.4以上版本可以直接升级。而我的版本是11.2.0.4,所以升级成非CDB的数据库。
19c升级步骤
升级环境
服务器os linux7.5 内存256G cpu 32核
oracle 版本 11.2.0.4 数据量240G
oracle 19c软件静默安装时间约5-10分钟
oracle 11.2.0.4升级到19c升级时间 约60分钟
1.备份
这个可以逻辑的或RMAN的备份
2.安装19软件的步骤
把新建的ORACLE_HOME目录(我的是/u01/app/oracle/product/19c/dbhome_1)建好,解压下载的19软件(修改解压文件的权限)
oracle用户:
mkdir -p /u01/app/oracle/product/19c/dbhome_1 (root用户需要修改权限)
cd /u01/app/oracle/product/19c/dbhome_1/
静默安装的话:
设置好
新的ORACLE_HOME,ORACLE_BASE
对应的参数按照实际需要进行修改
./runInstaller -ignorePrereq -waitforcompletion -silent \
-responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_HOSTNAME=${ORACLE_HOSTNAME} \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=${ORA_INVENTORY} \
SELECTED_LANGUAGES=en,en_GB \
ORACLE_HOME=${ORACLE_HOME} \
ORACLE_BASE=${ORACLE_BASE} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSBACKUPDBA_GROUP=dba \
oracle.install.db.OSDGDBA_GROUP=dba \
oracle.install.db.OSKMDBA_GROUP=dba \
oracle.install.db.OSRACDBA_GROUP=dba \
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
DECLINE_SECURITY_UPDATES=true
图形界面安装:
./runInstaller -ignoreInternalDriverError
3.进行升级前检查
3.1清理数据库
清空回收站
检查 SYS 及 SYSTEM 用户的失效对象
检查 SYS 及 SYSTEM 用户下的重复对象
检查失效的、必需的、废弃的组件
3.2 检查所有的物化视图
检查所有的物化视图的状态,刷新所有没有刷新的物化视图。
检查物化视图日志的大小,如果物化视图日志的行数非零,那么刷新物化视图。
检查 direct loader 日志以及 PMOP 日志(分区维护操作日志),如果 direct loader log 或者 PMOP 日志非空,那么刷新日志显示的物化视图。升级数据库前,必须确保所有的物化视图都已经刷新完毕。
执行下面的 SQL 查询:
3.3Schema-Only 的用户以及升级密码状态为 EXPIRED 的用户
在开始升级之前,请确定是否要对密码处于EXPIRED状态且其帐户处于LOCKED状态的默认Oracle数据库帐户使用密码身份验证。
在升级到 Oracle Database 19c 之后,默认的 Oracle 账号(没有设置密码并且处于 EXPIRED 和 LOCKED 状态)会被置为 NO AUTHENTICATION 状态。
由于此新功能,这些默认账号会变为 schema-only 帐户,并无法使用密码验证。此功能的好处是管理员不再需要定期修改这些Oracle默认账号的密码。
此功能还可以降低未授权者使用默认密码侵入这些帐户的安全风险。
3.4复制 Transparent Encryption Oracle 钱包
如果使用了带 Oracle 钱包的 Transparent Data Encryption (TDE),那么拷贝 thesqlnet.ora 和 wallet 文件到新的Oracle home。在升级前需要手工拷贝 sqlnet.ora 和 wallet 文件。
- 以授权用户身份登录。
- 手工拷贝 sqlnet.ora,wallet 文件以及 ewallet.p12,到新的 Oracle home。
打开数据库 wallet。
例如:
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN
3.5理解密码大小写敏感
从 Oracle Database 12c release 2 (12.2) 开始,默认的基于密码验证的协议排除了大小写不敏感的 10g 版本的密码。默认的SQLNET.ORA文件中参数SQLNET.ALLOWED_LOGON_VERSION_SERVER被设置成了 12 (排他模式)。
为了安全起见,Oracle建议使用大小写敏感的密码验证。这是默认的设置。但是在升级数据库的时候可以短暂的关闭大小写敏感的密码验证。在升级后,可以再决定是否启用大小写敏感的密码验证。
在升级前,Oracle建议您检查是否新的密码验证会影响您的应用。可以做下面的检查:
- 检查是否有用户使用了 10g 大小写不敏感的密码验证方式。
- 检查是否使用了尚未安装 CPUOct2012 补丁的11.2.0.3或者更早版本的客户端,或者应用了这个补丁但尚未启用大小写敏感的密码版本。
- 确认您并未设置SEC_CASE_SENSITIVE_LOGON成FALSE。设置SEC_CASE_SENSITIVE_LOGON为FALSE就无法启用大小写敏感的密码版本了(11G和12C的密码版本)
3.6对只读表空间升级
以 -T 参数使用 Parallel Upgrade Utility 可以在升级时把用户表空间置为只读。 因为数据库可以读取之前版本创建的数据文件 header, 所以在升级时我们不需要做额外的操作。当升级完成后,表空间被置为读写时,文件 header 会自动被更新。如果升级失败,无法把表空间重新 online,那么检查升级日志。日志中包含把表空间重新 online 的语句。可以在数据库中或者每个pdb里手工执行来 online 表空间。
在升级日志文件中找到表空间相关的命令
如果升级失败可以检查升级的日志 (Oracle_base/cfgtoologs/dbua), 并且手工执行日志中的命令来 online 表空间。可以检查如下日志:
Non-CDB 升级: catupgrd0.log
PDB 数据库: catupgrdpdbname0.log, 这里 pdbname 是要升级的 pdb 的名字。
在每个日志文件的开始部分,可以找到把表空间置为只读的命令:
Tablespace altered.
而在每个日志文件的结尾部分,可以找到把表空间置为读写的SQL命令:
Tablespace altered.
出于安全考虑,不同的 Windows 账户配置为 Oracle home 不允许共享同一个 Oracle Base。
步骤 4: Preupgrade 步骤
在源库执行 Preupgrade 脚本
升级前在 11.2 数据库上执行 OLS preprocess 脚本:
如果要升级的数据库安装有 Oracle Label Security,那么赋予SYS以DV_PATCH_ADMIN的角色
升级前在 11.2 数据库上执行 OLS preprocess 脚本:
1. 从 19c 的 Oracle Home 下拷贝以下脚本到源库的 Oracle Home(11.2) 下。
ORACLE_HOME/rdbms/admin/emremove.sql
ORACLE_HOME/olap/admin/catnoamd.sql
2. 启动 SQL*Plus 并以 DVOWNER 登录到要升级的数据库。
3. 执行下面的SQL:
4. 使用 SYS as SYSDBA 登陆数据库:
5. 执行 Data Vault preprocess 脚本:
ORACLE_HOME/rdbms/admin/emremove.sql
ORACLE_HOME/olap/admin/catnoamd.sql
6. 执行完毕后,以 DVOWNER 登陆数据库
7. 执行下面的SQL:
对于Database Vault,赋予SYS以DV_PATCH_ADMIN的角色
如果启用了Database Vault,那么也需要做对应的检查,检查步骤需要执行下面的SQL脚本 - olspreupgrade.sql, emremove.sql, catnoamd.sql
以 DVOWNER 登陆要升级的数据库
执行下面的SQL:
使用 emremove.sql 手工删除 DB control
关闭 DB control
使用 sysdba 登陆
SQL>SET SERVEROUTPUT ON
SQL>@emremove.sql >> Script located in new 12c ORACLE_HOME/rdbms/admin
从系统中手工删除ORACLE_HOME/HOSTNAME_SID/ 和 ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_HOSTNAME_SID 目录
如果是 windows 系统则删除 DB Console 的系统服务 OracleDBConsoleSID
确保升级前所有的文件都没有处于备份模式
执行下面的语句:
清空回收站
要清空回收站,执行下面的语句:
注意: 升级前务必清空回收站来避免 ORA-00600 错误并且减少升级时间。
性能方面
保存性能相关指标
检查网络性能
收集优化器统计信息
收集统计信息可以减少停机时间,Oracle建议使用 DBMS_STATS.GATHER_DICTIONARY_STATS 来收集这些统计信息,比如:
检查时区设置
源库的 time zone 文件版本应该小于或者等于目标库的 time zone 文件版本。如果源库的 time zone 文件版本更高,那么需要升级目标库的 time zone 文件版本来对应源库的 time zone 文件。
关于升级 Oracle OLAP Data Security Policies
在 11g 数据库上定义的 Data security roles 不能自动转换成 ORAS。所以在升级前,需要删除所有在 11g 数据库上定义的 data security roles。升级后可以使用新版本的 Analytic Workspace Manager 重新定义 data security roles。
如果从 11g 升级到 12c 之前未删除 data security roles,那么所有的 data security policies 以及 data security role 都会在新版本上失效。
步骤
5.升级具体步骤
19c linux7需要安装的yum包:
yum install -y bc yum install -y binutils yum install -y compat-libcap1 yum install -y compat-libstdc++-33 #yum install -y dtrace-modules #yum install -y dtrace-modules-headers #yum install -y dtrace-modules-provider-headers yum install -y dtrace-utils yum install -y elfutils-libelf yum install -y elfutils-libelf-devel yum install -y fontconfig-devel yum install -y glibc yum install -y glibc-devel yum install -y ksh yum install -y libaio yum install -y libaio-devel yum install -y libdtrace-ctf-devel yum install -y libXrender yum install -y libXrender-devel yum install -y libX11 yum install -y libXau yum install -y libXi yum install -y libXtst yum install -y libgcc yum install -y librdmacm-devel yum install -y libstdc++ yum install -y libstdc++-devel yum install -y libxcb yum install -y make yum install -y net-tools # Clusterware yum install -y nfs-utils # ACFS yum install -y python # ACFS yum install -y python-configshell # ACFS yum install -y python-rtslib # ACFS yum install -y python-six # ACFS yum install -y targetcli # ACFS yum install -y smartmontools yum install -y sysstat # Added by me. yum install -y unixODBC
linux 8需要安装的包:
dnf install -y bc dnf install -y binutils #dnf install -y compat-libcap1 dnf install -y compat-libstdc++-33 #dnf install -y dtrace-modules #dnf install -y dtrace-modules-headers #dnf install -y dtrace-modules-provider-headers #dnf install -y dtrace-utils dnf install -y elfutils-libelf dnf install -y elfutils-libelf-devel dnf install -y fontconfig-devel dnf install -y glibc dnf install -y glibc-devel dnf install -y ksh dnf install -y libaio dnf install -y libaio-devel #dnf install -y libdtrace-ctf-devel dnf install -y libXrender dnf install -y libXrender-devel dnf install -y libX11 dnf install -y libXau dnf install -y libXi dnf install -y libXtst dnf install -y libgcc dnf install -y librdmacm-devel dnf install -y libstdc++ dnf install -y libstdc++-devel dnf install -y libxcb dnf install -y make dnf install -y net-tools # Clusterware dnf install -y nfs-utils # ACFS dnf install -y python # ACFS dnf install -y python-configshell # ACFS dnf install -y python-rtslib # ACFS dnf install -y python-six # ACFS dnf install -y targetcli # ACFS dnf install -y smartmontools dnf install -y sysstat # Added by me. dnf install -y unixODBC # New for OL8 dnf install -y libnsl dnf install -y libnsl.i686 dnf install -y libnsl2 dnf install -y libnsl2.i686
启动预检查:
export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4
/u01/app/oracle/product/11.2.0/dbhome_1/jdk/bin/java -jar /u01/app/oracle/product/19c/dbhome_1/rdbms/admin/preupgrade.jar FILE TEXT DIR /u01/app/oracle/precheck
查看生成的
/u01/app/oracle/precheck下的日志
如果有问题的,执行 postupgrade_fixups.sql
安装19软件--这一步已经安装了。
db_recovery_file_dest string /u01/app/oracle/fast_recovery_area
db_recovery_file_dest_size big integer 80G 这个是、我是设置的很大。
5.1关闭数据库
PURGE DBA_RECYCLEBIN;
lsnrctl stop;
SHUTDOWN IMMEDIATE;
为升级新的Oracle Home做准备
- 从要升级的数据库 Home 拷贝配置文件到新的版本的Oracle Home中。
- 如果您有一个 password 文件,那么把它从旧的 Oracle home 拷贝到新的 Oracle home。推荐重建 password 文件以利用 orapwd 的新功能,如果有的话。
- 从参数文件中删除所有废弃的参数。在新的版本的数据库里有一些参数已经被废弃。从要启动新版本的数据库的参数文件中删除所有被废弃的参数,否则会在启动时产生错误。同时,修改那些在新版本里格式已经被改变的参数。
- 如果要升级的是集群数据库,那么需要在升级前修改参数 CLUSTER_DATABASE 为 FALSE。
设置环境变量指向目标 ORACLE_HOME
新的ORACLE_HOME为
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE=/u01/app/oracle --我的还是之前那个base目录
从旧的Oracle home下拷贝 SPFILE.ORA 或者 INIT.ORA到目标Oracle home,PURGE DBA_RECYCLEBIN然后把
使用目标 ORACLE_HOME(设置 ORACLE_HOME 为目标 ORACLE_HOME)启动数据库到 upgrade 模式(后续需要把sqlnet.ora,tnsnames.ora,listerner.ora复制到新的目录)
cp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfiletest19c.ora /u01/app/oracle/product/19c/dbhome_1/dbs/
cp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwtest19c /u01/app/oracle/product/19c/dbhome_1/dbs/
startup upgrade;
cd $ORACLE_HOME/bin
./dbupgrade
耐心等待约1个小时结束如下:
执行 Post-Upgrade Status 工具, utlusts.sql 并且检查升级的日志。在新的版本下执行 Post-Upgrade Status 工具。
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?/rdbms/admin/utlusts.sql
注意: 之前版本的 utluNNNs.sql 在 19c 上被替换为 utlusts.sql
注意: 如果执行 utlusts.sql 时碰到错误 "ORA-06502: PL/SQL: numeric or value error: character string buffer too small" ,那么执行
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?/rdbms/admin/utlusts.sql
如果使用了Oracle Clusterware,设置了 CLUSTER_DATABASE=TRUE 那么你必须升级数据库对应的 Oracle Clusterware keys。在19c上运行 srvctl 来做这件事,比如:
检查升级状态
执行 dbupgdiag.sql 并检查日志。可以从 Note 556610.1 下载这个脚本。
编译失效对象
执行 utlrp.sql (多次) 来使它们生效,直到失效对象的个数不再改变。
SQL> @?/rdbms/admin/utlrp.sql
步骤6: 升级后步骤
在 Linux 和 Unix 上设置环境变量
确保下面的环境变量指向了新的 ORACLE_HOME 对应的目录:
ORACLE_HOME
PATH
更新 oratab 文件
修改 /etc/oratab 文件对应的条目指向新的 ORACLE_HOME 目录
修改 /etc/oratab 文件
Post-upgrade fixup 脚本
执行 pre-upgrade 产生的 post-upgrade fixup 脚本
后续把tns,监听文件,以及sqlnet.ora拷贝到到指定的新目录中,入股是11G升到19C,需要在sqlnet.ora中加入:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
执行 Post-Upgrade Status 工具, utlusts.sql 并且检查升级的日志。在新的版本下执行 Post-Upgrade Status 工具。
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?ORACLE_HOME/rdbms/admin/utlusts.sql
注意: 之前版本的 utluNNNs.sql 在 19c 上被替换为 utlusts.sql
注意: 如果执行 utlusts.sql 时碰到错误 "ORA-06502: PL/SQL: numeric or value error: character string buffer too small" ,那么执行
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?/rdbms/admin/utlusts.sql
如果使用了Oracle Clusterware,设置了 CLUSTER_DATABASE=TRUE 那么你必须升级数据库对应的 Oracle Clusterware keys。在19c上运行 srvctl 来做这件事,比如:
$ORACLE_HOME/bin/srvctl upgrade database -db name -o ORACLE_HOME
检查升级状态
执行 dbupgdiag.sql 并检查日志。可以从 Note 556610.1 下载这个脚本。
编译失效对象
执行 utlrp.sql (多次) 来使它们生效,直到失效对象的个数不再改变。
$ sqlplus "/ AS SYSDBA"
SQL> @?/rdbms/admin/utlrp.sql
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER:控制可以连接到12c数据库的客户端版本(client -->12c server )
SQLNET.ALLOWED_LOGON_VERSION_CLIENT:控制12c数据库可以连到哪些版本的数据库(12c server -->其它版本dbserver),例如:控制通过DB LINK可连接到哪些版本的oracle库。
查看升级的组件:
set lin 200 pages 200
col COMP_NAME for a60
select substr(comp_id,1,15) comp_id,substr(comp_name,1,30)
comp_name,substr(version,1,10) version,status
from dba_registry order by modified;
select * from dba_registry_history;
后续还需要、修改时区以及兼容版本参数:
$ORACLE_HOME/rdbms/admin/utltz_countstar.sql
alter system set compatible='19.0.0' scope=spfile; 并进行重启。