生活随笔
收集整理的這篇文章主要介紹了
给Oracle 11g Interval分区进行重命名
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Oracle
?11g 眾多新特性中,我最喜歡的就是分區(qū)表增強(qiáng),眾所周知很多大問題“化整為零”之后就不是個(gè)問題,分區(qū)表就是一種非常好用的“化整為零”的手段。
還是說回正題吧,使用Interval分區(qū)不難,為分區(qū)/子分區(qū)的重命名也不難,我的分區(qū)表大致定義如下:
| 1 | CREATE?TABLE?Partition_Table |
| 7 | PARTITION?BY?RANGE( MSGDATE ) INTERVAL( NUMTOYMINTERVAL(1,'MONTH') ) |
| 8 | SUBPARTITION?BY?LIST( DAY_V ) |
????? 分區(qū)和子分區(qū)的重命名語(yǔ)法如下:
| 1 | alter?table?<table_name> rename partition <partition_name>?to?<new_partition_name>; |
| 2 | alter?table?<table_name> rename subpartition <subpartition_name>?to?<new_subpartition_name>; |
????? 每當(dāng)新數(shù)據(jù)觸發(fā)新建分區(qū)后,分區(qū)名字是系統(tǒng)給的,雖然不影響分區(qū)表的使用,但是看著很讓人迷茫:
| 6 | from?user_tab_subpartitions? |
| 7 | where?subpartition_name?like?'SYS%'?; |
| 01 | TABLE_NAME???????????????????? PARTITION_NAME? SUBPARTITION_NAME? TABLESPACE_NAME |
| 02 | ------------------------------ --------------- ------------------ ------------------------------ |
| 03 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP100??????? FIREWALL16 |
| 04 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP101??????? FIREWALL17 |
| 05 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP102??????? FIREWALL18 |
| 06 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP103??????? FIREWALL19 |
| 07 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP104??????? FIREWALL20 |
| 08 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP105??????? FIREWALL21 |
| 09 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP106??????? FIREWALL22 |
| 10 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP107??????? FIREWALL23 |
| 11 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP108??????? FIREWALL24 |
| 12 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP109??????? FIREWALL25 |
| 13 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP110??????? FIREWALL26 |
| 15 | TABLE_NAME???????????????????? PARTITION_NAME? SUBPARTITION_NAME? TABLESPACE_NAME |
| 16 | ------------------------------ --------------- ------------------ ------------------------------ |
| 17 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP111??????? FIREWALL27 |
| 18 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP112??????? FIREWALL28 |
| 19 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP113??????? FIREWALL29 |
| 20 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP114??????? FIREWALL30 |
| 21 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP115??????? FIREWALL31 |
| 22 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP85???????? FIREWALL01 |
| 23 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP86???????? FIREWALL02 |
| 24 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP87???????? FIREWALL03 |
| 25 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP88???????? FIREWALL04 |
| 26 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP89???????? FIREWALL05 |
| 27 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP90???????? FIREWALL06 |
| 29 | TABLE_NAME???????????????????? PARTITION_NAME? SUBPARTITION_NAME? TABLESPACE_NAME |
| 30 | ------------------------------ --------------- ------------------ ------------------------------ |
| 31 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP91???????? FIREWALL07 |
| 32 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP92???????? FIREWALL08 |
| 33 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP93???????? FIREWALL09 |
| 34 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP94???????? FIREWALL10 |
| 35 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP95???????? FIREWALL11 |
| 36 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP96???????? FIREWALL12 |
| 37 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP97???????? FIREWALL13 |
| 38 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP98???????? FIREWALL14 |
| 39 | P_MYSYSLOG_IL_2010???????????? SYS_P116??????? SYS_SUBP99???????? FIREWALL15 |
????? 將分區(qū)/子分區(qū)的名字改成得有意義才是王道。以下是用一個(gè)過程配合游標(biāo)來改分區(qū)名,重點(diǎn)是是從high_value字段獲得該分區(qū)的范圍描述,其他沒什么了:
| 03 | ?v_table_name user_tab_partitions.table_name%type; |
| 04 | ?v_partition_name user_tab_partitions.partition_name%type; |
| 05 | ?v_high_value?varchar(200); |
| 06 | ?v_tmp_partition_name user_tab_partitions.partition_name%type; |
| 10 | ??????partition_name , |
| 12 | ????from?user_tab_partitions? |
| 13 | ????where?partition_name?like?'SYS%'?; |
| 17 | ????fetch?cur?into?v_table_name,v_partition_name,v_high_value; |
| 18 | ????exit?when?cur%notfound; |
| 19 | ????v_tmp_partition_name := substr(v_high_value,11,10); |
| 20 | ????v_tmp_partition_name := to_char( to_date(v_tmp_partition_name,'yyyy-mm-dd')-1 ,?'yyyymm'); |
| 21 | ????v_sql :=?'alter table '||v_table_name||' rename partition ' |
| 22 | ??????||v_partition_name |
| 23 | ??????||' to P'||v_tmp_partition_name; |
| 24 | ????dbms_output.put_line( v_sql ); |
| 25 | ????execute?immediate v_sql; |
????? 由于改分區(qū)名屬于DDL語(yǔ)句,對(duì)于忙碌的系統(tǒng)來說很容易遇到ORA-00054這個(gè)錯(cuò)誤:
| 1 | ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired |
????? Oracle 11g 同時(shí)也引入了一個(gè)新特性——DDL Wait ,以前遇到這種情況要不就是找出那個(gè)該死的Transaction kill掉,要不就雇個(gè)人拼命堅(jiān)持不懈地敲鍵盤跑這條DDL,直到成功執(zhí)行,現(xiàn)在好了,這個(gè)人可以下崗了。只要設(shè)定ddl_lock_timeout這個(gè)參數(shù)就可以了,這個(gè)參數(shù)可以在實(shí)例級(jí)別和會(huì)話級(jí)別上設(shè)置,如果該值為0,遇到未提交事務(wù)時(shí)就會(huì)馬上報(bào)ORA-00054,如果設(shè)定為10,DDL語(yǔ)句會(huì)為這個(gè)事務(wù)最多等10秒,10秒內(nèi)事務(wù)提交,DDL語(yǔ)句就會(huì)執(zhí)行成功,否則10秒后再報(bào)ORA-00054。
總結(jié)
以上是生活随笔為你收集整理的给Oracle 11g Interval分区进行重命名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。