oracle 如何知道是谁删除了表中的数据

oracle 如何知道是谁删除了表中的数据,第1张

Linux 平台误删 oracle 数据文件的恢复方法

模拟误 *** 作:

数据库在正常运行,人工直接rm 掉了数据文件。

--1测试环境情况:

$ cat /etc/redhat-release

CentOS release 65 (Final)

select file_name from dba_data_files;

/u01/app/oracle/oradata/orcl/testdbf

$ sqlplus / as sysdba

SQLPlus: Release 112040 Production on 星期四 3月 5 15:55:14 2015

Copyright (c) 1982, 2013, Oracle All rights reserved

连接到:

Oracle Database 11g Enterprise Edition Release 112040 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

开启数据库归档

archive log list;

数据库日志模式 非存档模式

自动存档 禁用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 3002

当前日志序列 3004

mkdir /u01/arch

alter system set log_archive_dest_1='location=/u01/arch' scope=spfile;

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount;

ORACLE 例程已经启动。

Total System Global Area 10088E+10 bytes

Fixed Size 2261928 bytes

Variable Size 1644170328 bytes

Database Buffers 8422162432 bytes

Redo Buffers 19595264 bytes

数据库装载完毕。

SQL> alter database archivelog;

数据库已更改。

SQL> archive log list;

数据库日志模式 存档模式

自动存档 启用

存档终点 /u01/arch

最早的联机日志序列 3002

下一个存档日志序列 3004

当前日志序列 3004

SQL> alter database open;

数据库已更改。

SQL> select open_mode from v$database;

OPEN_MODE

------------------------------------------------------------

READ WRITE

--2新建测试数据

select file_name from dba_data_files;

FILE_NAME

--------------------------------------------------------------------------------

/u01/app/oracle/oradata/orcl/users01dbf

SQL> create tablespace wind datafile '/u01/app/oracle/oradata/orcl/wind01dbf' size 200m;

SQL> create user wind identified by wind01 default tablespace wind;

SQL> grant connect,resource,dba to wind;

$ sqlplus wind/wind01

create table t1

(

sid int not null primary key,

sname varchar2(10)

)

tablespace wind;

--循环导入数据

declare

maxrecords constant int:=100000;

i int :=1;

begin

for i in 1maxrecords loop

insert into t1 values(i,'ocpyang');

end loop;

dbms_outputput_line(' 成功录入数据! ');

commit;

end;

/

select count() from t1;

COUNT()

----------

100000

--3模拟删除数据

SQL> col tablespace_name for a20

SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME STATUS

-------------------- ---------------------------

SYSTEM ONLINE

SYSAUX ONLINE

UNDOTBS1 ONLINE

TEMP ONLINE

USERS ONLINE

TTSPACE ONLINE

OCPYANG ONLINE

OCPYANGINDEX ONLINE

LOBOCPYANG ONLINE

LOBOCPYANG01 ONLINE

LOBOCPYANG02 ONLINE

TABLESPACE_NAME STATUS

-------------------- ---------------------------

WIND ONLINE

rm -rf /u01/app/oracle/oradata/orcl/wind01dbf

ls /u01/app/oracle/oradata/orcl/ | grep wind

SQL> show user;

USER 为 "WIND"

SQL> select count() from t1;

COUNT()

----------

100000

SQL> desc t1

名称 是否为空 类型

----------------------------------------- -------- ----------------------------

SID NOT NULL NUMBER(38)

SNAME VARCHAR2(10)

SQL> delete from t1 where sid>99000;

已删除1000行。

SQL> commit;

提交完成。

SQL> select count() from t1;

COUNT()

----------

99000

--4恢复

ps -eaf|grep dbw0 |grep -v grep

oracle 1928 1 0 15:59 00:00:00 ora_dbw0_orcl

SQL> col tablespace_name for a20

SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME STATUS

-------------------- ---------------------------

SYSTEM ONLINE

SYSAUX ONLINE

UNDOTBS1 ONLINE

TEMP ONLINE

USERS ONLINE

TTSPACE ONLINE

OCPYANG ONLINE

OCPYANGINDEX ONLINE

LOBOCPYANG ONLINE

LOBOCPYANG01 ONLINE

LOBOCPYANG02 ONLINE

TABLESPACE_NAME STATUS

-------------------- ---------------------------

WIND ONLINE

cd /proc/1928/fd

ll

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 0 -> /dev/null

l-wx------ 1 oracle oinstall 64 Mar 5 16:20 1 -> /dev/null

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 10 -> /u01/app/oracle/product/1120/db_1/dbs/lkORCL

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 11 -> /u01/app/oracle/product/1120/db_1/rdbms/mesg/orausmsb

l-wx------ 1 oracle oinstall 64 Mar 5 16:20 2 -> /dev/null

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 256 -> /u01/app/oracle/oradata/orcl/control01ctl

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 257 -> /u01/app/oracle/fast_recovery_area/orcl/control02ctl

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 258 -> /u01/app/oracle/oradata/orcl/system01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 259 -> /u01/app/oracle/oradata/orcl/sysaux01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 260 -> /u01/app/oracle/oradata/orcl/undotbs01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 261 -> /u01/app/oracle/oradata/orcl/users01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 262 -> /u01/app/oracle/oradata/orcl/ttspace01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 263 -> /u01/app/oracle/oradata/orcl/ocpyang01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 264 -> /u01/app/oracle/oradata/orcl/ocpyangindex01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 265 -> /u01/app/oracle/oradata/orcl/lobocpyang01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 266 -> /u01/app/oracle/oradata/orcl/lobocpyang0101dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 267 -> /u01/app/oracle/oradata/orcl/lobocpyang0202dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 268 -> /u01/app/oracle/oradata/orcl/temp01dbf

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 269 -> /u01/app/oracle/oradata/orcl/wind01dbf (deleted) --注

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 3 -> /dev/null

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 4 -> /dev/null

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 5 -> /dev/null

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 6 -> /u01/app/oracle/product/1120/db_1/rdbms/mesg/orausmsb

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 7 -> /proc/1928/fd

lr-x------ 1 oracle oinstall 64 Mar 5 16:20 8 -> /dev/zero

lrwx------ 1 oracle oinstall 64 Mar 5 16:20 9 -> /u01/app/oracle/product/1120/db_1/dbs/hc_orcldat

直接cp该句柄文件名回原位置:

$ pwd

/proc/1928/fd

cp /proc/1928/fd/269 /u01/app/oracle/oradata/orcl/wind01dbf

NOTE:

由于数据库一直是打开使用的,数据在不断变更则SCN也会不断的变化,

cp数据文件和数据库当前的信息明显不一致,此时需要对数据文件进行recover

--脱机数据文件

alter database datafile '/u01/app/oracle/oradata/orcl/wind01dbf' offline;

select count() from t1;

第 1 行出现错误:

ORA-00376: 此时无法读取文件 11

ORA-01110: 数据文件 11: '/u01/app/oracle/oradata/orcl/wind01dbf'

--恢复数据文件

recover datafile '/u01/app/oracle/oradata/orcl/wind01dbf';

--联机数据文件

alter database datafile '/u01/app/oracle/oradata/orcl/wind01dbf' online;

select count() from t1;

COUNT()

----------

99000

成功恢复

很多朋友只用了oracle的删除,但很多情况下,他会发现重新安装时,点了 下一步安装界面就消失了,往往无奈下只好重装系统,其实只是你数据库没删干 净,删干净就不会出现这种情况了。

实现方法:

1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服 务。

2、 开始->程序->Oracle - OraHome81->Oracle Installation Products-> Universal Installer 卸装所有Oracle产品,但Universal Installer本身不能被删除

3、 运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删 除这个入口。

4、 运行regedit,选择 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动 这个列表, 删除所有Oracle入口。

5、 运行refedit, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Applicat ion, 删除所有Oracle入口。

6、开始->设置->控制面板->系统->高级->环境变量删除环境变 量CLASSPATH和PATH中有关Oracle的设定

7、 从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的 组和图标

8、删除\Program Files\Oracle目录

9、 重新启动计算机,重起后才能完全删除Oracle所在目录

10、 删除与Oracle有关的文件,选择Oracle所在的缺省目录C:\Oracle,删 除这个入口目录及所有子目录,并从C:\WINDOWS下删除以下文件ORACLEINI、 oradim73INI、oradim80INI、oraodbcini等等。

恢复的前提是备份;

数据库有什么备份,exp还是rman

如果有exp备份:直接imp数据

如果有rman备份:可以基于时间不完全恢复,将数据库恢复到误删除之前的时刻

如果没有备份但是开闪回了,可以闪回数据库或闪回表

首先,undo表空间满是正常的,oracle自然会重用或者扩展它,一般不用管它。

然后,现在要解决的话,需要先把undo tablespace设置成手动,启动数据库,创建新的undo tablespace。把新的设置成默认的。

假设你的库现在是mounted状态

1 创建PFILE(如果已有就是更新)

SQL>create pfile from spfile;

2 关闭数据库

SQL>shutdown immediate

3 在你的$ORACLE_HOME/dbs目录下面找个叫做

init<数据库>ora的文件,把其中有undo_management=AUTO的一行改成

undo_management=MANUAL

如果没有就在文件末尾填一行

4 以sysdba身份连接数据库

SQL>connect "/ as sysdba"

用刚才改过的文件启动数据库

SQL> startup pfile=<刚才的文件全路径和名字>

这步是最关键的,如果成功,后面就没问题了

5 drop掉原来的表空间

SQL> drop tablespace <原来的undo表空间名字> including contents;

6 创建新的undo表空间

SQL> create UNDO tablespace undotbs2 datafile '/u01/app/oracle/oradata/orcl/undotbs02dbf' size 100M autoextend on;

7 关闭数据库,

SQL>shutdown immediate

在开始那个init文件里设置UNDO_MANAGEMENT=AUTO

和 UNDO_TABLESPACE=UNDOTBS2

8 再做一次第四步

9 更新spfile

SQL>create spfile from pfile;

10 关闭数据库,正常重新启动

SQL>shutdown immediate

SQL>startup

11 去网上教你删undo那个地方骂它。非常想当然的做法。没有任何理由这么做

12 让你的工程师去学oracle 培训

以上步骤的中的第5步可能会出问题。我不确认。。。 但是即使第5步不成功,问题应该也不大

你已经说了是oracle11g,那么我就按照11g的做法来教你吧,和你确认几点东西,你前半句是想说明oracle被完全卸载了,只剩下数据库文件,dmp文件是吗?后半句是重新安装好了oracle11g,想要把数据库文件dmp文件恢复到oracle11g中,是吗?如果是这样,你可以这样做:

1,找到安装目录下的dpdump文件夹,将数据库文件dmp文件放进去。

2,运行DOS命令行,输入语句:impdp 用户名/密码@别名 dumpfile=dmp文件名dmp 回车

你先这样做,如果有报错再说吧,因为不知道你的数据库文件导出来的方式是什么方式,方式不同,语句也会有所不同。

以上就是关于oracle 如何知道是谁删除了表中的数据全部的内容,包括:oracle 如何知道是谁删除了表中的数据、oracle数据库删除错了表怎么恢复、Oracle 误删控制文件,oracle 数据库没重启的情况下,怎么恢复等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9763298.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存