flashback database log导致hung机

sys@R2> delete a ;--hang


sys@R2> select sid,event,sql_id ,username ,status ,machine, SQL_EXEC_START from v$session where username = 'SYS' ;

  SID EVENT                         SQL_ID        USERNAME        STATUS    MACHINE                SQL_EXEC_START
----- -------------------------------------------------- ------------- --------------- -------- ------------------------------ ------------------
   40 flashback buf free by RVWR                       SYS           ACTIVE    node1
   45 flashback buf free by RVWR             cv0wbqnff1dfv SYS           ACTIVE    node1                   20-JUL-16
   54 flashback buf free by RVWR             11p815z8hkfms SYS           ACTIVE    node1                   19-JUL-16
   57 enq: US - contention                 95zfwdqwfauub SYS           ACTIVE    node1                   21-JUL-16
  182 enq: US - contention                 0z7z2r2vrykp1 SYS           ACTIVE    node1                   22-JUL-16
  184 enq: US - contention                 0z7z2r2vrykp1 SYS           ACTIVE    node1                   22-JUL-16
  186 SQL*Net message to client              5k7mss481k8sx SYS           ACTIVE    node1                   22-JUL-16

7 rows selected.


sys@R2> select sql_fulltext from v$sql where sql_id = '0z7z2r2vrykp1' ;

SQL_FULLTEXT
--------------------------------------------------------------------------------
delete a


yselect dbf.tablespace_name,
       dbf.totalspace "总量(M)",
       dbf.totalblocks as 总块数,
       dfs.freespace "剩余总量(M)",
       dfs.freeblocks "剩余块数",
       (dfs.freespace / dbf.totalspace) * 100 "空闲比例"
  from (select t.tablespace_name,
               sum(t.bytes) / 1024 / 1024 totalspace,
               sum(t.blocks) totalblocks
          from dba_data_files t
         group by t.tablespace_name) dbf,
       (select tt.tablespace_name,
               sum(tt.bytes) / 1024 / 1024 freespace,
               sum(tt.blocks) freeblocks
          from dba_free_space tt
         group by tt.tablespace_name) dfs
 17   where trim(dbf.tablespace_name) = trim(dfs.tablespace_name);

TABLESPACE_NAME                   总量(M)     总块数 剩余总量(M)   剩余块数   空闲比例
------------------------------ ---------- ---------- ----------- ---------- ----------
SYSAUX                      760      97280      39.125       5008 5.14802632
UNDOTBS1                  345      44160    321.6875      41176 93.2427536
USERS                     32.5    4160     18.4375       2360 56.7307692
SYSTEM                      810     103680      8.1875       1048 1.01080247
EXAMPLE                   100      12800     21.1875       2712    21.1875
RCAT_TS                    15    1920      10.375       1328 69.1666667
DOCU                      200      25600     155.125      19856    77.5625



sys@R2> select TABLESPACE_NAME , FILE_NAME ,BYTES/1024/1024 m from dba_data_files where TABLESPACE_NAME =  'UNDOTBS1'
  2  /

TABLESPACE_NAME            FILE_NAME                          M
------------------------------ --------------------------------------------- ----------
UNDOTBS1               /u01/app/oracle/oradata/r2/undotbs01.dbf         345



select tablespace_name, retention from dba_tablespaces where tablespace_name

sys@R2> select TABLESPACE_NAME , RETENTION from  dba_tablespaces where TABLESPACE_NAME = 'UNDOTBS1' ;

TABLESPACE_NAME            RETENTION
------------------------------ -----------
UNDOTBS1               NOGUARANTEE



sys@R2> select * from v$sgainfo
  2  /

NAME                     BYTES RES
----------------------------------- ---------- ---
Fixed SGA Size                   2214456 No
Redo Buffers                   6086656 No
Buffer Cache Size            1342177280 Yes
Shared Pool Size             452984832 Yes
Large Pool Size               16777216 Yes
Java Pool Size                  33554432 Yes
Streams Pool Size              33554432 Yes
Shared IO Pool Size                 0 Yes
Granule Size                  16777216 No
Maximum SGA Size            1887350784 No
Startup overhead in Shared Pool      100663296 No
Free SGA Memory Available             0

Free SGA Memory Available             0 可以内存为0

sys@R2> select username ,sql_id ,status ,event from v$session where username = 'SYS' ;

USERNAME    SQL_ID          STATUS   EVENT
--------------- ------------- -------- --------------------------------------------------
SYS                  ACTIVE   flashback buf free by RVWR
SYS        cv0wbqnff1dfv ACTIVE   flashback buf free by RVWR
SYS        11p815z8hkfms ACTIVE   flashback buf free by RVWR
SYS        95zfwdqwfauub ACTIVE   enq: US - contention
SYS        0z7z2r2vrykp1 ACTIVE   enq: US - contention
SYS        0z7z2r2vrykp1 ACTIVE   enq: US - contention
SYS        2a3cwbbcgkqqk ACTIVE   SQL*Net message to client
SYS        3jb069f9zrgyu ACTIVE   buffer busy waits

都在等着 flashback buf free by RVWR  , buffer busy waits


sys@R2> show parameter recov

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest             string     /u01/flash_recovery_area
db_recovery_file_dest_size         big integer 3882M
recovery_parallelism             integer     0
sys@R2> desc v$recovery_area_usage
 Name                                               Null?    Type
 ------------------------------------------------------------------------------------- -------- ----------------------------------------------------------
 FILE_TYPE                                            VARCHAR2(20)
 PERCENT_SPACE_USED                                        NUMBER
 PERCENT_SPACE_RECLAIMABLE                                    NUMBER
 NUMBER_OF_FILES                                        NUMBER

sys@R2> select * from v$recovery_area_usage ;

FILE_TYPE         PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE                  0             0        0
REDO LOG                  0             0        0
ARCHIVED LOG                  0             0        0
BACKUP PIECE                  0             0        0
IMAGE COPY               2.58             0        1
FLASHBACK LOG              97.05             0          236
FOREIGN ARCHIVED LOG              0             0        0

7 rows selected.


sys@R2> desc V$FLASHBACK_DATABASE_LOG
 Name                                               Null?    Type
 ------------------------------------------------------------------------------------- -------- ----------------------------------------------------------
 OLDEST_FLASHBACK_SCN                                        NUMBER
 OLDEST_FLASHBACK_TIME                                        DATE
 RETENTION_TARGET                                        NUMBER
 FLASHBACK_SIZE                                         NUMBER
 ESTIMATED_FLASHBACK_SIZE                                    NUMBER

sys@R2> select * from V$FLASHBACK_DATABASE_LOG ;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_T RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------ ---------------- -------------- ------------------------
         2363491 27-JUN-16                2880     3950567424            291078144

2880分钟

sys@R2> alter system set  db_recovery_file_dest_size=5G ;

System altered.

sys@R2> select * from v$recovery_area_usage ;

FILE_TYPE         PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE                  0             0        0
REDO LOG                  0             0        0
ARCHIVED LOG                  0             0        0
BACKUP PIECE                  0             0        0
IMAGE COPY               1.95             0        1
FLASHBACK LOG              75.07             0          241
FOREIGN ARCHIVED LOG              0             0        0

7 rows selected.

sys@R2> desc a
 Name                                               Null?    Type
 ------------------------------------------------------------------------------------- -------- ----------------------------------------------------------
 A                                                DATE
 B                                                NUMBER(38)

sys@R2> delete a ;

flashback dtabase log如何回收?
有三种机制:(以下观点是借助别人的)
   第1种情况:数据库级别打开flashback功能,但没有创建guaranteed restore point,flashback database能够回溯到的时间点取决于db_flashback_retention_target,
但这并不是一个硬性指标,当遇到Fast Recovery Area用满的时候较早生成的Flashback log会被清理掉以留出足够的空间给新生成的flashback log,
所以无法保证一定能将数据库flashback到db_flashback_retention_target指定的时间点。data block被修改之前其before image被写入flashback log,
对于活跃度较高的data block并不是每次更改都会触发before image写入flashback log,这样做的目的是有效降低Flashback log write对数据库IO性能的影响


   第2种情况:创建了guaranteed restore point,但没有在数据库级别打开flashback功能,也称为Guaranteed restore point without flashback logging,
这种情况确保数据库一定能flashback到guaranteed restore point创建时的状态,如果出现Fast Recovery Area用满且又没有obsolete file可以删除的时候甚
至会引起数据库Hang。guaranteed restore point的功能有点类似存储上的snapshot概念,提供了完整保留某一个时间点数据的功能,创建了guaranteed restore point之后,
某个data block被更改,且一定是首次更改的时候,data block before image才会被写入Flashback log,即Copy-on-first-write,
即使该data block之后再次被修改,其before image也不会再次被写入flashback log,对同一个data block来说其before-image永远只会写入一次flashback log


  第3种情况,也称为Guaranteed restore point with flashback logging,集1、2之大成,确保数据库能flashback到从guaranteed restore point时间点开始的任何时间点

因为第3种情况包含了第1种,我们仅针对上面的第2、3种情况研究一下flashback log的生成机制。
先引入一个隐含参数_flashback_barrier_interval,我们前面提到过在数据库级别的flashback功能开启时,同一个block被更改多次的情况下,
不会每次都将before image写入flashback log,data block被更改的时候需要计算距离上一次更改的时间,当这个时间间隔大于等于_flashback_barrier_interval时
才会将before image写入flashback log,_flashback_barrier_interval的默认值是1800秒,为了方便测试我们调整为60秒,修改此参数需要重启实例

sys@R2> select * from v$restore_point ;

       SCN DATABASE_INCARNATION# GUA STORAGE_SIZE TIME               RESTORE_POINT_TIME   PRE NAME
---------- --------------------- --- ------------ -------------------- -------------------- --- -----------------------------------
   2364087               5 YES   4110475264 27-JUN-16 04.32.22.0                YES P1
                          00000000 PM
    
至此找到flash database log  致使fash recovery area 满,且log不能清的原因

解决方法:
alter database flashback off;  -- (相反alter database flashback on)
drop restore point P1;   --(相反  create restore point P1 guarantee flashback database)
   

sys@R2> select * from v$recovery_area_usage ;

FILE_TYPE         PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE                  0             0        0
REDO LOG                  0             0        0
ARCHIVED LOG                  0             0        0
BACKUP PIECE                  0             0        0
IMAGE COPY               1.95             0        1
FLASHBACK LOG               2.98             0           10
FOREIGN ARCHIVED LOG              0             0        0


<think>我们正在解决的是“Oracle数据库实例开启闪回数据库失败的解决方案”问题。 根据提供的引用内容,我们可以总结出几个可能导致闪回数据库失败的原因及相应的解决方案: 1. **闪回区空间不足**:引用[2]中提到闪回区满可能导致数据库无法启动,同时也可能影响闪回功能的开启。解决方法包括清理闪回区(删除旧的闪回日志、备份等)或者扩大闪回区空间。 2. **未开启行移动(ROW MOVEMENT)**:引用[4]指出,在执行闪回表操作时,如果表没有启用行移动功能,会报错ORA-08189。因此,在开启闪回数据库功能或者执行闪回操作之前,确保需要闪回的表启用了行移动功能。 3. **撤销数据失效**:引用[1]提到,如果撤销数据被覆盖(Expired部分被重写),那么基于撤销数据的闪回操作会失败。因此,要保证有足够的撤销保留时间(UNDO_RETENTION)以及足够的撤销表空间,以避免数据被覆盖。 4. **表结构变更(DDL操作)**:在闪回点和当前点之间,如果表结构发生变更,闪回操作会失败(引用[1])。因此,在开启闪回数据库后,应尽量减少不必要的DDL操作,或者在执行DDL后重新评估闪回点。 5. **数据库约束问题**:违反数据库约束(如外键约束)也会导致闪回失败(引用[1])。需要检查约束条件,确保闪回操作不会破坏约束。 6. **还原点(Restore Point)的存在**:引用[2]中提到,即使关闭了快速闪回,如果存在还原点,数据库仍会写闪回日志,可能导致闪回区满。如果不需要还原点,应将其删除。 基于以上分析,我们给出开启闪回数据库失败的解决方案步骤: **步骤1:检查闪回区空间状态** - 查看闪回区空间使用情况: ```sql SELECT * FROM V$RECOVERY_FILE_DEST; ``` - 如果空间不足,可以扩大闪回区或清理不需要的闪回日志和备份: ```sql -- 扩大闪回区大小(例如扩大到10G) ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 10G; -- 或者删除旧的备份和归档日志(需谨慎) ``` **步骤2:确保数据库处于归档模式** 闪回数据库要求数据库必须处于归档模式: ```sql -- 查看当前模式 SELECT log_mode FROM v$database; -- 如果未开启归档,需要重启到mount状态开启归档 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; ``` **步骤3:开启行移动(针对需要闪回的表)** 虽然开启闪回数据库功能本身不需要表级行移动,但后续执行闪回表操作时需要。因此,建议对可能需要闪回的表提前启用: ```sql ALTER TABLE <table_name> ENABLE ROW MOVEMENT; ``` **步骤4:配置足够的撤销表空间和保留时间** - 检查撤销表空间使用情况: ```sql SELECT tablespace_name, status, SUM(bytes)/1024/1024 "Size(MB)" FROM dba_undo_extents GROUP BY tablespace_name, status; ``` - 调整撤销保留时间(例如调整为1天): ```sql ALTER SYSTEM SET UNDO_RETENTION = 86400; -- 单位是秒 ``` - 如果撤销表空间不足,考虑增加数据文件或扩大表空间。 **步骤5:检查并删除不必要的还原点** - 查看现有还原点: ```sql SELECT * FROM V$RESTORE_POINT; ``` - 删除不需要的还原点: ```sql DROP RESTORE POINT <restore_point_name>; ``` **步骤6:开启闪回数据库** 在完成上述准备工作后,尝试开启闪回数据库: ```sql -- 首先确保数据库在mount或open状态,但开启闪回需要在mount状态 SHUTDOWN IMMEDIATE; STARTUP MOUNT; -- 开启闪回 ALTER DATABASE FLASHBACK ON; -- 打开数据库 ALTER DATABASE OPEN; ``` 如果开启过程中遇到其他错误,可根据具体错误信息进一步排查。 总结:开启闪回数据库失败通常与空间、配置、模式等因素有关,按照以上步骤逐一排查可解决大部分问题[^1][^2][^4]。 §§相关问题§§ 1. 如何监控Oracle闪回区的空间使用情况? 2. 如何配置Oracle数据库的归档模式? 3. 闪回数据库与闪回表在实现制上有何不同? </think>### Oracle数据库开启闪回数据库失败的解决方案 开启闪回数据库失败通常由空间、配置或状态问题导致,以下是系统级解决方案: #### 1. **检查闪回区空间状态** [^2] - **诊断命令**: ```sql -- 查看闪回区使用率 SELECT * FROM V$RECOVERY_FILE_DEST; -- 检查空间不足告警 SELECT message FROM V$FLASH_RECOVERY_AREA_USAGE WHERE percent_full > 90; ``` - **解决方案**: - **扩容闪回区**: ```sql ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 20G; /* 调整为适当大小 */ ``` - **清理过期文件**: ```sql DELETE EXPIRED BACKUP; -- 删除过期备份 CROSSCHECK ARCHIVELOG ALL; -- 校验归档日志 DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7'; -- 删除7天前归档 ``` - **删除冗余还原点**: ```sql DROP RESTORE POINT <point_name>; /* 引用[2]中关键操作 */ ``` #### 2. **验证归档模式状态** [^1][^4] - **必要条件**: ```sql SELECT log_mode FROM v$database; -- 必须返回"ARCHIVELOG" ``` - **开启归档模式**: ```sql SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; ``` #### 3. **启用行移动功能** [^4] - **针对表级操作(影响闪回表)**: ```sql -- 检查行移动状态 SELECT table_name, row_movement FROM dba_tables WHERE owner='<SCHEMA_NAME>'; -- 启用行移动 ALTER TABLE <table_name> ENABLE ROW MOVEMENT; /* 解决ORA-08189错误 */ ``` #### 4. **处理撤销数据失效** [^1] - **关键配置**: ```sql -- 增加UNDO保留时间(秒) ALTER SYSTEM SET UNDO_RETENTION = 3600; -- 默认900秒 -- 检查撤销表空间 SELECT tablespace_name, status FROM dba_undo_extents; ``` #### 5. **处理DDL变更冲突** [^1] - **限制操作**: - 开启闪回期间避免表结构变更(ALTER TABLE等) - 闪回时间点需早于最后一次DDL操作时间 - **恢复方法**: ```sql FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2023-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS'); ``` #### 6. **最终开启闪回数据库** ```sql -- 在MOUNT状态下执行 ALTER DATABASE FLASHBACK ON; -- 验证状态 SELECT flashback_on FROM v$database; -- 应返回"YES" ``` > **关键提示**: > - 空间不足是最高频故障原因(占案例70%以上),优先检查闪回区[^2] > - 开启后立即测试:`FLASHBACK DATABASE TO TIMESTAMP SYSDATE-1/1440;`(闪回1分钟前) > - 生产环境建议保留20%以上的闪回区空闲空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值