【oracle11g,10】redo日誌文件1:實例故障和介質故障,日誌組的操作,查看日誌內容

一.實例故障和介質故障:

1.instance 故障:
 實例恢復(instance recovery) 實例部分崩潰,如:RAC有四個節點沒有全掛,
 崩潰恢復(crash recovery) 實例全部崩潰 ,如:RAC有四個節點全掛,

2.media 故障: 磁盤損毀等物理原因導致。


3.實例恢復和介質恢復的相同點: 都是想用redo做前滾,再用undo做回滾。
4.實例恢復和介質恢復的不同點:
                   crash recovery                     media rcovery
是否自動                自動                                 手動
產生原因         非法關庫等認爲原因                      磁盤損壞等物理原因
使用日誌          online redo log                 archived log 和online redo log
是否轉儲                不需要                            可能需要
是否完全                完全恢復                          可以不完全恢復
本質區別               內存髒塊丟失,文件沒壞                文件損壞

5.instance failure (實例故障)
不需要DBA, smon 可以自動解決,但是很多用戶沒提交的事務丟失。 比如掉電,cpu故障,後臺進程崩潰,用戶非法關庫shutdown abort等。 dba 啓動實例,smon用redo 日誌做前滾 (redo apply),開庫後用undo段,對未提交事務做回滾。檢查告警日誌看實例故障的原因。

6.media failure:(介質故障)
介質故障,硬盤等介質故障造成的文件的丟失,遇到就很棘手,需要dba用備份進行解決。
datafile丟了好解決,redofile丟了也可以解決,但是如果都丟了就只能做不完全恢復。最好把不同文件放在不同磁盤上。redo日誌單獨放一個盤,archive log最好備份。


7.如果想殺庫將smon進程殺掉。


二.fast_start_mttr_target 參數:(重點)

1.fast_start_mttr_target參數表示數據庫實例故障恢復所需要的時間,當設置了這個參數後會啓動自動生成檢查點不定期生成檢查點(檢查點可以作爲實例恢復的起點),單位是秒。

2.恢復時間取決於讀取log files的時間和處理需要恢復的數據塊的時間。參數log_checkpoint_interval設定了恢復過程中將要被讀的重做日誌的數量。fast_start_io_target控制了需要被恢復的數據塊數量。然而,dba可以通過單獨設置參數來設置基於秒級的恢復時間限制。
log_checkpoint_timeout限制了上一次檢查點和最近的重做記錄之間的秒數(就是超過log_checkpoint_timeout參數設置的時間沒有發生檢查點,就會發生檢查點並且立即io)。
所以在oracle10gR2後有了fast_start_mttr_target,實際上這個參數被轉化爲設置參數fast_start_io_target,log_checkpoint_interval兩個參數。

3.設置fast_start_mttr_target參數: 修改fast_start_mttr_target!=0,表示啓用,

SQL> alter system  set fast_start_mttr_target=1;

System altered.

#TARGET_MTTR是根據fast_start_mttr_target參數設置的值算出的理論值。
#ESTIMATED_MTTR是根據內存中的髒塊的情況估算出的值。
SQL> select target_mttr,estimated_mttr from v$instance_recovery;

TARGET_MTTR ESTIMATED_MTTR
----------- --------------
         21             19

SQL> alter system set fast_start_mttr_target=3600;

System altered.

SQL> select target_mttr,estimated_mttr from v$instance_recovery;

TARGET_MTTR ESTIMATED_MTTR
----------- --------------
         30             19



一般fast_start_mttr_target的的設置爲300,或者是上線和下線的平均值接近300,600,900中的一個,


三.實例恢復的過程:
當有事務未提交,數據庫使用shutdown abort 關閉此時需要實例恢復,實例恢復的過程如下:

---告警日誌內容---
alter database open
Beginning crash recovery of 1 threads    --崩潰恢復
Started redo scan  --掃描redo
Completed redo scan
 read 452 KB redo, 101 data blocks need recovery   --101個數據塊需要恢復
Started redo application at
 Thread 1: logseq 22, block 4606
Recovery of Online Redo Log: Thread 1 Group 1 Seq 22 Reading mem 0
  Mem# 0: /u01/app/oracle/oradata/prod/disk1/redo01.log
  Mem# 1: /u01/app/oracle/oradata/prod/disk2/redo01.log
Completed redo application of 0.41MB                    --應用日誌完成
Completed crash recovery at
 Thread 1: logseq 22, block 5510, scn 500946
 101 data blocks read, 101 data blocks written, 452 redo k-bytes read
Tue Jun 17 07:22:24 2014
Thread 1 advanced to log sequence 23 (thread open)
Thread 1 opened at log sequence 23
  Current log# 2 seq# 23 mem# 0: /u01/app/oracle/oradata/prod/disk1/redo02.log
  Current log# 2 seq# 23 mem# 1: /u01/app/oracle/oradata/prod/disk2/redo02.log
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Tue Jun 17 07:22:24 2014
SMON: enabling cache recovery            --使用smon將實例恢復
Successfully onlined Undo Tablespace 2.        --使用undo回滾事務完成
Verifying file header compatibility for 11g tablespace encryption..
Verifying 11g file header compatibility for tablespace encryption completed
SMON: enabling tx recovery
Database Characterset is AL32UTF8
No Resource Manager plan active
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
Tue Jun 17 07:22:25 2014
QMNC started with pid=18, OS id=7461 
Completed: alter database open




四.查看日誌生成的量:

SQL> select a.name,b.value from v$statname a ,v$mystat b where b.statistic#=a.statistic# and a.name like '%redo size%';



五.查看日誌組和日誌狀態:

1.查看日誌:
SQL> select group#,sequence#,bytes/1024 k, members, status from v$log;

    GROUP#  SEQUENCE#          K    MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
         1         22     102400          2 INACTIVE
         2         23     102400          2 CURRENT
         3         21     102400          2 INACTIVE
2.看日誌成員:
SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                             IS_
---------- ------- ------- -------------------------------------------------- ---
         3 STALE   ONLINE  /u01/app/oracle/oradata/prod/disk1/redo03.log      NO
         3 STALE   ONLINE  /u01/app/oracle/oradata/prod/disk2/redo03.log      NO
         2         ONLINE  /u01/app/oracle/oradata/prod/disk1/redo02.log      NO
         2         ONLINE  /u01/app/oracle/oradata/prod/disk2/redo02.log      NO
         1         ONLINE  /u01/app/oracle/oradata/prod/disk1/redo01.log      NO
         1         ONLINE  /u01/app/oracle/oradata/prod/disk2/redo01.log      NO

6 rows selected.


3.日誌文件的狀態和其他的:

下面的項是  STATUS 列和其他列: 
UNUSED:表示從未對聯機重做日誌文件組進行寫入。這是剛添加的聯機重做日誌文件的狀態,當切換組時,會優先切換到狀態爲UNUSED的組 。 
CURRENT:表示當前的聯機重做日誌文件組,日誌組對應的髒塊還沒有從databuffer寫入到data file,不能被刪除。 
     ACTIVE:表示聯機重做日誌文件組是活動的,但是並非當前聯機重做日誌文件組。崩潰恢復需要該狀態。它可用於塊恢復。日誌組對應的髒塊還沒有從databuffer寫入到data file,不能被刪除。。 
     CLEARING:表示在執行  ALTER DATABASE CLEAR LOGFILE  命令後正在將該日誌重建爲一個空日誌。日誌清除後,其狀態更改爲  UNUSED。
    CLEARING_CURRENT:表示正在清除當前日誌文件中的已關閉線程。如果切換時發生某些故障,如寫入新日誌標   頭時發生了輸入/ 輸出  (I/O)  錯誤,則日誌可能處於此狀態。     
     INACTIVE :表示例程恢復不再需要聯機重做文件日誌組。日誌組對應的髒塊已經從databuffer寫入到data file,可以被刪除。

thread :線程(通過後臺進程lgwr啓動),在單實例的環境下,thread#永遠是1,。
sequence:日誌序列號,在日誌切換是會遞增。
first_change#:在當前日誌中記錄的首個數據塊的scn。當時事務完成的時候會在數據塊上寫入一個scn,代表數據塊的變化。



六.添加日誌:

1.添加日誌組:注意和其他組成員大小一致。
SQL>  alter database add logfile group 4 '/u01/app/oracle/oradata/prod/disk1/redo04.log' size 50m; 

2.添加成員:

alter database add logfile member '/u01/app/oracle/oradata/prod/disk2/redo04.log' to group 4;

3.添加多個成員的日誌組:
alter database add logfile group 5('/u01/app/oracle/oradata/prod/disk1/redo05.log','/u01/app/oracle/oradata/prod/disk2/redo05.log') size 100m;
 
4.切換日誌組:
 使用alter system switch logfile;切換日誌組.
當日志組的狀態都爲active時,再切換日誌組,此時生成一個全局檢查點,dbwr會寫所用的髒塊,所有的日誌組狀態爲inactive.
SQL> select group# ,sequence#, status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1         22 INACTIVE
         2         23 CURRENT
         3         21 INACTIVE
         4          0 UNUSED

SQL> alter system switch logfile;

System altered.

SQL> select group# ,sequence#, status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1         22 INACTIVE
         2         23 ACTIVE
         3         21 INACTIVE
         4         24 CURRENT
#切日誌,此時發生增量檢查點
SQL> alter system switch logfile;

System altered.

SQL> select group# ,sequence#, status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1         22 INACTIVE
         2         23 ACTIVE
         3         25 CURRENT
         4         24 ACTIVE

SQL> alter system switch logfile;

System altered.

SQL>  select group# ,sequence#, status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1         26 CURRENT
         2         23 ACTIVE
         3         25 ACTIVE
         4         24 ACTIVE

--沒有日誌組可用時,切日誌時會生成全局檢查點,寫所有髒塊。
SQL> alter system switch logfile;   

System altered.

SQL> select group# ,sequence#, status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1         26 INACTIVE
         2         27 CURRENT
         3         25 INACTIVE
         4         24 INACTIVE



七.dump出日誌組文件:

#dump出日誌文件
SQL> alter system dump logfile '/u01/app/oracle/oradata/prod/disk1/redo01.log';

#查看dump的日誌文件
[oracle@master trace]$ ls -lt|grep prod_ora
-rw-r----- 1 oracle oinstall   8127 Jun 17 08:53 prod_ora_7451.trc


3.bbed 可以修改數據塊的內容。


八.日誌遷移和重名名:

1.不關庫日誌遷移: 刪除日誌成員,然後添加新成員;
#刪除一個日誌組,注意不能刪除current 日誌,(當前日誌需要先切換日誌,再執行全局檢查點後纔可以)
SQL> alter database drop logfile memeber '/u01/app/oracle/oradata/prod/disk2/redo01.log';

#添加一個新的日誌組:

SQL> alter database add logfile member '/u01/app/oracle/oradata/prod/disk3/redo01.log' to  group 1;

2.關庫日誌遷移:關閉數據庫,copy日誌文件,rename 日誌文件

SQL> shutdown immediate

$ cp /u01/app/oracle/oradata/prod/disk2/redo01.log /u01/app/oracle/oradata/prod/disk3/redo01.log
#rename 文件
SQL> alter database rename file '/u01/app/oracle/oradata/prod/disk2/redo01.log' to /u01/app/oracle/oradata/prod/disk3/redo01.log


九.刪除和清空日誌組:
1.clear日誌組:
clear日誌組,只能對inactive 日誌組clear操作,clear以後相當於建立空白的文件,所以日誌組狀態變爲UNUSED,

SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE

SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of instance orcl (thread 1)
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log'


SQL> alter database clear logfile group 2;

Database altered.

SQL>  select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 UNUSED
         3 INACTIVE

SQL> 


2.drop日誌組: 刪除日誌組

SQL> alter database drop logfile group 5;



十.redo日誌記錄的內容:
redo日誌中記錄數據塊的變化。

1.dump日誌文件中內容:
sys@PROD>alter system dump logfile '/home/db2install/oradata/prod/redo03a.log';

System altered.
#查詢dump文件的位置
sys@PROD>select value from v$diag_info where name = 'Default Trace File';

VALUE
----------------------------------------------------
/u01/app/oracle/diag/rdbms/prod/prod/trace/prod_ora_3706.trc


2.分析日誌:(分析一個update操作):

#執行update操作(將原值1250改爲3500)
SQL> update emp set sal = 3500 where empno = 7521;

#dump當前日誌組
sys@PROD>select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 ACTIVE
         3 CURRENT

sys@PROD>select member from v$logfile where group# = 3;

MEMBER
--------------------------------------------------
/home/db2install/oradata/prod/redo03a.log

sys@PROD>alter system dump logfile '/home/db2install/oradata/prod/redo03a.log';

System altered.

sys@PROD>select value from v$diag_info where name = 'Default Trace File';

VALUE
-----------------------------------------------------------------
/u01/app/oracle/diag/rdbms/prod/prod/trace/prod_ora_3706.trc

#將1250和3500當成字符轉成16進制
sys@PROD>select dump(1250, 16) from dual;

DUMP(1250,16)
--------------------
Typ=2 Len=3: c2,d,33

sys@PROD>select dump(3500, 16) from dual;

DUMP(3500,16)
------------------
Typ=2 Len=2: c2,24

#分析redo日誌: (記錄數據塊的變化)

AFN:文件號
dba: data block address 數據塊地址
slot: 行 ,從0開始記。
col: 列 ,從0開始記.
c2 24 修改後的值。

RBA:(redo bytes address) redo會寫到日誌文件的位置。 
RBA組成:redo 序列號,redo block 號,以及偏移量。

①.分析第一個變化:
#根據文件號查詢對應的文件和表空間
sys@PROD>select file_name , tablespace_name from dba_data_files
  2  where file_id = 4;

FILE_NAME                                  TABLESPACE_NAME
----------------------------------------   -------------------
/home/db2install/oradata/prod/users01.dbf   USERS

#查詢EMP 所在表空間
sys@PROD>select tablespace_name from dba_segments where segment_name = 'EMP';

TABLESPACE_NAME
------------------------------
USERS
#將dba數據塊地址16進制 轉爲10進制
sys@PROD>select to_number('1000097', 'xxxxxxxxxxxxxx') from dual;

TO_NUMBER('1000097','XXXXXXXXXXXXXX')
-------------------------------------
                             16777367

# 根據數據塊地址,獲取文件號和塊號
sys@PROD>select dbms_utility.data_block_address_file(16777367) file#,
  2  dbms_utility.data_block_address_block(16777367) block#
  3  from dual;

     FILE#     BLOCK#
---------- ----------
         4        151

#根行的rowid查詢文件號,塊號,行號 (與上文的一致)
scott@PROD>select rowid from emp where empno = 7521;

ROWID
------------------
AAAS5JAAEAAAACXAAC

#打開執行計劃
scott@PROD>explain plan for select * from emp where empno = 7521;

Explained.

scott@PROD>@?/rdbms/admin/utlxplp

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2949544139

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |     1 |    87 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    87 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPNO"=7521)

14 rows selected.

scott@PROD>select dbms_rowid.rowid_relative_fno('AAAS5JAAEAAAACXAAC') file#,
  2  dbms_rowid.rowid_block_number('AAAS5JAAEAAAACXAAC') block#,
  3  dbms_rowid.rowid_row_number('AAAS5JAAEAAAACXAAC') row#
  4  from dual;

     FILE#     BLOCK#       ROW#
---------- ---------- ----------
         4        151          2

②.分析文件3的變化:

sys@PROD>select file_name, tablespace_name from dba_data_files
  2  where file_id = 3;

FILE_NAME                                    TABLESPACE_NAME
------------------------------------------   ------------------
/home/db2install/oradata/prod/undotbs01.dbf  UNDOTBS1


sys@PROD>show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1

























發佈了94 篇原創文章 · 獲贊 11 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章