现象:
当前的 recovery catalog schema 是 12.1。
安装了 12.2 数据库,recovery catalog schema 被从 12.1 升级到 12.2。
升级 catalog 发生如下错误:
RMAN> upgrade catalog;
RMAN-6444: error creating init_grsp_pdb_key
RMAN-571: ===========================================================
RMAN-569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-571: ===========================================================
RMAN-6004: ORACLE error from recovery catalog database: ORA-1422: exact fetch returns more than requested number of rows
问题大多发生在recovery catalog数据库是支持多个多租户数据库的情况下。
原因:
这是由于一个bug导致:
<Bug 25852885> UPGRADE CATALOG WITH 12.2 RMAN ON 12.1 DATABASE FAILS W/ ORA-1422
解决方案:
workaround
备份并编辑 12.2 环境的 ORACLE_HOME/rdbms/admin 目录下的 recover.bsq 文件。改变如下行:
define init_nrsp_pdb_key
<<<
declare
cursor nrsp_c is
select distinct nrsp.rowid rid, dbinc.db_key db_key
from nrsp, dbinc
where nrsp.pdb_key is null
and nrsp.dbinc_key = dbinc.dbinc_key
order by dbinc.db_key;
prev_db_key number := 0;
local_pdb_key number;
begin
for r in nrsp_c loop
if (r.db_key <> prev_db_key) then
prev_db_key := r.db_key;
select pdb_key into local_pdb_key
from pdb
where pdb.con_id in (1, 0);
end if;
改为:
define init_nrsp_pdb_key
<<<
declare
cursor nrsp_c is
select distinct nrsp.rowid rid, dbinc.db_key db_key
from nrsp, dbinc
where nrsp.pdb_key is null
and nrsp.dbinc_key = dbinc.dbinc_key
order by dbinc.db_key;
prev_db_key number := 0;
local_pdb_key number;
begin
for r in nrsp_c loop
if (r.db_key <> prev_db_key) then
prev_db_key := r.db_key;
select pdb_key into local_pdb_key
from pdb
where pdb.con_id in (1, 0)
and pdb.db_key = r.db_key;
end if;
并且改变:
define init_grsp_pdb_key
<<<
declare
cursor grsp_c is
select distinct grsp.rowid rid, dbinc.db_key db_key
from grsp, dbinc
where grsp.pdb_key is null
and grsp.dbinc_key = dbinc.dbinc_key
order by dbinc.db_key;
prev_db_key number := 0;
local_pdb_key number;
begin
for r in grsp_c loop
if (r.db_key <> prev_db_key) then
prev_db_key := r.db_key;
select pdb_key into local_pdb_key
from pdb
where pdb.con_id in (1, 0);
end if;
改为:
define init_grsp_pdb_key
<<<
declare
cursor grsp_c is
select distinct grsp.rowid rid, dbinc.db_key db_key
from grsp, dbinc
where grsp.pdb_key is null
and grsp.dbinc_key = dbinc.dbinc_key
order by dbinc.db_key;
prev_db_key number := 0;
local_pdb_key number;
begin
for r in grsp_c loop
if (r.db_key <> prev_db_key) then
prev_db_key := r.db_key;
select pdb_key into local_pdb_key
from pdb
where pdb.con_id in (1, 0)
and pdb.db_key = r.db_key;
end if;
保存文件。
使用12.2 ORACLE_HOME中的12.2RMAN客户端重新连接,并且重新运行'upgrade catalog'两次。
|