跳到主要內容

ORA-01113: file 8 needs media recovery


原本為了練習壞軌的模擬,先手動備份 sample.dbf --> sample.dbf.bk,再修改 sample.dbf 的 block 資料,

以觀察資料庫的變化,練習完成之後,再將備份  sample.dbf.bk --> sample.dbf,結果無法正常開啟資料庫。

因為確定 sample.dbf 的資料是正確的,所以問題應該是 checkpoint number不一致所導致。

所以我使用下列的方法解決。但是如果資料無法確定是否正確,則建議還原資料庫。

SQL*Plus: Release 11.1.0.7.0 - Production on Wed Mar 21 00:55:29 2012

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected.
SQL>startup
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> select open_mode from v$database;

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

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 8 needs media recovery
ORA-01110: data file 8: '/home/oracle/app/oracle/oradata/orcl/sample.dbf'

方法一:

SQL> Alter database datafile '/home/oracle/app/oracle/oradata/orcl/sample.dbf' offline

Database altered.

SQL> alter database open;

Database altered.

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> recover datafile 8;
Media recovery complete.
SQL> Alter database datafile '/home/oracle/app/oracle/oradata/orcl/sample.dbf' online;

Database altered.


方法二:

查詢檔案應該要註記的 checkpoint number
SQL> select name,checkpoint_change#,last_change# from v$datafile;

NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
/home/oracle/app/oracle/oradata/orcl/system01.dbf
        9812649     9812649

/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
        9812649     9812649

/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
        9812649     9812649


NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
/home/oracle/app/oracle/oradata/orcl/users01.dbf
        9812649     9812649

/home/oracle/app/oracle/oradata/orcl/example01.dbf
        9812649     9812649

/home/oracle/app/oracle/oradata/orcl/APEX_1246426611663638.dbf
        9812649     9812649


NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
/home/oracle/app/oracle/oradata/orcl/APEX_1265209995679366.dbf
        9812649     9812649

/home/oracle/app/oracle/oradata/orcl/sample.dbf
        9812649     9812649

/home/oracle/app/oracle/oradata/orcl/RMAN_CATALOG.dbf
        9812649     9812649


9 rows selected.
查詢資料庫的 checkpoint number
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
        9812649
實際查詢目前在檔案內的 checkpoint number,發現 sample.dbf 的號碼不一樣
SQL> select name,checkpoint_change# from v$datafile_header;

NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE#
------------------
/home/oracle/app/oracle/oradata/orcl/system01.dbf
        9812649

/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
        9812649

/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
        9812649


NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE#
------------------
/home/oracle/app/oracle/oradata/orcl/users01.dbf
        9812649

/home/oracle/app/oracle/oradata/orcl/example01.dbf
        9812649

/home/oracle/app/oracle/oradata/orcl/APEX_1246426611663638.dbf
        9812649


NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE#
------------------
/home/oracle/app/oracle/oradata/orcl/APEX_1265209995679366.dbf
        9812649

/home/oracle/app/oracle/oradata/orcl/sample.dbf
        9806191

/home/oracle/app/oracle/oradata/orcl/RMAN_CATALOG.dbf
        9812649


9 rows selected.
查詢需要恢復的檔案。
SQL> select file#,online_status,to_char(change#,'999999999999') from v$recover_file;

     FILE# ONLINE_ TO_CHAR(CHANG
---------- ------- -------------
     8 ONLINE     9806191
    

SQL> shutdown immediate;

SQL> startup mount

恢復資料庫,第一次使用Auto,第二次使用Cancel


SQL> recover database using backup controlfile until auto;


SQL> recover database using backup controlfile until cancel;


SQL> shutdown immediate;
    
修改pifle ,例如:initorcl.ora,加入隱含的參數 _ALLOW_RESETLOGS_CORRUPTION=TRUE

指定 pfile 參數檔啟用
SQL> startup pfile=?/dbs/initorcl.ora
ORACLE instance started.

Total System Global Area  456146944 bytes
Fixed Size              1344840 bytes
Variable Size            377490104 bytes
Database Buffers        71303168 bytes
Redo Buffers              6008832 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


因為還原是"不完全還原",open database時就一定要用resetlogs來讓database起來

SQL> ALTER DATABASE OPEN RESETLOGS;

Database altered.

SQL> select file#,online_status,to_char(change#,'999999999999') from v$recover_file;

no rows selected

SQL> select name,checkpoint_change# from v$datafile_header;

NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE#
------------------
/home/oracle/app/oracle/oradata/orcl/system01.dbf
        9806195

/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
        9806195

/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
        9806195


NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE#
------------------
/home/oracle/app/oracle/oradata/orcl/users01.dbf
        9806195

/home/oracle/app/oracle/oradata/orcl/example01.dbf
        9806195

/home/oracle/app/oracle/oradata/orcl/APEX_1246426611663638.dbf
        9806195


NAME
--------------------------------------------------------------------------------
CHECKPOINT_CHANGE#
------------------
/home/oracle/app/oracle/oradata/orcl/APEX_1265209995679366.dbf
        9806195

/home/oracle/app/oracle/oradata/orcl/sample.dbf
        9806195

/home/oracle/app/oracle/oradata/orcl/RMAN_CATALOG.dbf
        9806195


9 rows selected.

SQL> startup
ORACLE instance started.

Total System Global Area  456146944 bytes
Fixed Size              1344840 bytes
Variable Size            394267320 bytes
Database Buffers        54525952 bytes
Redo Buffers              6008832 bytes
Database mounted.
Database opened.

這個網誌中的熱門文章

Line如何換行

在電腦版的Line輸入文字時,遇到需要換行的情形時,我都是用記事本先寫好再複製上去,這樣就可以有換行的效果,可是這樣的做法好像失去Line的便利性。 於是查了一下,原來有一個設定可以指定Enter換行,而不是發訊息出去。 完成設定之後,要發送訊息就改用Alt+Enter,而Enter就可以換行了。

在Windows下,利用tasklist與taskkill來刪除Process

Windows7 / Windows8 kill process Linux下要刪除某個程序通常會使用 ps 配合 kill 來刪除程序。 例如:ps -ef |grep [PROCESS NAME]       kill -9 [PID] 在Windows下,通常是開啟工作管理員來強制結束應用程式,但是如果要寫成Script,就必須改為命令式。 TASKLIST [/S system [/U username [/P [password]]]]          [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]           TASKKILL [/S system [/U username [/P [password]]]]          { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]           (Tasklist:查詢Process ; Taskkill:刪除Process)           例如要刪除已開啟的記事本(notepad): 1、查詢記事本的Process訊息     C:\> tasklist |find /i "notepad.exe"     notepad.exe      6092 Console     1     5,832 K 2、由上得知記事本的PID為6092     C:\> taskkill /f /PID 6092     成功:處理程序 PID 6092 已經終止了。     taskkill使用的參數     /f:指定此參數可強制終止處理程序     /PID:指定要終止之處理程序的 PID      3、也可以直接以程式名稱刪除     C:\ taskkill /f /im notepad.exe     成功:處理程序 "notepad.exe" <PID 6092> 已經終止了      下面是我自己測試的Script,可以刪除多個相同的程式,例如同時開啟了三個記事本: @echo off for /f &quo

Win 10 工作排程無法執行bat批次檔

利用Win 10的工作排程器來設定每日自動執行的批次檔,單獨執行批次檔沒問題,但是放在排程上就是無法執行。 後來試了幾種網路上提供的方式,其注意的事項如下: 1、在「安全性選項」選擇「只有使用者登入時才執行」並取消「以最高權限執行」。 2、在「設定」中選擇「Windows 10」 3、批次檔內的執行檔需以完整的路徑執行,或設定PATH路徑。 3、批次檔中如果帶有中文的路徑,則文字編碼類型必需是ANSI碼,       我的批次檔一開始就是UTF-8碼,但是單獨執行沒有問題,排程上就是有問題,       最後在批次檔中加入暫停指令pause才發現的。 4、如果想選擇「不論使用者登入與否均執行」,則在「設定」必須選擇「Windows Server 2003、Windows XP或Windows 2000」,    但是上述的選項只有在新增工作程程時才會出現,原有的工作排程是不會有此選項