ORA-01291: missing logfile 事务闪回缺失日志

实验遇到的问题:

1、刚开始做前面的实验的时候,resetlogs重置了联机日志,导致闪回的时候总是报miss logfile的错误。

这个时候需要用noretlogs的方式重建控制文件,然后重新启动数据库到open状态。

SQL> SELECT distinct xid,commit_scn FROM flashback_transaction_query t

2  where table_owner=‘HR‘

3  and   lower(t.table_name) = ‘employees‘

4  and   t.commit_timestamp > systimestamp - interval ‘90‘ minute

5  order by t.commit_scn ;

XID              COMMIT_SCN

---------------- ----------

100004005E010000    2948380

0E0019005E010000    2948386

SQL> declare

2  xids sys.xid_array ;

3  begin

4    xids := sys.xid_array(‘100004005E010000‘);

5    dbms_flashback.transaction_backout(1,xids,options => dbms_flashback.cascade);

6  end ;

7  /

declare

*

ERROR at line 1:

ORA-55507: Encountered mining error during Flashback Transaction Backout.

function:krvxpsr

ORA-01291: missing logfile

ORA-06512: at "SYS.DBMS_FLASHBACK", line 37

ORA-06512: at "SYS.DBMS_FLASHBACK", line 70

ORA-06512: at line 5

此问题是我之前启动数据库时候重置了日志文件,导致数据库不读日志。需要重建控制文件。

shutdown immediate

startup nomount

alter database backup controlfile to trace as ‘J:\app\wufan\diag\rdbms\orcl\orcl\trace\control.trac‘;

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 ‘J:\APP\WUFAN\ORADATA\ORCL\REDO01.LOG‘  SIZE 50M BLOCKSIZE 512,

GROUP 2 ‘J:\APP\WUFAN\ORADATA\ORCL\REDO02.LOG‘  SIZE 50M BLOCKSIZE 512,

GROUP 3 ‘J:\APP\WUFAN\ORADATA\ORCL\REDO03.LOG‘  SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

‘J:\APP\WUFAN\ORADATA\ORCL\SYSTEM01.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\SYSAUX01.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\UNDOTBS02.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\USERS01.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\EXAMPLE01.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\UNDOTBS04.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\DATAFILE\O1_MF_UNDOTBS4_CK602RTP_.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\DATAFILE\O1_MF_TEST02_CK610HG8_.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\DATAFILE\O1_MF_TEST02_CK611OKD_.DBF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\DATA_TEST01.BDF‘,

‘J:\APP\WUFAN\ORADATA\ORCL\HEAT01.BDF‘

CHARACTER SET ZHS16GBK

;

--这种情况其实不需要恢复,你执行了这条命令它会告诉你没有什么可恢复的。

RECOVER DATABASE;

--打开所有的补充日志文件,可以不做

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

--打开系统归档,当前已经是归档状态,所以这条命令会报错,不用管

ALTER SYSTEM ARCHIVE LOG ALL;

--打开数据库

ALTER DATABASE OPEN;

至此,重建控制文件已经完成

重新进行试验

1、开两个事物

SQL> update hr.employees t

2  set t.salary = t.salary * 2 ;

107 rows updated.

SQL> commit ;

Commit complete.

SQL> update hr.employees t

2  set t.salary = t.salary * 1.1 ;

107 rows updated.

SQL> commit ;

Commit complete.

2、查询两个事物号

SQL> SELECT distinct xid,commit_scn FROM flashback_transaction_query t

2  where table_owner=‘HR‘

3  and   lower(t.table_name) = ‘employees‘

4  and   t.commit_timestamp > systimestamp - interval ‘15‘ minute

5  order by t.commit_scn ;

XID              COMMIT_SCN

---------------- ----------

13001A0061010000    2983670

0F0021005D010000    2983677

3、执行事物闪回

SQL> declare

2  xids sys.xid_array ;

3  begin

4    xids := sys.xid_array(‘13001A0061010000‘);

5    dbms_flashback.transaction_backout(1,xids,options => dbms_flashback.nocascade);

6  end ;

7  /

declare

*

ERROR at line 1:

ORA-00600: internal error code, arguments: [ktgRunStmt_5], [25153], [ORA-25153:

Temporary Tablespace is Empty

ORA-00600: internal error code, arguments: [ktgRunStmt_5], [25153], [ORA-25153:

Temporary Tablespace is Empty

], [], [], [], [], [], [], [], [], []

], [], [], [], [], [], [], [], [], []

ORA-00600: internal error code, arguments: [ktgRunStmt_5], [25153], [ORA-25153:

Temporary Tablespace is Empty

], [], [], [], [], [], [], [], [], []

ORA-06512: at "SYS.DBMS_FLASHBACK", line 37

ORA-06512: at "SYS.DBMS_FLASHBACK", line 70

ORA-06512: at line 5

看着报错多吓人!其实问题就在于

[ORA-25153:

Temporary Tablespace is Empty

临时表空间是空的。下面就来确认这个问题:

--当前用户默认临时表空间

SQL> select username,temporary_tablespace from dba_users where username=‘SYS‘;

USERNAME                       TEMPORARY_TABLESPACE

------------------------------ ------------------------------

SYS                            TEMP_01

--默认表空间逻辑上是联机的,没问题

SQL> select tablespace_name,status from dba_tablespaces where tablespace_name=‘TEMP_01‘;

TABLESPACE_NAME                STATUS

------------------------------ ---------

TEMP_01                        ONLINE

--物理上没有文件,问题就在这儿

SQL> select file_name,tablespace_name from dba_temp_files;

no rows selected

--确定临时文件是存在的,把该临时文件添加到表空间

SQL> alter tablespace temp add tempfile ‘J:\app\wufan\oradata\orcl\temp01.dbf‘;

Tablespace altered.

--上面那条语句把文件对应到temp表空间了,其实sys的默认临时表空间是temp_01。

SQL> select tablespace_name,file_name from dba_temp_files;

TABLESPACE_NAME

------------------------------

FILE_NAME

--------------------------------------------------------------------------------

TEMP

J:\APP\WUFAN\ORADATA\ORCL\TEMP01.DBF

--将错就错吧,就将sys默认表空间改成temp吧

SQL> alter user sys temporary tablespace temp;

User altered.

--查看是否改过来了

SQL> select username,temporary_tablespace from dba_users where username=‘SYS‘;

USERNAME                       TEMPORARY_TABLESPACE

------------------------------ ------------------------------

SYS                            TEMP

重新进行实验:

开启连个事务:

--这边报了个错,因为做了很多次实验,现在这个薪水的值已经很大了,超出了字段的长度

SQL> update hr.employees t

2  set t.salary = t.salary * 2 ;

set t.salary = t.salary * 2

*

ERROR at line 2:

ORA-01438: value larger than specified precision allowed for this column

SQL> commit ;

Commit complete.

SQL> update hr.employees t

2  set t.salary = t.salary * 1.1 ;

107 rows updated.

SQL> commit ;

Commit complete.

--因为失败了一个语句,所以查询就只有3个事务。

SQL> SELECT distinct xid,commit_scn FROM flashback_transaction_query t

2  where table_owner=‘HR‘

3  and   lower(t.table_name) = ‘employees‘

4  and   t.commit_timestamp > systimestamp - interval ‘15‘ minute

5  order by t.commit_scn ;

XID              COMMIT_SCN

---------------- ----------

13001A0061010000    2983670

0F0021005D010000    2983677

0D00050064010000    2984032

--执行回退到倒数第二个事务,用nocascade

SQL> declare

2  xids sys.xid_array ;

3  begin

4    xids := sys.xid_array(‘0F0021005D010000‘);

5    dbms_flashback.transaction_backout(1,xids,options => dbms_flashback.nocascade);

6  end ;

7  /

declare

*

ERROR at line 1:

ORA-55504: Transaction conflicts in NOCASCADE mode

ORA-06512: at "SYS.DBMS_FLASHBACK", line 37

ORA-06512: at "SYS.DBMS_FLASHBACK", line 70

ORA-06512: at line 5

--失败了,因为倒数第二个事务依赖于倒数第一个事务

--重新用cascade选项,把倒数第二个事务依赖的第一个事务一起回退掉

SQL> declare

2  xids sys.xid_array ;

3  begin

4    xids := sys.xid_array(‘0F0021005D010000‘);

5    dbms_flashback.transaction_backout(1,xids,options => dbms_flashback.cascade);

6  end ;

7  /

PL/SQL procedure successfully completed.

--过程执行成功,但是别忘了commit,oracle在过程里面并没有提交,需要你手动提交才能生效

SQL> commit ;

Commit complete.

SQL>

时间: 2024-12-16 04:51:12

ORA-01291: missing logfile 事务闪回缺失日志的相关文章

Oracle学习(十三):闪回

1.知识点:能够对比以下的录屏进行阅读 SQL> --1. 错误地删除了记录 SQL> --2. 错误地删除了表 SQL> --3. 查询历史记录 SQL> --4. 怎样撤销一个已经提交的事务 SQL> SQL> --闪回的类型 SQL> --1. 闪回表:将表回退到过去的一个时间上 SQL> --2. 闪回删除:Oracle回收站 SQL> --3. 闪回版本号查询:全部历史记录 SQL> --4. 闪回事务查询:通过select语句得到一个

oracle闪回那些事

开启闪回数据库 alter database flashback on; alter database open; 修改日期时间显示格式: alter session  set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 查看系统视图 v$flashback_database_log中查看闪回数据库日志信息: select * from v$flashback_database_log; 闪回数据库: flashback database to timest

Oracle OCP笔记(31)使用闪回功能

Oracle OCP笔记(31)使用闪回功能 Oracle的闪回功能受到3个数据库结构之一的支持: 撤消数据.闪回恢复区和回收站. 撤消表空间中的撤销数据不仅支持事务回滚,也支持大多数闪回表操作.Flashback Data Archives允许查询先前版本的表行,它在撤销表空间之外的一个或多个表空间中提供一个区域,支持的保留期比撤销表空间还长.闪回日志保存在闪回恢复区中,从而无需执行传统的还原和恢复操作,即可方便地将整个数据库回滚到过去的时间点.每个表空间中的回收站包含一个或多个版本的已删除的

Oracle学习(15)【DBA向】:闪回

闪回Flashback 什么是闪回 l在Oracle的操作工程中,会不可避免地出现操作失误或者用户失误,例如不小心删除了一个表等,这些失误和错误可能会造成重要数 据的丢失,最终导致Oracle数据库停止. l在传统意义上,当发生数据丢失.数据错误问题时,解决的主要办法是数据的导入导出.备份恢复技术,这些方法都需要在发生错误 前,有一个正确的备份才能进行恢复. l为了减少这方面的损失,Oracle提供了闪回技术.有了闪回技术,就可以实现数据的快速恢复,而且不需要数据备份. 闪回的好处 恢复中,闪回

专题实验 oracle 闪回特性

在 oracle 9i 之前的版本中, 如果用户因为误操作 delete 或 update 并提交了, 那么恢复这些用户的操作错误是极其低效的. 为此, oracle 提供了闪回功能, 通过回退, 我们可以找回正确的数据. oracle 闪回查询特性 通过闪回查询我们可以按照时间戳或SCN来向前查询, 获取修改之前的数据镜像, 再通过insert等操作就可以恢复数据. 闪回查询一来于回滚段中存储的数据前镜像, 在oracle9i以前的版本中, 通常只要事务提交后, 前镜像数据就可以被覆盖, 空间

【Java EE 学习第30天】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】

一.闪回 1.可能的误操作 (1)错误的删除了记录 (2)错误的删除了表 (3)查询历史记录 (4)撤销已经提交了的事务. 2.对应着以上四种类型的误操作,有四种闪回类型 (1)闪回表:将表回退到过去的一个时间上 (2)闪回删除:还原Oracle回收站 (3)闪回版本查询:所有历史记录 (4)闪回事务查询:通过一个select 语句得到一个undo_sql,通过该undo_sql闪回 3.事实上oracle数据库还有另外两种闪回类型 (5)闪回数据库 (6)闪回归档日志 4.系统改变号:由时间戳

[转]Oracle DB执行闪回数据库

? 配置闪回数据库 ? 执行闪回数据库操作 ? 监视闪回数据库 闪回数据库 闪回数据库操作: ? 作用类似于数据库的倒带按钮 ? 可以在用户造成了逻辑数据损坏的情况下使用 闪回数据库 使用闪回数据库,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到那个时间的状态.因为不需要还原备份,所以此操作速度很快.可以使用此功能还原导致逻辑数据损坏的更改. 使用闪回数据库时,Oracle DB 可使用过去的块映像回退对数据库的更改.在正常数据库操作期间,Oracle DB 会不定期地将这些块

[课]10.1闪回查询的三种方式:闪回查询/闪回版本查询/闪回事务查询

数据库版本 1.1闪回查询演示 1.2闪回版本查询演示 1.3闪回事务查询演示 在做闪回事务查询时候,我们需要使用ORACLE提供的一个系统视图FLASHBACK_TRANSACTION_QUERY.闪回事务查询与闪回版本查询之间有着密切的关系,从刚才我们实验的闪回版本查询中可以知道有一个伪列VERSIONS_XID,那么闪回事务查询就是通过这个伪列与闪回版本查询发生关联. 我们现在查看一下该表的表结构: 开始演示:

闪回事务查询

原理:基于undo 闪回事务查询可以看作一个在事务级别查询数据库改变的一个诊断工具 FLASHBACK_TRANSACTION_QUERY retrieve transaction information for all tables involved in a transaction. provides the SQL statements that you can use to undo the changes made by a particular transaction 需要打开最小附