[20130614]linux下删除数据文件的恢复的一些细节问题.txt

简介: [20130614]linux下删除数据文件的恢复的一些细节问题.txt前天看了链接:http://space.itpub.net/26015009/viewspace-763506我仅仅做一些测试以及补充,以及注意的细节问题,实际上最好的方法依旧是使用rman备份恢复.
[20130614]linux下删除数据文件的恢复的一些细节问题.txt

前天看了链接:
http://space.itpub.net/26015009/viewspace-763506

我仅仅做一些测试以及补充,以及注意的细节问题,实际上最好的方法依旧是使用rman备份恢复.

1.测试环境:

--session 1
SQL> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

CREATE TABLESPACE AAA DATAFILE
  '/u01/app/oracle11g/oradata/test/aaa01.dbf' SIZE 65528K AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;

--使用rman备份.

RMAN> backup datafile 11 format '/data/testtest/aaa%U.dbf' ;
Starting backup at 2013-06-14 09:32:32
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=198 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00011 name=/u01/app/oracle11g/oradata/test/aaa01.dbf
channel ORA_DISK_1: starting piece 1 at 2013-06-14 09:32:34
channel ORA_DISK_1: finished piece 1 at 2013-06-14 09:32:35
piece handle=/data/testtest/aaa0loc5g1i_1_1.dbf tag=TAG20130614T093234 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2013-06-14 09:32:35

Starting Control File and SPFILE Autobackup at 2013-06-14 09:32:36
piece handle=/u01/app/oracle11g/flash_recovery_area/TEST/autobackup/2013_06_14/o1_mf_s_818069557_8vnwopcj_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2013-06-14 09:32:40

SQL> create table t tablespace aaa as select * from dba_objects ;
Table created.

SQL> select count(*) from t;
  COUNT(*)
----------
     77569

SQL> alter system checkpoint;
System altered.

SQL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat where rownum=1));
SPID
------
18627

$ ls -l /proc/18627/fd | grep aaa
lrwx------  1 oracle11g oinstall 64 2013-06-14 11:52:45 260 -> /u01/app/oracle11g/oradata/test/aaa01.dbf
--可以发现260指向/u01/app/oracle11g/oradata/test/aaa01.dbf.


2.删除数据文件.
$ cd /u01/app/oracle11g/oradata/test
$ rm aaa01.dbf
/bin/rm: remove regular file `aaa01.dbf'? y

$ ls -l /proc/18627/fd | grep aaa
lrwx------  1 oracle11g oinstall 64 2013-06-14 11:52:45 260 -> /u01/app/oracle11g/oradata/test/aaa01.dbf (deleted)

--session 1:
SQL> select count(*) from t;
  COUNT(*)
----------
     77569

SQL> insert into t select * from t where rownum
1 row created.

SQL> commit ;
Commit complete.
--删除了文件,file habdle以及数据块的内存并没有释放,依旧可以操作.

SQL> select count(*) from t;
  COUNT(*)
----------
     77570

--session 2:
SQL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat where rownum=1));
SPID
------
18633

$ ls -l /proc/18633/fd | grep aaa
--无输出

SQL> select count(*) from t;
  COUNT(*)
----------
     77570

SQL> alter system flush buffer_cache;
System altered.

SQL> select count(*) from t;
select count(*) from t
                     *
ERROR at line 1:
ORA-01116: error in opening database file 11
ORA-01110: data file 11: '/u01/app/oracle11g/oradata/test/aaa01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

--回到回话1,依旧能查询:
SQL> select count(*) from t;
  COUNT(*)
----------
     77570

--接着回到回话2,执行查询:
SQL> select count(*) from t;
  COUNT(*)
----------
     77570
--这次成功!     

SQL> insert into t select * from t where rownum
insert into t select * from t where rownum
            *
ERROR at line 1:
ORA-01116: error in opening database file 11
ORA-01110: data file 11: '/u01/app/oracle11g/oradata/test/aaa01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

$ ls -l /proc/18633/fd | grep aaa
--无输出,因为aaa01.dbf已经删除.
--回话2不能插入,因为没有指向aaa01.dbf的文件句柄.但是查询应该没有问题.只要信息在数据缓存里面.

--session 1:
SQL> alter system flush buffer_cache;
System altered.

SQL> select count(*) from t;
  COUNT(*)
----------
     77570

--可以发现回话1根本没有影响,因为在删除前已经打开了指向aaa01.dbf的文件句柄.甚至可以继续插入数据.

SQL> insert into t select * from t where rownum
1 row created.

SQL> commit ;
Commit complete.

SQL> select count(*) from t;
  COUNT(*)
----------
     77571

--SQL> alter system checkpoint;
--alter system checkpoint
--*
--ERROR at line 1:
--ORA-03113: end-of-file on communication channel
--Process ID: 18627
--Session ID: 191 Serial number: 21
--如果我执行alter system checkpoint;数据库直接crash.

--说明如果是正常的生产环境,你删除了文件,这个时候不可能没有事务发生对这个数据文件.这样问题会变得非常复杂.
--如果这时使用cp命令拷贝文件,得到的文件可能"有问题"!

3.比较正确的操作:
SQL> alter  tablespace aaa read only ;
Tablespace altered.
--仅仅能对表空间设置为读写.

$ cd /proc/18627/fd
$ cp 260 /u01/app/oracle11g/oradata/test/aaa01.dbf

--注意拷贝后文件的权限!!!
--如果这个时候使用alter  tablespace aaa read write ;应该不行的,因为copy回来的文件不是原来打开的文件句柄.
--正确的做法是:
alter database datafile 11 offline ;
--RMAN> recover datafile 11 ;
alter database datafile 11 on ;

--实际上这个步骤要块,如果执行了检查点(alter system checkpoint;),我的测试数据库会直接crash.

SQL> insert into t select * from t where rownuminsert into t select * from t where rownum            *
ERROR at line 1:
ORA-00372: file 11 cannot be modified at this time
ORA-01110: data file 11: '/u01/app/oracle11g/oradata/test/aaa01.dbf'

SQL> alter  tablespace aaa read write ;
Tablespace altered.

4.使用rman操作:
--我个人感觉使用rman是比较可靠的,除非数据库没有数据文件的备份或者为非归档模式.
SQL> alter database datafile 11 offline ;
Database altered.

RMAN> restore datafile 11 ;

Starting restore at 2013-06-14 10:08:17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=13 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00011 to /u01/app/oracle11g/oradata/test/aaa01.dbf
channel ORA_DISK_1: reading from backup piece /data/testtest/aaa0loc5g1i_1_1.dbf
channel ORA_DISK_1: piece handle=/data/testtest/aaa0loc5g1i_1_1.dbf tag=TAG20130614T093234
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:04
Finished restore at 2013-06-14 10:08:25

RMAN> recover datafile 11 ;

Starting recover at 2013-06-14 10:08:34
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:01

Finished recover at 2013-06-14 10:08:38

--
SQL>  alter database datafile 11 online ;
Database altered.

总结:
我不知道我这样恢复还有别的问题,至少按照原链接操作是有问题的.也许实际的生产情况更加复杂,个人感觉选择rman来恢复还是比较正
规的,除非没备份或者是非归档模式.

目录
相关文章
|
23天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
77 1
|
27天前
|
Linux 数据安全/隐私保护 Windows
Linux入门指南:linux权限究竟是什么?和文件有什么关系?
Linux入门指南:linux权限究竟是什么?和文件有什么关系?
30 0
|
29天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
22天前
|
人工智能 安全 Linux
【Linux】Linux之间如何互传文件(详细讲解)
【Linux】Linux之间如何互传文件(详细讲解)
|
1天前
|
固态存储 Ubuntu Linux
Linux(29) 多线程快速解压缩|删除|监视大型文件
Linux(29) 多线程快速解压缩|删除|监视大型文件
10 1
|
1天前
|
Ubuntu Linux 数据安全/隐私保护
Linux(24) 如何在Ubuntu中操作rootfs.img文件
Linux(24) 如何在Ubuntu中操作rootfs.img文件
2 0
|
6天前
|
安全 Linux 开发工具
Linux中可引起文件时间戳改变的相关命令
【4月更文挑战第12天】Linux中可引起文件时间戳改变的相关命令
12 0
|
8天前
|
Linux Shell 开发工具
Linux文件常用操作
Linux文件常用操作(几乎覆盖所有日常使用)
81 0
|
9天前
|
Linux 内存技术 Perl
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
|
15天前
|
Linux
linux 超过4个G的文件传不上去的解决办法
linux 超过4个G的文件传不上去的解决办法
9 0