piner的歸檔模式下丟失或損壞一個資料檔案,在linux+oracle10g下測試成功!

mengzhaoliang發表於2008-02-13
        在歸檔方式下損壞或丟失一個資料檔案,如果存在相應的備份與該備份以來的歸檔日誌,恢復還是比較簡單的,可以作到儘量少的Down機時間,並能作到資料庫的完全恢復。

測試環境:
1      作業系統:Redhat 5
[oracle@mzl proc]$ cat /proc/version
Linux version 2.6.18-8.el5 (brewbuilder@ls20-bc2-14.build.redhat.com) (gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)) #1 SMP Fri Jan 26 14:15:21 EST 2007

2     資料庫版本:Oracle10g
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

3     資料庫的名字:orcl
SQL> show parameter db_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      orcl

4    檢視資料庫是否在歸檔模式下
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     20
Next log sequence to archive   22
Current log sequence           22

5    在users表空間建立表
SQL> create table testdata(a int) tablespace users;

Table created.

6   插入資料
SQL> insert into testdata values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from testdata;

         A
----------
         1

7    在/home/mzl/BackupDatabase目錄下有個hotbak.sql檔案,內容如下:
[oracle@mzl BackupDatabase]$ cat ./hotbak.sql
#rem script.:hotbak.sql
#rem creater:mengzhaoliang
#rem data:2008/2/4
#rem desc:backup all database datafile in archive
#enter database
$ORACLE_HOME/bin/sqlplus "/as sysdba" <alter system archive log current;
#start
alter tablespace system begin backup;
!cp /u01/app/oracle/oradata/orcl/system01.dbf /home/mzl/BackupDatabase/;
alter tablespace system end backup;

alter tablespace system begin backup;
!cp /u01/app/oracle/oradata/orcl/undotbs01.dbf /home/mzl/BackupDatabase/;
alter tablespace system end backup;

alter tablespace system begin backup;
!cp /u01/app/oracle/oradata/orcl/users01.dbf /home/mzl/BackupDatabase/;
alter tablespace system end backup;

alter tablespace system begin backup;
!cp /u01/app/oracle/oradata/orcl/sysaux01.dbf /home/mzl/BackupDatabase/;
alter tablespace system end backup;

alter tablespace system begin backup;
!cp /u01/app/oracle/oradata/orcl/example01.dbf /home/mzl/BackupDatabase/;
alter tablespace system end backup;

#backup control file
#binary
alter database backup controlfile to '/home/mzl/BackupDatabase/controlbinarybackup';

#ascii
alter database backup controlfile to trace;

alter system archive log current;

<
8   執行hotbak.sql檔案
[oracle@mzl BackupDatabase]$ ./hotbak.sql

9   繼續插入資料
SQL> insert into testdata values(2);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from testdata;

         A
----------
         1
         2
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.

10   關閉資料庫,模擬丟失資料
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@mzl orcl]$ pwd
/u01/app/oracle/oradata/orcl
[oracle@mzl orcl]$ ls
control01.ctl  example01.dbf  redo03.log    temp01.dbf
control02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbf
control03.ctl  redo02.log     system01.dbf  users01.dbf
[oracle@mzl orcl]$ rm users01.dbf
[oracle@mzl orcl]$ ls
control01.ctl  example01.dbf  redo03.log    temp01.dbf
control02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbf
control03.ctl  redo02.log     system01.dbf
模擬媒體毀壞

11    啟動資料庫錯誤,離線該資料檔案

SQL> startup
ORACLE instance started.

Total System Global Area  268435456 bytes
Fixed Size                  1218868 bytes
Variable Size              88082124 bytes
Database Buffers          171966464 bytes
Redo Buffers                7168000 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
還可以檢視報警檔案(見上一個恢復案例)或動態檢視v$recover_file
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_
---------- ------- -------
ERROR                                                       CHANGE#
----------------------------------------------------------------- ----------
TIME
---------
         4 ONLINE  ONLINE
FILE NOT FOUND                                            0


離線資料檔案
SQL> alter database datafile 4 offline drop;

Database altered.

12    開啟資料庫,複製備份回來(restore),恢復(recover)該資料檔案,並聯機
SQL> alter database open;

Database altered.
複製備份從備份處
[oracle@mzl orcl]$ pwd
/u01/app/oracle/oradata/orcl
[oracle@mzl orcl]$ cp /home/mzl/BackupDatabase/users01.dbf  .
[oracle@mzl orcl]$ ls
control01.ctl  example01.dbf  redo03.log    temp01.dbf
control02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbf
control03.ctl  redo02.log     system01.dbf  users01.dbf

恢復該資料檔案
SQL> recover datafile 4;
Media recovery complete.

恢復成功,聯機該資料檔案
SQL> alter database datafile 4 online;

13   檢查資料庫的資料(完全恢復)
SQL> select * from testdata;

         A
----------
         1
         2



說明:
1、採用熱備份,需要執行在歸檔模式下,可以實現資料庫的完全恢復,也就是說,從備份後到資料庫崩潰時的資料都不會丟失。
2、可以採用全備份資料庫的方式備份,對於特殊情況,也可以只備份特定的資料檔案,如只備份使用者表空間(一般情況下對於某些寫特別頻繁的資料檔案,可以單獨加大備份頻率)
3、如果在恢復過程中,發現損壞的是多個資料檔案,即可以採用一個一個資料檔案的恢復方法(第5步中需要對資料檔案一一離線,第6步中需要對資料檔案分別恢復),也可以採用整個資料庫的恢復方法。
4、如果是系統表空間的損壞,不能採用此方法



http://www.itpub.net/viewthread.php?tid=126320&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12778571/viewspace-170147/,如需轉載,請註明出處,否則將追究法律責任。

相關文章