在Oracle 19c 数据库中升级和配置文件脚本
简而言之:将 Oracle 数据库升级到任何版本时,我建议:
- glogin.sql从目标 Oracle Home(sqlplus/admin子文件夹)中删除该文件。
- login.sql从当前目录中删除(如果存在)。
- 取消设置SQLPATH环境变量。
如果您想了解更多细节,请继续阅读。这篇博文是由我前几天看到的一条推文开始的。我依稀记得我在 Oracle 之外(在现实世界中)的日子里,我使用的升级运行手册有类似的步骤。
先假设一下
如果你不这样做会发生什么?自动升级可能会失败:
-------------------------------------------------
Errors in database [CDB1]
Stage [DBUPGRADE]
Operation [STOPPED]
Status [ERROR]
Info [
Error: UPG-1400
UPGRADE FAILED [CDB1]
Cause: Database upgrade failed with errors
For further details, see the log file located at /home/oracle/upg_logs/CDB1/CDB1/100/autoupgrade_20200804_user.log]
命令行升级可能会失败,原因是:
Unexpected error encountered in catctlMain; Error Stack Below; exiting
Died at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 9188.
at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 9188.
main::catctlDie("\x{a}Unexpected error encountered in catconInit; exiting\x{a} No chil"...) called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 37
27
main::catctlDBLogon("/u01/app/oracle/product/19/rdbms/admin", "/home/oracle/upg_logs/CDB1/CDB1/100/dbupgrade", "catupgrd20200804112601", "CDB\$ROOT", 0, 4) ca
lled at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 3782
main::catctlLogon() called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 1422
main::catctlMain() called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 1370
eval {...} called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 1368
------------------------------------------------------
CATCTL FATAL ERROR
------------------------------------------------------
并且数据库升级助手可能会像这样失败:
当您进一步挖掘日志时,您会发现ORA-04023: Object SYS.STANDARD could not be validated or authorized.
请注意,我写道可能会发生错误。那是因为这完全取决于您输入的内容glogin.sql
或login.sql.
有些事情可能会奏效——但有些肯定不会。经常使用的一件事是SET SERVEROUT ON
肯定会破坏升级。
为什么
glogin.sql
正式命名为站点配置文件脚本并login.sql
命名为用户配置文件脚本。如文档中所述,它们在您每次启动SQL*Plus
时都会执行,并且可以包含您在SQL*Plus
中键入的任何内容。您在 SQL*Plus 中使用的许多命令都在使用数据库中的功能。SET SERVEROUT ON以使用数据库包为例DBMS_OUTPUT
。
升级数据库时,它会以UPGRADE模式启动,这会极大地改变数据库的行为。此外,升级需要更改数据库中的许多功能。它通过调用 SQL*Plus 来执行脚本来做到这一点——而且它必须执行许多脚本。简而言之,它类似于:
sqlplus / as sysdba @upgrade.sql
如果您在升级期间定义配置文件脚本,您实际上是在升级脚本之前注入要执行的代码。如果您的配置文件脚本尝试使用暂时不起作用的功能,则会发生错误。某些脚本设置为退出,SQLERROR这将中断升级。其他人则忽略该错误,以便稍后在检查日志文件中是否有意外错误消息时失败。
想象一下,当升级尝试替换软件包DBMS_OUTPUT
并且同时有一个配置文件脚本设置SET SERVEROUT ON.
我们正在尝试使用被替换的相同功能。
如何操作
你可以使用这个小例子来避免这个问题:
export TARGET_ORACLE_HOME=/u01/app/oracle/product/19
mv $TARGET_ORACLE_HOME/sqlplus/admin/glogin.sql $TARGET_ORACLE_HOME/sqlplus/admin/glogin.sql.backup
mv login.sql login.sql.backup
export SQLPATH=
# Now start the upgrade using the preferred method
java -jar autoupgrade.jar ....
# Or
cd $TARGET_ORACLE_HOME/bin
dbupgrade
# Or
$TARGET_ORACLE_HOME/bin/dbua
现在怎么办
如果你glogin.sql
离题了,你可能会得到一个错误:
其他选项(命令行或 DBUA)根本没有检查。
我们正在努力使我们的文档更清楚地说明这个问题,所以期待很快就会看到更新。