ORA-39700: database must be opened with UPGRADE option

本文介绍了一种从Oracle 11.2.0.3到11.2.0.4版本升级的具体步骤。通过重建控制文件、使用备份控制文件进行恢复、采用升级模式启动数据库并完成后续升级操作来解决版本不一致导致的问题。


环境 oracle 11G+linux+ASM

A库test1的oracle软件版本11.2.0.3.9
B库test2的oracle软件版本11.2.0.4.160119

背景:

用A库test1的备份还原成一套B库test2,但是由于两个库的软件版本不一致,没注意版本,直接open了。
是从低版本到高版本,故open时报错ORA-39700: database must be opened with UPGRADE option。

解决方法:
这时就需要用open失败时的redo log恢复
先重建控制文件:
重建控制文件的trace File 为recctl.sql
CREATE CONTROLFILE REUSE DATABASE "TEST2" RESETLOGS FORCE LOGGING NOARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 3
    MAXDATAFILES 3000
    MAXINSTANCES 8
    MAXLOGHISTORY 5344
LOGFILE
  GROUP 1 '+DATA_TEST2_MDG'  SIZE 1024M BLOCKSIZE 512,
  GROUP 2 '+DATA_TEST2_MDG'  SIZE 1024M BLOCKSIZE 512,
  GROUP 3 '+DATA_TEST2_MDG'  SIZE 1024M BLOCKSIZE 512,
  GROUP 4 '+DATA_TEST2_MDG'  SIZE 1024M BLOCKSIZE 512
DATAFILE
  '+DATA_TEST2_MDG/test2/datafile/system.1610.894856391',
  '+DATA_TEST2_MDG/test2/datafile/sysaux.1624.894856765',
  '+DATA_TEST2_MDG/test2/datafile/undotbs1.1237.894847477',
  '+DATA_TEST2_MDG/test2/datafile/users.1521.894854559',
  '+DATA_TEST2_MDG/test2/datafile/undotbs1.916.894838713',
  '+DATA_TEST2_MDG/test2/datafile/auddata_840.xtf'
CHARACTER SET ZHS16GBK
;

SQL> @recctl.sql

Control file created.

使用backup controlfile做recovery
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 9913448269590 generated at 12/22/2015 15:41:13 needed for
thread 1
ORA-00289: suggestion : +data_test2_mdg
ORA-15173: entry 'ARCHIVELOG' does not exist in directory 'TEST2'
ORA-00280: change 9913448269590 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
+DATA_TEST2_MDG/test2/ONLINELOG/group_1.1441.899134865       --输入当时是redo log进行恢复
Log applied.
Media recovery complete.             --恢复完成,注意恢复完成就不需要使用其他redo再恢复了,如果还需要继续恢复就数据第2个redolog。

恢复完成后,用upgrade模式启库:
alter database open resetlogs upgrade;

增加tempfile;

升级数据字典,如果是从11.2.0.4.X升级到11.2.0.4.160119则不需要执行此步骤。
@?/rdbms/admin/catupgrd.sql

修改dba_registry
shutdown immediate;
startup;
@?/rdbms/admin/catbundle.sql psu apply

编译无效对象
@?/rdbms/admin/utlrp.sql


### 解决 Oracle 数据库中的 ORA-00998 和 ORA-06512 错误 在 Oracle 数据库中,当执行动态 SQL 时,若未为表达式提供列别名,可能会遇到 `ORA-00998: must name this expression with a column alias` 错误。此错误通常出现在使用 `PIVOT` 操作或子查询中未明确指定列别名的情况下。此外,`ORA-06512` 错误表示在 PL/SQL 过程中某一行发生异常,通常与前一个错误相关联,指示错误发生的行号[^1]。 例如,在使用 `PIVOT` 时,若查询中包含未命名的表达式,Oracle 会抛出 `ORA-00998` 错误: ```sql SELECT * FROM ( SELECT year, product_name, amount FROM sales_data ) PIVOT ( SUM(amount) FOR product_name IN (10 AS "Electronics", 20 AS "Clothing") ); ``` 在上述查询中,`IN` 子句中的 `10 AS "Electronics"` 和 `20 AS "Clothing"` 是合法的,因为它们为每个值提供了别名。但如果遗漏了 `AS` 子句,如 `FOR product_name IN (10, 20)`,Oracle 会抛出 `ORA-00998` 错误,因为它无法为这些值生成列名[^1]。 在 PL/SQL 块中,若使用 `EXECUTE IMMEDIATE` 执行动态 SQL 时未正确处理列别名,也可能触发 `ORA-06512` 错误。例如: ```plsql DECLARE v_sql VARCHAR2(4000); BEGIN v_sql := 'SELECT * FROM ( SELECT year, product_name, amount FROM sales_data ) PIVOT ( SUM(amount) FOR product_name IN (10, 20) )'; EXECUTE IMMEDIATE v_sql; END; ``` 上述代码会因 `IN` 子句中未指定列别名而抛出 `ORA-00998` 错误,并在 `EXECUTE IMMEDIATE` 所在行触发 `ORA-06512` 错误。为避免此类错误,必须确保所有 `PIVOT` 列都具有明确的列别名[^1]。 #### 正确的写法如下: ```plsql DECLARE v_sql VARCHAR2(4000); v_in_list VARCHAR2(1000) := ''; CURSOR c_products IS SELECT DISTINCT product_name FROM sales_data ORDER BY product_name; BEGIN FOR prod IN c_products LOOP v_in_list := v_in_list || '''' || prod.product_name || ''' AS "' || prod.product_name || '", '; END LOOP; IF LENGTH(v_in_list) > 0 THEN v_in_list := RTRIM(v_in_list, ', '); END IF; v_sql := 'SELECT * FROM ( SELECT year, product_name, amount FROM sales_data ) PIVOT ( SUM(amount) FOR product_name IN (' || v_in_list || ') ) ORDER BY year'; EXECUTE IMMEDIATE v_sql INTO ...; -- 正确处理结果集 END; ``` 在上述代码中,`v_in_list` 动态构建了 `PIVOT` 的 `IN` 子句,并为每个产品名称提供了列别名(如 `'Electronics' AS "Electronics"`),从而避免 `ORA-00998` 错误。此外,`EXECUTE IMMEDIATE` 正确地将结果存储到变量中,防止 `ORA-06512` 错误的发生。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值