oracle 12c中自增分区表 自动调整缓存分区的存储过程
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,最近为了使用12c的强大的inmemory功能,新做了一个OGG从11gR2 RAC到12c的数据同步,分担主库的olap业务其中有几张分区表,按月分区自增,只缓存半年的数据,这样每个月的1号就需要缓
千家信息网最后更新 2025年11月10日oracle 12c中自增分区表 自动调整缓存分区的存储过程最近为了使用12c的强大的inmemory功能,新做了一个OGG从11gR2 RAC到12c的数据同步,分担主库的olap业务
其中有几张分区表,按月分区自增,只缓存半年的数据,这样每个月的1号就需要缓存新一个月的分区进去,同时需要移除6个月前的分区,所以写了个过程,做个简单记录
刚接触PLSQL,游标什么的也刚接触,只是自己做个简单记录
代码运行结果示例:
SQL> exec partition_cache
表名:TABLE1 需缓存分区名称:SYS_P1167 分区最大值:2018-07
SQL: ALTER TABLE CCPS.TABLE1 MODIFY PARTITION SYS_P1167 INMEMORY PRIORITY CRITICAL
表名:TABLE1 需移除分区名称:SYS_P388 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE1 MODIFY PARTITION SYS_P388 NO INMEMORY
*******************************************
表名:TABLE2 需移除分区名称:SYS_P588 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE2 MODIFY PARTITION SYS_P588 NO INMEMORY
*******************************************
表名:TABLE3 需缓存分区名称:SYS_P1168 分区最大值:2018-07
SQL: ALTER TABLE CCPS.TABLE3 MODIFY PARTITION SYS_P1168 INMEMORY PRIORITY CRITICAL
表名:TABLE3 需移除分区名称:SYS_P328 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE3 MODIFY PARTITION SYS_P328 NO INMEMORY
*******************************************
表名:TABLE4 需移除分区名称:SYS_P368 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE4 MODIFY PARTITION SYS_P368 NO INMEMORY
*******************************************
表名:TABLE5 需缓存分区名称:SYS_P1166 分区最大值:2018-07
SQL: ALTER TABLE CCPS.TABLE5 MODIFY PARTITION SYS_P1166 INMEMORY PRIORITY CRITICAL
表名:TABLE5 需移除分区名称:SYS_P428 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE5 MODIFY PARTITION SYS_P428 NO INMEMORY
*******************************************
PL/SQL procedure successfully completed
其中有几张分区表,按月分区自增,只缓存半年的数据,这样每个月的1号就需要缓存新一个月的分区进去,同时需要移除6个月前的分区,所以写了个过程,做个简单记录
点击(此处)折叠或打开
- CREATE OR REPLACE PROCEDURE PARTITION_CACHE
- IS
- TYPE REF_CURSOR_TYPE IS REF CURSOR;
- C1 REF_CURSOR_TYPE; --动态游标,用来循环处理需要缓存的5张表
- V_HIGHVALUE DBA_TAB_PARTITIONS.HIGH_VALUE%TYPE; --自增分区因为分区名不确定,需要根据分区的最大值来获取分区名
- V_PARTNAME DBA_TAB_PARTITIONS.PARTITION_NAME%TYPE; --分区名
- V_HIGHMONTH NVARCHAR2(10); --最大分区值截取成月份格式
- V_CURRMONTH NVARCHAR2(10); --当前月
- V_OLDMONTH NVARCHAR2(10); --6个月前的月份
- V_SQL1 NVARCHAR2(1000); --移除旧分区的sql
- V_SQL2 NVARCHAR2(1000); --缓存新分区的sql
- V_SQL VARCHAR2(1000); --获取分区名和分区最大值的sql
- BEGIN
- V_CURRMONTH := TO_CHAR(ADD_MONTHS(SYSDATE,1),'YYYY-MM');
- V_OLDMONTH := TO_CHAR(ADD_MONTHS(SYSDATE,-6),'YYYY-MM');
- DECLARE CURSOR C2 IS SELECT * FROM DBA_TABLES WHERE TABLE_NAME IN ('TABLE1','TABLE2','TABLE3','TABLE4','TABLE5') ORDER BY TABLE_NAME;
- BEGIN
- FOR TABNAME IN C2 --循环操作5张表
- LOOP
- V_SQL := 'SELECT HIGH_VALUE,PARTITION_NAME FROM DBA_TAB_PARTITIONS WHERE TABLE_NAME = '''|| TABNAME.TABLE_NAME||''' ORDER BY PARTITION_POSITION DESC';
- OPEN C1 FOR V_SQL;
- FETCH C1 INTO V_HIGHVALUE,V_PARTNAME;
- WHILE (C1%FOUND) LOOP
- V_HIGHMONTH := SUBSTR(V_HIGHVALUE,12,7);
- IF (V_HIGHMONTH = V_OLDMONTH) THEN
- DBMS_OUTPUT.PUT_LINE('表名:'||TABNAME.TABLE_NAME||' 需移除分区名称:'||V_PARTNAME||' 分区最大值:'||V_OLDMONTH);
- V_SQL1 := 'ALTER TABLE CCPS.'||TABNAME.TABLE_NAME||' MODIFY PARTITION '||V_PARTNAME||' NO INMEMORY';
- DBMS_OUTPUT.PUT_LINE('SQL: '||V_SQL1);
- ELSIF (V_HIGHMONTH = V_CURRMONTH) THEN
- DBMS_OUTPUT.PUT_LINE('表名:'||TABNAME.TABLE_NAME||' 需缓存分区名称:'||V_PARTNAME||' 分区最大值:'||V_HIGHMONTH);
- V_SQL2 := 'ALTER TABLE CCPS.'||TABNAME.TABLE_NAME||' MODIFY PARTITION '||V_PARTNAME||' INMEMORY PRIORITY CRITICAL';
- DBMS_OUTPUT.PUT_LINE('SQL: '||V_SQL2);
- END IF;
- FETCH C1 INTO V_HIGHVALUE,V_PARTNAME;
- END LOOP;
- CLOSE C1;
- DBMS_OUTPUT.PUT_LINE(' ');
- DBMS_OUTPUT.PUT_LINE('*******************************************');
- END LOOP;
- END;
- END;
刚接触PLSQL,游标什么的也刚接触,只是自己做个简单记录
代码运行结果示例:
SQL> exec partition_cache
表名:TABLE1 需缓存分区名称:SYS_P1167 分区最大值:2018-07
SQL: ALTER TABLE CCPS.TABLE1 MODIFY PARTITION SYS_P1167 INMEMORY PRIORITY CRITICAL
表名:TABLE1 需移除分区名称:SYS_P388 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE1 MODIFY PARTITION SYS_P388 NO INMEMORY
*******************************************
表名:TABLE2 需移除分区名称:SYS_P588 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE2 MODIFY PARTITION SYS_P588 NO INMEMORY
*******************************************
表名:TABLE3 需缓存分区名称:SYS_P1168 分区最大值:2018-07
SQL: ALTER TABLE CCPS.TABLE3 MODIFY PARTITION SYS_P1168 INMEMORY PRIORITY CRITICAL
表名:TABLE3 需移除分区名称:SYS_P328 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE3 MODIFY PARTITION SYS_P328 NO INMEMORY
*******************************************
表名:TABLE4 需移除分区名称:SYS_P368 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE4 MODIFY PARTITION SYS_P368 NO INMEMORY
*******************************************
表名:TABLE5 需缓存分区名称:SYS_P1166 分区最大值:2018-07
SQL: ALTER TABLE CCPS.TABLE5 MODIFY PARTITION SYS_P1166 INMEMORY PRIORITY CRITICAL
表名:TABLE5 需移除分区名称:SYS_P428 分区最大值:2017-12
SQL: ALTER TABLE CCPS.TABLE5 MODIFY PARTITION SYS_P428 NO INMEMORY
*******************************************
PL/SQL procedure successfully completed
最大
最大值
名称
缓存
只是
数据
月份
游标
循环
接触
过程
分区表
强大
业务
代码
功能
动态
半年
同时
格式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
三丰云服务器python
北京远程新华网络技术
连接数据库没密码java
退出数据库操作
制度对网络安全
信誉可靠的零信任网络安全
顺丰软件开发实习
软件开发文档包含哪档
无棣软件开发初级教程
mysql数据库连接假死
思科网络技术实验1答案
软件开发开发中的规范
选择题的数据库表设计
小学生网络安全教育可信吗
后台不显示服务器怎么回事
主播的服务器都是什么
互联网软件开发过程中的角色
网易我的世界练习跑酷的服务器
魔兽9.1服务器人数统计
服务器里面4个硬盘的作用
view证书服务器
蜀门手游服务器都一样吗
数据库 比对
浙江服务器电源什么牌子好
上海品质网络技术诚信合作
合肥工业学校网络安全实训
英泰移动教育系统数据库设计
磊科nw762改打印服务器
学完数据库运营的心得
网站镜像服务器