久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

數據庫中間隔分區表的刪除邏輯

153次閱讀
沒有評論

共計 6767 個字符,預計需要花費 17 分鐘才能閱讀完成。

這篇文章主要介紹了數據庫中間隔分區表的刪除邏輯,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

主要討論如下:
1. 間隔分區表的刪除邏輯
2. 如何處理 ORA-14758 報錯

創建間隔分區
create table t_interval
(
  a DATE,
  b int,
  c int
  )
PARTITION BY RANGE (a)
  INTERVAL (numtodsinterval(3, day))
  (
  PARTITION P1 VALUES LESS THAN (TO_DATE( 2018-1-2 , YYYY-MM-DD))
  );
insert into t_interval values(TO_DATE( 2018-01-01 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-02 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-05 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-08 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-11 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-14 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
commit;

09:45:19 SQL   select PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,INTERVAL from dba_tab_partitions where table_name= T_INTERVAL

PARTITION_NAME  HIGH_VALUE  PARTITION_POSITION INTERVAL
——————– ——————————————————————————– —————— ———
P1  TO_DATE(2018-01-02 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  1 NO
SYS_P2876  TO_DATE(2018-01-05 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  2 YES
SYS_P2877  TO_DATE(2018-01-08 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  3 YES
SYS_P2878  TO_DATE(2018-01-11 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  4 YES
SYS_P2879  TO_DATE(2018-01-14 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  5 YES
SYS_P2880  TO_DATE(2018-01-17 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  6 YES

6 rows selected.
interval 列指示分區是否是間隔分區。創建表時指定的分區不屬于間隔分區范疇。

更改表的分區間隔
alter table t_interval set interval(NUMTODSINTERVAL(2, day
09:46:57 SQL select PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,INTERVAL from dba_tab_partitions where table_name= T_INTERVAL

PARTITION_NAME  HIGH_VALUE  PARTITION_POSITION INTERVAL
——————– ——————————————————————————– —————— ———
P1  TO_DATE(2018-01-02 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  1 NO
SYS_P2876  TO_DATE(2018-01-05 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  2 NO
SYS_P2877  TO_DATE(2018-01-08 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  3 NO
SYS_P2878  TO_DATE(2018-01-11 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  4 NO
SYS_P2879  TO_DATE(2018-01-14 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  5 NO
SYS_P2880  TO_DATE(2018-01-17 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  6 NO

6 rows selected.

Elapsed: 00:00:00.00
分區間隔更改之后,interval 列都變成了 NO。

插入數據產生新分區
insert into t_interval values(TO_DATE( 2018-01-18 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-20 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-22 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-24 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-01-26 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
commit;
09:48:55 SQL select PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,INTERVAL from dba_tab_partitions where table_name= T_INTERVAL

PARTITION_NAME  HIGH_VALUE  PARTITION_POSITION INTERVAL
——————– ——————————————————————————– —————— ———
P1  TO_DATE(2018-01-02 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  1 NO
SYS_P2876  TO_DATE(2018-01-05 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  2 NO
SYS_P2877  TO_DATE(2018-01-08 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  3 NO
SYS_P2878  TO_DATE(2018-01-11 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  4 NO
SYS_P2879  TO_DATE(2018-01-14 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  5 NO
SYS_P2880  TO_DATE(2018-01-17 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  6 NO
SYS_P2881  TO_DATE(2018-01-19 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  7 YES
SYS_P2882  TO_DATE(2018-01-21 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  8 YES
SYS_P2883  TO_DATE(2018-01-23 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  9 YES
SYS_P2884  TO_DATE(2018-01-25 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  10 YES
SYS_P2885  TO_DATE(2018-01-27 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGORIA  11 YES

11 rows selected.
新生成的分區屬于間隔分區。

嘗試刪除分區
09:49:26 SQL alter table t_interval drop partition SYS_P2880;
alter table t_interval drop partition SYS_P2880
  *
ERROR at line 1:
ORA-14758: Last partition in the range section cannot be dropped
經過多次嘗試之后發現,發現無法刪除間隔分區最后一個為 NO 的分區。

如果一定要刪除最后一個為 NO 的分區的話,那么需要把分區表 dba_tab_partitions 的 interval 列都變為 NO。
方法很簡單,就是指定 interval 屬性為當前值,再執行一遍:
alter table t_interval set interval(NUMTODSINTERVAL(1, day
然后刪除
09:55:32 SQL alter table t_interval drop partition SYS_P2880;

Table altered.

Elapsed: 00:00:00.01
再插入數據產生新的間隔分區
insert into t_interval values(TO_DATE( 2018-02-01 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-02-02 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
insert into t_interval values(TO_DATE( 2018-02-03 10:00:00 , YYYY-MM-DD HH24:MI:SS),1,1);
commit;

抓取表的 ddl

set pagesize 0
set long 90000
select dbms_metadata.get_ddl(TABLE , T_INTERVAL , MING) from dual;
10:35:19 SQL select dbms_metadata.get_ddl(TABLE , T_INTERVAL , MING) from dual;

 

  CREATE TABLE MING . T_INTERVAL
  (  A DATE,
  B NUMBER(*,0),
  C NUMBER(*,0)
  ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CAC
HE DEFAULT)
  TABLESPACE TBS_MING
  PARTITION BY RANGE (A) INTERVAL (NUMTODSINTERVAL(1, DAY))
 (PARTITION SYS_P2877   VALUES LESS THAN (TO_DATE( 20
18-01-08 00:00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_C
ALENDAR=GREGORIAN )) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS
2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE TBS_MING ,
 。。。省略。。。
 PARTITION SYS_P2890   VALUES LESS THAN (TO_DATE( 2018-01-30 00:
00:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREG
ORIAN )) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE
DEFAULT)
  TABLESPACE TBS_MING ,
 PARTITION SYS_P2891   VALUES LESS THAN (TO_DATE( 2018-01-31 00:00
:00 , SYYYY-MM-DD HH24:MI:SS , NLS_CALENDAR=GREGOR
IAN )) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DE
FAULT)
  TABLESPACE TBS_MING )

會發現間隔分區定義并沒有出現在表的 ddl 定義語句中。當表分區屬性 interval 變為 NO 后,分區被轉變成范圍分區,然后才會加入到表的 ddl 語句中。

1. 間隔分區 interval 為 NO 的最后一個分區無法刪除,都變為 NO 的時候,則可以刪除任意一個分區
2.alter table t_interval set interval 命令可以將 interval 屬性都變為 NO。
3. 間隔分區定義不出現在表的 ddl 語句中,interval 變為 NO 后,才會加入到表的 ddl 語句中。

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“數據庫中間隔分區表的刪除邏輯”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-24發表,共計6767字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 庆阳市| 维西| 德保县| 清新县| 偃师市| 泾源县| 溧阳市| 通山县| 西乡县| 奈曼旗| 山阴县| 河西区| 吴旗县| 九寨沟县| 双柏县| 清镇市| 庄河市| 玛多县| 东明县| 宜阳县| 镇宁| 山东省| 南投市| 安化县| 沙雅县| 西峡县| 青河县| 炎陵县| 普洱| 博客| 肥城市| 汤阴县| 永寿县| 河北省| 金乡县| 泸溪县| 盈江县| 荆门市| 夹江县| 罗甸县| 仪陇县|