9i分割槽表自動管理實現方法之一
需求cmd_sent,track保留最近三個月資料
當前天為2005年3月5日為例
分析:
1 2005年3月20日匯出2004.12分割槽資料
2 2005年3月21日增加2005.5分割槽
exec add_partition_procedure(2);
3 2005年3月20日刪除2004.12分割槽資料
exec drop_partition_procedure(3);
1 備份原有分割槽資料
[oracle@gpsbeta admin]$ cat cmd_sent_bk_by_partition.sh
#!/bin/sh
export ORACLE_HOME=/home/oracle/OraHome1
export ORACLE_SID=orcl
export NLS_LANG=american_america.ZHS16GBK
dateStr=`/bin/date +%Y%m`
dateAgo=`date --date='3 months ago' +%Y%m`
tabWithPar='CMD_SENT'$dateAgo
dmpLocation='/home/oracle/liyong/partitionMgr/cmd_sent/'$tabWithPar
$ORACLE_HOME/bin/exp sm2bk/sm2bk tables=cmd_sent:$tabWithPar file=$dmpLocation.dmp log=$dmpLocation.log rows=y FEEDBACK=10000 buffer=100000000 STATISTICS=NONE
[oracle@gpsbeta admin]$
[oracle@gpsbeta admin]$ cat track_bk_by_partition.sh
#!/bin/sh
export ORACLE_HOME=/home/oracle/OraHome1
export ORACLE_SID=orcl
export NLS_LANG=american_america.ZHS16GBK
dateStr=`/bin/date +%Y%m`
dateAgo=`date --date='3 months ago' +%Y%m`
tabWithPar='TRACK'$dateAgo
dmpLocation='/home/oracle/liyong/partitionMgr/track/'$tabWithPar
$ORACLE_HOME/bin/exp sm2bk/sm2bk tables=track:$tabWithPar file=$dmpLocation.dmp log=$dmpLocation.log rows=y FEEDBACK=10000 buffer=100000000 STATISTICS=NONE
[oracle@gpsbeta admin]$
2 刪除老分割槽過程
實現功能:
今天:2005.3月份 假設設定v_month_no為3 表示為刪除2004年12月份分割槽
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/********************************
author: liyong
date : 2005-03-08
version: 1.0
功能: 刪除業務表分割槽
v_month_no: 2005.3 假設設定v_month_no為3
表示刪除2004.12分割槽
*********************************/
create or replace procedure drop_partition_procedure(v_month_no in number)
is
--刪除分割槽的年月形如200503
v_cmd_str varchar2(16);
v_track_str varchar2(16);
--刪除分割槽的ddl語句
v_ddl_str varchar2(4000);
begin
select 'cmd_sent'||to_char(add_months(sysdate,-v_month_no),'YYYYMM') into v_cmd_str from dual;
select 'track'||to_char(add_months(sysdate,-v_month_no),'YYYYMM') into v_track_str from dual;
--開始刪除分割槽
v_ddl_str := 'alter table cmd_sent drop partition '||v_cmd_str;
execute immediate v_ddl_str;
v_ddl_str := 'alter table track drop partition '||v_track_str;
execute immediate v_ddl_str;
end;
3 建立新分割槽過程
實現功能:
今天:2005.3 假設設定v_month_no為2 表示新增2005.5分割槽
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/********************************
author: liyong
date : 2005-03-08
version: 1.0
功能: 為業務表新增分割槽
v_month_no: 2005.3 假設設定v_month_no為2
表示新增2005.5分割槽
*********************************/
create or replace procedure add_partition_procedure(v_month_no in number)
is
v_cmd_str varchar2(16);
v_track_str varchar2(16);
v_ddl_str varchar2(4000);
v_utc varchar2(11);
begin
select 'cmd_sent'||to_char(add_months(sysdate,v_month_no),'YYYYMM') into v_cmd_str from dual;
select 'track'||to_char(add_months(sysdate,v_month_no),'YYYYMM') into v_track_str from dual;
--獲取新分割槽的utc
select smtools.date2utc(trunc(add_months(last_day(sysdate)+1,v_month_no))) into v_utc from dual;
--開始刪除分割槽
v_ddl_str := 'alter table cmd_sent add partition '||v_cmd_str||' values less than ( '||v_utc||' )';
execute immediate v_ddl_str;
v_ddl_str := 'alter table track add partition '||v_track_str||' values less than ( '||v_utc||' )';
execute immediate v_ddl_str;
end;
alter table cmd_sent add partition CMD_SENT200508 values less than (1125504000);
4 系統級呼叫 建立新分割槽 刪除老分割槽
[oracle@stardb1 oas]$ cat /oas/liyong/scheduletask/add_partition_job.sh
#!/bin/sh
export ORACLE_BASE=/oas
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_SID=starmap
$ORACLE_HOME/bin/sqlplus -s sm2bk/sm2bk<spool add_partition_procedure.log
exec add_partition_procedure(2);
spool off
exit
!
[oracle@stardb1 oas]$ cat /oas/liyong/scheduletask/drop_partition_job.sh
#!/bin/sh
export ORACLE_BASE=/oas
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_SID=starmap
$ORACLE_HOME/bin/sqlplus -s sm2bk/sm2bk<spool drop_partition_procedure.log
exec drop_partition_procedure(3);
spool off
exit
!
設定crontab
[oracle@gpsbeta admin]$ pwd
/home/oracle/liyong/partitionMgr/admin
[oracle@gpsbeta admin]$ ls
add_partition_job.sh drop_partition_job.sh
cmd_sent_bk_by_partition.sh track_bk_by_partition.sh
每月10日12點10分左右執行
10 12 10 * * sh /home/oracle/liyong/partitionMgr/admin/cmd_sent_bk_by_partition.sh
20 12 10 * * sh /home/oracle/liyong/partitionMgr/admin/track_bk_by_partition.sh
30 12 10 * * sh /home/oracle/liyong/partitionMgr/admin/add_partition_job.sh
35 12 10 * * sh /home/oracle/liyong/partitionMgr/admin/drop_partition_job.sh
5 分割槽表維護過程
比如2005年1月份時,04年8月的業務資料就不會再用到
那麼我們可以將04年8月的歷史資料匯出.
首先倒出歷史分割槽cmd_sent200408
1>exp starmap_gd/starmap_gd tables=(cmd_sent:cmd_sent200408) file=cmd_sent0408 STATISTICS=none FEEDBACK=10000 buffer=100000000 log=exp_cmd_sent.log
2>資料庫級刪除歷史分割槽
SQL> show user
USER 為"STARMAP_GD"
SQL> alter table cmd_sent drop partition cmd_sent200408;
表已更改。
假設2005年年底計費,需要04年的資料
那麼首先要在資料庫級建立相應歷史分割槽
透過split一級一級的恢復到2004年8月
3> 資料庫級split 04年9月資料,產生cmd_sent200408分割槽
/********************************
新增新的分割槽cmd_sent200408
1093968000為2004-9-1的utc
********************************/
SQL> alter table cmd_sent
2 split partition cmd_sent200409 at (1093968000)
3 into (partition cmd_sent200408,partition cmd_sent200409);
表已更改。
4>倒入2004年8月曆史資料
imp starmap_gd/starmap_gd tables=(cmd_sent:cmd_sent200408) file=cmd_sent0408 ignore=y indexes=n log=imp_cmd_sent.log
這樣2004年8月的歷史資料已經倒入
SQL> set autotrace on
SQL> select count(*) from cmd_sent partition(cmd_sent200408);
COUNT(*)
----------
6460
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'CMD_SENT_TU_ID_IDX' (NON-UNIQ
UE) (Cost=4 Card=6460)
5 分析表cmd_sent
analyze table cmd_sent estimate statistics sample 15 percent;
6 分割槽表相關資料字典檢視
1> 使用者分割槽表相關資訊
col TABLE_NAME for a20
col PARTITION_NAME for a20
col HIGH_VALUE for a15
select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,NUM_ROWS
from USER_TAB_PARTITIONS
order by TABLE_NAME,PARTITION_NAME;
7 注意
alter user sm23 QUOTA UNLIMITED ON business;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/76065/viewspace-823744/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實現MySQL表結構自動分割槽指令碼MySql指令碼
- Oracle Interval Partition 自動分割槽表-實驗Oracle
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle
- Mysql表分割槽實現MySql
- 分割槽表學習之一
- 自動備份、截斷分割槽表分割槽資料
- 【實驗】【PARTITION】RANGE分割槽表移動表分割槽(Move Partition)
- postgresql分割槽表實現方式SQL
- rebuild分割槽表分割槽索引的方法Rebuild索引
- MySQL表分割槽管理MySql
- ORACLE分割槽表管理Oracle
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- 海量資料處理_表分割槽(分割槽自動維護與歷史分割槽歸檔)
- HGDB的分割槽表實現SQL Server的分割槽檢視SQLServer
- PostgreSQL使用表繼承實現分割槽表SQL繼承
- ORACLE分割槽表管理[轉]Oracle
- Oracle分割槽表的管理Oracle
- 【翻譯】分割槽表和索引(9i)(一)索引
- 【學習筆記】分割槽表和分割槽索引——管理索引分割槽(四)筆記索引
- 分割槽表-實戰
- 全面學習分割槽表及分割槽索引(17)--其它索引分割槽管理操作索引
- 【實驗】【PARTITION】RANGE分割槽表合併分割槽
- 【實驗】【PARTITION】RANGE分割槽表增加分割槽
- 【實驗】【PARTITION】RANGE分割槽表刪除分割槽
- 【實驗】【PARTITION】RANGE分割槽表截斷表分割槽(Truncate Partition)
- oracle分割槽表和分割槽表exchangeOracle
- Oracle的使用者表自動增加分割槽Oracle
- Mysql表分割槽實操MySql
- 全面學習分割槽表及分割槽索引(7)--怎樣管理索引
- ORACLE分割槽表的使用和管理Oracle
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- oracle分割槽表和非分割槽表exchangeOracle
- 普通表自動轉化為按月分割槽表的指令碼指令碼
- 全面學習分割槽表及分割槽索引(7)--怎樣管理(續)索引
- Oracle分割槽表及分割槽索引Oracle索引
- INTERVAL分割槽表鎖分割槽操作
- (3) MySQL分割槽表使用方法MySql
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引