社区
基础和管理
帖子详情
plsql中删除数据不成功
wildjeff
2018-10-10 10:44:24
在plsql中执行2次删除语句,然后提交(写一条语句 执行 然后再修改这条语句 再执行,最后提交一次);在数据库中查询记录 2条记录都查询不到,但是在bmc patrol客户端中还能查到第一个删除的记录,这是什么原因呢?
...全文
694
3
打赏
收藏
plsql中删除数据不成功
在plsql中执行2次删除语句,然后提交(写一条语句 执行 然后再修改这条语句 再执行,最后提交一次);在数据库中查询记录 2条记录都查询不到,但是在bmc patrol客户端中还能查到第一个删除的记录,这是什么原因呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
一名即将失业的db
2018-10-11
打赏
举报
回复
串库的可能性很大,缓存没有碰到过,楼主可以尝试新建一个表,然后用bmc patrol查询是否能查到。或者查一下session
卖水果的net
2018-10-10
打赏
举报
回复
数据库中查询记录 2条记录都查询不到,但是在bmc patrol客户端中还能查到
1、确认是否连的同一个库(或用户)。 2、缓存问题。
ray_suen
2018-10-10
打赏
举报
回复
你确定你第一条语句有成功执行,并删除了数据吗?
简单说明Oracle
数据
库
中
对死锁的查询及解决方法
死锁的原理 当对于
数据
库某个表的某一列做更新或
删除
等操作,执行完毕后该条语句不提 交,另一条对于这一列
数据
做更新操作的语句在执行的时候就会处于等待状态, 此时的现象是这条语句一直在执行,但一直没有执行
成功
,也没有报错。 死锁的定位方法 通过检查
数据
库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。 1)用dba用户执行以下语句 select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object) 如
oracle恢复工具-FY_Recover_Data
不小心Truncate表的事情也是有的, 其
中
大部份时因为工具连错了库, 从儿跑错了角本. 遇到这种事情而没有备份时怎么办呢? 首先要停止
数据
库, 将这个表所在的表空间的文件拷贝出来, 因为Oracle在Truncate只时将相应Segment的第一个块格式化掉了, 而后面的都还存在, 到下次用时到才真正地重新格式化. 下面来讲一个Truncate表后进行恢复的例子: SQL> CREATE TABLE T_TRUNCATE AS SELECT * FROM TAB; Table created. SQL> SELECT COUNT(*) FROM T_TRUNCATE; COUNT(*) ---------- 14 SQL> ALTER SYSTEM CHECKPOINT; System altered. SQL> TRUNCATE TABLE T_TRUNCATE; Table truncated. SQL> ALTER SYSTEM CHECKPOINT; System altered. 在Truncate时只是Segment Header格式化了, 并将Data Object ID换成一个新的值, 我们可以在AUL
中
用DESC命令来查看: AUL> desc anysql.t_truncate Storage(OBJ#=9976 OBJD=9977 TS=4 FILE=4 BLOCK=5235 CLUSTER=0) No. SEQ INT Column Name Type --- --- --- ----------------------------- ---------------- 1 1 1 TNAME VARCHAR2(30) NOT NULL 2 2 2 TABTYPE VARCHAR2(7) 3 3 3 CLUSTERID NUMBER 要恢复这个表的
数据
, 首先要在AUL
中
运行SCAN EXTENT命令, 因为Segment Header被格式化了, 所以Extent Map也可能丢失, 而Scan Extent则将扫描整个
数据
文件并将Extent分配信息写入AULEXT.TXT文件: AUL> SCAN EXTENT FILE 4 2006-12-18 21:32:10 2006-12-18 21:32:24 恢复的关键是要获得这个表原来的Data Object ID, 在这个例子
中
我在Truncate表后什么也没有做就关闭
数据
库进行恢复了. 从上面的DESC命令可以看出表的Segment Header是(4,5235), 而新的Data Object ID是9977, 老的Data Object ID我们可以从Segment Header的后面一个
数据
块
中
得到, 如果这个表有几个Free List Group, 则可能还要再后面几个块. 用AUL的ORADUMP命令来看一下后面一个块: AUL> ORADUMP FILE 4 BLOCK 5236 RDBA=0x01001474(4/5236)=16782452,type=0x06,fmt=0xa2,seq=0x02,flag=0x04 seg/obj=0x000026f8=9976,csc=0x0000.0006caf5,itc=3,typ=1 - DATA FLG=0x32, fls=0, nxt=0x01001471(4/5233)=16782449 ...... 可以看到原来的Data Object ID是9976, 现在可以恢复了, 先不指定原来的Data Object ID试试? AUL> unload table anysql.t_truncate; 2006-12-18 21:33:37 Unload OBJD=9977 FILE=4 BLOCK=5235 CLUSTER=0 ... 2006-12-18 21:33:37 接下来指定原来的Data Object ID, 再试试? AUL> unload table anysql.t_truncate object 9976; 2006-12-18 21:33:45 Unload OBJD=9976 FILE=4 BLOCK=5235 CLUSTER=0 ... P_MV_FACT_SALES|TABLE TIME_DIM|TABLE FACT_SALES|TABLE MV_FACT_SALES|TABLE SEG$|TABLE NUMTEST|TABLE T_OBJECTS|TABLE T_LOBTEST|TABLE T_INCLOB|TABLE CF_XXK|TABLE T_TESTDMP|TABLE T_CLOBDEMO|TABLE T_BLOBDEMO|TABLE T_TRUNCATE|TABLE 2006-12-18 21:33:45 可以看到14条
数据
全回来了, 当然
数据
库是复杂的, 如果是一个很大的表, 还是不能保证可以100%恢复的. 最近至少看到二次错误地截断(Truncate)表的例子, 并在网上询问如何恢复, 在这儿我给出AUL/MyDUL的解决方案, 下面是我用的一个测试表: ASQL> DESC TRUNCDEMO NO# NAME NULLABLE TYPE --- ----------------- -------- ------------ 1 COL1 VARCHAR2(20) ASQL> SELECT * FROM TRUNCDEMO; COL1 ----- ROW 1 ROW 2 2 rows returned. 接下来我们来截断表, 其实这个操作只是重新格式化了段头块(Segment Header), 并分配一个新的
数据
对象号(Data Object ID), 当然空间分配信息也改了, 除非加了重用空间选项(Reuse Storage). 来看一下这个操作的前后变化: ASQL> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS; DATA_OBJECT_ID OBJECT_NAME -------------- ----------- 13676 TRUNCDEMO 1 rows returned. ASQL> truncate table truncdemo; Truncate Table Succeed. ASQL> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS; DATA_OBJECT_ID OBJECT_NAME -------------- ----------- 13677 TRUNCDEMO 1 rows returned. 由于在System表空间
中
已经记录了新的信息, 因此用当前的System信息是不能恢复过来的,在AUL/MyDUL
中
可以当作没有System时的情况来处理,在下面的命令
中
, 我们用Truncate后的
数据
对象号就不能进行恢复, 而使用Truncate以前的就可以, 当然空间不能被重新利用了是恢复的前提. AUL> unload object 13676 column varchar file 4; 2006-09-18 22:38:58 ROW 1 ROW 2 2006-09-18 22:39:04 AUL> unload object 13677 column varchar file 4; 2006-09-18 22:39:10 2006-09-18 22:39:10 AUL> 因此在意外发生Truncate后, 如果没有备份可以恢复, 首先要做的事是备份一下当前的文件, 免得空间被重用. 而Truncate之前的
数据
对象号在AUL/MyDUL
中
是很容易找出来的. 到此已经说明了如何恢复Truncate表了. 跟据原理可以创建一个恢复包Recover_Truncate_Data,然后我们可以做个实验进行验证恢复效果如何: 第一步:创建表 create table truntab1 as select * from dba_objects; 第二步:查询表
中
记录数 select count(*) from truntab1; --72622 第三步:truncate表
中
业务
数据
truncate table truntab1; 第四步:确认表
中
记录数为零 select count(*) from truntab1; -- 0 第五步:设置恢复前环境变量 set serveroutput on size 10000000 --//设置大点,默认为2000 bytes exec dbms_output.enable(999999999999999999999); --//默认为2000 bytes 注意:如果不不进行设置,为报
PLSQL
ORA-20000: ORU-10027: buffer overflow, limit of 10000 第六步:实施truncate表
中
数据
恢复 declare tgtowner varchar2(30); tgttable varchar2(30); datapath varchar2(4000); datadir varchar2(30); rects varchar2(30); recfile varchar2(30); rstts varchar2(30); rstfile varchar2(30); blksz number; rectab varchar2(30); rsttab varchar2(30); copyfile varchar2(30); begin tgtowner := 'SYS'; --指定表名的属用户 tgttable := 'TRUNTAB1'; --指定需要恢复的表名 datapath := 'D:\app\Administrator\oradata\lmis\'; --
数据
文件所在位置 datadir := 'FY_DATA_DIR'; Recover_Truncate_data.prepare_files(tgtowner, tgttable, datapath, datadir, rects, recfile, rstts, rstfile, blksz); Recover_Truncate_data.fill_blocks(tgtowner, tgttable, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile); Recover_Truncate_data.recover_table(tgtowner, tgttable, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz); end; 第七步:查看输出内容和构造表名: 15:32:44: Directory Name: FY_DATA_DIR4 15:32:45: Recover Tablespace: FY_REC_DATA4; Data File: FY_REC_DATA4.DAT 15:32:46: Restore Tablespace: FY_RST_DATA4; Data File: FY_RST_DATA4.DAT 15:32:48: Recover Table: SYS.TRUNTAB1$2 15:32:48: Restore Table: SYS.TRUNTAB1$$2 15:33:04: [fill_blocks] Data Blocks formatted. 15:33:05: [copy_file] begin copy file: FY_DATA_DIR4\FY_REC_DATA4.DAT => FY_DATA_DIR4\FY_REC_DATA_COPY.DAT 15:33:05: [copy_file] completed. 15:33:05: Copy file of Recover Tablespace: FY_REC_DATA_COPY.DAT 15:33:05: begin to recover table SYS.TRUNTAB1 15:33:19: [restore_table] Trying to restore data to SYS.TRUNTAB1$$2 15:33:20: [restore_table] Expected Records in this round: 411 15:33:20: [restore_table] 411 records recovered 此处省略N行输出............................................ 15:33:44: [restore_table] Expected Records in this round: 0 15:33:44: [restore_table] 0 records recovered 15:33:44: 1033 truncated data blocks found. 15:33:44: 72622 records recovered in backup table SYS.TRUNTAB1$$2 15:33:44: Recovery completed. PL/SQL procedure successfully completed 从红色字体可以看出,恢复72622条,刚好是truncate前业务表
中
记录数,恢复临时表为:SYS.TRUNTAB1$$2 第七步:查看输出内容和构造表名: insert into truntab1 select * from SYS.TRUNTAB1$$2 第八步:验证
数据
是否完全恢复 select count(*) from truntab1; --72622 至此,truncate掉的
数据
成功
恢复,并且此方法也可以恢复drop table tablename purge
删除
的
数据
, 第九步:清理恢复产生的表空间和
数据
文件 特别提醒:恢复完成后,该方法会在
数据
库
中
产生一个表空间:FY_RST_DATA*,恢复一次产生一个,记得及时清理!否则会导致服务器RMAN备份失败ORA-19566 超出损坏块限制(切记) truncate原理: ? ? ? ?TRUNCATE不会逐个清除用户
数据
块上的
数据
,而仅仅重置
数据
字典和元
数据
块上的元
数据
(如存储段头和扩展段图)。也就是说,此时,其基本
数据
并未被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的
数据
,需要及时备份其所在的
数据
文件。 ? ? 方法:用存储过程包Fy_Recover_Data ? ? 它是利用Oracle表扫描机制、
数据
嫁接机制恢复TRUNCATE或者损坏
数据
的工具包,这个包是由行内有影响力的DBA大师黄炜先生通过
PLSQL
编写的,再这里再次感谢他的无私技术分享。Fy_Recover_Data去本文附近
中
下载 好了,闲话少说,下面通过oracle
数据
库
中
scott用户自带的emp表做测试: 步骤1:先把Fy_Recover_Data包拷贝到oracle相关目录下 步骤2:在scott用户下创建test_emp表: SQL> conn scott/tiger; Connected. SQL> select * from tab; TNAME ? ? ? TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS ? ? ? TABLE DEPT ? ? ? TABLE EMP ? ? ? ? ? ? ? ?TABLE SALGRADE ? ? ? TABLE SQL> select count(*) from emp; ? COUNT(*) ---------- 14 SQL> create table test_emp ?as select * from emp; Table created. SQL> select count(*) from test_emp; ? COUNT(*) ---------- 14 步骤3:用truncate
删除
test_emp表: SQL> truncate table test_emp; Table truncated. SQL> select count(*) from test_emp; ? COUNT(*) ---------- 0 步骤4:在linux
中
的oracle用户下解压FY_Recover_Data.zip包 $ unzip FY_Recover_Data.zip Archive: ?FY_Recover_Data.zip ? inflating: FY_Recover_Data.SQL? 步骤5:恢复 1)在sys用户下执行存储过程 SQL> @/home/oracle/FY_Recover_Data.SQL Package created. Package body created. 2)查看test_emp表在
数据
文件
中
的目录 SQL> select file_name from dba_data_files f, dba_tables t where t.owner='SCOTT' and t.table_name='TEST_EMP' and t.tablespace_name = f.tablespace_name; FILE_NAME -------------------------------------------------------------------------------- /u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf 3)通过脚本恢复,可以用sqlplus命令行或者
plsql
developer执行 declare ? ? ? tgtowner varchar2(30); ? ? ? tgttable varchar2(30); ? ? ? datapath varchar2(4000); ? ? ? datadir varchar2(30); ? ? ? rects varchar2(30); ? ? ? recfile varchar2(30); ? ? ? rstts varchar2(30); ? ? ? rstfile varchar2(30); ? ? ?blksz number; ? ? ?rectab varchar2(30); ? ? ?rsttab varchar2(30); ? ? ?copyfile varchar2(30); ? ?begin ? ? ?tgtowner := 'SCOTT'; --table owner ? ? ?tgttable := 'TEST_EMP'; ?--table name ? ? ?datapath := '/u03/oracle/oradata/WUTONG/datafile/'; ? ?--必须和test.t1表所在的
数据
文件的目录相同 ? ? ?datadir := 'FY_DATA_DIR'; ? ? ? ?--oracle
中
目录的名字,可以修改 ? ? ?Fy_Recover_data.prepare_files(tgtowner, tgttable, datapath, datadir, rects, recfile, rstts, rstfile, blksz); ? ? ?Fy_Recover_data.fill_blocks(tgtowner, tgttable, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile); ? ? ?Fy_Recover_data.recover_table(tgtowner, tgttable, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz); ? ?end; ? ?以上SQL脚本产生2个表空间(2个
数据
文件),还有1个copy文件。 4)切换到scott用户下查看会发现多了些不一样以test_emp的表,这时找到相关有
数据
的表,把
数据
插入原表test_emp SQL> conn scott/tiger Connected. SQL> select * from tab; TNAME ? ? ? TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS ? ? ? TABLE DEPT ? ? ? TABLE EMP ? ? ? TABLE SALGRADE ? ? ? TABLE TEST_EMP ? ? ? TABLE TEST_EMP$ ? ? ? TABLE TEST_EMP$$ ? ? ? TABLE 7 rows selected. SQL> insert into test_emp select * from TEST_EMP$$; 14 rows created. SQL> commit; Commit complete. SQL> select count(*) from test_emp; ? COUNT(*) ---------- 14 当你看到这一步的时候,说明truncate的表已经完全恢复了,恭喜你
数据
恢复
成功
!紧张的压力随之而释放,脸上露出灿烂的笑容和自豪感(做DBA很辛苦,
数据
库能保持正常运行,DBA在幕后做了大量的工作,有时是不会不被公司其他人理解的。。。。。) 步骤6:恢复
数据
后,把恢复时产生的2个表空间
删除
,再
删除
对应
数据
文件 SQL> conn / as sysdba Connected. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u03/oracle/oradata/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf /u03/oracle/oradata/WUTONG/datafile/FY_REC_DATA.DAT /u03/oracle/oradata/WUTONG/datafile/FY_RST_DATA.DAT 7 rows selected. SQL>?drop tablespace FY_REC_DATA INCLUDING CONTENTS; Tablespace dropped. SQL>?drop tablespace FY_RST_DATA INCLUDING CONTENTS; Tablespace dropped. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u03/oracle/oradata/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf /u03/oracle/oradata/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf 然后去操作系统下把对应的
数据
文件
删除
即可 ---------------------
Oracle11g服务器、客户端的安装和
plsql
developer(一次
成功
)
1.你能保证Oracle11g不出现错误吗? 2.你能保证Oracle11g 服务器安装不出现错误吗? 3.你能保证
plsql
developer不出ORA-12541 TNS 无监听程序错误吗? 4.你知道Oracle11g安装服务器端,客户端,
plsql
developer都有...
BOS 技术整理
BOS 技术整理-02 Oracle
数据
库安装配置使用 直接安装 打开服务 并尝试连接
数据
库 安装远程连接工具
PLSQL
Developer 安装配置使用 2.在
PLSQL
Developer 启动,配置 oracle instanceclient 目录 4、 默认
PLSQL
Developer 连接 Oracle 使用客户端字符集 utf-8 , 基于工具使用 SQL 插入
中
文有乱码问题,设置客户端字符集 gb2312 配置 环境变量 NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK 弹窗了,就表示
成功
了! 工具补充: Navicat Premium 安装和使用 直接安装 ok jquery easyui 总合 (直接看API文档 后期加上如何使用) Orcale 创建用户 先进入 Orcale 命令行 针对 BOS 系统建立新的用户 创建 bos/bos 账户, 授予角色 connect、resource -- Create the user create user BOS identified by "" default tablespace SYSTEM temporary tablespace TEMP profile DEFAULT password expire; -- Grant/Revoke role privileges grant connect to BOS; grant resource to BOS; -- Grant/Revoke system privileges grant unlimited tablespace to BOS; Spring 环境搭建 IOC 导入 context 依赖 beans、core、expression AOP 导入 测试集成 Web 集成 配置监听器 整合持久层框架 hibernate、jpa web.xml 配置 spring 监听器 src/main/resource 下 建立 applicationContext.xml rc/main/resource 提供 config.properties 外部属性文件、log4j.properties 日志配置文件 配置文件如下: applicationContext.xml struts2 注解 类上 @ParentPackage 包继承谁? extends=”struts-default” @Namespace 包命名空间 namespace=”/” @Actions struts2 的 Action 配置,用于配置多个 Action 方法上 @Action 配置访问路径,和方法绑定 @Result 结果集配置 struts2 和 spring 整合 struts2 的 Action 使用 spring 注解,被 spring 管理 @Controller spring 表现层 bean @Scope 配置 Action 为多例 Spring Data JPA 代替了 Hibernate "CURD " 但是和Hibernate一样 实现DAO(
数据
)层的功能 "增删改查" Hibernate 实体类 生成表结构 ---- 领域(Domain)驱动建模 这次使用的是驱动建模,传统的设计模式是: 先设计表,再创建实体 JPA 注解使用 @Entity 标明是实体类 @Table 映射表名称 @Id 主键标识 @GeneratedValue 自动生成主键的值 @Column 设置映射
数据
表
中
列信息 @Temporal 控制
数据
表保存日期哪个部分(日期、时间、日期时间) @OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护
中
间表 收派标准修添加能实现 html 请求 后台处理 服务器端Service和DAO编写整合springdatajpa 业务层接口 修改 Action 代码调用 Service 业务层实现类 在applicationContext添加一条 用来整合 Spring Data jpa
注意: 这里的扫描包,必须指定到类的上级包 比如 一个类 com.itStone.bao.dao.test.java 那么它的上级包 就是 com.itStone.bao.dao 根级包是 : 就是 com 只需要编写 DAO 接口,继承 JpaRepository即可 不需要对 DAO 接口做任何实现, 实际上 spring 会调用 SimpleJpaRepository 实现 struts 2 注解
在
plsql
中
添加
删除
数据
在登录到
plsql
中
,要对某个表进行操作时,发现没有权限,此时可采用: 第一步: select * from "表名" for update; 显示出该表,如图: 第二步: 点击解锁图标,即可对
数据
进行编辑,如图:,修改完成后,点击对勾,并提交事务,,即可
成功
修改。
基础和管理
17,377
社区成员
95,128
社区内容
发帖
与我相关
我的任务
基础和管理
Oracle 基础和管理
复制链接
扫一扫
分享
社区描述
Oracle 基础和管理
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章