暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

利用文件句柄及ln软连接恢复刚删除日志

原创 乔尼Zzz 2023-03-22
521

今天恩墨的每日一题有考,想着按照提示步骤实验一遍加深映像。

在Oracle数据库open状态下,如果无意误删了处于current状态的redolog日志文件(假设仅1个member):

1、马上添加足够多的日志组以防止数据库hang死,出现故障立即添加足够的redolog组,可以避免误删的句柄被覆盖,导致数据库异常;

2、数据库open状态下,lgwr/dbwN等进程会持有redo log/data file等文件的句柄,实际上就是一个指向redolog物理文件的软链接,删除了物理文件,只是临时释放了文件inode信息,但是句柄仍然可以写入的,因此通过将句柄反向软链接到物理文件,可以保证数据库的日志继续写入正常,使用lsof等命令,找到对应redolog的句柄fd,然后使用ln -s redolog生成软链接文件。

3、通过checkpoint/archive log可以将误删除的redolog完整apply并归档,避免数据丢失,使用命令alter system checkpoint; alter system archive log current;测试日志切换及归档是否正常;

4、误删redolog切换归档成功,必须立即删除日志组,否则切换覆盖会报错,使用alter database drop logfile group 删除误删的redo文件组。

实验:

#删除所有日志:

rm -rf /u01/app/oracle/oradata/ORCL/onlinelog/*

#第一时间增加日志

select t1.group#,t1.status,t2.member,t1.bytes/1024/1024 from vlogt1,vlog t1,vlogt1,vlogfile t2 where t1.group#=t2.group#; 
3 INACTIVE /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_3_k7l1zyqj_.log 200 
2 CURRENT /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_k7l1zypw_.log 200 
1 INACTIVE /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_k7l1zyob_.log 200 


ALTER DATABASE ADD LOGFILE (’/u01/app/oracle/oradata/ORCL/onlinelog/redo4.log’) SIZE 200m; 
ALTER DATABASE ADD LOGFILE (’/u01/app/oracle/oradata/ORCL/onlinelog/redo5.log’) SIZE 200m; 
ALTER DATABASE ADD LOGFILE (’/u01/app/oracle/oradata/ORCL/onlinelog/redo6.log’) SIZE 200m; 
ALTER DATABASE ADD LOGFILE (’/u01/app/oracle/oradata/ORCL/onlinelog/redo7.log’) SIZE 200m;


#查找文件句柄

[oracle@orcl_host ~]$ ps -ef|grep ora_lgwr_orcl
oracle    2414     1  0 19:31 ?        00:00:00 ora_lgwr_orcl
oracle    3744  3636  0 19:46 pts/1    00:00:00 grep --color=auto ora_lgwr_orcl
[oracle@orcl_host ~]$ lsof -p 2414
..............
ora_lgwr_ 2414 oracle    7w   REG  252,0      1046  90404452 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_lgwr_2414.trc
ora_lgwr_ 2414 oracle    8w   REG  252,0       911  90404453 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_lgwr_2414.trm
ora_lgwr_ 2414 oracle    9uR  REG  252,0        24 134314132 /u01/app/oracle/product/19.3.0/dbhome_1/dbs/lkORCL
ora_lgwr_ 2414 oracle   10r   REG  252,0   1434112   4934297 /u01/app/oracle/product/19.3.0/dbhome_1/rdbms/mesg/oraus.msb
ora_lgwr_ 2414 oracle  256u   REG  252,0  18726912   7151980 /u01/app/oracle/oradata/ORCL/controlfile/o1_mf_k7l1zwf1_.ctl
ora_lgwr_ 2414 oracle  257u   REG  252,0 209715712 221796019 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_k7l1zyob_.log (deleted)
ora_lgwr_ 2414 oracle  258u   REG  252,0 209715712 221796020 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_k7l1zypw_.log (deleted)
ora_lgwr_ 2414 oracle  259u   REG  252,0 209715712 221796021 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_3_k7l1zyqj_.log (deleted)
ora_lgwr_ 2414 oracle  264u   REG  252,0 102768640 163159187 /u01/app/oracle/oradata/ORCL/datafile/o1_mf_temp_k7l203tc_.tmp

#查看句柄文件

[oracle@orcl_host ~]$ ll /proc/2414/fd/257
lrwx------. 1 oracle oinstall 64 Mar 22 19:41 /proc/2414/fd/257 -> /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_k7l1zyob_.log (deleted)
[oracle@orcl_host ~]$ ll /proc/2414/fd/258
lrwx------. 1 oracle oinstall 64 Mar 22 19:41 /proc/2414/fd/258 -> /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_k7l1zypw_.log (deleted)
[oracle@orcl_host ~]$ ll /proc/2414/fd/259

#软连接恢复文件

[oracle@orcl_host ~]$ ln -s /proc/2414/fd/257 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_k7l1zyob_.log
[oracle@orcl_host ~]$ ln -s /proc/2414/fd/258 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_k7l1zypw_.log
[oracle@orcl_host ~]$ ln -s /proc/2414/fd/259 /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_3_k7l1zyqj_.log
[oracle@orcl_host ~]$ ll /u01/app/oracle/oradata/ORCL/onlinelog/
total 819216
lrwxrwxrwx. 1 oracle oinstall        17 Mar 22 19:47 o1_mf_1_k7l1zyob_.log -> /proc/2414/fd/257
lrwxrwxrwx. 1 oracle oinstall        17 Mar 22 19:47 o1_mf_2_k7l1zypw_.log -> /proc/2414/fd/258
lrwxrwxrwx. 1 oracle oinstall        17 Mar 22 19:47 o1_mf_3_k7l1zyqj_.log -> /proc/2414/fd/259
-rw-r-----. 1 oracle oinstall 209715712 Mar 22 19:45 redo4.log
-rw-r-----. 1 oracle oinstall 209715712 Mar 22 19:45 redo5.log
-rw-r-----. 1 oracle oinstall 209715712 Mar 22 19:45 redo6.log
-rw-r-----. 1 oracle oinstall 209715712 Mar 22 19:46 redo7.log

#尝试切换日志

SQL> alter system checkpoint;
系统已更改。
SQL> alter system archive log current;
系统已更改。

#切换日志后,删除恢复的软连接日志文件

SQL> select t1.group#,t1.status,t2.member,t1.bytes/1024/1024 from v$log t1,v$logfile t2 where t1.group#=t2.group#;
3 INACTIVE                /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_3_k7l1zyqj_.log                                                                                           200
2 ACTIVE                /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_2_k7l1zypw_.log                                                                                           200
1 INACTIVE                /u01/app/oracle/oradata/ORCL/onlinelog/o1_mf_1_k7l1zyob_.log                                                                                           200
4 ACTIVE                /u01/app/oracle/oradata/ORCL/onlinelog/redo4.log                                                                                                   200
5 CURRENT                /u01/app/oracle/oradata/ORCL/onlinelog/redo5.log                                                                                                   200
6 UNUSED                /u01/app/oracle/oradata/ORCL/onlinelog/redo6.log                                                                                                   200
7 UNUSED                /u01/app/oracle/oradata/ORCL/onlinelog/redo7.log                                                                                                   200
SQL> alter database drop logfile group 1;
数据库已更改。
SQL> alter database drop logfile group 2;
数据库已更改。
SQL> alter database drop logfile group 3;
数据库已更改。
SQL> select t1.group#,t1.status,t2.member,t1.bytes/1024/1024 from v$log t1,v$logfile t2 where t1.group#=t2.group#;
4 INACTIVE                /u01/app/oracle/oradata/ORCL/onlinelog/redo4.log                                                                                                   200
5 ACTIVE                /u01/app/oracle/oradata/ORCL/onlinelog/redo5.log                                                                                                   200
6 CURRENT                /u01/app/oracle/oradata/ORCL/onlinelog/redo6.log                                                                                                   200
7 UNUSED                /u01/app/oracle/oradata/ORCL/onlinelog/redo7.log


总结:同样的方法适用于数据文件的找回。





最后修改时间:2023-03-23 10:29:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论