热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle使用句柄实现特定场景的无备份恢复-mysql教程

在dba的工作中,备份是一切工作的基

在dba的工作中,备份是一切工作的基

在dba的工作中,备份是一切工作的基础。如果没有备份,本来很简单的恢复工作也会难上加难,如果业务数据要求很高,造成数据的丢失或者损坏,就是重大事故了。使用rman备份或者做一个完整的系统级备份也是很重要的,如果在特定的场景下,没有备份,如果还能恢复,那就太幸运了。

当数据库中的某个数据文件误删的时候,如果数据库还没有重启的时候,还是能够做一些工作的。因为文件对应的句柄还没有释放。我们可以从里面找到一个镜像的备份实现我们的数据恢复。一定注意这种恢复不一定是完全的数据恢复,如果在数据文件删除的瞬间,有开启的事务,那么这些事务也是提交过的。

--------------------------------------推荐阅读 --------------------------------------

RMAN 配置归档日志删除策略

Oracle基础教程之通过RMAN复制数据库

RMAN备份策略制定参考内容

RMAN备份学习笔记

Oracle数据库备份加密 RMAN加密

--------------------------------------分割线 --------------------------------------

在删除之前,我们先来看看测试环境的数据文件情况。

SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
------------------------------ --------------------------------------------------
SYSTEM /u03/ora11g/oradata/TEST01/system01.dbf
SYSAUX /u03/ora11g/oradata/TEST01/sysaux01.dbf
UNDOTBS /u03/ora11g/oradata/TEST01/undotbs01.dbf
TEST_DATA1 /u02/ora11g/testdata1.dbf
POOL_DATA /u03/ora11g/oradata/TEST01/pool_data03.dbf
POOL_DATA /u03/ora11g/oradata/TEST01/pool_data01.dbf
POOL_DATA /u03/ora11g/oradata/TEST01/pool_data02.dbf
POOL_DATA /u03/ora11g/oradata/TEST01/pool_data04.dbf
POOL_DATA /u03/ora11g/oradata/TEST01/pool_data05.dbf
POOL_DATA /u01/ora11g/pool_data06.dbf
POOL_DATA /u01/ora11g/pool_data07.dbf
11 rows selected.
我们创建一个新的表空间和数据文件,

SQL> create tablespace test_delete datafile '/u01/ora11g/test_delete.dbf' size 10M;
Tablespace created.

SQL> create user test_delete identified by test_delete default tablespace test_delete quota unlimited on test_delete;
User created.
然后创建一个用户,在里面添加一些数据。
grant connect,resource to test_delete;
conn test_delete/test_delete
create table test as select *from all_objects;
create index test_ind on test(object_id);
create table test1 as select *from test where rownum<100;
update test1 set object_name='a' ;
注意最后的一条update语句,我们还没有做commit操作,所以此时数据还可能没有写入数据文件,从事务的角度来说,这个update还没有完成。
我们来看看是否能够恢复所有的数据,包括未提交的事务数据。

在删除之前,简单来一个检查。

SQL> select count(*)from test;
COUNT(*)
----------
5660

SQL> select count(*)from test1 where object_name='a';
COUNT(*)
----------
99
开始手动删除数据文件

[ora11g@rac1 fd]$ rm /u01/ora11g/test_delete.dbf
删除之后尝试做一个create操作,竟然成功了。

SQL> create table test3 as select *from test1;
Table created.
继续尝试一个Update,终于报错了,得到了期望之中的Ora错误。
update test set object_id=1
*
ERROR at line 1:
ORA-01116: error in opening database file 12
ORA-01110: data file 12: '/u01/ora11g/test_delete.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
这个时候开始考虑使用句柄来查看对应的数据文件,,
首先使用ps得到dbw对应的进程号。

[ora11g@rac1 proc]$ ps -ef|grep ora_dbw
ora11g 938 1 0 Nov20 ? 00:00:07 ora_dbw0_TEST01
ora11g 7819 5794 0 06:04 pts/0 00:00:00 grep ora_dbw

然后在/proc/938/fd里面查看
[ora11g@rac1 proc]$ ll /proc/938/fd
total 0
lr-x------ 1 ora11g dba 64 Nov 21 05:36 0 -> /dev/null
l-wx------ 1 ora11g dba 64 Nov 21 05:36 1 -> /dev/null
lr-x------ 1 ora11g dba 64 Nov 21 05:36 10 -> /dev/zero
lr-x------ 1 ora11g dba 64 Nov 21 05:36 11 -> /dev/zero
lrwx------ 1 ora11g dba 64 Nov 21 05:36 12 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/hc_TEST01.dat
lr-x------ 1 ora11g dba 64 Nov 21 05:36 13 -> /u03/ora11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 ora11g dba 64 Nov 21 05:36 14 -> /proc/938/fd
lr-x------ 1 ora11g dba 64 Nov 21 05:36 15 -> /dev/zero
lrwx------ 1 ora11g dba 64 Nov 21 05:36 16 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/hc_TEST01.dat
lrwx------ 1 ora11g dba 64 Nov 21 05:36 17 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/lkTEST01
lr-x------ 1 ora11g dba 64 Nov 21 05:36 18 -> /u03/ora11g/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lrwx------ 1 ora11g dba 64 Nov 21 06:05 19 -> socket:[1434598]
l-wx------ 1 ora11g dba 64 Nov 21 05:36 2 -> /dev/null
lrwx------ 1 ora11g dba 64 Nov 21 05:36 256 -> /u03/ora11g/oradata/TEST01/control01.ctl
lrwx------ 1 ora11g dba 64 Nov 21 05:36 257 -> /u03/ora11g/oradata/TEST01/control02.ctl
lrwx------ 1 ora11g dba 64 Nov 21 05:36 258 -> /u03/ora11g/oradata/TEST01/system01.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 259 -> /u03/ora11g/oradata/TEST01/sysaux01.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 260 -> /u03/ora11g/oradata/TEST01/undotbs01.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 261 -> /u02/ora11g/testdata1.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 262 -> /u03/ora11g/oradata/TEST01/pool_data03.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 263 -> /u03/ora11g/oradata/TEST01/pool_data01.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 264 -> /u03/ora11g/oradata/TEST01/pool_data02.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 265 -> /u03/ora11g/oradata/TEST01/pool_data04.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 266 -> /u03/ora11g/oradata/TEST01/pool_data05.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 267 -> /u01/ora11g/pool_data06.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 268 -> /u01/ora11g/pool_data07.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:36 269 -> /u03/ora11g/oradata/TEST01/temp01.dbf
lrwx------ 1 ora11g dba 64 Nov 21 05:55 270 -> /u01/ora11g/test_delete.dbf (deleted)
lr-x------ 1 ora11g dba 64 Nov 21 05:36 3 -> /dev/null
lr-x------ 1 ora11g dba 64 Nov 21 05:36 4 -> /dev/null
lr-x------ 1 ora11g dba 64 Nov 21 05:36 5 -> /dev/null
lr-x------ 1 ora11g dba 64 Nov 21 05:36 6 -> /dev/null
lrwx------ 1 ora11g dba 64 Nov 21 05:36 7 -> /u03/ora11g/product/11.2.0/dbhome_1/dbs/hc_TEST01.dat
lr-x------ 1 ora11g dba 64 Nov 21 05:36 8 -> /dev/null
lr-x------ 1 ora11g dba 64 Nov 21 05:36 9 -> /dev/null

可以看到句柄的信息,删除的数据文件状态已经在/proc/xx/fd里面有所体现了。
这个时候我们手动拷贝数据文件到目标目录。

[ora11g@rac1 fd]$ cp 270 /u01/ora11g/test_delete.dbf
[ora11g@rac1 fd]$
拷贝完成之后,使用测试用户来做一些简单的验证。发现创建一个新表的操作顺利完成了。

推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 掌握Linux:基础命令入门
    本章节深入浅出地介绍了Linux系统中的基本命令操作,帮助读者快速上手并理解其核心功能。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
author-avatar
墨镜空间新
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有