DROP CATALOG仅清空元数据表数据但不释放空间、不删用户;彻底卸载需三步:先DROP CATALOG,再DROP USER rcat CASCADE,最后DROP TABLESPACE(若专用)。
直接结论:用 drop catalog 命令只能清空恢复目录的元数据表(如 rout、db、bs 等),但不会删除用户、表空间或底层数据库对象;真要彻底清理,必须分两步走——先删目录内容,再删目录用户。
为什么 DROP CATALOG 不等于“卸载目录”
很多人以为执行 DROP CATALOG 就像卸软件一样一劳永逸,其实它只是清空 RCAT 用户下所有 RMAN 元数据表的数据和约束,表结构仍保留,用户权限、表空间、索引全在。更关键的是:ROUT 表(占空间主力)虽被清空,但高水位没降,后续插入仍可能触发大量逻辑读;而 DBA_SEGMENTS 里看到的 MB 占用也不会立刻减少。
-
DROP CATALOG后,SELECT COUNT(*) FROM rout返回 0,但SELECT bytes/1024/1024 FROM dba_segments WHERE segment_name = 'ROUT'仍显示原大小 - 该命令不回收空间,也不 drop index 或 trigger,
ROUT_U1、ROUT_I_RSR这些索引还在 - 若之后重新
CREATE CATALOG,RMAN 会复用旧表结构,但历史碎片残留,长期运行易出性能抖动
如何真正“卸载”恢复目录(含空间释放)
彻底清理 = 清元数据 + 删用户 + 收回表空间。三步缺一不可,顺序不能错:
- 第一步:以
rcat用户登录 RMAN,执行DROP CATALOG(需输两次确认) - 第二步:用 DBA 账户(如
system)登录 SQL*Plus,执行DROP USER rcat CASCADE—— 注意必须带CASCADE,否则因存在对象报错ORA-01922: CASCADE must be specified to drop 'RCAT' - 第三步:如果
rcat用户专用了独立表空间(如RECCAT),可进一步DROP TABLESPACE reccat INCLUDING CONTENTS AND DATAFILES,否则表空间文件还躺在磁盘上
容易踩的坑:备份没做就删用户?别碰生产库!
恢复目录一旦删掉,所有注册过的目标数据库(REGISTER DATABASE)元数据全丢,LIST BACKUP、REPORT OBSOLETE 全失效,RMAN 将退化为仅依赖控制文件的“无目录模式”,历史备份无法智能识别过期与否。
- 删前务必导出关键信息:
SELECT db_key, dbid, name FROM rc_database、SELECT * FROM rc_backup_set(若有权限) - 更稳妥做法是先用
RMAN CONNECT CATALOG+BACKUP RECOVERY CATALOG做一次目录自身备份(虽然极少人这么做) - 测试环境可大胆操作;生产环境建议先
CREATE USER rcat_new IDENTIFIED BY ...搭新目录,迁移注册再切,而不是硬删
真正麻烦的不是命令敲几行,而是删完发现某台老数据库的备份策略依赖这个目录做跨库报告,或者审计要求保留 7 年 catalog 日志——这些隐性依赖,往往等报错才浮现。

















