案例:RMAN 备份控制文件报错 ORA-00230

作者 | JiekeXu

来源 | JiekeXu之路(ID: JiekeXu_IT)

转载请联系授权 | (微信ID:xxq1426321293)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天分享一个上月处理的案例:RMAN 备份控制文件报错 ORA-00230。本文首发于微信公众号【JiekeXu之路】,欢迎点击上方蓝字关注我吧!

抓住八月的小尾巴,抽出一点点时间记录一下这个神奇的错误 ORA-00230,前段时间备份岗在执行备份时,说有几个数据库在备份控制文件时报错,无法备份控制文件,便派了事件单过来让检查问题所在。顿时感觉很新鲜,一直没有遇到这样的问题,便去看了看。

登陆数据库查看 Alert 日志发现以下报错:

不允许操作:快照控制文件入队不可用

RMAN-03009: failure of backup command on t1 channel at 07/20/2020 11:09:25
ORA-00230: operation disallowed: snapshot control file enqueue unavailable

首先便去查看控制文件:

sqlplus / as sysdba
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
+DATA/cmdb/controlfile/current.260.912246715


rman target /
RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name CMASDB are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 31 DAYS;
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+DATA/cmdb/controlfile/snapcf_cmdb.f';
RMAN> exit

rman 记录控制文件位置也在共享存储中,无任何问题,便使用系统自带的 oerr 查看错误提示:

JiekeXuDB1:/home/oracle$oerr ora 230
00230, 00000, "operation disallowed: snapshot control file enqueue unavailable"
// *Cause:  The attempted operation cannot be executed at this time because
//          another process currently holds the snapshot control file enqueue.
// *Action: Retry the operation after the concurrent operation that is holding
//          the snapshot control file enqueue terminates.

翻译出来就是:

操作不允许:快照控制文件入队不可用。

此时无法执行尝试的操作,因为另一个进程当前持有快照控制文件入队。

在持有快照控制文件队列的并发操作终止后重试操作。

大概意思就是说有进程在占用,于是利用搜索引擎查查其他人是怎么说的。查阅网上介绍 rman 备份遇到 ORA-00230 有 2 个原因,一是 9.2.0.8 的数据库的 rman 配置了磁带库备份,在备份时磁带库故障响应超时导致,二是数据库在之前的 rman 备份过程中被异常中断,残留有上次 rman 的备份进程。我们的数据库是 11204 没有 9i 版本,排除第一种可能。咨询相关人员后确认是由于上次将备份任务异常终止导致的,那么接下来按 RMAN 备份异常中断导致控制文件无法备份的处理过程。

网上给出了查询异常终止的 SQL 亲测可用,但据说也有没法查看的。

set line 345
col user for a20 
col MODULE for a30 
col ACTION for a20 
SELECT s.SID, USERNAME AS "User", PROGRAM, MODULE,ACTION, LOGON_TIME "Logon"
FROM V$SESSION s, V$ENQUEUE_LOCK l
WHERE l.SID = s.SID
AND l.TYPE = 'CF'
AND l.ID1 = 0
AND l.ID2 = 2;
---下面便是实际生产环境处理过程
JiekeXuDB1:/home/oracle$


SQL> col user for a20 
SQL> col MODULE for a30 
SQL> col ACTION for a20 
SQL> SELECT s.SID, USERNAME AS "User", PROGRAM, MODULE,
  2   ACTION, LOGON_TIME "Logon"
  3   FROM V$SESSION s, V$ENQUEUE_LOCK l
  4  WHERE l.SID = s.SID
  5  AND l.TYPE = 'CF'
  6  AND l.ID1 = 0
 AND l.ID2 = 2;
  7  
       SID User                 PROGRAM                                          MODULE                         ACTION               Logon
---------- -------------------- ------------------------------------------------ ------------------------------ -------------------- -------------------
       101 SYS                  rman@JiekeXuDB1 (TNS V1-V3)                       backup full datafile           0000040 STARTED16    2020-07-14 22:43:54


---根据查到的 SID 查看操作系统 SPID。
SQL> select spid from v$process where addr in(select paddr from v$session where sid=101);




SPID
------------------------
27394192


---根据 SPID 进程查看具体的进程名,判断进程的作用。LOCAL=YES 非数据库核心进程,便可以直接 kill -9 杀掉。
JiekeXuDB1:/home/oracle$ps -ef | grep 27394192
  oracle 27394192        1   0   Jul 14      -  0:05 oraclecmdb1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) 
JiekeXuDB1:/home/oracle$kill -9 27394192
JiekeXuDB1:/home/oracle$
JiekeXuDB1:/home/oracle$ps -ef | grep 27394192
  oracle 19726386 38928542   0 16:10:00  pts/0  0:00 grep 27394192

数据库再次查看已经没有进程占用了,可以正常备份了。

SQL> SELECT s.SID, USERNAME AS "User", PROGRAM, MODULE,
  2   ACTION, LOGON_TIME "Logon"
  3   FROM V$SESSION s, V$ENQUEUE_LOCK l
WHERE l.SID = s.SID
AND l.TYPE = 'CF'
 AND l.ID1 = 0
 AND l.ID2 = 2;
  4    5    6    7  
no rows selected

前面说上面 SQL 不太好使,所以另一套数据库同样的问题使用另一个 SQL 查看,如下:

---查看被占用的进程 SID 
SQL> col MODULE for a30 
SQL> col BLOCK for a45
SQL>  select s.sid, username, program, module, action, logon_time, l.*
  2  from v$session s, v$enqueue_lock l
  3  where l.sid = s.sid
and l.type = 'CF';
  4  
       SID USERNAME                       PROGRAM                                          MODULE                         ACTION                         LOGON_TIME   ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------- ------------------------------ ------------------------------------------------ ------------------------------ ------------------------------ ------------ ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
      2281                                oracle@ZB12GHCW1 (CKPT)                                                                                        26-MAR-20    0700010266E4B6F0 0700010266E4B748       2281 CF          0          0          2          0   10011939 ##########
      2283 SYS                            rman@ZB12GHCW1 (TNS V1-V3)                       backup incr datafile           0000040 STARTED16              14-JUL-20    0700010266E4EF50 0700010266E4EFA8       2283 CF          0          2          4          0     493750 ##########


---此处查看到有 SID 为 2281 的 CKPT 检查点进程和 SID 为 2283 的 RMAN 进程。


---下面使用拼接语句直接拼接出来,直接 kill 掉。      
SQL> select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid);
Enter value for sid: 2283
old   1: select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid)
new   1: select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=2283)


'KILL-9'||SPID
--------------------------------
kill -9 15007754
SQL> host kill -9 15007754


---接下来查看已经没有 2283 的进程了。
SQL> set line 345 
SQL> set pages 345 
SQL> select s.sid,username,program,module,action,logon_time,l.*
  2   from v$session s,v$enqueue_lock l
  3   where l.sid=s.sid
and l.type='CF';
  4


       SID USERNAME        PROGRAM                        MODULE               ACTION       LOGON_TIME   ADDR             KADDR                   SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------- --------------- ------------------------------ -------------------- ------------ ------------ ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
      2281                 oracle@ZB12GHCW1 (CKPT)                                          26-MAR-20    0700010266E4B6F0 0700010266E4B748       2281 CF          0          0          2          0  26-MAR-20          2

处理完后,备份便可以正常进行了,看来这个问题下次得注意一些了,故特此记录下来,以备不时之需,也希望看到的朋友们能够注意到这点,加油,让我们一起努力做更好的自己,今天就到这里了,祝小伙伴们新的一周快乐每一天!

Oracle 12c 及以上版本补丁更新说明及下载方法(收藏版)

Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)

Oracle 19c 之多租户 PDB 连接与访问(三)

Oracle 12C 最新补丁下载与安装操作指北

DBA 常用的软件工具有哪些(分享篇)?

关于 Oracle ACFS 相关知识的简单学习

Oracle 相关认证证书查询及真伪辨别

Oracle 11g ADG 快照备库切换步骤

openGaussDB 初体验(下)


点亮在看,你最好看!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值