天天看點

[20141027]關于熱備份的問題.txt

[20141027]關于熱備份的問題.txt

--上午同僚問關于熱備份的問題,我認為關于熱備份這部分内容可以跳過,畢竟rman更加友善,效率更高.

--我把關于這部分内容做一些總結.

SCOTT@test> @ver1

PORT_STRING                    VERSION        BANNER

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

x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

1.測試1:

SCOTT@test> select file#,status,tablespace_name,checkpoint_change#,checkpoint_time,checkpoint_count from v$datafile_header where file# in (1,4);

           FILE# STATUS  TABLESPACE_NAME                CHECKPOINT_CHANGE# CHECKPOINT_TIME     CHECKPOINT_COUNT

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

               1 ONLINE  SYSTEM                                11736795034 2014-10-27 11:54:38        856621626

               4 ONLINE  USERS                                 11736795034 2014-10-27 11:54:38        856621626

SCOTT@test> alter system checkpoint ;

System altered.

               1 ONLINE  SYSTEM                                11736828790 2014-10-27 17:52:12        856621627

               4 ONLINE  USERS                                 11736828790 2014-10-27 17:52:12        856621627

--可以發現checkpoint_count增加1,CHECKPOINT_CHANGE#發生變化.

SCOTT@test> alter tablespace users begin backup;

Tablespace altered.

               4 ONLINE  USERS                                 11736828918 2014-10-27 17:53:55        856621628

--可以發現users表空間觸發了檢查點,CHECKPOINT_CHANGE#發生了變化,CHECKPOINT_COUNT計數+1.

--如果這個時候修改資訊,加入檢查點,一樣寫資料檔案.

SCOTT@test> select * from dept ;

          DEPTNO DNAME          LOC

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

              10 ACCOUNTING     NEW YORK

              ...

              70 aaaa           BBBB

7 rows selected.

SCOTT@test> update dept set loc='NNNN' where deptno=70 ;

1 row updated.

SCOTT@test> commit;

Commit complete.

               1 ONLINE  SYSTEM                                11736829197 2014-10-27 17:57:39        856621628

               4 ONLINE  USERS                                 11736828918 2014-10-27 17:53:55        856621629

--可以發現file#=4,CHECKPOINT_CHANGE#沒有變化(被當機),而CHECKPOINT_COUNT增加+1.

SCOTT@test> alter tablespace users end backup;

               4 ONLINE  USERS                                 11736829197 2014-10-27 17:57:39        856621630

--可以發現file#=4,CHECKPOINT_CHANGE#增加變化,而CHECKPOINT_COUNT增加+1.

--可以發現在熱備份階段當機的是CHECKPOINT_CHANGE#。

--在資料庫open的過程中,Oracle要進行兩次檢查.

--第一次檢查資料檔案頭中的Checkpoint cnt是否與對應控制檔案中的Checkpoint cnt一緻.如果相等,進行第二次檢查.

--第二次檢查資料檔案頭的開始SCN和對應控制檔案中的結束SCN是否一緻如果結束SCN等于開始SCN,則不需要對那個檔案進行恢複.

--對每個資料檔案都完成檢查後,打開資料庫.同時将每個資料檔案的結束SCN設定為無窮大.

2.熱備份産生大量日志.

--熱備份使用的備份工具作業系統指令,為了保證資料塊的資訊完整性,有時候要把整個塊的資訊記錄在redo檔案中.

--這樣熱備份期間産生的日志比較多,應該避開業務高峰做這種操作.

$ cat viewredo.sql

SELECT b.NAME, a.statistic#, a.VALUE

  FROM v$mystat a, v$statname b

WHERE b.NAME IN ('redo size', 'redo wastage','user commits','data blocks consistent reads - undo records applied') AND a.statistic# = b.statistic#;

SCOTT@test> @viewredo

NAME                                                         STATISTIC#      VALUE

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

user commits                                                          6          0

redo size                                                           178        772

redo wastage                                                        183          0

data blocks consistent reads - undo records applied                 293          0

SCOTT@test> update dept set loc='XXXX' where deptno=70 ;

SCOTT@test> commit ;

user commits                                                          6          1

redo size                                                           178       9572

-- 9572-772=8800.

-- 實際上如果在修改這個塊的記錄,日志産生沒有這麼大.

SCOTT@test> update dept set loc='YYYY' where deptno=70 ;

user commits                                                          6          2

redo size                                                           178      10188

-- 10188-9572=616. 第2次修改就沒有這個多redo.

SCOTT@test> select rowid,dept.* from dept ;

ROWID                  DEPTNO DNAME          LOC

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

AABBrlAAEAAAAWDAAB         10 ACCOUNTING     NEW YORK

AABBrlAAEAAAAWDAAC         20 RESEARCH       DALLAS1

AABBrlAAEAAAAWDAAD         30 SALES          CHICAGO

AABBrlAAEAAAAWDAAE         40 OPERATIONS     BOSTON

AABBrlAAEAAAAWEAAA         50 aaa            bbb

AABBrlAAEAAAAWFAAA         60 cc             aaa

AABBrlAAEAAAAWFAAB         70 aaaa           YYYY

--修改同一塊的資料,就沒有這個多redo.

SCOTT@test> update dept set loc='ZZZZ' where deptno=60 ;

user commits                                                          6          3

redo size                                                           178      10764

--另外實際上這些修改資訊是可以寫盤的.

SCOTT@test> @lookup_rowid AABBrlAAEAAAAWFAAA

    OBJECT       FILE      BLOCK        ROW DBA                  TEXT

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

    269029          4       1413          0 4,1413               alter system dump datafile 4 block 1413

--使用bbed觀察:

BBED> set dba 4,1413

        DBA             0x01000585 (16778629 4,1413)

BBED> p *kdbr[0]

rowdata[0]

----------

ub1 rowdata[0]                              @8120     0x2c

BBED> x /rncc

rowdata[0]                                  @8120

flag@8120: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8121: 0x02

cols@8122:    3

col    0[2] @8123: 60

col    1[2] @8126: cc

col    2[4] @8129: ZZZZ

--雖然檔案頭部在熱備份階段當機的是CHECKPOINT_CHANGE#。但是塊中的資訊依舊會更新寫資料檔案的.

3.在熱備份模式下無法正常關閉資料庫.

SYS@test> shutdown immediate

ORA-01149: cannot shutdown - file 4 has online backup set

ORA-01110: data file 4: '/u01/app/oracle11g/oradata/test/users01.dbf'

--出現ORA-01149錯誤.

SYS@test> select * from v$backup ;

           FILE# STATUS                      CHANGE# TIME

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

               1 NOT ACTIVE                        0

               2 NOT ACTIVE                        0

               3 NOT ACTIVE                        0

               4 ACTIVE                  11736835244 2014-10-28 09:46:20

               5 NOT ACTIVE                        0

               6 NOT ACTIVE               3011239824 2012-11-08 15:43:19

               7 NOT ACTIVE                        0

               8 NOT ACTIVE               3268230043 2014-03-20 10:13:21

               9 NOT ACTIVE                        0

              10 NOT ACTIVE                        0

              11 NOT ACTIVE                        0

11 rows selected.

--可以發現file#=4處在active模式,也就是在熱備份模式.

--測試異常關機後的情況.

SYS@test> shutdown abort

ORACLE instance shut down.

SYS@test> startup

ORACLE instance started.

Total System Global Area       1603411968 bytes

Fixed Size                        2228784 bytes

Variable Size                   973082064 bytes

Database Buffers                620756992 bytes

Redo Buffers                      7344128 bytes

Database mounted.

ORA-10873: file 4 needs to be either taken out of backup mode or media recovered

--提示file#=4需要恢複.

SYS@test> select * from v$recover_file;

FILE# ONLINE  ONLINE_ ERROR                       CHANGE# TIME

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

     4 ONLINE  ONLINE                          11736835244 2014-10-28 09:46:20

SYS@test> recover datafile 4;

Media recovery complete.

no rows selected

               4 NOT ACTIVE              11736835244 2014-10-28 09:46:20

--可以發現recover datafile 4;可以關閉熱備份模式.

4.再做一次在熱備份異常關機的情況.

SYS@test> alter database open ;

Database altered.

SYS@test> alter tablespace users begin backup;

SYS@test> alter tablespace users end backup;

               4 NOT ACTIVE              11736857045 2014-10-28 10:10:59

SYS@test> select open_mode from v$database ;

OPEN_MODE

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

MOUNTED

--奇怪alter tablespace users end backup;指令可以在mount狀态下執行.搞不懂oracle #@%$#@%

SYS@test>  alter tablespace users offline ;

alter tablespace users offline

*

ERROR at line 1:

ORA-01109: database not open

SYS@test>  alter tablespace users online ;