某一张表被应用软件里误操作把数据都清空了,现在想恢复到清空之间,比如2013年8月13日14点以前,应该怎样操作?

  通过这个问题可以引发一系列的知识点串联。

  1、如果开启闪回可以使用闪回表。

  

怎样查看我的数据库有没有开启flashback

  flashback database要求数据库必须处于归档模式,且闪回之后必须使用resetlogs打开数据库
  查看数据库的归档模式及闪回是否启用
  SQL> select log_mode,open_mode,flashback_on from v$database;

  LOG_MODE   OPEN_MODE    FLASHBACK_ON
  -------------------    -----------------     ------------------------
  ARCHIVELOG      READ WRITE       NO         

  

  FLASHBACK_ON为NO,则表示闪回特性尚未启用

oracle数据库归档模式

Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。

模式介绍

Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。
如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。
数据库使用归档方式运行时才可以进行灾难性恢复。
1.归档日志模式和非归档日志模式的区别
非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.
归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.
用ARCHIVE LOG LIST 可以查看当前模式状态是归档模式还是非归档模式.

如何查看oracle当前处于归档模式还是非归档模式

1、

selectname,log_mode,open_mode from v$database;

NAME   LOG_MODE   OPEN_MODE
---------   ------------     -----------------
CKDB   ARCHIVELOG  READ WRITE

若是归档模式,则LOG_MODE=ARCHIVELOG
若是非归档模式,则LOG_MODE=NOARCHIVELOG

2、

输入:archive log list 回车,可以查看是否是归档模式

SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 31
Current log sequence 33

oracle数据库如何打开归档

oracle数据库如果不开启归档模式,对于误操作来说将是灾难性的,无法进行恢复操作。下面介绍oracle如何核实是否开启归档模式和如何开启归档模式的方法。

  1. 开启归档模式

    1>首先打开cmd命令窗口输入:sqlplus / as sysdba登录数据库

    2>成功登录数据库后,输入命令:select log_mode from v$database用来查看归档模式

    3>查询后可以看到log_ mode是noarchivelog说明归档模式是不归档模式

    4>用shutdown immediate或shutdown normal关闭数据库

    5>等待数据库正常关闭

    6>数据库关闭后,用startup mount启动数据库、加载实例但数据库关闭

    7>使用命令:alter database archivelog;打开归档日志,执行命令成功后返回数据库已更改的消息

    8>使用命令:alter database open;打开数据库即可完成整体操作

    9>alter system archive log start; (启用自动归档)

    10>exit (退出)

    11>验证归档日志。重复第一步骤,执行命令:select log_mode v$database,看到执行结果为archivelog

  做一次完全备份,因为非归档日志模式下产生的备份日志对于归档模式已经不可用了.这一步非非常重要!

  2.改变归档模式到非归档模式:

    1)SQL>SHUTDOWN NORMAL/IMMEDIATE;
    2)SQL>STARTUP MOUNT;
    3)SQL>ALTER DATABASE NOARCHIVELOG;
    4)SQL>ALTER DATABASE OPEN;
  3.启用自动归档: LOG_ARCHIVE_START=TRUE
    归档模式下,日志文件组不允许被覆盖(重写),当日志文件写满之后,如果没有进行手动归档,那么系统将挂起,直到归档完成为止.
    这时只能读而不能写.
    运行过程中关闭和重启归档日志进程
    SQL>ARCHIVE LOG STOP
    SQL>ARCHIVE LOG START
  4.手动归档: LOG_ARCHIVE_START=FALSE
    归档当前日志文件
    SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
    归档序号为052的日志文件
    SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 052;
    归档所有日志文件
    SQL>ALTER SYSTEM ARCHIVE LOG ALL;
    改变归档日志目标
    SQL>ALTER SYSTEM ARCHIVE LOG CURRENT TO '&PATH';
  5.归档模式和非归档模式的转换
    第4步的逆过程.
  6.配置多个归档进程
    Q:什么时候需要使用多个归档进程?
    A:如果归档过程会消耗大量的时间,那么可以启动多个归档进程,这是个动态参数,可以用ALTER SYSTEM动态修改.
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=10;
    Oracle9i中最多可以指定10个归档进程
    与归档进程有关的动态性能视图
    v$bgprocess,v$archive_processes
  7.配置归档目标,多归档目标,远程归档目标,归档日志格式
    归档目标 LOG_ARCHIVE_DEST_n
    本地归档目标:
    SQL>LOG_ARCHIVE_DEST_1 = "LOCATION=D:ORACLEARCHIVEDLOG";
    远程归档目标:
    SQL>LOG_ARCHIVE_DEST_2 = "SERVICE=STANDBY_DB1";
    强制的归档目标,如果出错,600秒后重试:
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_4 = "LOCATION=E:ORACLEARCHIVEDLOG MANDATORY REOPEN=600";
    可选的归档目标,如果出错,放弃归档:
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_3 = "LOCATION=E:ORACLEARCHIVEDLOG OPTIONAL";
    归档目标状态:关闭归档目标和打开归档目标
    关闭归档目标1
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = DEFER
    打开归档目标2
    SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE
    归档日志格式
    LOG_ARCHIVE_FORMAT
  8.获取归档日志信息
    V$ARCHIVED_LOG
    V$ARCHIVE_DEST
    V$LOG_HISTORY
    V$DATABASE
    V$ARCHIVE_PROCESSES
    ARCHIVE LOG LIST;

查看oracle是否开启闪回,查看删除记录

  

  查看oracle是否开启闪回功能,
  --FLASHBACK_ON为NO,则表示闪回特性尚未启用

   select log_mode,open_mode,flashback_on from v$database;

  查看oracle删除记录

   select * from user_recyclebin;

  

经过上述一段艰难的过程,下面来操作闪回:

  (一)

  如果开启闪回可以使用闪回表。
  select log_mode,flashback_on from v$database;
  如果是下面结果则开了闪回
  LOG_MODE   FLASHBACK_ON
  ------------     ------------------
  ARCHIVELOG   YES

  可以执行以下命令
  alter table 表名 enable row movement; --开启表行移动
  flashback table 表名 to timestamp to_timestamp('20130813 14:00:00','yyyymmdd hh24:mi:ss');
  --闪回到2013年8月13日14点

  你要是没开启,有逻辑备份可以使用imp命令导入数据。
  如果没用逻辑备份,开启归档模式,有物理备份,能够停机、数据丢失的话,可以采用不完全恢复
  用rman登陆
  rman target /
  执行以下命令
  run{shutdown immediate;
  startup mount;
  set until time = "to_date('20130813 14:00:00','yyyymmdd hh24:mi:ss')";
  restore database;
  recover database;
  alter database open resetlogs;}
  切记!做以上任何操作前做好备份,否则出了问题后悔莫及。
  而且建议你联系你们数据库管理员处理这个问题。

  (二)

  

如果只是1个表的话, 还是比较简单的。

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SQL> CREATE TABLE test_fb_table (
  2    ID   int,
  3    VAL  VARCHAR2(10)
  4  );
Table created.
SQL> INSERT INTO test_fb_table  VALUES (1, 'TEST');
1 row created.
SQL> commit;
Commit complete.
 
假如 数据被错误的删除/更新
需要检索某个时间点上,表原有的数据。
SQL> SELECT TO_CHAR(sysdate, 'yyyy-mm-dd hh24:mi:ss') FROM dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2010-11-07 13:01:37
 
这里删除掉数据。
SQL> delete from test_fb_table;
1 row deleted.
SQL> commit;
Commit complete.
 
确认数据已经被删除。
SQL> select * from test_fb_table;
no rows selected
1
2
3
4
5
6
7
这里检索出,指定时间点上,指定表的数据情况。
SQL> select * from test_fb_table
  2    AS OF TIMESTAMP TO_TIMESTAMP('2010-11-07 13:01:37',
  3      'yyyy-mm-dd hh24:mi:ss');
        ID VAL
---------- --------------------
         1 TEST

对于你来说, 也就是你需要先

CREATE TABLE  临时表  AS

select * from   你的那个数据被删除的表

AS OF TIMESTAMP TO_TIMESTAMP('2013-08-13 14:00:00',  'yyyy-mm-dd hh24:mi:ss');

这样, 就把当初那个时间点上的,  那个表的数据,  复制到一个   临时表  里面去了。

然后再

INSERT  INTO  你的那个数据被删除的表    SELECT  *  FROM  临时表;

注: 你需要确定一下, 那个  数据被删除的表  上面, 有没有触发器什么的。

有的话, 可能需要暂时 禁用掉, 数据插入完了再恢复。

  (三)(没有dba权限)

  如果有数据库备份和日志备份,才能解决你的问题,将数据恢复到某个时间点。

否则无法实现。

如果有备份,可以让DBA帮忙恢复一个新数据库,然后你将此表的数据copy出来到原先的数据库中。

  (四)(没有dba权限)

需要用闪回表flashback table,你是做不了的,找dba吧

oracle数据库表恢复到特定时间点的更多相关文章

  1. Oracle 数据库表同步方法浅议

    总结一下Oracle数据库表级别的复制同步 一.通过触发器进行表的复制 原理,是监听表上都某一字段进行的DML操作,然后得到DML操作的数据,重新在另一个表上执行DML操作. 优点: 简单,编写一个触 ...

  2. Oracle数据库表分区

    一.Oracle数据库表分区概念和理解         1.1.已经存在的表没有方法可以直接转化为分区表.         1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...

  3. oracle数据库表空间追加数据库文件方法

    oracle数据库表空间追加数据库文件方法   针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G  第一种方式:表空间增加数据文件    www.2cto.com   1 ...

  4. Java创建Oracle数据库表

    我们通常只用java执行DML(即:insert, update, delete, select)操作,很少用来执行DDL(create, drop, alert)操作.今天试了下如何用java来创建 ...

  5. oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?

    Oracle 语句中“||”代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335s ...

  6. 在oracle数据库表中没有添加rowid字段为什么会出现?

    rowid 是 oracle 数据库表中的伪列, rowid 首先是一种数据类型,它唯一标识一条记录物理位置, 基于64位编码的18个字符显示.因为 rowid 是伪列, 所以并未真的存储在表中,但可 ...

  7. Oracle数据库表空间与数据文件的关系描述正确的是( )

    Oracle数据库表空间与数据文件的关系描述正确的是( ) A.一个表空间只能对应一个数据文件 B.一个表空间可以对应多个数据文件 C.一个数据文件可以对应多个表空间 D.表空间与数据文件没任何对应关 ...

  8. Oracle数据库表空间与用户的关系是 ( )

    Oracle数据库表空间与用户的关系是 ( )? A.一对一 B.一对多 C.多对一 D.多对多 解答: D 一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用.

  9. 查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件

    查看Oracle数据库表空间大小(空闲.已使用),是否要增加表空间的数据文件 1.查看表空间已经使用的百分比 Sql代码 select a.tablespace_name,a.bytes/1024/1 ...

随机推荐

  1. MacBook pro管理员变成普通用户无法解锁问题

    最近使用Mac的时候,把管理员的名字修改了一下,WTF?没有管理员权限了?然后就没有解锁权限了,这可以说是Mac的一个致命bug呀!下载软件也不可以了.具体我的解决方式在这里记录一下,以供和我遇到同样 ...

  2. Javascript调试技巧整理

    整理一下网上看到的实用调试技巧! 1. 不要使用alert 首先,alert只能打印出字符串,如果打印的对象不是String,则会调用toString()方法将该对象转成字符串(比如转成[object ...

  3. 13. Ajax技术

    在传统的Web应用模式中,页面中用户的每一次操作都将触发一次返回Web服务器的HTTP请求,服务器进行相应的处理后,返回一个HTML页面的客户端.而在Ajax应用中,页面中的用户的操作将通过Ajax引 ...

  4. python正则表达式-案例

    工作中遇到一个小问题,需要在一个日志文件中,删选出包含emrfs sync命令和之后内容的行,格式如下, [2019-10-31 08:20:16,389] {logging_mixin.py:84} ...

  5. Leetcode题目33.搜索旋转排序数组(中等)

    题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...

  6. Python基于Pymssql模块实现连接SQL Server数据库的方法

    首先,安装pymssql第三方库pip install pymssql 其次,导入pymssql库 最后们就可以连接数据库了 import pymssql server = "10.10.9 ...

  7. linux常用查看系统操作的linux命令

    系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostna ...

  8. 红米note4高配版 电量用完,充不进去电,解决办法

    红米note4高配版  电量用完,充不进去电,解决办法 1.拆机,电池连线拆开,再安上,反复两次.就ok. 2.尾插坏了,买个尾插,换上.就好. 修手机的一次1,2百,太贵

  9. Spring JdbcTemplate实例

    1.常用方法 * update():执行DML语句.增.删.改语句* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合 ...

  10. 网络分析:WireShark

    安装 WireShark 官网 过滤器 类别 显示过滤器模式 捕获过滤器模式 逻辑表达式 and:&& or:|| 成组:() 过滤实例 仅监听某域名 http.host == &qu ...