如何監控分割槽表邊界溢位
在資料倉儲環境中,分割槽表會非常多,尤其是範圍分割槽的表。為了確保業務不受影響,需要確保分割槽表的分割槽的邊界足夠大,以免匯入資料時會出錯。
為了避免出錯,很多人設定了maxvalue或者提早分配很多個分割槽,這些都是不好的習慣。
設定MAXVALUE可能會導致兩個問題:
1) 產生垃圾資料
2) 因為疏忽導致MAXVALUE的分割槽變得巨大,給後續的資料管理帶來麻煩
提早分配很多個分割槽也會導致一些問題:
1) 也可能會產生垃圾資料
2) 不是按需分配可能會導致後續的一系列問題,如因為資料量變化而修改分割槽方式等
更好的做法是隻提前分配少量的分割槽,並密切監控分割槽的擴充套件情況。那麼,如何監控分割槽是否會溢位邊界呢?我的做法是寫一段程式碼實時監控分割槽的邊界及當前時間的差異,如果邊界接近溢位,則告警。
這裡比較麻煩的是處理high_value,它是一個long型別的欄位,下面是我的做法。
[@more@]--適用場景:按時間作分割槽的表。分割槽欄位資料型別可以使DATE,也可以使VARCHAR2。如果分割槽欄位是VARCHAR2,則鍵值的格式為YYYY-MM-DD。
在我的資料倉儲環境中,有大量的這種分割槽表存在,且分割槽表都是嚴格按照標準的設定的,所以可以用以下程式碼監控。
-- CREATE TEMPORATY TABLE
CREATE GLOBAL TEMPORARY TABLE TEMP_PARTITION_MONITOR
(OWNER VARCHAR2(32),TABLE_NAME VARCHAR2(32),PARTITION_NAME VARCHAR2(32),DATA_TYPE VARCHAR2(20),HIGH_VALUE VARCHAR2(128))
ON COMMIT PRESERVE ROWS;
CREATE OR REPLACE PROCEDURE P_MONITOR_PARTITION(P_PRE_DAYS NUMBER DEFAULT 7) IS
L_CNT INT;
L_BEHIND_DAYS INT := 90;
BEGIN
/*
P_PRE_DAYS: 設定提前多少天預警
*/
FOR C IN (SELECT A.*, K.OWNER, K.NAME, K.COLUMN_NAME, TC.DATA_TYPE
FROM (SELECT TABLE_NAME, PARTITION_NAME, PARTITION_POSITION, HIGH_VALUE
FROM (SELECT /*+ rule */
T1.TABLE_NAME, T1.PARTITION_NAME, PARTITION_POSITION, HIGH_VALUE, ROW_NUMBER() OVER(PARTITION BY T1.TABLE_OWNER, T1.TABLE_NAME ORDER BY PARTITION_POSITION DESC) RN
FROM DBA_TAB_PARTITIONS T1, DBA_PART_TABLES T2
WHERE T1.TABLE_OWNER = 'OWNER' AND
T1.TABLE_OWNER = T2.OWNER AND
T1.TABLE_NAME = T2.TABLE_NAME AND
T2.PARTITIONING_TYPE = 'RANGE')
WHERE RN = 1) A, DBA_PART_KEY_COLUMNS K, DBA_TAB_COLUMNS TC
WHERE K.OWNER = 'OWNER' AND K.NAME = A.TABLE_NAME AND
K.COLUMN_POSITION = 1 AND K.OBJECT_TYPE = 'TABLE' AND
K.OWNER = TC.OWNER AND K.NAME = TC.TABLE_NAME AND
K.COLUMN_NAME = TC.COLUMN_NAME AND
TC.DATA_TYPE NOT IN ('NUMBER')) LOOP
--我關心的資訊比較多,所以SQL會比較長
INSERT INTO TEMP_PARTITION_MONITOR
VALUES
(C.OWNER, C.TABLE_NAME, C.PARTITION_NAME, C.DATA_TYPE, REPLACE(REPLACE(C.HIGH_VALUE, '''', ''), ' ', ''));
END LOOP;
SELECT COUNT(1)
INTO L_CNT
FROM TEMP_PARTITION_MONITOR T
WHERE (DATA_TYPE IN ('DATE') OR DATA_TYPE LIKE '%CHAR%') AND
HIGH_VALUE <> 'MAXVALUE' AND CASE WHEN
DATA_TYPE LIKE '%CHAR%' THEN HIGH_VALUE ELSE SUBSTR(HIGH_VALUE, INSTR(HIGH_VALUE, '(') + 1, INSTR(HIGH_VALUE, ',') - INSTR(HIGH_VALUE, '(') - 9) END > TO_CHAR(SYSDATE - L_BEHIND_DAYS, 'YYYY-MM-DD') AND CASE WHEN DATA_TYPE LIKE '%CHAR%' THEN HIGH_VALUE ELSE SUBSTR(HIGH_VALUE, INSTR(HIGH_VALUE, '(') + 1, INSTR(HIGH_VALUE, ',') - INSTR(HIGH_VALUE, '(') - 9) END < TO_CHAR(SYSDATE + P_PRE_DAYS, 'YYYY-MM-DD');
IF L_CNT > 0 THEN
DBMS_OUTPUT.PUT_LINE(L_CNT || ' tables will run out of range in ' ||
P_PRE_DAYS || ' days');
--可以在這裡新增傳送郵件或者簡訊的程式碼,自動告警
END IF;
END P_MONITOR_PARTITION;
提交一個定時任務,讓它定期執行就可以實現分割槽邊界溢位的自動化監控了。
為了避免出錯,很多人設定了maxvalue或者提早分配很多個分割槽,這些都是不好的習慣。
設定MAXVALUE可能會導致兩個問題:
1) 產生垃圾資料
2) 因為疏忽導致MAXVALUE的分割槽變得巨大,給後續的資料管理帶來麻煩
提早分配很多個分割槽也會導致一些問題:
1) 也可能會產生垃圾資料
2) 不是按需分配可能會導致後續的一系列問題,如因為資料量變化而修改分割槽方式等
更好的做法是隻提前分配少量的分割槽,並密切監控分割槽的擴充套件情況。那麼,如何監控分割槽是否會溢位邊界呢?我的做法是寫一段程式碼實時監控分割槽的邊界及當前時間的差異,如果邊界接近溢位,則告警。
這裡比較麻煩的是處理high_value,它是一個long型別的欄位,下面是我的做法。
[@more@]--適用場景:按時間作分割槽的表。分割槽欄位資料型別可以使DATE,也可以使VARCHAR2。如果分割槽欄位是VARCHAR2,則鍵值的格式為YYYY-MM-DD。
在我的資料倉儲環境中,有大量的這種分割槽表存在,且分割槽表都是嚴格按照標準的設定的,所以可以用以下程式碼監控。
-- CREATE TEMPORATY TABLE
CREATE GLOBAL TEMPORARY TABLE TEMP_PARTITION_MONITOR
(OWNER VARCHAR2(32),TABLE_NAME VARCHAR2(32),PARTITION_NAME VARCHAR2(32),DATA_TYPE VARCHAR2(20),HIGH_VALUE VARCHAR2(128))
ON COMMIT PRESERVE ROWS;
CREATE OR REPLACE PROCEDURE P_MONITOR_PARTITION(P_PRE_DAYS NUMBER DEFAULT 7) IS
L_CNT INT;
L_BEHIND_DAYS INT := 90;
BEGIN
/*
P_PRE_DAYS: 設定提前多少天預警
*/
FOR C IN (SELECT A.*, K.OWNER, K.NAME, K.COLUMN_NAME, TC.DATA_TYPE
FROM (SELECT TABLE_NAME, PARTITION_NAME, PARTITION_POSITION, HIGH_VALUE
FROM (SELECT /*+ rule */
T1.TABLE_NAME, T1.PARTITION_NAME, PARTITION_POSITION, HIGH_VALUE, ROW_NUMBER() OVER(PARTITION BY T1.TABLE_OWNER, T1.TABLE_NAME ORDER BY PARTITION_POSITION DESC) RN
FROM DBA_TAB_PARTITIONS T1, DBA_PART_TABLES T2
WHERE T1.TABLE_OWNER = 'OWNER' AND
T1.TABLE_OWNER = T2.OWNER AND
T1.TABLE_NAME = T2.TABLE_NAME AND
T2.PARTITIONING_TYPE = 'RANGE')
WHERE RN = 1) A, DBA_PART_KEY_COLUMNS K, DBA_TAB_COLUMNS TC
WHERE K.OWNER = 'OWNER' AND K.NAME = A.TABLE_NAME AND
K.COLUMN_POSITION = 1 AND K.OBJECT_TYPE = 'TABLE' AND
K.OWNER = TC.OWNER AND K.NAME = TC.TABLE_NAME AND
K.COLUMN_NAME = TC.COLUMN_NAME AND
TC.DATA_TYPE NOT IN ('NUMBER')) LOOP
--我關心的資訊比較多,所以SQL會比較長
INSERT INTO TEMP_PARTITION_MONITOR
VALUES
(C.OWNER, C.TABLE_NAME, C.PARTITION_NAME, C.DATA_TYPE, REPLACE(REPLACE(C.HIGH_VALUE, '''', ''), ' ', ''));
END LOOP;
SELECT COUNT(1)
INTO L_CNT
FROM TEMP_PARTITION_MONITOR T
WHERE (DATA_TYPE IN ('DATE') OR DATA_TYPE LIKE '%CHAR%') AND
HIGH_VALUE <> 'MAXVALUE' AND CASE WHEN
DATA_TYPE LIKE '%CHAR%' THEN HIGH_VALUE ELSE SUBSTR(HIGH_VALUE, INSTR(HIGH_VALUE, '(') + 1, INSTR(HIGH_VALUE, ',') - INSTR(HIGH_VALUE, '(') - 9) END > TO_CHAR(SYSDATE - L_BEHIND_DAYS, 'YYYY-MM-DD') AND CASE WHEN DATA_TYPE LIKE '%CHAR%' THEN HIGH_VALUE ELSE SUBSTR(HIGH_VALUE, INSTR(HIGH_VALUE, '(') + 1, INSTR(HIGH_VALUE, ',') - INSTR(HIGH_VALUE, '(') - 9) END < TO_CHAR(SYSDATE + P_PRE_DAYS, 'YYYY-MM-DD');
IF L_CNT > 0 THEN
DBMS_OUTPUT.PUT_LINE(L_CNT || ' tables will run out of range in ' ||
P_PRE_DAYS || ' days');
--可以在這裡新增傳送郵件或者簡訊的程式碼,自動告警
END IF;
END P_MONITOR_PARTITION;
提交一個定時任務,讓它定期執行就可以實現分割槽邊界溢位的自動化監控了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-1040594/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android 分割槽和記憶體監控Android記憶體
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- oracle分割槽表和分割槽表exchangeOracle
- oracle分割槽表和非分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- PG的非分割槽表線上轉分割槽表
- 教程:如何使用DataLakeAnalytics建立分割槽表
- 【MYSQL】 分割槽表MySql
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 移動分割槽表和分割槽索引的表空間索引
- SQL Server大分割槽表沒有空分割槽的情況下如何擴充套件分割槽的方法SQLServer套件
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- 如何使用Data Lake Analytics建立分割槽表
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- 分割槽表-實戰
- MySQL 分割槽表探索MySql
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- 【Linux】MBR磁碟分割槽表只能有四個分割槽?Linux
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- Linux中監控磁碟分割槽及使用情況的命令有哪些?Linux
- Linux中監控磁碟分割槽和使用情況的幾個工具Linux
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- 分割槽表之自動增加分割槽(11G)
- Mysql表分割槽實操MySql
- OceaBase 分割槽表建立技巧
- Mysql表分割槽實現MySql
- PostgreSQL:傳統分割槽表SQL
- PostgreSQL:內建分割槽表SQL
- SQL SERVER之分割槽表SQLServer
- ORACLE分割槽表梳理系列Oracle
- Spark操作Hive分割槽表SparkHive