Oracle Database 23ai FREE RMAN Catalog Probleme

Nutzt man die Oracle Datenbank 23ai FREE Edition um sich mit RMAN vertraut zu machen, kann man in unerwartete Fehler laufen. Die Datenbank ist im Archivelog Modus und wir nutzen diese auch für den Recovery Catalog (was in der Praxis nicht sinnvoll ist, da im Fall eines Fehlers eben der Recovery Catalog potentiell nicht zur Verfügung steht).

Recovery Catalog Owner anlegen

Um das Problem zu reproduzieren legt man einen Recovery Catalog Benutzer in der FREEPDB1 an, und granted diesem die Rolle RECOVERY_CATALOG_OWNER.

SQL> ALTER SESSION SET CONTAINER = freepdb1;
Session altered.

SQL> CREATE TABLESPACE cat_ts 
     DATAFILE '/opt/oracle/oradata/FREE/FREEPDB1/cat_ts01.dbf' 
     SIZE 20M AUTOEXTEND ON NEXT 10M;
Tablespace created.

SQL> CREATE USER cat_owner IDENTIFIED BY oracle_4U 
     DEFAULT TABLESPACE cat_ts QUOTA UNLIMITED ON cat_ts;
User created.

SQL> GRANT RECOVERY_CATALOG_OWNER TO cat_owner;
Grant succeeded.

col GRANTEE format a20
col GRANTED_ROLE format a30

select GRANTEE, GRANTED_ROLE
from DBA_ROLE_PRIVS
where GRANTEE = 'CAT_OWNER';

GRANTEE     GRANTED_ROLE
----------- ------------------------------
CAT_OWNER    RECOVERY_CATALOG_OWNER

Datenbank im RMAN Catalog registrieren

Im nächsten Schritt erzeugen wir mit RMAN einen Catalog und registrieren die Datenbank:

$ rman target / catalog cat_owner/oracle_4U@localhost/freepdb1

Recovery Manager: Release 23.0.0.0.0 - Production on Tue Jun 25 14:41:24 2024
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle and/or its affiliates.  All rights reserved.

connected to target database: FREE (DBID=1440152558)
connected to recovery catalog database

RMAN> create catalog;
create catalog;
recovery catalog created

RMAN> register database;
register database;
database registered in recovery catalog
starting full resync of recovery catalog
full resync complete

Bis hierher funktioniert alles wie erwartet.

Fehler #1: RMAN Backup

Testet man jetzt ein RMAN Backup unter Nutzung des Recovery Catalogs, läuft man in folgenden Fehler:

$ rman target / catalog cat_owner/oracle_4U@localhost/freepdb1

RMAN> backup archivelog all;
Starting backup at 25-JUN-24
current log archived
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=211 device type=DISK
disconnect from the recovery catalog
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=56 RECID=2 STAMP=1172217774
...
input archived log thread=1 sequence=92 RECID=38 STAMP=1172577360
channel ORA_DISK_1: starting piece 1 at 25-JUN-24
channel ORA_DISK_1: finished piece 1 at 25-JUN-24
piece handle=/opt/oracle/fra/FREE/backupset/2024_06_25/o1_mf_annnn_TAG20240625T115604_m7od2ob8_.bkp tag=TAG20240625T115604 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:45
reconnection with the recovery catalog is successful
Oracle error from recovery catalog database: ORA-06550: line 1, column 7:
PLS-00201: identifier 'DBMS_LOCK' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Help: https://docs.oracle.com/error-help/db/ora-06550/
...
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-01005: Internal Error when acquiring lock with SQL Error 6550

Das ist aber nicht das einzige Problem, das auftreten kann.

Fehler #2: RMAN Catalog Upgrade

Im nächsten Schritte testen wir das Upgrade des Catalogs. Dazu muss man den Befehl upgrade catalog zwei mal eingeben:

$ rman target / catalog cat_owner/oracle_4U@localhost/freepdb1

RMAN> upgrade catalog;
upgrade catalog;
recovery catalog owner is CAT_OWNER
enter UPGRADE CATALOG command again to confirm catalog upgrade

RMAN> upgrade catalog;
upgrade catalog;
recovery catalog upgraded to version 23.04.00.24.05
DBMS_RCVMAN package upgraded to version 23.04.00.24
DBMS_RCVCAT package upgraded to version 23.04.00.24.
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-01005: Error while converting X lock to S lock

Analyse

Wenn man RMAN im Debug Modus setzt, findet man, dass dieser DBMS_LOCK nicht korrekt aufrufen kann. Das spannende daran ist, dass diese Berechtigung in der Datenbank aber in der Role RECOVERY_CATALOG_OWNER sehr wohl vorhanden ist.

Workaround

Als Workaround kann man EXECUTE auf DBMS_LOCK direkt granten. Dann funktioniert das Upgrade.

$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Tue Jun 25 15:08:19 2024
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.4.0.24.05

SQL> alter session set container = freepdb1;

Session altered.

SQL> grant execute ON DBMS_LOCK TO cat_owner;

Grant succeeded.

Upgrade oder Backup nochmals testen

$ rman target / catalog cat_owner/oracle_4U@localhost/freepdb1

Recovery Manager: Release 23.0.0.0.0 - Production on Tue Jun 25 15:10:11 2024
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle and/or its affiliates.  All rights reserved.

connected to target database: FREE (DBID=1440152558)
connected to recovery catalog database


RMAN> upgrade catalog;
upgrade catalog;
recovery catalog owner is CAT_OWNER
enter UPGRADE CATALOG command again to confirm catalog upgrade

RMAN> upgrade catalog;
upgrade catalog;
recovery catalog upgraded to version 23.04.00.24.05
DBMS_RCVMAN package upgraded to version 23.04.00.24
DBMS_RCVCAT package upgraded to version 23.04.00.24.

Update zum Artikel

Oracle hat im Laufe der Lebenszeit von Oracle 19c anscheinend eine Änderung im Backup and Recovery User’s Guide geändert. Im Kapitel 13.2.2 Creating the Recovery Catalog Schema Owner wurde ein zusätzlicher Schritt eingeführt (in der initialen Oracle 19c Dokumentation war dies noch nicht enthalten).

@?/rdbms/admin/dbmsrmansys.sql

Dieses Script wurde mit Oracle 19.15 aktualisiert um das Problem mit DBMS_LOCK zu beheben. Für die Oracle 23ai wurde der Patch ebenfalls in diesem Script am 24. August 2023 aufgenommen.

Referenzen

Das Problem ist nicht unbekannt… Der Fehler wurde schon im März 2022 für Oracle 19.14 gemeldet:

  • Upgrade Catalog fails RMAN-01005: Error While Converting X Lock To S Lock (Doc ID 2857994.1)