一张几亿的分区表,能改名么?

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 一张几亿的分区表,能改名么?

要先恭喜北京女排,击败天津进军全运会四强,继续加油!

一个微信群中有位朋友问“一张几亿的分区表,能改名么?”。我想他要表达的,不是语法上是否可以改名,而是改名是否有什么影响?

是否有影响,需要看看背后做了什么。

创建测试表,

create table tbl_par (
  id number,
  insert_time date
)
partition by range (insert_time)
(
  partition par_1 values less than (to_date(‘2017-01-02’, ‘yyyy-mm-dd’)),
  partition par_2 values less than (to_date(‘2017-01-03’, ‘yyyy-mm-dd’)),
  partition par_3 values less than (to_date(‘2017-01-04’, ‘yyyy-mm-dd’))
);

插入测试数据,

SQL select insert_time, count(*) from tbl_par group by insert_time; INSERT_TI   COUNT(*) --------- ---------- 01-JAN-17      10000 02-JAN-17      10000 03-JAN-17      10000

SQL select count(*) from tbl_par partition(par_1); COUNT(*) ---------- 10000

SQL select count(*) from tbl_par partition(par_2); COUNT(*) ---------- 10000

SQL select count(*) from tbl_par partition(par_3); COUNT(*) ---------- 10000

执行10046事件,

SQL alter session set events ‘10046 trace name context forever, level 12’;
Session altered.

SQL alter table tbl_par rename to tbl_par_k; Table altered.

SQL alter session set events '10046 trace name context off'; Session altered.

从trace看,首先以对表TBL_PAR以NOWAIT加了EXCLUSIVE表级排他锁,

LOCK TABLE “TBL_PAR” IN EXCLUSIVE MODE  NOWAIT

此时禁止对表进行DDL或DML操作,若执行了DDL操作,直接提示“ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired”的错误,若执行了DML操作,则处于hang,但允许执行select(非for update)操作。

接着有一段自治事务,判断table rename的操作,

一张几亿的分区表,能改名么?

又做了一系列的CRUD操作,主要是针对数据字典表,总计100次select,7次insert,16次delete,10次update,

整个trace文件一共4107行,大约执行一半的时候,从obj$中删除了obj#=28535的对象,根据user_objects的object_id可知,就是TBL_PAR,

delete from obj$ where obj# = :1 END OF STMT BINDS #140483454726864:  Bind#0   oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00   oacflg=00 fl2=0001 frm=00 csi=00 siz=24 off=0   kxsbbbfp=7fc4da83ea80  bln=22  avl=04  flg=05   value=28535

紧接着执行了insert操作,向obj$插入了obj#=28535的对象,此时对象名称就是TBL_PAR_K,相当于将数据字典中TBL_PAR的记录,替换为了TBL_PAR_K,

insert into obj$(owner#,name,namespace,obj#,type#,ctime,mtime,stime,status,remoteowner,linkname,subname,dataobj#,flags,oid$,spare1,spare2,spare3) values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18) END OF STMT PARSE #140483455897008:c=2000,e=1234,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=1498855328240025 BINDS #140483455897008:  Bind#0   oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00   oacflg=00 fl2=0001 frm=00 csi=00 siz=24 off=0   kxsbbbfp=7fc4da830980  bln=22  avl=02  flg=05   value=93  Bind#1   oacdty=01 mxl=32(09) mxlc=00 mal=00 scl=00 pre=00   oacflg=10 fl2=0001 frm=01 csi=178 siz=32 off=0   kxsbbbfp=74dbbc3e  bln=32  avl=09  flg=09   value="TBL_PAR_K"  Bind#2   oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00   oacflg=00 fl2=0001 frm=00 csi=00 siz=72 off=0   kxsbbbfp=7fc4da830920  bln=22  avl=02  flg=05   value=1  Bind#3   oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00   oacflg=00 fl2=0001 frm=00 csi=00 siz=0 off=24   kxsbbbfp=7fc4da830938  bln=22  avl=04  flg=01   value=92368

然后,又对一些底层数据字典表,例如idl_ub1$、idl_ub2$、idl_ub2$、idl_sb4$,进行了一系列清理操作。

注意此处只是改了表名,分区名称不变。

整个操作,虽然开始对表加了EXCLUSIVE NOWAIT级别的锁,从现象上看,秒级完成了,但后台执行了100+次的数据字典SQL操作,效率非常高。

总结:

  1. 当对某一个操作不确定的时候,10046是一个解密的绝佳武器,不一定要看懂所有trace信息,可能一些关键的信息,就能让我们有所领悟。

  2. 从现象以及10046的trace看,改表名会锁表,但时间有限,主要是针对数据字典表,进行一系列的对象名称替换,因此还是可控。

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

一张几亿的分区表,能改名么?

Android和IOS用户,可以激情赏赞,

一张几亿的分区表,能改名么?
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 一张几亿的分区表,能改名么?


 上一篇
定制化删除ES索引数据 定制化删除ES索引数据
我们有一台ES服务器,设置了每天02:00执行一次清理索引数据的定时任务,但这两天总是出现磁盘空间抖动,一线一看见超了阈值,就打电话报警,可能整晚要被叫几次,ES作为日志平台的一部分,只是为了方便我们检索日志,不影响实际业务,这就比较烦了。
下一篇 
Linux运维必会的100道MySql面试题之(一) Linux运维必会的100道MySql面试题之(一)
写此文章的由来,源于老男孩老师在群里发的一篇文章 **  “Linux运维班MySQL必会面试题100道”** 因此,民工哥将题抄录下来,然后在线下环境将答案逐一验证,并写出来分享给需要的小伙伴,因答案纯属个人观点,难免会有不正之处,还望小