在ORACLE的免费学习版本XE上进行物理备份实验。
[root@host5 ~]# su - oracle
[oracle@host5 ~]# sqlplus /nolog
SQL> connect / as sysdba
Connected.
如果数据库还没开启,则
SQL> startup
数据库开启。
1.创建测试表空间 user_data 和数据文件 userdata1.dbf
SQL> create tablespace user_data datafile 'userdata1.dbf' size 100M ;
Tablespace created.
2.创建测试表 userinfo
SQL> create table userinfo
(
id number(6,0),
username varchar2(20)
);
Table created.
查看一下表的信息:
SQL> col name for a30
SQL> set line 100
SQL> desc userinfo
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
ID NUMBER(6)
USERNAM VARCHAR2(20)
插入数据:
SQL> insert into userinfo(id,usernam) values (1,'tom');
1 row created.
SQL> select * from userinfo ;
ID USERNAM
---------- --------------------
1 tom
~~~~~~~~~~~~~~~~~~~~~~~~~~
开始备份。
以下三类文件要备份:
查询数据库一共有多少个数据文件:
SQL> select * from dba_data_files;
/u01/app/oracle/oradata/XE/users.dbf
/u01/app/oracle/oradata/XE/sysaux.dbf
/u01/app/oracle/oradata/XE/undotbs1.dbf
/u01/app/oracle/oradata/XE/system.dbf
(数据文件在这里)
/u01/app/oracle/product/11.2.0/xe/dbs/userdata1.dbf
日志文件
select * from v$logfile;
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_2_fn3zc0sl_.log
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_1_fn3zbz7v_.log
控制文件
select * From v$controlfile;
/u01/app/oracle/oradata/XE/control.dbf
~~~~~~~~~~
3.
备份之前必须要关闭数据库,这也是第一次关闭数据库:
SQL> shutdown immediate
SQL> quit
4.
文件全部拷贝到一个新的空的文件夹/u01/mybak。
[root@host5 ~]# cd /u01/
[root@host5 u01]# ls
app
[root@host5 u01]#
[root@host5 u01]# mkdir mybak
[root@host5 u01]#
[root@host5 u01]# cd mybak/
[root@host5 mybak]$ pwd
/u01/mybak
把上面查出来的数据文件,日志文件,控制文件用操作系统的复制命令,粘贴到备份目录下。
[root@host5 u01]# cd /u01/mybak/
[root@host5 mybak]# cp /u01/app/oracle/product/11.2.0/xe/dbs/userdata1.dbf . # 注意空格后面有个点. !!!指的是把前面的文件复制到当前这个目录!!!
[root@host5 mybak]# cp /u01/app/oracle/fast_recovery_area/XE/onlinelog/* . # *代表onlinelog目录下的所有(两个)文件
[root@host5 mybak]# cp /u01/app/oracle/oradata/XE/control.dbf . #这个是控制文件
[root@host5 mybak]# cp /u01/app/oracle/oradata/XE/users.dbf .
[root@host5 mybak]# cp /u01/app/oracle/oradata/XE/sysaux.dbf .
[root@host5 mybak]# cp /u01/app/oracle/oradata/XE/undotbs1.dbf .
[root@host5 mybak]# cp /u01/app/oracle/oradata/XE/system.dbf .
[root@host5 mybak]# ls
control.dbf o1_mf_2_fn3zc0sl_.log system.dbf userdata1.dbf
o1_mf_1_fn3zbz7v_.log sysaux.dbf undotbs1.dbf users.dbf
这八个文件都已经复制好了。其实在/u01/app/oracle/oradata/XE 下面还有一个temp.dbf ,不过既然select * from dba_data_files 只找到5个文件,我就没有管这个临时文件。
5.
拷贝完成之后,我们要模拟数据库故障。怎么模拟呢?删除重要数据,模拟出故障的情况。
先使用oracle用户,启动数据库
[root@host5 ~]# su - oracle
[oracle@host5 ~]# sqlplus /nolog
SQL> connect / as sysdba
Connected.
SQL> startup
数据库开启。
进入数据库删除重要数据,模拟出故障的情况。
SQL> truncate table userinfo;
Table truncated.
6.
开始恢复。别忘了关闭数据库!!第二次关闭数据库。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> quit
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
先删除旧的八个文件。
[oracle@host5 ~]$
[oracle@host5 ~]$ su - root
[root@host5 ~]# cd /u01/app/oracle/oradata/XE
[root@host5 XE]# rm control.dbf
rm:是否删除普通文件 "control.dbf"?y
[root@host5 XE]# rm u*
rm:是否删除普通文件 "undotbs1.dbf"?y
rm:是否删除普通文件 "users.dbf"?y
[root@host5 XE]# rm s*
rm:是否删除普通文件 "sysaux.dbf"?y
rm:是否删除普通文件 "system.dbf"?y
[root@host5 XE]# cd /u01/app/oracle/fast_recovery_area/XE/onlinelog
[root@host5 onlinelog]# ls
o1_mf_1_fn3zbz7v_.log o1_mf_2_fn3zc0sl_.log
[root@host5 onlinelog]# rm *
rm:是否删除普通文件 "o1_mf_1_fn3zbz7v_.log"?y
rm:是否删除普通文件 "o1_mf_2_fn3zc0sl_.log"?y
[root@host5 mybak]# cd /u01/app/oracle/product/11.2.0/xe/dbs/
[root@host5 dbs]# rm userdata1.dbf
rm:是否删除普通文件 "userdata1.dbf"?y
7.
把备份的文件拷贝到原来目录。
[root@host5 mybak]# cp o1_mf_* /u01/app/oracle/fast_recovery_area/XE/onlinelog/
[root@host5 mybak]# ls /u01/app/oracle/fast_recovery_area/XE/onlinelog/
o1_mf_1_fn3zbz7v_.log o1_mf_2_fn3zc0sl_.log
[root@host5 mybak]# cp control.dbf /u01/app/oracle/oradata/XE/
[root@host5 mybak]# cp users.dbf /u01/app/oracle/oradata/XE/
[root@host5 mybak]# cp system.dbf /u01/app/oracle/oradata/XE/
[root@host5 mybak]# cp undotbs1.dbf /u01/app/oracle/oradata/XE/
[root@host5 mybak]# cp sysaux.dbf /u01/app/oracle/oradata/XE/
[root@host5 mybak]# cp userdata1.dbf /u01/app/oracle/product/11.2.0/xe/dbs/
8.
在开启数据库进行验证之前,还有一件事!!要将刚才的所有八个文件的用户和用户组改成oracle 与dba!!!!
具体可以看一下我们一直没有动的temp.dbf 文件的信息,
[root@host5 mybak]# cd /u01/app/oracle/oradata/XE/
[root@host5 XE]$ ls -ld temp.dbf
-rw-r-----. 1 oracle dba 20979712 8月 20 22:00 temp.dbf
因此:
[root@host5 ~]# cd /u01/app/oracle/oradata/XE
[root@host5 XE]# chown oracle:dba control.dbf
[root@host5 XE]# chown oracle:dba sysaux.dbf
[root@host5 XE]# chown oracle:dba system.dbf
[root@host5 XE]# chown oracle:dba undotbs1.dbf
[root@host5 XE]# chown oracle:dba users.dbf
[root@host5 XE]#
[root@host5 XE]# cd /u01/app/oracle/product/11.2.0/xe/dbs/
[root@host5 dbs]# ls
hc_XE.dat init.ora lkXE orapwXE spfileXE.ora userdata1.dbf
[root@host5 dbs]# chown oracle:dba userdata1.dbf
[root@host5 dbs]#
[root@host5 dbs]# ls -ld hc_XE.dat
-rw-rw----. 1 oracle dba 1544 8月 20 22:53 hc_XE.dat
[root@host5 dbs]#
[root@host5 dbs]# cd /u01/app/oracle/fast_recovery_area/XE/onlinelog
[root@host5 onlinelog]# chown oracle:dba o1_mf_1_fn3zbz7v_.log
[root@host5 onlinelog]# chown oracle:dba o1_mf_2_fn3zc0sl_.log
[root@host5 onlinelog]#
[root@host5 onlinelog]# exit
9.
开启数据库,验证数据是否还在!!!
[oracle@host5 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.2.0 Production on Mon Aug 20 22:56:43 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL>
SQL> connect / as sysdba
Connected to an idle instance.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 413372416 bytes
Fixed Size 2227040 bytes
Variable Size 301991072 bytes
Database Buffers 104857600 bytes
Redo Buffers 4296704 bytes
Database mounted.
Database opened.
SQL>
SQL> select * from userinfo;
ID USERNAM
---------- --------------------
1 tom
数据已经恢复。
完毕。
~~~~~~~~~~~~~~~~~
这里不用看。
没有把文件的root权限改成oracle:dba,开启数据库会出现什么情况??
SQL> startup
ORACLE instance started.
Total System Global Area 413372416 bytes
Fixed Size 2227040 bytes
Variable Size 301991072 bytes
Database Buffers 104857600 bytes
Redo Buffers 4296704 bytes
ORA-00205: error in identifying control file, check alert log for more info
SQL>
SQL> select * from userinfo
2 ;
select * from userinfo
*
ERROR at line 1:
ORA-01219: database not open: queries allowed on fixed tables/views only
SQL>
SQL> quit