数据库物理备份与恢复系列之——数据库手动热备份和恢复

数据库手动热备份和恢复

一.手动热备份原理

手动热备份是指数据库处于OPEN状态下利用操作系统命令备份数据库。

手动热备份使用begin backup命令备份数据库,只适用于备份数据文件。

手动热备份必须处于归档模式

 

设置begin backup的作用:

①锁定数据文件头的SCN

②告诉oracle需要在日志文件中额外存储发生改变的数据块信息

SQL> select * from v$backup;

     FILE# STATUS         CHANGE# TIME
---------- ------------------ ---------- ---------
     1 NOT ACTIVE               0
     2 NOT ACTIVE               0
     3 NOT ACTIVE               0
     4 NOT ACTIVE               0

SQL> alter database begin backup;

Database altered.

SQL> select * from v$backup;

     FILE# STATUS         CHANGE# TIME
---------- ------------------ ---------- ---------
     1 ACTIVE          365092 08-DEC-16
     2 ACTIVE          365092 08-DEC-16
     3 ACTIVE          365092 08-DEC-16
     4 ACTIVE          365092 08-DEC-16

ACTIVE状态表示在锁定状态

image

这时候不允许以shutdown immediate方式关闭数据库

SQL> shutdown immediate
ORA-01149: cannot shutdown - file 1 has online backup set
ORA-01110: data file 1: '/DATA/ORA11G/system01.dbf'

--如果使用shutdown abort关闭数据库,开启的时候会报错
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1.0055E+10 bytes
Fixed Size            2261888 bytes
Variable Size         5670702208 bytes
Database Buffers     4362076160 bytes
Redo Buffers           19742720 bytes
Database mounted.
ORA-10873: file 1 needs to be either taken out of backup mode or media
recovered
ORA-01110: data file 1: '/DATA/ORA11G/system01.dbf'

解决方式一:end backup
SQL> alter database end backup;

Database altered.
SQL> alter database open;

Database altered.

解决方式二:按照提示,进行介质恢复

SQL> recover database;
Media recovery complete.
SQL> alter database open;

Database altered.

SQL> select * from v$backup;

     FILE# STATUS         CHANGE# TIME
---------- ------------------ ---------- ---------
     1 NOT ACTIVE          386568 08-DEC-16
     2 NOT ACTIVE          386568 08-DEC-16
     3 NOT ACTIVE          386568 08-DEC-16
     4 NOT ACTIVE          386568 08-DEC-16

二.手动热备份日志产生量

数据库正在被改变,使用操作命令复制数据块的过程中,就可能产生分裂,然后造成坏块。

oracle为了避免这种情况,需要将数据库内容保存在在线日志中,所以手动热备份日志产生量比正常情况大。

Release 11.2.0.4.0

发起数据库级别的BEGIN BACKUP

SQL> alter database begin backup;

Database altered.

查询v$STATNAME和v$MYSTAT视图观察当前会话产生的日志量为17220字节

SQL> col name for a20;
SQL> select t1.name ,t2.value from v$statname t1,v$mystat t2
  2  where t1.statistic#=t2.statistic#
  3  and t1.name in('redo size','redo entries');

NAME              VALUE
-------------------- ----------
redo entries              5
redo size          17220

更改一个数据块中一行数据,产生的日志量为8780字节。

SQL> update scott.employee set comm=100 where empno=7844;

1 row updated.

SQL> commit;

Commit complete.

SQL> col name for a20
SQL> select t1.name ,t2.value from v$statname t1,v$mystat t2
  2  where t1.statistic#=t2.statistic#
  3  and t1.name in('redo size','redo entries');

NAME              VALUE
-------------------- ----------
redo entries              8
redo size          26000

SQL> select 26000-17220 from dual;

26000-17220
-----------
       8780
SQL> alter system dump logfile '/DATA/ORA11G/redo02.log';

正常情况下产生的日志量仅仅548字节

SQL> select * from v$backup;

     FILE# STATUS         CHANGE# TIME
---------- ------------------ ---------- ---------
     1 NOT ACTIVE          408234 08-DEC-16
     2 NOT ACTIVE          408234 08-DEC-16
     3 NOT ACTIVE          408234 08-DEC-16
     4 NOT ACTIVE          408234 08-DEC-16

SQL> col name for a20;
SQL> select t1.name ,t2.value from v$statname t1,v$mystat t2
  2  where t1.statistic#=t2.statistic#
  3  and t1.name in('redo size','redo entries');

NAME              VALUE
-------------------- ----------
redo entries              8
redo size           1648

SQL> update scott.employee set comm=100 where empno=7844;

1 row updated.

SQL> commit;

Commit complete.

SQL> col name for a20;
SQL> select t1.name ,t2.value from v$statname t1,v$mystat t2
  2  where t1.statistic#=t2.statistic#
  3  and t1.name in('redo size','redo entries');

NAME              VALUE
-------------------- ----------
redo entries              9
redo size           2196

SQL> select 2196-1648 from dual;

2196-1648
----------
       548

总结:begin backup产生的日志量比正常情况大约多产生8K的日志量,约一个数据块的大小。

三.手动热备份下数据文件的恢复

当数据文件出现问题时,只要将热备份数据文件使用操作系统命令复制到原路径即可。和冷备份的区别是,热备份的数据库需要先应用归档日志,当数据文件和控制文件一致之后才能打开数据库。

热备份的数据文件内部肯定处于不一致的状态,所以开启的时候都必须应用归档日志进行media recovery。修复的起点就是v$backup.CHANGE#记录的SCN。即这里的412056

SQL> alter database begin backup;

Database altered.

SQL> select * from v$backup;

     FILE# STATUS         CHANGE# TIME
---------- ------------------ ---------- ---------
     1 ACTIVE          412056 08-DEC-16
     2 ACTIVE          412056 08-DEC-16
     3 ACTIVE          412056 08-DEC-16
     4 ACTIVE          412056 08-DEC-16

下面演示一下恢复的过程

SQL> alter database begin backup;  --置数据库为begin backup

Database altered.

 
  系统cp命令拷贝数据文件到另外一个目录
oracle@test1: /DATA/ORA11G> cp users01.dbf ../
SQL> alter database end backup;  --备份完成后置数据库end backup  
  这时候我们删掉数据文件
oracle@test1: /DATA/ORA11G> rm -rf users01.dbf

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1.0055E+10 bytes
Fixed Size            2261888 bytes
Variable Size         5670702208 bytes
Database Buffers     4362076160 bytes
Redo Buffers           19742720 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/DATA/ORA11G/users01.dbf'

开启的时候提示找不到数据文件

 
  恢复我们刚才备份的数据文件到原路径
oracle@test1: /DATA/ORA11G> cp ../users01.dbf .

SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1.0055E+10 bytes
Fixed Size            2261888 bytes
Variable Size         5670702208 bytes
Database Buffers     4362076160 bytes
Redo Buffers           19742720 bytes
Database mounted.
ORA-01113: file 4 needs media recovery    --需要介质恢复
ORA-01110: data file 4: '/DATA/ORA11G/users01.dbf'


SQL> recover database;
Media recovery complete.
SQL> startup
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> alter database open;

Database altered.  --这样我们就恢复了数据文件

 
posted @ 2016-12-08 11:03  guilingyang  阅读(734)  评论(0编辑  收藏  举报