- 浏览: 787640 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (981)
- javascript (102)
- java (212)
- JQuery (81)
- 幽默笑话 (2)
- 只言片语 (6)
- 开发小记 (283)
- Hibernate (17)
- DWR (4)
- SQL (10)
- spring-ibatis (8)
- linux (24)
- Struts1 (8)
- Struts2 (16)
- spring (42)
- Mybatis (16)
- css (18)
- servlet (8)
- jdbc (4)
- jsp (1)
- spring-jdbc (2)
- FreeMarker (2)
- MySQL (24)
- JQuery-Grid (7)
- jstl (5)
- 正则表达式 (1)
- 面试集锦 (86)
- unix (18)
- 开发工具 (23)
- ajax (5)
- webservice (4)
- log4j (3)
- oracle (15)
- extjs (14)
- 其他 (9)
- 优秀技术参考地址 (1)
- 性能 (3)
- 数据库 (25)
- 算法 (15)
- 设计模式 (10)
- Python (3)
- AIX (5)
- weblogic (1)
- shell (14)
- quartz (5)
- 图形文件FusionCharts (1)
- Websphere (4)
- 转载 (5)
- hadoop (1)
- highchart (24)
- perl (22)
- DB2 (7)
- JBoss (1)
- JQuery Easy UI (9)
- SpringMVC (5)
- ant (5)
- echart (9)
- log4J配置 (3)
- 多线程 (10)
- 系统架构 (7)
- nginx (3)
- loadrunner1 (1)
- 分布式 (1)
- Dubbo (1)
- Redis (2)
- JMS (4)
- 自动化测试 (3)
- Spring循环依赖的三种方式 (1)
- spring-boot (2)
- 高级测试 (9)
- github (2)
- sonar (1)
- docker (6)
- web前端性能优化 (1)
- spring-aop (6)
- rabbit (1)
- ELK (1)
- maven (1)
- minio (1)
最新评论
-
zengshaotao:
jstl1point0 写道很好啊,如果有带Session会话 ...
Nginx+Tomcat搭建高性能负载均衡集群 -
jstl1point0:
很好啊,如果有带Session会话的怎么搞呢
Nginx+Tomcat搭建高性能负载均衡集群
今天测试下了oracle在删除表的数据后的恢复方法。
在oracle生产系统的维护测试中有一张表,将里面的数据delete并commit了,由于业务不能中断(数据库不能停机),并且系统还在不断有数据往该表中写入。现在需要将之前delete掉的数据恢复,可以使用基于scn的恢复。
在删除之前,最好查询到数据库当前的scn,恢复的时候就采用基于这个scn点的恢复。
example:
方法一:
1)创建一张测试表;
CREATE TABLE w AS SELECT * FROM dba_objects WHERE 1 = 2;
2)向该表插入测试数据;
SQL> insert into w select * from dba_objects;
72558 rows created.
SQL> commit;
Commit complete.
3)SQL> select count(*) from w;
COUNT(*)
----------
72558
4)在删除之前,先获取数据库的scn,便于恢复的时候查找到数据在什么时候还是存在的;
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
117853514 ------ 当前scn号
由于数据库没有停,因此scn号也在不断变化,因此需要查出数据在哪个scn点的时候还是存在的
SQL> select count(*) from w as of scn 117854000; ------查看数据在scn号为117854000时是否存在
select count(*) from w as of scn 117854000
*
ERROR at line 1:
ORA-08181: specified number is not a valid system change number ------应该是系统还没有走到这个scn号
SQL> select count(*) from w as of scn 117853000;------查看数据在scn号为117853000时是否存在
COUNT(*)
----------
0 ------不存在
SQL> select count(*) from w as of scn 117853500;
COUNT(*)
----------
0
SQL> select count(*) from w as of scn 117853510; 直到查到这个scn才发现数据才存在,因此届时就是基于这个scn点进行恢复
COUNT(*)
----------
72558
5)模拟删除数据;
SQL> delete from w;
72558 rows deleted.
SQL> commit;
Commit complete.
SQL> SELECT COUNT(*) FROM w;
COUNT(*)
----------
0
6)模拟数据库不停机,业务在不断向表中插入数据;
SQL> insert into w select * from w as of scn 117844000;
72558 rows created.
SQL> select count(*) from w;
COUNT(*)
----------
72558
7)执行基于删除之前数据仍然存在的scn点的恢复;
SQL> insert into w select * from w as of scn 117853510;
72558 rows created.
SQL> commit;
Commit complete.
8)查询验证,之前删除的数据是否恢复回来了,并且新插入的数据也存在;
SQL> select count(*) from w;
COUNT(*)
----------
145116
大功告成。之前delete掉的72558条数据+新进来的72558条数据,总共是145116条数据。达到我们的要求!
现在稍微总结一下:
在做数据表的删除操作之前,一点要谨慎,尤其是在生产系统不能停机的情况下,要么首先将数据库或者表备份一下,再进行删除,这样就算需要恢复也可以用备份进行恢复;如果删除时候没有做相关备份,在删除之前一定要先查下系统当前scn,并且验证出数据在哪个scn点的时候还是存在的(这点很重要,如果没有找到,就无法恢复删除的数据)恢复的时候就基于这个scn点的恢复。
方法二:
1)同样创建上面的测试表和数据;
SQL> select count(*) from w;
COUNT(*)
----------
72558
2)查询下数据库的时间,用于确定删除的数据在什么时间点还存在;
SQL> select to_char(sysdate, 'yyyy-dd-mm hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2011-23-03 17:23:55
SQL> select count(*) from w;
COUNT(*)
----------
72558 -------数据在2011-23-03 17:23:55的时间还存在
3)模拟数据的删除操作;
SQL> delete from w;
72558 rows deleted.
SQL> commit;
Commit complete.
4)将删除数据之前的时间(数据还存在的时间)转换为scn;
SQL> select timestamp_to_scn(to_timestamp('2011-03-23 17:22:00','yyyy-mm-dd hh24:mi:ss')) from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP('2011-03-2317:22:00','YYYY- MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
117872363
5)验证这个scn点时数据的存在;
SQL> select count(*) from w as of scn 117872363;
COUNT(*)
----------
72558
6)创建基于原表数据还存在时的临时表;
SQL> create table q as select * from w as of scn 117872363;
Table created.
以上语句由两条语句合并而成:
SQL> create table q as select * from w where 1 = 0;
Table created.
SQL> insert into q select * from w as of scn 117872363;
72558 rows created.
SQL> select count(*) from q;
COUNT(*)
----------
72558
7)由于业务并未中断,所以原表里面也有新数据进来了,此时只要将刚创建的临时表的数据导出,然后再倒入到原表中即可。
在oracle生产系统的维护测试中有一张表,将里面的数据delete并commit了,由于业务不能中断(数据库不能停机),并且系统还在不断有数据往该表中写入。现在需要将之前delete掉的数据恢复,可以使用基于scn的恢复。
在删除之前,最好查询到数据库当前的scn,恢复的时候就采用基于这个scn点的恢复。
example:
方法一:
1)创建一张测试表;
CREATE TABLE w AS SELECT * FROM dba_objects WHERE 1 = 2;
2)向该表插入测试数据;
SQL> insert into w select * from dba_objects;
72558 rows created.
SQL> commit;
Commit complete.
3)SQL> select count(*) from w;
COUNT(*)
----------
72558
4)在删除之前,先获取数据库的scn,便于恢复的时候查找到数据在什么时候还是存在的;
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
117853514 ------ 当前scn号
由于数据库没有停,因此scn号也在不断变化,因此需要查出数据在哪个scn点的时候还是存在的
SQL> select count(*) from w as of scn 117854000; ------查看数据在scn号为117854000时是否存在
select count(*) from w as of scn 117854000
*
ERROR at line 1:
ORA-08181: specified number is not a valid system change number ------应该是系统还没有走到这个scn号
SQL> select count(*) from w as of scn 117853000;------查看数据在scn号为117853000时是否存在
COUNT(*)
----------
0 ------不存在
SQL> select count(*) from w as of scn 117853500;
COUNT(*)
----------
0
SQL> select count(*) from w as of scn 117853510; 直到查到这个scn才发现数据才存在,因此届时就是基于这个scn点进行恢复
COUNT(*)
----------
72558
5)模拟删除数据;
SQL> delete from w;
72558 rows deleted.
SQL> commit;
Commit complete.
SQL> SELECT COUNT(*) FROM w;
COUNT(*)
----------
0
6)模拟数据库不停机,业务在不断向表中插入数据;
SQL> insert into w select * from w as of scn 117844000;
72558 rows created.
SQL> select count(*) from w;
COUNT(*)
----------
72558
7)执行基于删除之前数据仍然存在的scn点的恢复;
SQL> insert into w select * from w as of scn 117853510;
72558 rows created.
SQL> commit;
Commit complete.
8)查询验证,之前删除的数据是否恢复回来了,并且新插入的数据也存在;
SQL> select count(*) from w;
COUNT(*)
----------
145116
大功告成。之前delete掉的72558条数据+新进来的72558条数据,总共是145116条数据。达到我们的要求!
现在稍微总结一下:
在做数据表的删除操作之前,一点要谨慎,尤其是在生产系统不能停机的情况下,要么首先将数据库或者表备份一下,再进行删除,这样就算需要恢复也可以用备份进行恢复;如果删除时候没有做相关备份,在删除之前一定要先查下系统当前scn,并且验证出数据在哪个scn点的时候还是存在的(这点很重要,如果没有找到,就无法恢复删除的数据)恢复的时候就基于这个scn点的恢复。
方法二:
1)同样创建上面的测试表和数据;
SQL> select count(*) from w;
COUNT(*)
----------
72558
2)查询下数据库的时间,用于确定删除的数据在什么时间点还存在;
SQL> select to_char(sysdate, 'yyyy-dd-mm hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2011-23-03 17:23:55
SQL> select count(*) from w;
COUNT(*)
----------
72558 -------数据在2011-23-03 17:23:55的时间还存在
3)模拟数据的删除操作;
SQL> delete from w;
72558 rows deleted.
SQL> commit;
Commit complete.
4)将删除数据之前的时间(数据还存在的时间)转换为scn;
SQL> select timestamp_to_scn(to_timestamp('2011-03-23 17:22:00','yyyy-mm-dd hh24:mi:ss')) from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP('2011-03-2317:22:00','YYYY- MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
117872363
5)验证这个scn点时数据的存在;
SQL> select count(*) from w as of scn 117872363;
COUNT(*)
----------
72558
6)创建基于原表数据还存在时的临时表;
SQL> create table q as select * from w as of scn 117872363;
Table created.
以上语句由两条语句合并而成:
SQL> create table q as select * from w where 1 = 0;
Table created.
SQL> insert into q select * from w as of scn 117872363;
72558 rows created.
SQL> select count(*) from q;
COUNT(*)
----------
72558
7)由于业务并未中断,所以原表里面也有新数据进来了,此时只要将刚创建的临时表的数据导出,然后再倒入到原表中即可。
发表评论
-
MyBatis防止SQL注入
2017-11-14 13:35 987SQL注入是一种代码注入技术,用于攻击数据驱动的应 ... -
java中类的加载顺序介绍(ClassLoader)
2017-11-14 11:41 8171、ClassNotFoundExcetpion 我们在 ... -
JMS实例
2017-08-21 15:40 4781. JMS架构 Java 消息服务(Java M ... -
java中Filter、Servlet、Listener的学习
2017-03-29 21:52 4551、Filter的功能filter功能,它使用户可以改变一个 ... -
高并发,线程池
2017-03-29 21:52 10971.高并发的内容 Zookee ... -
servlet/filter/listener/interceptor区别与联系
2017-03-29 21:47 517servlet/filter/listener/interc ... -
密码过期
2015-11-10 17:30 469oracle sql develop ,一个oracle客户 ... -
显式提交惹的祸
2015-04-19 10:28 518需要开发一个指标监控系统,数据库是oracle的 之 ... -
AIX上oracle的安装二
2014-07-20 14:15 624硬盘上安装任何东西都是需要空间的,所以在系统登陆后需要建立相 ... -
AIX上oracle的安装一
2014-07-18 22:52 607因为开发环境一般都是windows,然后发布环境是unix或 ... -
前台接收后台返回流
2014-06-08 22:49 2340很多时候,我们需要前台接收后台返回的流,比如图片。 当然, ... -
log4j ,ibatis sql输出
2014-06-07 23:24 465log4j,一个很流行的日志功能,很多第三方插件都在使用, ... -
ibatis,dynamic sql
2014-06-07 23:18 457ibatis 2的主打开发,标签使用时,需要注意,比如在动 ... -
json格式依赖包
2014-06-07 22:26 745json是比较简单的数据交换格式,一般的,我们都会用到类似如 ... -
ThreadLocal
2014-06-02 13:49 634一、概述 *在Thread类当中有这么一个成员变量的 ... -
数据库的事务隔离级别
2014-05-29 11:24 579在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务 ... -
JQuery.extend()
2014-05-22 15:49 592var src1 = { name:"tom&q ... -
归集数组数据,求数组数据加和为固定值
2014-05-22 14:45 925package web; import java.u ... -
javascript 两个括号
2014-05-21 16:14 769//这里只是相当于进行了匿名函数的定义,后面的括号不能进行 ... -
只在synchronized块里同步
2014-05-20 21:57 648package thread; /** * 线程在执行同步 ...
相关推荐
* transaction recovery:SCN 帮助 Oracle 决定在一次突然中断或者 SHUTDOWN ABORT 后,是否需要一个崩溃恢复。 * query consistency:Oracle 还使用数据块的 SCN 来维护查询的一致性和多版本。 Oracle SCN 是一个...
Checkpoint 的目的就是要把存储在 buffer 内的已提交交易写回 disk,否则一旦发生 crash,需要进行 recovery 时,就必须花很多时间从 redo log file内最后的 SCN 交易开始进行 recovery,这样在商业应用上是很浪费...
### SCN号与Oracle数据库恢复研究 #### 一、SCN与Checkpoint 在Oracle数据库中,SCN(System Change Number)是一个非常重要的概念,它用来标识数据库中的任何改变。SCN是Oracle内部使用的数字序列,每当数据库发生...
本文将详细探讨Oracle介质恢复的内部过程,通过对控制文件(controlfile)、重做日志(redolog)、数据文件(datafile)等内容的深入分析,帮助读者理解这一复杂的流程。 #### 二、Oracle介质恢复的基本概念 1. **Start ...
在Oracle数据库管理系统中,RMAN(Recovery Manager)是一种强大的工具,用于执行数据库的备份与恢复操作。其中,增量备份作为一种高效的方式,在实际应用中非常普遍。增量备份的核心优势在于仅备份自上次完整或增量...
SQL> ALTER SYSTEM SET db_recovery_file_dest='D:\oracle\flash_recovery_area\test'; ``` - **监控闪回区域使用情况**:通过`V$RECOVERY_FILE_DEST`视图监控闪回区域的使用率,以避免空间不足导致的潜在问题。 ...
查询SCN可以通过`v$datafile`、`v$datafile_header`、`v$database`、`v$log`以及`v$log_history`视图进行。 不完全恢复分为三种类型: 1. 时间基恢复(Time-based recovery):恢复到特定时间点,该点之前的所有...
3. **执行基于SCN的RMAN增量备份**:在主库上,使用RMAN(Recovery Manager)工具执行增量备份,指定从SCN开始,例如: - `RMAN> BACKUP DEVICE TYPE DISK INCREMENTAL FROM SCN <SCN from previous step> DATABASE...
Oracle闪回技术基于数据库的撤销数据(Undo Data),它允许用户和管理员在不破坏当前数据库状态的情况下,查询或恢复过去的数据。这一功能在误删除、数据损坏或需要历史数据分析的情景下尤为重要。 ### 主要的...
在《Oracle Database Backup and Recovery User's Guide》11g Release 2 (11.2)文档中,全面介绍了Oracle数据库的备份与恢复策略。这份指南不仅涵盖了RMAN(Recovery Manager)备份和恢复技术,还包括了用户管理的...
RMAN提供了强大的恢复功能,如`LIST INCOMPLETE RECOVERY`可以列出需要恢复的文件,`RESTORE DATABASE`和`RECOVER DATABASE`可以恢复整个数据库,而`RESTORE DATAFILE`和`RECOVER DATAFILE`则用于恢复单个文件。...
RMAN (Recovery Manager) 是 Oracle 提供的一种强大而灵活的数据备份、恢复工具,它可以帮助数据库管理员执行各种复杂的备份与恢复操作。通过 RMAN,可以有效地管理 Oracle 数据库的备份和恢复策略,确保数据的安全...
在Linux系统中,通常使用RMAN(Recovery Manager)工具来执行Oracle数据库的备份。RMAN是Oracle数据库自带的命令行工具,它可以创建完整的数据库备份、增量备份以及归档日志备份。通过配置cron job或者systemd定时...
对于数据库的维护与管理,Oracle提供了一系列的工具和组件,如RMAN(Recovery Manager),用于数据库的备份、恢复和迁移。通过RMAN,用户可以更加便捷地进行数据库的备份和恢复操作,同时它还支持增量备份、数据压缩...
- **Incmplt recovery SCN**: 如果数据库曾经过恢复,这个SCN将不再是0,它记录了最后一次未完成恢复过程的SCN值。 - **Redo in Controlfile**: 提供了关于重做日志文件的信息,包括当前使用的线程、文件编号、SCN...
记录并提供解决方案针对各种常见问题,如队列文件保存期限设置、AIX使用裸设备、UNIX GGSCI需要lib包验证、OGG错误代码、复制进程拆分、BOUNDED RECOVERY、从指定时间重新抓取等。 9. Oracle GoldenGate反向切换...
RMAN(Recovery Manager)是 Oracle 数据库提供的一种备份和恢复工具。RMAN 可以用于备份和恢复数据库。RMAN 的优点是可以自动管理备份和恢复过程,减少数据库管理员的工作量。 四、 数据的导入与导出 Oracle ...
RMAN支持全库备份、表空间备份、文件备份等多种备份类型,并且能够进行基于时间、基于SCN(系统更改号)和基于归档日志的恢复。 #### 3. 数据文件恢复 当某个数据文件损坏或丢失时,可以通过RMAN进行单独的数据...