在开发过程可能会遇到一些特殊场景,诸如我想删除某表,但是无法删除,去找原因发现是发生了锁表,
锁表指的是在执行一个事务时,该事务获取了一个锁并保持其锁定状态,直到事务完成或手动释放锁,导致其他事务无法同时访问相同资源。
-- 排查锁表和解除锁表
select sess.sid,sess.serial#, lo.oracle_username,lo.os_user_name, ao.object_name,lo.locked_mode
from v$locked_object lo,dba_objects ao,v$session sess
where ao.object_id=lo.object_id and lo.session_id=sess.sid;
alter system kill session '72,1756’;
--分别为SID和SERIAL#号
--解除锁表后删除原表,建新表
drop table DEPT_TEST_WXX2;
后来经蒋老师提醒,发现这个方法存在缺陷,
drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉。
上面的删除只是在数据库无法使用该表数据,并不是真正意义上的删除,仍会占用数据库空间,真正的删除语句:drop table DEPT_TEST_WXX2 purge;
总结如下:
关于数据库表的几种删除方式和不同(扩展)
Oracle中删除表(drop,truncate,delete)
Drop命令
•drop table books;的指令会将表放到回收站里,用 flashback table “BIN$1Oiy3qm/QJubov1BwBUOgw==$0” to before drop; 就能恢复。
•删除表:drop table books purge; 是绕过回收站,彻底删除。
•建议先 purge recyclebin; 清除当前用户的回收站,不会影响其他用户的回收站。
•或者 purge table 表名; 清除回收站内指定的表。
•用drop删除表数据,不但会删除表中的数据,连表结构也被删除了!
truncate命令
•用truncate删除表数据,只是删除表中的数据,表结构不会被删除!
•删除整个表的数据时,过程是系统一次性删除数据,效率比较高
•truncate删除释放空间
delete命令
•用delete删除表数据,只是删除表中的数据,表结构不会被删除!
•虽然也是删除整个表的数据,但是过程是系统一行一行地删,效率比truncate低
•delete删除是不释放空
制作了排版方便记忆(虽然也很丑就是了)