- 浏览: 1197844 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
Oracle删除表
- 1, DELETE (删除数据表里记录的语句)
- DELETE FROM表名 WHERE 条件;
- 注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused.
- 如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间
- TRUNCATE TABLE 表名;
- 此操作不可回退.
1, DELETE (删除数据表里记录的语句) DELETE FROM表名 WHERE 条件; 注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused. 如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间 TRUNCATE TABLE 表名; 此操作不可回退.
- http://www.chinaunix.net 作者:oraix 发表于:2004-11-28 23:02:53
- 注意:这里说的delete是指不带where子句的delete语句
- 相同点
- truncate和不带where子句的delete, 以及drop都会删除表内的数据
- 不同点:
- 1. truncate和 delete只删除数据不删除表的结构(定义)
- drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
- 2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
- truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
- 3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
- 显然drop语句将表所占用的空间全部释放
- truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).
- 4.速度,一般来说: drop>; truncate >; delete
- 5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
- 使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
- 想删除表,当然用drop
- 想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
- 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据
评论
2 楼
dolphin_ygj
2009-04-20
Oracle找回数据(转)
1、 用dbms_flashback找回数据
首先必须要有使用dbms_flashback包的权力,可以在sys下通过
Grant execute on dbms_flashback to user;授权
Sql>execute dbms_flashback.enable_at_time(date); //开启快照模式
Sql>进行回复操作,此时查询的表都是date所指时间的表,可以通过游标打开表,或把该表中的数据存入临时表
Sql>execute dbms_flashback.disable; //结束快照模式
Sql>把游标或临时表中的数据写回到原来的表中
一个示例存储过程:
1、确定数据被删之前的状态:
SQL>connect test/test
SQL>select * from yang;
SQL> select * from yang;
PART_ID ID NAME
---------- ---------- ----------
1 1 yang
1 1 yang
11 1 ding
SQL> select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
01-21-05 14:48:09
2、删除表中的全部数据:
SQL>delete yang;
SQL>commit;
SQL>select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
01-21-05 14:49:08
3、启用flashback。
SQL> exec dbms_flashback.enable_at_time(to_date('2005-01-21 14:48:09','yyyy-mm-dd hh24:mi:ss'));
PL/SQL 过程已成功完成。
SQL> select * from yang;
PART_ID ID NAME
---------- ---------- ----------
1 1 yang
1 1 yang
11 1 ding
这说明通过flashback可以找回丢失的数据。
因为在flashback方式下不能使用DML语句,而只能查看数据,因此使用通常的方法并不能恢复数据,但我们使用存储过程中的游标来保存flashback状态下的数据,等关闭flashback后再用此游标把数据恢复。
4、使用存储过程如下:
SQL>set serveroutput on
SQL>DECLARE
r_yang yang%ROWTYPE;
CURSOR c_yang IS SELECT * FROM yang;
BEGIN
OPEN c_yang;
dbms_flashback.disable;
LOOP
FETCH c_yang INTO r_yang;
EXIT WHEN c_yang%NOTFOUND;
dbms_output.put_line(r_yang.part_id||','||r_yang.id||','||r_yang.name);
insert into yang (part_id,id,name) values (r_yang.part_id,r_yang.id,r_yang.name);
commit;
END LOOP;
CLOSE c_yang;
END;
/
1,1,yang
1,1,yang
11,1,ding
PL/SQL 过程已成功完成。
5、然后再查看表中的数据,发现数据已经恢复了。
SQL> select * from yang;
PART_ID ID NAME
---------- ---------- ----------
1 1 yang
1 1 yang
11 1 ding
2、用timestamp找回数据
insert into yang
select * from yang as of timestamp to_timestamp('2005-01-21 14:48:0', 'yyyy-mm-dd hh24:mi:ss');
将表yang在2005-01-21 14:48:0这一时间点时的记录插入到当前时刻的yang表中。
1、 用dbms_flashback找回数据
首先必须要有使用dbms_flashback包的权力,可以在sys下通过
Grant execute on dbms_flashback to user;授权
Sql>execute dbms_flashback.enable_at_time(date); //开启快照模式
Sql>进行回复操作,此时查询的表都是date所指时间的表,可以通过游标打开表,或把该表中的数据存入临时表
Sql>execute dbms_flashback.disable; //结束快照模式
Sql>把游标或临时表中的数据写回到原来的表中
一个示例存储过程:
1、确定数据被删之前的状态:
SQL>connect test/test
SQL>select * from yang;
SQL> select * from yang;
PART_ID ID NAME
---------- ---------- ----------
1 1 yang
1 1 yang
11 1 ding
SQL> select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
01-21-05 14:48:09
2、删除表中的全部数据:
SQL>delete yang;
SQL>commit;
SQL>select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
01-21-05 14:49:08
3、启用flashback。
SQL> exec dbms_flashback.enable_at_time(to_date('2005-01-21 14:48:09','yyyy-mm-dd hh24:mi:ss'));
PL/SQL 过程已成功完成。
SQL> select * from yang;
PART_ID ID NAME
---------- ---------- ----------
1 1 yang
1 1 yang
11 1 ding
这说明通过flashback可以找回丢失的数据。
因为在flashback方式下不能使用DML语句,而只能查看数据,因此使用通常的方法并不能恢复数据,但我们使用存储过程中的游标来保存flashback状态下的数据,等关闭flashback后再用此游标把数据恢复。
4、使用存储过程如下:
SQL>set serveroutput on
SQL>DECLARE
r_yang yang%ROWTYPE;
CURSOR c_yang IS SELECT * FROM yang;
BEGIN
OPEN c_yang;
dbms_flashback.disable;
LOOP
FETCH c_yang INTO r_yang;
EXIT WHEN c_yang%NOTFOUND;
dbms_output.put_line(r_yang.part_id||','||r_yang.id||','||r_yang.name);
insert into yang (part_id,id,name) values (r_yang.part_id,r_yang.id,r_yang.name);
commit;
END LOOP;
CLOSE c_yang;
END;
/
1,1,yang
1,1,yang
11,1,ding
PL/SQL 过程已成功完成。
5、然后再查看表中的数据,发现数据已经恢复了。
SQL> select * from yang;
PART_ID ID NAME
---------- ---------- ----------
1 1 yang
1 1 yang
11 1 ding
2、用timestamp找回数据
insert into yang
select * from yang as of timestamp to_timestamp('2005-01-21 14:48:0', 'yyyy-mm-dd hh24:mi:ss');
将表yang在2005-01-21 14:48:0这一时间点时的记录插入到当前时刻的yang表中。
1 楼
dolphin_ygj
2009-04-20
Oracle查找删除记录后表中某一时间点的数据
删除数据前表中记录
1> select t.*, t.rowid from vt_temp_test;
1 1 2 3.00 4.00
2 5 6 7.00 8.00
3 9 10 11.00 12.00
4 13 14 15.00 16.00
记录原数据完整时间点
2> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
1 2009-01-08 09:23:53
删除表中记录
3> delete from vt_temp_test;
找回原数据完整时间点数据
4> select * from vt_temp_test as of timestamp to_timestamp('2009-01-08 09:23:53', 'yyyy-mm-dd hh24:mi:ss');
1 1 2 3.00 4.00
2 5 6 7.00 8.00
3 9 10 11.00 12.00
4 13 14 15.00 16.00
插入丢失数据到原表
5> insert into vt_temp_test select * from vt_temp_test as of timestamp to_timestamp('2009-01-08 09:23:53', 'yyyy-mm-dd hh24:mi:ss');
验证数据恢复情况
6> select * from vt_temp_test
1 1 2 3.00 4.00
2 5 6 7.00 8.00
3 9 10 11.00 12.00
4 13 14 15.00 16.00
---- 此时表明数据已完全恢复到原数据完整时间点的数据 ----
#### 注:当执行 truncate table vt_temp_test 时,就无法恢复数据,查找当时数据会报错:ORA-01466 unable to read table - table definition has changed。drop table vt_temp_test则更不可恢复 ####
删除数据前表中记录
1> select t.*, t.rowid from vt_temp_test;
1 1 2 3.00 4.00
2 5 6 7.00 8.00
3 9 10 11.00 12.00
4 13 14 15.00 16.00
记录原数据完整时间点
2> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
1 2009-01-08 09:23:53
删除表中记录
3> delete from vt_temp_test;
找回原数据完整时间点数据
4> select * from vt_temp_test as of timestamp to_timestamp('2009-01-08 09:23:53', 'yyyy-mm-dd hh24:mi:ss');
1 1 2 3.00 4.00
2 5 6 7.00 8.00
3 9 10 11.00 12.00
4 13 14 15.00 16.00
插入丢失数据到原表
5> insert into vt_temp_test select * from vt_temp_test as of timestamp to_timestamp('2009-01-08 09:23:53', 'yyyy-mm-dd hh24:mi:ss');
验证数据恢复情况
6> select * from vt_temp_test
1 1 2 3.00 4.00
2 5 6 7.00 8.00
3 9 10 11.00 12.00
4 13 14 15.00 16.00
---- 此时表明数据已完全恢复到原数据完整时间点的数据 ----
#### 注:当执行 truncate table vt_temp_test 时,就无法恢复数据,查找当时数据会报错:ORA-01466 unable to read table - table definition has changed。drop table vt_temp_test则更不可恢复 ####
发表评论
-
并发行级锁超2秒报警监控sql
2010-07-20 16:18 1939并发行级锁超2秒报警监控sql -
数据设计规范v
2010-06-22 19:47 0数据设计规范v -
Oracle 有趣排序包括那些
2010-06-20 16:51 1452按拼音排序 select * from table ... -
Oracle sql 性能优化调整
2010-06-20 16:15 1395Oracle sql ... -
Delete、Drop、Truncate的比较(转)
2010-05-31 13:39 1474Delete、Drop、Truncate的比较 关键字: d ... -
Oracle误操作解决方案(转)
2010-05-31 13:35 1392Oracle误操作解决方案 文章分类:数据库 一.误删除数 ... -
一个递归调用的存储过程
2010-04-19 01:51 1848一个递归调用的存储过程 -
oracle index学习总结
2009-12-08 10:44 19629oracle index 1.index需要储存空间 ... -
Jdbc 和hibernate
2009-11-16 23:38 1875Jdbc 和hibernate 一、Jdbc是java ... -
去掉 powerDesigner 中表设计时的 name和code联动的功能
2009-11-16 17:04 3485去掉 powerDesigner 中表设计时的 name和co ... -
oracle数据库索引未被使用的问题及其解决2007
2009-11-15 01:42 2131一次,在进行WEB页面上进行历史数据文件检查时,发现数据库访问 ... -
RMAN配置及备份与恢复练习
2009-09-27 18:06 16261.创建表空间SQL>create tablespace ... -
误删除数据后怎么立即恢复(不考虑全库备份和利用归档日志)
2009-09-27 18:01 3385要达到删除数据,有以下几种方式都可以:1、delete2、dr ... -
IMP数据到指定的表空间
2009-09-27 12:47 9103IMP数据到指定的表空间 一直以来,我都认为只要指定用户的默 ... -
ORACLE UPDATE 语句语法与性能分析
2009-09-27 09:49 1880为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在 ... -
oracle job 例子
2009-09-22 12:38 3064一、设置初始化参 ... -
oracle 时间加减综合
2009-09-17 11:43 1981加法 select sysdate,add_mon ... -
详细介绍ORACLE sqlplus命令
2009-09-09 16:42 2061一、ORACLE的启动和关闭1、在单机环境下要想启动或关闭OR ... -
AWR介绍与SYSAUX空间关系 SYASAUX表空间满了 系统慢
2009-09-08 09:45 7957AWR介绍与SYSAUX空间关系 2007-11-05 14 ... -
to_char 'NLS_DATE_LANGUAG参数
2009-09-02 18:41 1481select to_char(sysdate, 'Day'), ...
相关推荐
本文将深入探讨如何在Oracle环境中实现定时删除表空间的数据并释放空间,主要涵盖以下几个关键知识点: 1. **Oracle 表空间(Tablespaces)**:表空间是Oracle数据库中存储数据的基本单位,它由一个或多个数据文件...
如果在操作系统层面误删了数据文件,有几种恢复方法: 1. 如果已执行`ALTER DATABASE DATAFILE N OFFLINE DROP;`但未实际删除文件,可以先将文件ONLINE,然后使用`ALTER TABLESPACE XXX DROP DATAFILE N;`命令删除。...
本文介绍了几种常用的彻底删除Oracle数据表的方法,包括使用`PURGE`命令、在`DROP`语句中添加`PURGE`选项等。正确应用这些方法可以帮助管理员有效地管理数据库空间,并避免不必要的数据残留问题。
删除和重建 Oracle 实例需要注意以下几点: * 在删除实例之前,需要备份数据库,以免数据丢失。 * 删除实例需要关闭所有 Oracle 进程,以免出现意外错误。 * 重建实例需要使用正确的实例名和SID,以免出现冲突。 * ...
本文介绍了在Oracle数据库中处理重复数据的几种方法。无论是部分字段重复还是完全重复的记录,都可以通过创建临时表的方式提高删除重复记录的效率。此外,在处理重复数据时,还应考虑到保留最新或最旧记录的需求,...
oracle 删除重复数据的几种方法 在 Oracle 中,删除重复的数据是一种常见的操作。delete 操作可以用来删除重复的数据,但是需要根据实际情况选择合适的方法。下面将介绍四种删除重复数据的方法,每种方法都有其优...
Oracle RAC (Real Application Clusters) 是一种高可用性和可扩展性的数据库解决方案,它允许多个Oracle数据库实例同时访问同一个数据库。在Oracle RAC环境中进行实例管理是一项重要的任务,包括添加新的实例或删除...
SQL*Plus是Oracle提供的一种命令行工具,它是最早也是最基础的数据库访问方式。用户可以通过输入SQL语句直接与数据库交互,执行查询、插入、更新和删除等操作。在没有图形界面或者网络环境限制的情况下,SQL*Plus是...
当你不小心删除了数据库表中的数据时,Oracle提供了一种称为"闪回"的功能来恢复这些数据。在Oracle 10g及更高版本中,你可以使用`AS OF TIMESTAMP`子句查询到特定时间点的数据。例如,要查询两个小时以前的表数据,...
要删除Oracle数据库表中的重复记录,有几种方法可以采用: ##### 方法一:使用子查询与DELETE语句 这种方法适用于只需要删除重复记录中的某些行的情况。步骤如下: 1. **找出重复的记录**:首先,我们需要找到...
在Oracle 10g中,删除表有几种不同的方法,主要通过SQL语句实现。最常用的是`DROP TABLE`语句,用于永久性地从数据库中删除整个表及其所有数据。以下是对`DROP TABLE`语句的详细解释: ```sql DROP TABLE 表名 ...
本文旨在通过对比几种不同的方法来删除Oracle中的重复记录,并分析其性能差异,从而为数据库管理员提供有效的解决方案。 #### 二、方法与实现 ##### 方法一:使用ROWID直接删除 这种方法利用ROWID属性唯一性来...
Java 是一种广泛使用的编程语言,而 Oracle 数据库是一种功能强大且广泛使用的关系型数据库管理系统。在本文中,我们将探讨如何使用 Java 操作 Oracle 数据库,包括建表、插入数据和删除数据等操作。 Java 操作 ...
Oracle Data Guard(DG)是Oracle数据库系统中的一种高可用性和灾难恢复解决方案,它允许在主数据库和一个或多个备用数据库之间创建和维护实时同步。在Oracle DG环境中,归档日志是实现数据保护和故障切换的关键组件...
当面临以下几种情况时,可能需要考虑清理这些垃圾表: 1. **空间占用**:这些未被真正删除的表会继续占用数据库的存储空间。随着垃圾表数量的增加,可能会对数据库性能产生影响,特别是在磁盘空间有限的情况下。 2...
本文将详细介绍Oracle 11g的三种主要登录方式:企业管理器(EM)、SQL*Plus以及SQL Developer,并简述它们的基本功能和应用场景。 1. **企业管理器(Enterprise Manager,简称EM)** Oracle EM 提供了一个图形化的...
在本文中,我们将深入探讨Oracle的几种登录方式及其简易使用,以帮助新手快速上手。 1. **SQL*Plus登录** SQL*Plus是Oracle提供的一种命令行工具,用于直接与数据库交互。在命令行界面输入`sqlplus username/...
Oracle 临时表是一种特殊的表结构,它可以在数据库中临时存储数据,用于实现一些特定的应用场景。下面是 Oracle 临时表的详细知识点: 创建临时表 创建临时表的语法为: ``` CREATE GLOBAL TEMPORARY TABLE table ...
针对不同的场景,可以采取以下几种策略来删除重复记录: 1. **基于Group By和Min/Max Rowid** ```sql DELETE FROM cz WHERE (c1, c10, c20) IN (SELECT c1, c10, c20 FROM cz GROUP BY c1, c10, c20 HAVING COUNT...
在Oracle数据库中,外部表(External Tables)是一种特殊类型的表,它允许...总之,Oracle外部表为处理大量外部数据提供了一种高效、灵活的方式,通过合理的设计和管理,可以大大简化数据集成过程,提高数据处理效率。