Oracle备份恢复案例2-表空间热备恢复

7.5.2 案例2 (数据库打开时的恢复以用户数据的表空间为例(热备))

热备份是当数据库打开并对用户有效是的OS级的数据备份。热备份只能用于ARCHIVELOG方式的数据库。在数据文件备份之前,对应的表空间必须通过使用ALTER TABLESPACE …… BEGIN BACKUP以备份方式放置。然后组成表空间的数据文件可以使用类似冷备份的操作系统命令进行拷贝。在数据文件用操作系统命令拷贝后,应使用ALTER TABLESPACE …… END BACKUP命令使表空间脱离热备份方式。
热备份没有必要备份联机日志,但必须是归档状态,在实例恢复的时候,可能需要用到归档日志。当前联机日志一定要保护好或是处于镜相状态,当前联机日志的损坏,对于数据库的损坏是巨大的,只能以数据的丢失来进行数据库的恢复工作。

对于临时表空间,存放的是临时信息,在热备份是也可以考虑不用备份,如果临时文件发生故障,可以删除该数据文件与表空间,重建一个临时表空间。

热备份的优点:

  • 可在表空间或数据文件级备份,备份时间短。
  • 备份时数据库仍可使用。
  • 可达到秒级恢复(恢复到某一时间点上)。
  • 可对几乎所有数据库实体作恢复。
  • 恢复是快速的,在大多数情况下在数据库仍工作时恢复。

场景: 数据库打开时的恢复以用户数据的表空间为例(热备)

step 1: 创建新的表空间(tab02)

1
2
3
4
5
6
7
8
9
SQL> create tablespace tab02 datafile '/home/oracle/app/oracle/oradata/mmpdb3/tab02.dbf' size 10M;
Tablespace created.
SQL> select FILE#, TS#, NAME from v$datafile;
FILE# TS# NAME
---------- ---------- ------------------------------------------------------------
6 7 /home/oracle/app/oracle/oradata/mmpdb3/tab02.dbf

step 2: 创建新的表(t02),使用tab02表空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> create table t02(id number(10), name varchar(10)) tablespace tab02;
Table created.
SQL> insert into t02 values(1, 'test01');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t02;
ID NAME
---------- ---------------
1 test01

step 3: 热备份表空间(tab02)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SQL> alter tablespace tab02 begin backup;
alter tablespace tab02 begin backup
*
ERROR at line 1:
ORA-01123: cannot start online backup; media recovery not enabled
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 7
Current log sequence 9
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> alter tablespace tab02 begin backup;
Tablespace altered.
[root@hzvscmdb mmpdb3]# cp -a /home/oracle/app/oracle/oradata/mmpdb3/tab02.dbf /home/oracle/dbbak/hot
SQL> alter tablespace tab02 end backup;
Tablespace altered.

step 4: 向表t02, 插入新的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> insert into t02 values(2, 'test02');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t02;
ID NAME
---------- -----------------
1 test01
2 test02

step 4: 模拟删除表空间,并进行恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@hzvscmdb mmpdb3]# rm -rf tab02.dbf
SQL> select * from t02;
ID NAME
---------- -----------------
1 test01
2 test02
SQL> alter database datafile 6 offline;
Database altered.
[root@hzvscmdb mmpdb3]# cp -a /home/oracle/dbbak/hot/tab02.dbf ./
SQL> select * from t02;
select * from t02
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/home/oracle/app/oracle/oradata/mmpdb3/tab02.dbf'
SQL> recover datafile 6;
Media recovery complete.
SQL> select FILE#, TS#, NAME, status from v$datafile;
FILE# TS# NAME STATUS
---------- ---------- ------------------------------------------------------------ -------
1 0 /home/oracle/app/oracle/oradata/mmpdb3/system01.dbf SYSTEM
2 1 /home/oracle/app/oracle/oradata/mmpdb3/sysaux01.dbf ONLINE
3 2 /home/oracle/app/oracle/oradata/mmpdb3/undotbs01.dbf ONLINE
4 4 /home/oracle/app/oracle/oradata/mmpdb3/users01.dbf ONLINE
5 6 /home/oracle/app/oracle/oradata/mmpdb3/tab01.dbf ONLINE
6 7 /home/oracle/app/oracle/oradata/mmpdb3/tab02.dbf OFFLINE
SQL> alter database datafile 6 online;
Database altered.
SQL> select * from t02;
ID NAME
---------- -----------------
1 test01
2 test02