跳到主要內容

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.

留言

這個網誌中的熱門文章

Shell Script簡易教學

一、概論
在許多的情況之下,我們都需要固定一組可以重覆或判斷資訊的指令,
而把這些指令存被在文字檔中,再交由Shell執行,就是Script。
一般會將Shell Script的副檔名命名為.sh,雖然副檔名在Linux中並非必要,
但是有副檔名可以讓我們更容易管理這些檔案。

假設有一個名為test.sh 的 Shell Script,首先用文字編輯器來撰寫內容如下:
#!/bin/bash
echo Hello World

第一行是必需的,它是用來定義你要使用的 shell。Linux中有許多的Shell可以使用,
如:ksh、bash,但是彼此之間語法有所差異,所以我們首先需要定義使用哪一個Shell。
而第二行的 echo 代表列出一個字串,預設會把後面的字串「Hello World」顯示在螢幕上。
將test.sh存檔後,可以用下列其中一種方式執行它:
1、直接輸入 sh test.sh
2、改變test.sh的權限,加上可以執行的權限,
   chmod a+x test.sh
   接著直接執行它:
   ./test.sh

在Shell Script中,「#」表示註解,在#後面將視為註解並且被程式忽略。
例如:
#pwd
ls -l
Shell只會執行ls -l,而不會執行ls -l

而「;」 則代表指令的分隔,例如:
pwd;ls -l

pwd
ls -l
都是一樣執行pwd及ls -l。

二、變數的使用
在Shell Script中,所有的變數都視為字串,因此不需要在定義變數類型。
在Shell中定義和使用變數時並不一樣。
例如,定義一個變數id並且設定值為2013001,接著還要將印出變數的值:
id=2013001 -> 定義變數時前面不加「$」符號
echo $id   -> 使用變數時前面要加「$」符號
注意,在等號的二邊不可以有空白,否則將出現錯誤。

再介紹一個範例:
dir=/home/oracle
ls $dir

這裡我們定義了變數dir的值為/home/oracle,接著用ls指令來印出變數dir,
此時指令會變為ls /home/oracle,所以就把目錄中所有檔案都列出來。


我們再來看一個例子,說明如何使用變數來定義變數:
$ tmppath=/tmp$ tmpfile=$tmppath/abc.txt$ ec…

用Excel 2010製作免費甘特圖

用Excel 2010製作免費甘特圖,以下是完成圖,其實是用圖表的功能加上修改圖表的選項來仿製甘特圖,
並非真正的甘特圖,如果要用免費的甘特圖軟體,可以下載GanttProject,有支援中文。
官方網址:http://www.ganttproject.biz/

首先將任務、開始日期、天數、完成日期填入工作表中,完成計劃後將資料全選,並在工具列上找到橫條圖。
一定要將資料全選起來,不然Excel有可能會判斷錯誤,畫出不符我們需求的圖表
(日期我算錯了,不過不影響製作,可以事後再修改)

圖表出現之後,修改資料的範圍(藍色框的部份),將資料由D6拉到C6。
「完成日期」只是為了讓Excel一開始不要判斷錯誤而產生錯誤的圖表。

在「藍色線條」上按滑鼠右鍵,選擇「資料數列格式」

依下圖點選「無填滿」,把藍色的線條變成透明,讓圖表看起來像是甘特圖。

接著我們要修改欄、列的參數,在下面日期的部份點選滑鼠右鍵,選「座標軸格式」

下方列是日期,所以選「日期」,並選擇一個類型

再來到「座標軸選項」中設定最小、最大值,讓圖表看起來更像甘特圖,其中最小值、最大值的數字,
是由1900/1/1到指定日期的總天數,例如:2014/4/9-1900/1/1=41737天(可用Excel直接相減得出數值)
「主要刻度間距」改為1,也就是間距為1天

接著回到圖表上,在左方任務列上按滑鼠右鍵,選擇「座標軸格式」

這次只選「類別次序反轉」,會把任務上下翻轉。

最後再將圖表的寬度、長度做一個調整就完成了。

補充說明: 如果遇到下列的情形,圖表的內容相反的話,可以按下「切換列/欄」來改變

Excel可以自訂公式(函數)來補足內建公式(函數)無法處理的情形

Excel有許多實用的公式,善用這些公式可以達成大部份的功能,但是萬一公式無法滿足需求時,可以自訂公式來解決。

          自訂公式其實就是自訂函數,先開啟Visual Basic(VBA)


                     新增一個「模組」


在開啟的模組視窗內撰寫VBA的函數程式,例如:

Function TEST01(A, B)
    TEST01 = A * 10 + B * 20
End Function

                    函數TEST01需要兩個參數A、B,並且將計算的結果回傳。



完成上述的設計之後,就可以在插入函數中選擇使用者定義,再選擇TEST01。
(或直接在儲存格輸入函數名稱TEST01)
反正使用的方法就跟一般的Excle的公式一樣就對了。