[20180423]关于闪回表与主外键约束.txt

简介: [20180423]关于闪回表与主外键约束.txt --//上个星期做的测试,可以发现删除表在恢复主外键约束丢失. --//链接:http://blog.itpub.

[20180423]关于闪回表与主外键约束.txt

--//上个星期做的测试,可以发现删除表在恢复主外键约束丢失.
--//链接:http://blog.itpub.net/267265/viewspace-2153199/
--//不过这个可以模拟一个另外的测试.

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create table p ( x int primary key );
create table c ( x references p );
insert into p values ( 1 );
insert into p values ( 2 );
commit;

SCOTT@book> insert into c values ( 3 );
insert into c values ( 3 )
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.SYS_C0011835) violated - parent key not found

2.测试1:

--//session 1:
SCOTT@book> insert into p values ( 3 );
1 row created.

--//session 2:
SCOTT@book> drop table c purge;
drop table c purge
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

SCOTT@book> drop table c ;
drop table c
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
--//因为P表存在insert操作,而这个要锁定c表获取TM锁,这样删除是无法操作的:

SCOTT@book> @ &r/viewlock

   SID    SERIAL# USERNAME   OSUSER     MACHINE    MODULE       LOCK_TYPE       MODE_HELD  MODE_REQUE LOCK_ID1   LOCK_ID2   OWNER  OBJECT_TYP OBJECT_NAME          BLOCK LOCKWAIT
------ ---------- ---------- ---------- ---------- ------------ --------------- ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90716      0          SCOTT  TABLE      C                    No
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TX Transaction  Exclusive  None       655387     21831                                             No
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90714      0          SCOTT  TABLE      P                    No


3.测试2:
--//session 1:
SCOTT@book> commit ;
Commit complete.

--//注意不提交.
SCOTT@book> update p set x=x where x=2;
1 row updated.

--//session 2:
SCOTT@book> @ &r/viewlock
   SID    SERIAL# USERNAME   OSUSER     MACHINE    MODULE       LOCK_TYPE       MODE_HELD  MODE_REQUE LOCK_ID1   LOCK_ID2   OWNER  OBJECT_TYP OBJECT_NAME          BLOCK LOCKWAIT
------ ---------- ---------- ---------- ---------- ------------ --------------- ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TX Transaction  Exclusive  None       655370     21844                                             No
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90714      0          SCOTT  TABLE      P                    No

--//有点奇怪这个时候并没有锁C表.

SCOTT@book> insert into c values (2);
1 row created.

SCOTT@book> commit ;
Commit complete.

--//c表可以进行正常插入操作.

--//session 1:
SCOTT@book> commit ;
Commit complete.

SCOTT@book> delete from c ;
1 row deleted.

SCOTT@book> commit ;
Commit complete.

4.测试3:
--//session 1:
--//注意不提交.
SCOTT@book> @ &r/s
SCOTT@book(274,9)>

SCOTT@book> update p set x=x+2 where x=2;
1 row updated.

--//session 2:
SCOTT@book> @ &r/s
SCOTT@book(106,69)>
SCOTT@book> insert into c values (2);

--//挂起!!

SCOTT@book> @ &r/viewlock
   SID    SERIAL# USERNAME   OSUSER     MACHINE    MODULE       LOCK_TYPE       MODE_HELD  MODE_REQUE LOCK_ID1   LOCK_ID2   OWNER  OBJECT_TYP OBJECT_NAME          BLOCK LOCKWAIT
------ ---------- ---------- ---------- ---------- ------------ --------------- ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
   106         69 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90716      0          SCOTT  TABLE      C                    No    0000000084C36170
   106         69 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90714      0          SCOTT  TABLE      P                    No    0000000084C36170
   106         69 SCOTT      oracle     gxqyydg4   SQL*Plus     TX Transaction  Exclusive  None       589841     2823                                              No    0000000084C36170
   106         69 SCOTT      oracle     gxqyydg4   SQL*Plus     TX Transaction  None       Share      655384     21828                                             No    0000000084C36170
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TX Transaction  Exclusive  None       655384     21828                                             Yes
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90714      0          SCOTT  TABLE      P                    No
6 rows selected.

--//偏题了,不再做主外键测试.

5.测试5:
--//session 1:
SCOTT@book(274,9)> select * from p;
         X
----------
         1
         2
         3

SCOTT@book(274,9)> select * from c;
no rows selected

SCOTT@book(274,9)> update p set x=x where x=2;
1 row updated.

--//session 2:
SCOTT@book(106,69)> @ &r/viewlock
   SID    SERIAL# USERNAME   OSUSER     MACHINE    MODULE       LOCK_TYPE       MODE_HELD  MODE_REQUE LOCK_ID1   LOCK_ID2   OWNER  OBJECT_TYP OBJECT_NAME          BLOCK LOCKWAIT
------ ---------- ---------- ---------- ---------- ------------ --------------- ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TX Transaction  Exclusive  None       655377     21680                                             No
   274          9 SCOTT      oracle     gxqyydg4   SQL*Plus     TM DML(TM)      Row-X (SX) None       90714      0          SCOTT  TABLE      P                    No

SCOTT@book(106,69)> drop table c purge;
drop table c purge
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

--//不能删除表C.
SCOTT@book(106,69)> drop table c ;
Table dropped.

--//这样实际上并没有真正删除,而是进入回收站.

SCOTT@book(106,69)> flashback table c to before drop ;
Flashback complete.

SCOTT@book(106,69)> insert into c values (1111);
1 row created.

SCOTT@book(106,69)> commit ;
Commit complete.

--//恢复后主外键已经破坏,可以插入异常数据.
--//可以看出一种特殊的情况就是drop table c ;时实际上主外键约束就已经删除了.

目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
学习MySQL中DDL语句的修改字段与删除字段,删除表
学习MySQL中DDL语句的修改字段与删除字段,删除表
|
存储 SQL 关系型数据库
MySQL 利用 frm 文件和 ibd 文件恢复表结构和表数据
MySQL 利用 frm 文件和 ibd 文件恢复表结构和表数据
1593 0
|
SQL Oracle 关系型数据库
truncate表后恢复方法总结
truncate表后恢复方法总结   1.1  BLOG文档结构图   1.2  前言部分   1.
1666 0
|
关系型数据库 Oracle SQL
[20180419]关于闪回的一些问题.txt
[20180419]关于闪回的一些问题.txt --//别人问的问题,就是drop表,然后flashbask表,建立的触发器还在吗? --//我记忆里触发器应该还在,我个人喜欢通过例子验证自己的判断.
1041 0
|
关系型数据库 Shell 数据库
|
SQL Oracle 关系型数据库
Oracle的闪回特性之恢复truncate删除表的数据
/* 2008/06/06*环境:Windows XP +Oracle10.2.0.1*循序渐进oracle——数据库管理、优化与备份恢复*循序渐进oracle第8章:Oracle的闪回特性之恢复truncate删除表的数据*/SQL> show parameter flashback...
1374 0
|
Oracle 关系型数据库
flashback table to before drop外键约束无法恢复的原因分析
        在oracle中,表被drop掉后,是可以通过flashback命令把表从回收站中还原回来的,还原之后的表唯独少掉了参考完整性约束。
892 0
|
存储 SQL 关系型数据库
5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
 1  Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图   索引  序列  同义词   约束 3  创建一个表,有2个条件(1 有权限;2有表空间)    Oracle给你提供了默认的resource. 4 创建表,表信息的增删改,Oracle回收站 DDL        
1106 0