Oracle RMAN备份元数据管理
一、概述
在Oracle数据库中,rman备份信息的记录(即称为rman备份元数据),可以有两种记录方式
1、默认方式,备份信息记录在控制文件中,默认记录最近7天的备份元数据(存放在控制文件的循环使用空间部分)
2、创建并配置专用的rman catalog数据库(即称为rman备份catalog库),用于存放其它数据库的备份元数据
二、控制文件存储
不管是否创建并使用专用的rman catalog数据库,控制文件中都会保存rman备份元数据信息,这是刚性行为,不可更改!
-- 默认保存7天,如下
show parameter control_file_record_keep_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
如果生产环境中不创建并使用专用的rman catalog数据库,仅使用控制文件来保存备份信息,建议将保存时间调整为31天以上,如下
--仅使用控制文件来保存备份信息,建议将保存时间调整为31天以上
--该参数为静态参数,需要重启生效
alter system set control_file_record_keep_time=31 scope=spfile;
三、RMAN CATALOG数据库存储
RMAN CATALOG 配置与管理
1、创建RMAN CATALOG数据库
备注:一个常规的ORACLE数据库,专用于保存其它数据库的rman备份信息
2、创建表空间与用户
在 CATALOG 数据库中准备存储环境,即创建专用的用户和专属存储表空间
-- 创建表空间,用于存储 catalog 元数据,自动扩展最大 30G
create tablespace tbs_catalog datafile '/oradata/orcl/tbs_catalog_001.dbf' size 100m autoextend on maxsize 30g;
-- 创建用户 rc_admin,默认表空间为 tbs_catalog,配额无限
create user rc_admin identified by oracle default tablespace tbs_catalog quota unlimited on tbs_catalog;
-- 授予连接、资源及恢复目录所有者权限
grant connect,resource ,recovery_catalog_owner to rc_admin;
3、生产库配置 TNS 指向 CATALOG
配置本地 tnsnames.ora,使数据库能连接到存储 RMAN 元数据的 CATALOG 数据库。
bash
cat >>$ORACLE_HOME/network/admin/tnsnames.ora <<'EOF'
rmancatalog =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.52)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
EOF
--验证
tail -10 $ORACLE_HOME/network/admin/tnsnames.ora
4. 创建与升级 CATALOG
bash
## 需要保存备份信息的库(生产库),通过rman catalog连接至 CATALOG 库创建目录结构
rman catalog=rc_admin/oracle@rmancatalog
create catalog;
# 同时连接目标库 和 CATALOG 库,升级目录(如果是旧版本升级上来)
rman target=sys/oracle@orcl catalog=rc_admin/oracle@rmancatalog
#第一次执行,会让你继续再次执行,以确认to confirm catalog upgrade
upgrade catalog;
#enter UPGRADE CATALOG command again to confirm catalog upgrade
#需要再次执行
upgrade catalog;
#再次执行后的输出
#recovery catalog upgraded to version 11.02.00.04
#DBMS_RCVMAN package upgraded to version 11.02.00.04
#DBMS_RCVCAT package upgraded to version 11.02.00.04
5. 注册目标数据库
bash
# 将目标数据库注册到 CATALOG 中
register database;
# 输出信息
#database registered in recovery catalog
#starting full resync of recovery catalog
#full resync complete
# 同步 CATALOG 信息
rman target=sys/oracle@orcl catalog=rc_admin/oracle@rmancatalog
resync catalog;
# 输出信息
#starting full resync of recovery catalog
#full resync complete
6. CDB 与 PDB 注册差异
在多租户环境(CDB/PDB)中,若要单独注册 PDB,需在 CATALOG 库中启用 VPD(虚拟私有数据库)支持。
-
报错现象 :直接注册 PDB 报错
RMAN-07543: recovery catalog does not have VPD support enabled。# pdb连接catalog数据库 [oracle@host01 admin]$ rman target=sys/oracle@pdb1 catalog=rc_admin/oracle@rmancatalog Recovery Manager: Release 19.0.0.0.0 - Production on Mon Dec 18 17:25:41 2023 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. connected to target database: PRODCDB:PDBPROD1 (DBID=2269085771, not open) connected to recovery catalog database # 报错信息 RMAN> show all; RMAN configuration parameters for database with db_unique_name PRODCDB are: RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of show command at 12/18/2023 17:25:56 RMAN-07552: VPC support required when target database is pluggable database RMAN-07543: recovery catalog does not have VPD support enabled # 报错说明 [oracle@host01 admin]$ oerr rman 07543 7543, 1, "recovery catalog does not have VPD support enabled" // *Cause: An attempt was made to use virtual recovery catalog features // without a proper VPD setup for the base catalog. // *Action: 1. Execute '?/rdbms/admin/dbmsrmanvpc.sql -vpd <owner>' after // connecting to a catalog database as SYS to grant VPD-required // privileges to the base catalog owner. // 2. Reconnect to RMAN base catalog and perform UPGRADE CATALOG. // 3. Retry the failed operation -
解决方法:
bash# 在 CATALOG 库中以 SYS 身份运行脚本启用 VPD $ sqlplus sys/oracle@rmancatalog as sysdba @$ORACLE_HOME/rdbms/admin/dbmsrmanvpc.sql -vpd RMAN #该脚本用于在多租户环境中为 RMAN CATALOG 启用虚拟私有目录支持,允许将 PDB 注册为独立的目标。 #输出类似如下 #Checking the operating user... Passed #Granting VPD privileges to the owner of the base catalog schema RMAN #======================================== #No eligible RMAN catalogs have been found! #Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production #Version 19.3.0.0.0 # 重新连接并升级 CATALOG rman catalog RMAN/RMAN@rmancatalog upgrade upgrade #至此就可以了
四、RMAN CATALOG的常用维护命令
创建、升级、注册的维护命令
| 命令 | 作用说明 |
|---|---|
UPGRADE CATALOG; |
升级 CATALOG :在升级了 RMAN 可执行文件后,首次连接时会提示 CATALOG 需要升级。需连续执行两次该命令以确认。 |
DROP CATALOG; |
删除 CATALOG :危险操作。会删除 CATALOG 用户下的所有 RMAN 元数据表。仅在重建 CATALOG 时使用。 |
CREATE CATALOG; |
创建 CATALOG:在 CATALOG 数据库中,为指定的 RMAN 用户创建元数据存储表。 |
REGISTER DATABASE; |
注册数据库:将一个新的目标数据库注册到 CATALOG 中。 |
UNREGISTER DATABASE; |
注销数据库 :从 CATALOG 中移除一个数据库的记录(不会删除物理备份文件)。 |
备份元数据同步与维护命令
| 命令 | 作用说明 |
|---|---|
RESYNC CATALOG; |
手动同步:将目标数据库控制文件中的备份信息同步到 CATALOG 数据库。通常在执行了非 RMAN 的文件操作(如手动删除归档日志)后使用。 |
RESYNC CATALOG FROM DB_UNIQUE_NAME ALL; |
在 DG 环境中,一个恢复目录通常会同时管理主库(Primary)和备库(Standby)。由于备库的备份操作可能直接在备库上执行,其控制文件中的元数据与恢复目录中的记录可能会不一致 加上 FROM DB_UNIQUE_NAME ALL:无论你现在连接的是主库还是备库,RMAN 都会去同步恢复目录里记录的所有**数据库(包括主库和所有备库)的元数据,确保整个 DG 环境的备份信息在恢复目录中是完整和最新的 |
REPORT OBSOLETE; |
报告过期 :根据配置的保留策略(如 CONFIGURE RETENTION POLICY),列出所有已"过期"的备份集和归档日志。这些备份不再需要用于恢复。 |
DELETE OBSOLETE; |
删除过期 :核心维护命令 。物理删除由 REPORT OBSOLETE 列出的备份片,并从 CATALOG 中清除其元数据记录,释放磁盘空间。 |
CROSSCHECK BACKUP; |
交叉检查 :核对 CATALOG 中记录的备份片是否真实存在于磁盘或磁带上。如果文件已丢失,会将状态更新为 EXPIRED。 |
DELETE EXPIRED BACKUP; |
清理失效记录 :删除那些在 CROSSCHECK 后被标记为 EXPIRED 的备份记录。 |
CHANGE BACKUPSET <id> UNAVAILABLE; |
标记不可用 :当某个备份片所在的磁盘临时不可访问时,可将其标记为 UNAVAILABLE,RMAN 在恢复时将忽略它。 |
CHANGE BACKUPSET <id> AVAILABLE; |
标记可用 :当磁盘恢复访问后,将其状态改回 AVAILABLE。 |
清理与删除命令(手动清理特定的备份记录)
# 1. 删除指定天数的过期备份
DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS;
# 2. 删除冗余度超过 N 份的备份
DELETE OBSOLETE REDUNDANCY = 2;
# 3. 手动删除指定的备份集
DELETE BACKUPSET 101;
# 4. 手动删除指定数据文件的镜像副本
DELETE DATAFILECOPY '/path/to/datafile_copy.dbf';
# 5. 删除所有归档日志(慎用!)
DELETE ARCHIVELOG ALL;
# 6. 删除7天前的所有归档日志
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';