海量資料處理_表分割槽(分割槽自動維護與歷史分割槽歸檔)
1,分割槽自動維護
CREATE OR REPLACE PACKAGE partition_managment IS
/*======================================================*/
/* 增加分割槽 */
/*======================================================*/
PROCEDURE add_partition(p_tab_name IN VARCHAR2);
/*======================================================*/
/* 刪除分割槽 */
/*======================================================*/
PROCEDURE drop_partition(p_tab_name IN VARCHAR2);
END partition_managment;
/
CREATE OR REPLACE PACKAGE BODY partition_managment IS
PROCEDURE log(p_comm IN VARCHAR2, p_type IN VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
/*INSERT INTO CLEAN_OUT_LOG
(WHEN, COMM, TYPE)
VALUES
(SYSDATE, P_COMM, P_TYPE);
COMMIT;
*/
dbms_output.put_line('info:' || p_comm || ' type:' || p_type);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line('ERROR IN partition_management.LOG');
END log;
/*======================================================*/
/* 增加分割槽,增加新的分割槽 */
/*======================================================*/
PROCEDURE add_partition(p_tab_name IN VARCHAR2) IS
l_ddl VARCHAR2(200);
l_partition_name VARCHAR2(200);
l_split_date VARCHAR2(8);
l_partition_num INT;
BEGIN
--get partition name
SELECT to_char(add_months(SYSDATE, 2), 'YYYYMM') || '01',
'P' || to_char(add_months(SYSDATE, 1), 'YYYYMM')
INTO l_split_date, l_partition_name
FROM dual;
--does it exist?
SELECT COUNT(*)
INTO l_partition_num
FROM user_tab_partitions
WHERE table_name = p_tab_name
AND partition_name = l_partition_name;
IF l_partition_num > 0 THEN
log('partition ' || l_partition_name || ' 已經存在,skip', 'I');
RETURN;
END IF;
--create
BEGIN
l_ddl := 'alter table ' || p_tab_name ||
' split partition pmax at (to_date(''' || l_split_date ||
''',''YYYYMMDD'')) into (' || ' partition ' ||
l_partition_name || ', partition pmax)';
log('add new partition,ddl:' || l_ddl, 'I');
EXECUTE IMMEDIATE l_ddl;
log('add new partition ok,ddl:' || l_ddl, 'I');
EXCEPTION
WHEN OTHERS THEN
log('Error when create a new partition:' ||
substr(dbms_utility.format_error_stack, 1, 900),
'E');
END;
END add_partition;
/*======================================================*/
/* 刪除分割槽,每呼叫一次,刪除最早的一個超過13個月的分割槽 */
/*======================================================*/
PROCEDURE drop_partition(p_tab_name IN VARCHAR2) IS
l_ddl VARCHAR2(200);
l_partition_name VARCHAR2(200);
BEGIN
--find the oldest partition
BEGIN
SELECT partition_name
INTO l_partition_name
FROM (SELECT *
FROM user_tab_partitions
WHERE table_name = p_tab_name
ORDER BY partition_name)
WHERE rownum < 2;
EXCEPTION
WHEN OTHERS THEN
log('No partition found for table:' || p_tab_name, 'W');
END;
--is older than 13 month?
BEGIN
IF (add_months(SYSDATE, -13) >
to_date(substr(l_partition_name, 2) || '01', 'YYYYMMDD')) THEN
l_ddl := 'alter table ' || p_tab_name || ' drop partition ' ||
l_partition_name;
log('drop partition,ddl:' || l_ddl, 'I');
EXECUTE IMMEDIATE l_ddl;
log('drop partition ok:' || l_ddl, 'I');
ELSE
log('最早的分割槽不需要刪除:' || l_partition_name, 'I');
END IF;
EXCEPTION
WHEN OTHERS THEN
log('Error when drop partition:' ||
substr(dbms_utility.format_error_stack, 1, 900),
'E');
END;
END drop_partition;
END partition_managment;
/
2,歷史分割槽歸檔:
--create directory:
create directory ext_local as '/local/TEST';
create directory ext_store as '/store/TEXT';
--grant privilege:
grant read,write on ext_local to test;
grant read,write on ext_store to test;
--create external table:
create table ext_200201
organization external(type oracle_dump
default directory ext_local location('ext_200201.dmp'))
as
select /*+ full(orderitem) */ * from orderitem
where shipdate >= to_date('20020101','YYYYMMDD')
and shipdate < to_date('20020201','YYYYMMDD');
--drop table
drop table ext_200201;
--cp
cp -p ext_200201.dmp /store/TEST/
--drop partition
alter table orderitem drop partition pt200201;
--restore
create table ext_200201_c(
...)
organization external(type oracle_dump
default directory ext_store location('ext_200201.dmp'));
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-696995/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql分割槽表佔用大量容量處理(最佳化)及歸檔分割槽表MySql
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- 分割槽表之自動增加分割槽(11G)
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- oracle分割槽表和分割槽表exchangeOracle
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- 分割槽表truncate慢處理
- oracle分割槽表和非分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- Hive的靜態分割槽與動態分割槽Hive
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- 移動分割槽表和分割槽索引的表空間索引
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- MySql資料分割槽操作之新增分割槽操作MySql
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- PG的非分割槽表線上轉分割槽表
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- Linux分割槽方案、分割槽建議Linux
- 【MYSQL】 分割槽表MySql
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 【Linux】MBR磁碟分割槽表只能有四個分割槽?Linux
- hive 動態分割槽插入資料表Hive
- Linux 分割槽擴容(根分割槽擴容,SWAP 分割槽擴容,掛載新分割槽為目錄)Linux
- 調整分割槽後分割槽不見的資料找到方法
- Oracle分割槽表基礎運維-07增加分割槽(4 RANGE_HASH)Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(5RANGE_LIST)Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(6RANGE_RANGE)Oracle運維
- MySQL 分割槽表探索MySql
- 分割槽表-實戰
- MySQL資料表分割槽手記MySql
- MySQL分表後原分割槽表處理方案MySql
- Hive中靜態分割槽和動態分割槽總結Hive
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別