Oracle:ORA-00283: recovery session canceled due to errors

2023-05-16

我做了一个这样的实验:归档模式下进行手工热备并进行还原恢复,结果将数据文件还原后,却报出了如下错误:
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 1: ‘/opt/oracle/oradata/orcl/system01.dbf’
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: ‘/opt/oracle/oradata/orcl/system01.dbf’

因此开始了困难重重的排错历程

首先看一下我做了哪些事:
※ 开启归档模式
※ 向scott用户中的A表插入一条数据并提交,插入第二条数据未提交
※ alter database begin backup; 备份数据库
※ 将所有dbf文件,ctl文件备份到指定路径
※ alter database end backup; 结束数据库备份
※ 删除所有.df,模拟数据文件丢失
※ 还原数据文件
※ recover database;进行数据库恢复 –从这步开始报错
※ alter database open;开启数据库 –继续报错

-- 1 . 开启归档模式
startup mount
alter database archivelog

-- 2 . scott用户下往表A插入一条数据并提交
scott@ORCL>insert into A values ('20200103001');

1 row created.

scott@ORCL>
scott@ORCL>commit;

Commit complete.

scott@ORCL>
scott@ORCL>

-- 3 . 又插入一条数据未提交
scott@ORCL>insert into A values ('20200103002');

1 row created.

scott@ORCL>
-- 4 . 查看要备份哪些数据文件
scott@ORCL>select name from v$datafile;

NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/opt/oracle/oradata/orcl/system01.dbf
/opt/oracle/oradata/orcl/sysaux01.dbf
/opt/oracle/oradata/orcl/undotbs01.dbf
/opt/oracle/oradata/orcl/users01.dbf
/opt/oracle/oradata/orcl/example01.dbf
/opt/oracle/oradata/orcl/users011.dbf

6 rows selected.

-- 5 . 查看数据文件对应哪些表空间
scott@ORCL>col file_name format a50
scott@ORCL>select file_id,file_name,tablespace_name from dba_data_files;

   FILE_ID FILE_NAME                                          TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
         5 /opt/oracle/oradata/orcl/example01.dbf             EXAMPLE
         4 /opt/oracle/oradata/orcl/users01.dbf               USERS
         3 /opt/oracle/oradata/orcl/undotbs01.dbf             UNDOTBS1
         2 /opt/oracle/oradata/orcl/sysaux01.dbf              SYSAUX
         1 /opt/oracle/oradata/orcl/system01.dbf              SYSTEM
         6 /opt/oracle/oradata/orcl/users011.dbf              USERS011

6 rows selected.

scott@ORCL>
scott@ORCL>
scott@ORCL>
scott@ORCL>
-- 6 . 查看要备份哪些控制文件
scott@ORCL>select name from v$controlfile;

NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/opt/oracle/oradata/orcl/control01.ctl
/opt/oracle/flash_recovery_area/orcl/control02.ctl
scott@ORCL>
-- 7 . 开始备份数据库
sys@ORCL>alter database begin backup;

Database altered.

--8 . cp数据文件和控制文件到指定路径下(这里有坑,接下来会讲解)
[root@db01 orclbk]# cp /opt/oracle/oradata/orcl/*.dbf /opt/oracle/oradatabk/orclbk
[root@db01 orcl]# cp /opt/oracle/oradata/orcl/control01.ctl /opt/oracle/oradatabk/orclbk
[root@db01 orclbk]# cp /opt/oracle/flash_recovery_area/orcl/control02.ctl /opt/oracle/oradatabk/orclbk
--9 . 备份期间,scn被冻结,不发生变化
sys@ORCL>select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            2431194
         2            2431194
         3            2431194
         4                  0
         5            2431194
         6            2431194

6 rows selected.
--9 . ACTIVE表示而已备份相应的数据文件,并且对于其中的数据块DBWN仍然可以刷新
sys@ORCL>select * from v$backup;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 ACTIVE                2431194 13-JAN-20
         2 ACTIVE                2431194 13-JAN-20
         3 ACTIVE                2431194 13-JAN-20
         5 ACTIVE                2431194 13-JAN-20
         6 ACTIVE                2431194 13-JAN-20

sys@ORCL>
-- 10 . 结束数据库备份
sys@ORCL>
sys@ORCL>alter database end backup;
alter database end backup
*
ERROR at line 1:
--11 . 这里报的error是一个历史性遗留问题,几个月前误删了正在使用中的users01文件,固重建了user011文件,将出问题的users01文件废弃掉了,代价是user01文件下的所有表都不能操作了,因此在备份数据库时,报出以下错误,可以暂且无视
ORA-01260: warning: END BACKUP succeeded but some files found not to be in backup mode

--12 . 删除所有数据文件,模拟数据文件丢失
[root@db01 orclbk]# cd /opt/oracle/oradata/orcl
[root@db01 orcl]# rm -f *.dbf

--13 . 还原数据文件
[root@db01 orcl]# cp /opt/oracle/oradatabk/orclbk/*.dbf /opt/oracle/oradata/orcl

sys@ORCL>
--14 . shutdown 数据库
sys@ORCL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL>
sys@ORCL>
--15 . startup 数据库
sys@ORCL>startup
ORACLE instance started.

Total System Global Area  409194496 bytes
Fixed Size                  2213856 bytes
Variable Size             310380576 bytes
Database Buffers           92274688 bytes
Redo Buffers                4325376 bytes
Database mounted.
--16 . 不出所料,数据库因丢失数据文件,报错如下
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'

--17 . 还原数据文件
[root@db01 orclbk]# cp /opt/oracle/oradata/orcl/*.dbf /opt/oracle/oradatabk/orclbk

--18 . 查看当前数据库状态
sys@ORCL>select open_mode from v$database;

OPEN_MODE
--------------------
MOUNTED

--19 . 恢复数据库,结果报错如下
sys@ORCL>recover database;
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'

--20 . 打开数据库,继续结果报错如下
sys@ORCL>alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'


sys@ORCL>
sys@ORCL>
sys@ORCL>recover database
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'

sys@ORCL>recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'

排错
首先确认控制文件和数据文件scn不一致

--21 . 
sys@ORCL>select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#
------------------
           2431562
           2431562
           2431562
           2214476
           2431562
           2431562

6 rows selected.



sys@ORCL>select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
                 0
                 0
                 0
                 0
                 0
                 0

6 rows selected.

查看trace文件和alert文件定位问题
在这里插入图片描述
上面第8步骤讲到的坑,仔细的人会注意到备份数据文件时linux文件目录拥有者及用户组由原来的oracle oinstall 变为root root了,这就意味着你还原后的文件权限变化了,这就是问什么看trace文件时会有permission denied的错误。

这里不用慌,更改 linux文件目录拥有者及用户组即可
chown -R oracle:oinstall test --大R代表递归更改,test下面的所有子目录都会更改,不加R参数,就只更改test目录拥有者和组
将所有文件改成 oracle oinstall
在这里插入图片描述

重建控制文件(这里是关键!)

idle>select status from v$instance
  2  ;

STATUS
------------
MOUNTED
idle>alter database backup controlfile to trace as '';

Database altered.

select d.value||b.bias||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc                                                                                                                                                             ' trace_file_name from ( select p.spid from sys.v$mystat m,sys.v$session s,sys.v                                                                                                                                                             $process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p, ( s                                                                                                                                                             elect t.instance from sys.v$thread t,sys.v$parameter v where v.name = 'thread' a                                                                                                                                                             nd (v.value = 0 or t.thread# = to_number(v.value))) i, ( select value from sys.v                                                                                                                                                             $parameter where name = 'user_dump_dest') d,(select DECODE(count(BANNER),0,'/','                                                                                                                                                             \') bias from v$version where upper(banner) like '%WINDOWS%') b;

TRACE_FILE_NAME
--------------------------------------------------------------------------------                                                                                                                                                             --------------------------------------------------------------------------------                                                                                                                                                             ----------------------------------------
/opt/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_1719.trc


-- 查看trace文件重建控制文件脚本,按照文件中提示进行操作
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/opt/oracle/oradata/orcl/redo01.log',
    '/opt/oracle/disk2/redo10b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/opt/oracle/oradata/orcl/redo02.log',
    '/opt/oracle/disk2/redo20b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/opt/oracle/oradata/orcl/redo03.log',
    '/opt/oracle/disk2/redo30b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    '/opt/oracle/oradata/orcl/redo04.log',
    '/opt/oracle/disk2/redo40b.log'
  ) SIZE 8M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/opt/oracle/oradata/orcl/system01.dbf',
  '/opt/oracle/oradata/orcl/sysaux01.dbf',
  '/opt/oracle/oradata/orcl/undotbs01.dbf',
  '/opt/oracle/oradata/orcl/users01.dbf',
  '/opt/oracle/oradata/orcl/example01.dbf',
  '/opt/oracle/oradata/orcl/users011.dbf'
CHARACTER SET WE8MSWIN1252
;
-- Take files offline to match current control file.
ALTER DATABASE DATAFILE '/opt/oracle/oradata/orcl/users01.dbf' OFFLINE DROP;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/opt/oracle/flash_recovery_area/ORCL/archivelog/2020_01_14/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/opt/oracle/flash_recovery_area/ORCL/archivelog/2020_01_14/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP3 ADD TEMPFILE '/opt/oracle/oradata/orcl/temp03.dbf' REUSE;
ALTER TABLESPACE TEMP2 ADD TEMPFILE '/opt/oracle/oradata/orcl/temp02.dbf' REUSE;
-- End of tempfile additions.
--
--     Set #2. RESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- The contents of online logs will be lost and all backups will
-- be invalidated. Use this only if online logs are damaged.
-- WARNING! The current control file needs to be checked against
-- the datafiles to insure it contains the correct files. The
-- commands printed here may be missing log and/or data files.
-- Another report should be made after the database has been
-- successfully opened.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
--  ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/opt/oracle/oradata/orcl/redo01.log',
    '/opt/oracle/disk2/redo10b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/opt/oracle/oradata/orcl/redo02.log',
    '/opt/oracle/disk2/redo20b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/opt/oracle/oradata/orcl/redo03.log',
    '/opt/oracle/disk2/redo30b.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    '/opt/oracle/oradata/orcl/redo04.log',
    '/opt/oracle/disk2/redo40b.log'
  ) SIZE 8M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/opt/oracle/oradata/orcl/system01.dbf',
  '/opt/oracle/oradata/orcl/sysaux01.dbf',
  '/opt/oracle/oradata/orcl/undotbs01.dbf',
  '/opt/oracle/oradata/orcl/example01.dbf',
  '/opt/oracle/oradata/orcl/users011.dbf'
CHARACTER SET WE8MSWIN1252
;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/opt/oracle/flash_recovery_area/ORCL/archivelog/2020_01_14/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/opt/oracle/flash_recovery_area/ORCL/archivelog/2020_01_14/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE
-- Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP3 ADD TEMPFILE '/opt/oracle/oradata/orcl/temp03.dbf' REUSE;
ALTER TABLESPACE TEMP2 ADD TEMPFILE '/opt/oracle/oradata/orcl/temp02.dbf' REUSE;
-- End of tempfile additions.
--

执行重建控制文件脚本
控制文件创建成功会提示Control file created.
在这里插入图片描述
recover database using bacup controlfile;
这里起初我选的AUTO,但是报错过不去,后来又选择filename,试了 如下redo文件,最终Log applied了
/opt/oracle/oradata/orcl/redo01.log --失败
/opt/oracle/oradata/orcl/redo03.log --失败
/opt/oracle/oradata/orcl/redo02.log --成功 Log applied
这里大家耐心挨个试一下

alter database open resetlogs;
在这里插入图片描述
到这里数据库终于正常打开,完结,撒花

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle:ORA-00283: recovery session canceled due to errors 的相关文章

  • 在 MVC3 应用程序中使用具有表单身份验证的 Oracle 数据库

    我编写了一个简单的 MVC3 应用程序 并遵循了有关如何设置经过身份验证的用户的教程 本教程使用 SQL Server Express 数据库 是否可以使用 Oracle 数据库代替 SQL Server 这只是更改 web config
  • 如何查看授予其他用户的架构哪些权限

    考虑这种情况 在数据库中 我有两个用户 A 和 B 及其相应的架构 我想知道 如何获取信息 架构 B 中的用户 A 有哪些权限 考虑这种情况 我们有两个用户及其关联的场景 我们有用户A和用户B 在A中 假设我们有TB1 TB2 在B中 假设
  • 在 Laravel 中获取身份验证用户 ID

    如果用户登录 Laravel 5 1 我们可以访问用户 ID Auth user gt id 在我以前的应用程序 不是 laravel 中 当用户登录时 我正在为 userid 注册一个会话 我正在检查 SESSION user id 是否
  • 一键提交多个表单

    我在用 SESSION为我的网上商店动态创建表单 这些表单包含客户想要的产品的自定义信息 这是布局 Page1 客户填写的表格如下所示
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc
  • 无法在 .NET 中加载 Oracle.DataAccess 的文件或程序集

    当我尝试运行一个简单的程序来访问 oracle 时 我收到此消息 无法加载文件或程序集 Oracle DataAccess 版本 2 111 7 20 文化 中性 PublicKeyToken 89b483f429c47342 或其依赖项之
  • 将 OraclePreparedStatement 与 DBCP 连接结合使用

    我正在尝试使用 dbcp 框架为我的 oracle 服务器创建一个连接池 我用过这个tutorial http web archive org web 20120615100115 http www freshblurbs com 80 j
  • 使用 SQL 序数位置表示法的好处?

    背景资料 序数位置表示法 又称序数 是基于列列表中的列顺序的列简写 SELECT子句 而不是列名或列别名 通常支持在ORDER BY子句 某些数据库 MySQL 3 23 PostgreSQL 8 0 支持语法GROUP BY条款也是如此
  • 每次使用会话来获取/设置对象属性

    我尝试搜索这个 但我什至不知道如何用它来搜索 我试图做的是有一个类 每次我访问它来更改它时 我实际上都是从会话中获取和设置值 这是我正在尝试做的事情 到目前为止我所做的事情 public class example public int p
  • 如何从 TOAD for Oracle 执行函数并将结果绑定到数据网格

    我有一个函数 它将 pl sql 对象的 VARRAY 作为其参数之一 如何执行此存储过程并将其返回的结果集绑定到 TOAD for Oracle 中的数据网格 经过一番搜索后 我找到了自己问题的答案 假设您的 varray 类型称为 va
  • 使用 to_char 格式化间隔

    以下 SQL 命令 select TO CHAR NVL arg1 arg2 TO DSINTERVAL 0 00 00 00 from table1 生成格式为 000000000 00 03 01 954000 的结果 是否可以在 to
  • 授予用户在查询时使用表索引的什么?

    我想知道当用户从表中查询数据并且该用户已被授予以下权限时 oracle 是否使用索引 grant select on table to user 我想知道是否需要其他拨款才能使用索引 不 没有要求 或能力 授予对索引的访问权限 如果用户可以
  • TOAD 将 &String 视为绑定变量

    我正在使用 Oracle Data Integrator 开发一些 ETL 有时会使用 TOAD 测试部分代码 今天我遇到了 TOAD 的问题 我有一行像 AND column value like DEV PROD 当我尝试运行包含上面过
  • NHibernate、数据绑定到 DataGridView、延迟加载和会话管理 - 需要建议

    我的主应用程序窗体 WinForms 有一个 DataGridView 它使用 DataBinding 和 Fluent NHibernate 显示 SQLite 数据库中的数据 该表单在应用程序运行的整个过程中都是打开的 出于性能原因 我
  • 使用 Vaadin Flow Web 应用程序处理全局所有布局和“路由”URL 的登录

    Vaadin 8 在 Vaadin 8 中 在我的UI子类我通过检查用户的会话是否带有一个属性来处理登录 该属性表明他们是否已成功登录 如果没有的话 我的UI子类显示登录布局 而不是带有导航选项的其他内容 例如菜单栏和在该 UI 内切换布局
  • 如何终止会话或会话 ID (ASP.NET/C#)

    当用户单击注销按钮时 如何销毁会话 会话 名称 我正在 MSDN 上查看 ASP NET API Reference 它似乎没有太多信息 看来还是比较有限的 但我找不到 ASP NET 类等的任何其他页面 我努力了 Session Aban
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 Windows 上使用 Git - 意外丢失了大量工作。我可以拿回来吗?

    我很困惑 我想我已经失去了几个小时的工作时间 我之前在 Git 中编辑了一个文件 我保存了它 但没有提交 我确实做了一些其他文件更改 并提交并推送了它们 然而 有一个文件被搞乱了 所以我单击了最后一次成功的提交 然后按了 回滚到此提交 令我
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4

随机推荐