[小e笔记]之一步一步学习备份恢复——第三篇 数据库恢复案例(Part 3)

小e随笔:今天又是一个不错的天气,在辽宁这个时节不冷不热,天气凉爽是我最喜欢的,今天得多整理些笔记(这么好的天(*^__^*) )因为明天有一个高中同学的婚礼,时间过的真快,人家都结婚了。还有在家这几天看到了儿时的伙伴,都有孩子了,孩子都能满地跑了,另我感慨万千啊!

3 部分脱机备份

说明:部分脱机备份实质就是使部分表空间offline,然后备份,但需要注意的是system和undo表空间不能offline,当然临时表空间也不能,但它也无必须备份,丢了可以重建,甚至不重新建立重新启动数据库后会自动创建(经测试),这是考OCP的一道题,印象很深刻。

案例1:归档模式下部分脱机备份(tablespace offline)

备份方案:OS备份

表空间备份基础概念:

说是备份表空间实质是备份表空间物理层也就是数据文件,算了,咱还是专业点,以下概念引自Oracle10g cencepts文档:

表空间备份是构成表空间的数据文件的备份。表空间备份可以是联机的或脱机的,但数据库必须运行在归档模式下表空间备份才是有效的。因为在使用表空间备份还原一个表空间后,必须应用应用重做日志才能使其与其他表空间保持一致性。

模拟一个表空间

说明尽量别拿默认表空间做实验,这是我之前血的教训,尽管实验环境没什么大不了坏了数据库重安被,但11g我真是无语安装很费时。

SQL> create tablespace test datafile '/u01/oracle/oradata/elvis/test01.dbf' size 50M;

Tablespace created.

SQL> create table test(id int,scn int) tablespace test;

Table created.

SQL> select * from test;

no rows selected

表空间offline&备份表空间

SQL> alter tablespace test offline;

Tablespace altered.

SQL> select tablespace_name,status,logging from dba_tablespaces;

TABLESPACE STATUS    LOGGING

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

SYSTEM     ONLINE    LOGGING

SYSAUX     ONLINE    LOGGING

UNDOTBS1   ONLINE    LOGGING

TEMP       ONLINE    NOLOGGING

USERS      ONLINE    LOGGING

TEST       OFFLINE   LOGGING

6 rows selected.

[oracle@elvis elvis]$ pwd     --备份表空间

/u01/oracle/oradata/elvis

[oracle@elvis elvis]$ mkdir bak

[oracle@elvis elvis]$ cp test01.dbf bak/

模拟数据

SQL> insert into test values(1,dbms_flashback.get_system_change_number);

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

反复插入,最终表中数据如下:

SQL> select * from test;

        ID        SCN

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

         1     512053

         2     512066

         3     512073

         4     512080

         5     512108    --没有commit

模拟数据损坏

[oracle@elvis elvis]$ rm -f test01.dbf

[oracle@elvis elvis]$ ll

total 1747280

drwxr-xr-x 2 oracle oinstall      4096 Oct  6 18:44 bak

-rw-r----- 1 oracle oinstall   9748480 Oct  6 18:56 control01.ctl

-rw-r----- 1 oracle oinstall  52429312 Oct  6 18:50 redo01.log

-rw-r----- 1 oracle oinstall  52429312 Oct  6 18:50 redo02.log

-rw-r----- 1 oracle oinstall  52429312 Oct  6 18:56 redo03.log

-rw-r----- 1 oracle oinstall 629153792 Oct  6 18:55 sysaux01.dbf

-rw-r----- 1 oracle oinstall 734011392 Oct  6 18:55 system01.dbf

-rw-r----- 1 oracle oinstall  71311360 Oct  6 17:04 temp01.dbf

-rw-r----- 1 oracle oinstall 235937792 Oct  6 18:55 undotbs01.dbf

-rw-r----- 1 oracle oinstall   5251072 Oct  6 18:55 users01.dbf

现在数据文件损坏,在往表里插入数据

SQL> insert into test values(6,dbms_flashback.get_system_change_number);

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> select * from test;

        ID        SCN

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

         1     512053

         2     512066

         3     512073

         4     512080

         5     512108

         6     512488

6 rows selected.

对于这个为什么数据文件损坏了,还是会插入数据,这个 。。。据说是因为磁盘空间没有被释放,是linux操作系统的机制,也就是说文件被标记了删除但实质上还是存在的,只是我们看不到了而已,所以还可以往磁盘里去写。

现在重启数据库

SQL> shutdown abort

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  598437888 bytes

Fixed Size                  1338140 bytes

Variable Size             394265828 bytes

Database Buffers          197132288 bytes

Redo Buffers                5701632 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file

ORA-01110: data file 5: '/u01/oracle/oradata/elvis/test01.dbf'

数据库恢复

[oracle@elvis bak]$ cp test01.dbf ..

SQL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#

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

         1             513193

         2             513193

         3             513193

         4             513193

         5             513193

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

     FILE# CHECKPOINT_CHANGE#

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

         1             513193

         2             513193

         3             513193

         4             513193

         5             511743

SQL> recover database;

ORA-00279: change 512018 generated at 10/06/2012 18:49:07 needed for thread 1

ORA-00289: suggestion :

/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_06/o1_mf_1_50_870370r3_

.arc

ORA-00280: change 512018 for thread 1 is in sequence #50

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

ORA-00279: change 512064 generated at 10/06/2012 18:50:08 needed for thread 1

ORA-00289: suggestion :

/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_06/o1_mf_1_51_87037h5v_

.arc

ORA-00280: change 512064 for thread 1 is in sequence #51

ORA-00279: change 512072 generated at 10/06/2012 18:50:23 needed for thread 1

ORA-00289: suggestion :

/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_06/o1_mf_1_52_87037wmo_

.arc

ORA-00280: change 512072 for thread 1 is in sequence #52

Log applied.

Media recovery complete.

SQL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#

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

         1             535324

         2             535324

         3             535324

         4             535324

         5             535324

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

     FILE# CHECKPOINT_CHANGE#

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

         1             535324

         2             535324

         3             535324

         4             535324

         5             535324

SQL> alter database open;

Database altered.

SQL> select * from test;

        ID        SCN

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

         1     512053

         2     512066

         3     512073

         4     512080

         5     512108

         6     512488

6 rows selected.

数据都恢复过来了

总结:这个实验在复习了这个方法备份方法的同时,又了解到了Linux操作系统的一个机制,就像前面讨论的一样,为什么数据文件没了,还可以插入数据,这就不在重复了,了解即可。还有数据都从redo和归档文件中恢复过来的。

elvis
2012.10.6
知识共享~共同进步
转载请注明:
http://blog.csdn.net/elvis_dataguru/article/details/8045025

你可能感兴趣的:(thread,oracle,sql,数据库,System,oracle10g)