oracle 定时清理表数据,关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题...
简介
数据库中的某些数据不一定要长期保存,例如:日志等数据、当保存一定时间后,系统允许删除所以系统需要定期删除那些已经过期的数据。
实现原理
1张表(SYS_DBA_CONFIG)、1个Job定时器(Job_DBA_AutoRunScript)和2个存储过程(DBA_AUTODELETE、DBA_AUTORUNSCRIPT)实现自动清理不同表中的过期数据。 通过定时器调用存储过程查表判断是否开启过期数据清理功能,如果开启调用数据清理的存储过程。
建表
建立数据库任务配置表,用来管理数据库中那些表需要定期处理。
表格类型
字段名
Type
非空
注解
NAME
VARCHAR2(200)
✔
任务执行对象名称
VALUE
VARCHAR2(200)
✔
设置保存时间(天)
TYPE
VARCHAR2(200)
✔
执行类型
ISRUN
NUMBER(1,0)
✔
是否执行
REMARK
VARCHAR2(200)
对应表中判断时间的字段
COLUMNTYPE
VARCHAR2(200)
字段类型
建表语法
create table SYS_DBA_CONFIG
(
NAME VARCHAR2(200) not null,
value VARCHAR2(200) not null,
type VARCHAR2(200) not null,
REMARK VARCHAR2(200) not null
ISRUN NUMBER(1) not null,
COLUMNTYPE VARCHAR2(200)
);
数据展示
表中的数据有两种:
存储过程是否启用
表格设置保存时间
创建存储过程
判断系统是否启动定期清除功能的存储过程
根据类型和是否启用查找删除数据的存储过程
CREATE OR REPLACE PROCEDURE xxx."DBA_AUTORUNSCRIPT" AS
/*******************************************************
功能:定期运行指定脚本V1.0
说明:SQL语句从配置表SYS_DBA_CONFIG读取
********************************************************/
v_Name VARCHAR2(500); --Sql语句变量
v_Value VARCHAR2(250); --Sql语句变量
CURSOR CS IS SELECT UPPER(Name),VALUE FROM SYS_DBA_CONFIG WHERE LOWER(TYPE)='auto_run_script' AND ISRUN = 1;
BEGIN
OPEN CS;
LOOP
FETCH CS INTO v_Name, v_Value;--获得当前记录的数据
EXIT WHEN CS%NOTFOUND;
dbms_output.put_line('执行脚本('||v_Name||'):'||v_Value);
EXECUTE IMMEDIATE ('BEGIN '||v_Name||'; COMMIT; END;');
END LOOP;
END DBA_AutoRunScript;
执行删除过期数据的存储过程
根据对应的表中的对应字段和当前时间比较,如果时间大于对应的保存时间天数,删除数据。
CREATE OR REPLACE PROCEDURE xxx."DBA_AUTODELETE" AS
/*******************************************************
功能:根据保留天数删除数据V1.0
说明:表名称、保存天数从配置表SYS_DBA_CONFIG读取
********************************************************/
v_name varchar2(250); --对应的表名
v_remark varchar2(250); --对应的表字段
v_value number(10); --表对应的表数据天数
v_endTime date; --清除的具体时间
v_sql varchar2(250);
v_columntype varchar2(20);
CURSOR CS IS SELECT Name,VALUE,remark,columntype FROM SYS_DBA_CONFIG WHERE LOWER(TYPE)='auto_delete_table' AND ISRUN=1;
BEGIN
OPEN CS;
LOOP
FETCH CS INTO v_name, v_value,v_remark,v_columntype;--获得当前记录的数据
EXIT WHEN CS%NOTFOUND;
dbms_output.put_line('删除的表名:' || v_name||' 保留天数:'||v_value);
v_endTime:=TRUNC(SYSDATE- v_value);
if v_columntype='DATE' then
v_sql := 'delete from ' || v_name||' where '|| v_remark||' < TRUNC(SYSDATE- '||v_value||')' ;
dbms_output.put_line('删除的sql:' || v_sql);
else
v_sql := 'delete from ' || v_name||' where to_date('||v_remark||',''yyyy-mm-dd hh24:mi:ss'') < TRUNC(SYSDATE- '||v_value||')';
dbms_output.put_line('删除的sql:' || v_sql);
end if;
begin
execute immediate v_sql;
end;
END LOOP;
END DBA_AutoDelete;
创建Jobs定时器
通过定时器启动判断系统是否启动定期清除功能的存储过程,然后存储过程再调用删除数据的存储过程完成数据清除。
begin
dbms_scheduler.create_job
(
job_name => 'Job_DBA_AutoRunScript',
job_type => 'PLSQL_BLOCK',
job_action => 'begin DBA_AutoRunScript; end;',
repeat_interval => 'FREQ=DAILY;BYHOUR=3;byminute=30',
enabled => true
);
end;
总结
后端可以只通过维护SYS_DBA_CONFIG表来维护数据库的过期数据清除管理,不需要后端去处理删除数据的业务逻辑。
到此这篇关于Oracle存储过程和调度器实现自动对数据库过期数据清除的文章就介绍到这了,更多相关Oracle实现自动对数据库过期数据清除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
oracle 定时清理表数据,关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题...相关推荐
- 数据库定时清理表数据
数据库怎么定时清理表中数据呢 当我们有一些业务日志等 需要过一个月 或者过多久定时清理一次 怎么弄呢?? 首先呢 先要数据库管理员先开启 如下命令: 查看以及开启 SHOW VARIABLES LIK ...
- oracle两个表数据比较,oracle数据库两表数据比较
1 引言 在程序设计的过程中,往往会遇到两个记录集的比较.如华东电网PMS接口中实现传递一天中变更(新增.修改.删除)的数据.实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等 ...
- mysql定时器定时清理表数据
1.首先先查看mysql是否开启定时任务开关 SHOW VARIABLES LIKE 'event_scheduler'; 2.Value为ON则已打开,OFF则关闭 如果是OFF,就先打开: # ...
- 番外-oracle数据库自动对数据库过期数据清除
照着这篇文章来的 原理:通过定时器调用数据清理的存储过程 连接数据库的工具用的是navicat 16 1建立数据库任务配置表 SQL语句: create table SYS_DBA_CONFIG (N ...
- Oracle海量数据清理-表空间释放
Oracle海量数据清理-表空间释放 背景 风控项目运行三年,相关数据源对接产生的数据不断累积,随着业务量的攀升,表数据量急剧增长,经过几轮delete后,目前数据表三个月存量热数据为4kw+.一方面 ...
- oracle 快速备份表数据
oracle 快速备份表数据 CreateTime--2018年2月28日17:04:50 Author:Marydon UpdateTime--2017年1月20日11:45:07 1.1.9.3 ...
- 清空oracle表数据 外键,oracle清空所有表数据
方法: 1. 删除所有外键约束 2. drop表 3. 添加外键约束 代码使用powerdesign生成 /*============================================= ...
- oracle导出对象和数据,浅析Oracle对象和数据的导入导出
对于Oracle对象和数据的导入导出,我们会用到一些小工具.以前我们一般都是使用PL/SQL Developer来实现,但是PL/SQL Developer在导出.导入数据时有两个问题: 1.要把表数 ...
- 01.数据库之清理表数据
一.清理表数据的方法与区别 1. truncate truncate 删除所有数据,保留表结构,不能撤销还原,会释放空间 2. delete delete 逐行删除速度极慢,不适合大量数据删除,不释放 ...
最新文章
- 基于webuploader.js的单图片上传封装
- Cocoapods 第三方类库管理工具
- 十图详解TensorFlow数据读取机制(附代码)
- Kubernetes实用技巧
- 机器学习如何应用到实际生活和创业中
- 第一期赠书活动《硅谷百年史》已寄出
- HDU1048 盐水的故事 精度问题
- 计算机网络实验(思科模拟器Cisco Packet Tracer)——交换机配置以及虚拟局域网VLAN
- Apache Cassandra和Java入门(第一部分)
- 白盒基本路径发测试实验报告_软件生命周期、白盒测试、黑盒测试
- Ubuntu的配置(以ubuntu 20.04桌面版为例)
- linux 终端必须退出 history才会记录吗,Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】...
- WinForm DataGridView新增加行
- 飞翔的圆(Flappy Bird)游戏源码完整版
- 火热升级:360Safe VS 雅虎助手
- 将网页内容保存为PDF及为PDF创建多级书签
- 台计算机结构看内存条位置,内存条在哪个位置
- 计算机第一启动设置u盘启动,怎么设置usb为第一启动_bios设置u盘启动
- ClickHouse可视化DBM Release 1.12.0
- QT 主线程子线程互相传值
热门文章
- SAP 电商云 Spartacus UI 出现 breaking change 时,如何用文字来描述
- 如何给基于 SAP Cloud SDK 的应用增添缓存支持 Cache support
- SAP BTP Launchpad Service 打不开应用的权限问题
- SAP Commerce Cloud 的本地开发
- SAP Fiori Elements List Report 列表宽度决定逻辑的单步调试
- 如何在Github网页端处理不同分支之间的冲突
- 通过单步调试理解Angular里routerLink指令实际url的生成逻辑
- Angular list列表绑定的一个例子
- yaas target folder generated and source folder generated
- 在SAP Cloud Platform上消费Business partner service遇到的错误