给Oracle 11g Interval分区进行重命名
生活随笔
收集整理的這篇文章主要介紹了
给Oracle 11g Interval分区进行重命名
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Oracle
?11g 眾多新特性中,我最喜歡的就是分區表增強,眾所周知很多大問題“化整為零”之后就不是個問題,分區表就是一種非常好用的“化整為零”的手段。
還是說回正題吧,使用Interval分區不難,為分區/子分區的重命名也不難,我的分區表大致定義如下:
| 1 | CREATE?TABLE?Partition_Table |
| 2 | ( |
| 3 | ??.... |
| 4 | ??.... |
| 5 | ??.... |
| 6 | ) |
| 7 | PARTITION?BY?RANGE( MSGDATE ) INTERVAL( NUMTOYMINTERVAL(1,'MONTH') ) |
| 8 | SUBPARTITION?BY?LIST( DAY_V ) |
????? 分區和子分區的重命名語法如下:
| 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>; |
????? 每當新數據觸發新建分區后,分區名字是系統給的,雖然不影響分區表的使用,但是看著很讓人迷茫:
| 1 | select? |
| 2 | ??table_name , |
| 3 | ??partition_name, |
| 4 | ??subpartition_name , |
| 5 | ??tablespace_name |
| 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 |
| 14 | ?? |
| 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 |
| 28 | ?? |
| 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 |
????? 將分區/子分區的名字改成得有意義才是王道。以下是用一個過程配合游標來改分區名,重點是是從high_value字段獲得該分區的范圍描述,其他沒什么了:
| 01 | declare? |
| 02 | ?v_sql?varchar(400); |
| 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; |
| 07 | ?cursor?cur?is? |
| 08 | ???select? |
| 09 | ??????table_name , |
| 10 | ??????partition_name , |
| 11 | ??????high_value? |
| 12 | ????from?user_tab_partitions? |
| 13 | ????where?partition_name?like?'SYS%'?; |
| 14 | begin |
| 15 | ??open?cur; |
| 16 | ??loop |
| 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; |
| 26 | ??end?loop; |
| 27 | ??close?cur; |
| 28 | end; |
| 29 | / |
????? 由于改分區名屬于DDL語句,對于忙碌的系統來說很容易遇到ORA-00054這個錯誤:
| 1 | ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired |
????? Oracle 11g 同時也引入了一個新特性——DDL Wait ,以前遇到這種情況要不就是找出那個該死的Transaction kill掉,要不就雇個人拼命堅持不懈地敲鍵盤跑這條DDL,直到成功執行,現在好了,這個人可以下崗了。只要設定ddl_lock_timeout這個參數就可以了,這個參數可以在實例級別和會話級別上設置,如果該值為0,遇到未提交事務時就會馬上報ORA-00054,如果設定為10,DDL語句會為這個事務最多等10秒,10秒內事務提交,DDL語句就會執行成功,否則10秒后再報ORA-00054。
總結
以上是生活随笔為你收集整理的给Oracle 11g Interval分区进行重命名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 11g创建Interval
- 下一篇: AIX 系统中 PVID 的含义与作用