番外-oracle数据库自动对数据库过期数据清除
照着这篇文章来的
原理:通过定时器调用数据清理的存储过程
连接数据库的工具用的是navicat 16
1建立数据库任务配置表
SQL语句:
create table SYS_DBA_CONFIG
(NAME VARCHAR2(250) not null,value VARCHAR2(250) not null,type VARCHAR2(200) not null,REMARK VARCHAR2(200) not nullISRUN NUMBER(1) not null,COLUMNTYPE VARCHAR2(200)
);
配置表字段说明:
2,创建数据清理的存储过程(根据保留天数删除数据)
SQL语句:
CREATE OR REPLACE PROCEDURE PSH."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' thenv_sql := 'delete from ' || v_name||' where '|| v_remark||' < TRUNC(SYSDATE- '||v_value||')' ;dbms_output.put_line('删除的sql:' || v_sql);elsev_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;beginexecute immediate v_sql;end;
END LOOP;END DBA_AutoDelete;
主要是要执行这一条SQL语句,可以根据自己需要自己修改
v_sql := 'delete from ' || v_name||' where to_date('||v_remark||',''yyyy-mm-dd hh24:mi:ss'') < TRUNC(SYSDATE- '||v_value||')';
执行完毕后,如果你使用的是navicat,那么会在这里看到
3,创建Job定时器
这里写时间间隔为一分钟是为了马上看到删除结果。
时间间隔当然还有其他的,比如:
每隔10天执行一次
REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10’;
每月15号执行一次
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=15’;
每月最后一天执行一次
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=-1';
就不一一列举了
SQL语句:
begin
dbms_scheduler.create_job
(
job_name => 'Job_DBA_AUTODELETE',
job_type => 'PLSQL_BLOCK',
job_action => 'begin DBA_AUTODELETE; end;',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=1;',
enabled => true
);
end;
当执行完整个SQL语句之后,定时器就开始工作了,我们的目的也达到了。
4,Job定时器的一些方法
1,查询所有job任务
select * from dba_scheduler_jobs;
2,启用job任务(根据名称,比如刚刚创建的Job_DBA_AUTODELETE)
begindbms_scheduler.run_job('Job_DBA_AUTODELETE',FALSE);end;
3,停用job任务
begindbms_scheduler.stop_job(job_name => 'Job_DBA_AUTODELETE',force => TRUE);end;
4,删除job任务
begindbms_scheduler.drop_job(job_name => 'Job_DBA_AUTODELETE',force => TRUE);end;
5,批量删除大量数据
照的这篇文章
不到30万条,不到20秒,可能有更快的方法,现在没有找到。
(可能有点问题,删除某一历史表,只有一个主键,1亿五千万条数据删了十几个小时?)
DECLARE--声明一个主键的集合类型TYPE ids_tbl IS TABLE OF MD_IOT_TAGHISTORY.NVFID%TYPE;id_list ids_tbl;INC NUMBER;LEN NUMBER:=5000;--创建游标CURSOR cur_cdd IS SELECT t.nvfid FROM MD_IOT_TAGHISTORY t WHERE T.SAVETIME< add_months(sysdate,-6);
BEGIN
--打开游标
OPEN cur_cdd;
LOOP--游标中的值取出来填充到id_list中,最多填充5000个FETCH cur_cdd BULK COLLECT INTO id_listLIMIT LEN;-- 循环5000次,根据主键清理数据FORALL i IN 1..id_list.count DELETE FROM MD_IOT_TAGHISTORY t where t.NVFID=id_list(i);--每5000条提交一次事务commit;--游标中取不出来东西的时候,结束循环EXIT WHEN cur_cdd%NOTFOUND;
END LOOP;
--关闭游标
CLOSE cur_cdd;
dbms_output.put_line('finished!');
--异常处理
exceptionwhen no_data_found then dbms_output.put_line('未找到数据');
END;
番外-oracle数据库自动对数据库过期数据清除相关推荐
- mysql数据库自动生成数据库开发设计文档
1.输出表结果,表结构可自己通过代码调整,简单但是有时候很实用,可以节省大量的时间,主要思路: a 在java代码中,通过数据库查询语句获取所有表名和表名备注信息. b 通过表名获取某张表的所有字段说 ...
- oracle 定时清理表数据,关于Oracle存储过程和调度器实现自动对数据库过期数据清除的问题...
简介 数据库中的某些数据不一定要长期保存,例如:日志等数据.当保存一定时间后,系统允许删除所以系统需要定期删除那些已经过期的数据. 实现原理 1张表(SYS_DBA_CONFIG).1个Job定时器( ...
- windows10 oracle自动备份,Windows系统下oracle 自动备份数据库
Windows系统下oracle 自动备份数据库 1.创建批处理文件(.bat) 2.建立windows 定时任务 2.1创建任务 2.2 常规处 ->填写任务名称 2.3触发器 2.4 操作 ...
- Linux oracle数据库自动备份自动压缩脚本代码
Linux oracle数据库自动备份自动压缩脚本代码 Linux oracle数据库备份完成后可以自动压缩脚本代码. 复制代码代码如下: #!/bin/bash #backup.sh #edit: ...
- oracle数据库自动备份
oracle数据库自动备份 环境:windows server2008操作系统,oracle 10.2.0数据库 工具:windows命令窗口 ,windows任务计划 命令:exp profile ...
- delphi Oracle导出多个表,Oracle数据库自动备份工具(Delphi源码)
Oracle数据库自动备份工具(Delphi源码) 下载地址:http://www.blogjava.net/Files/96sd2/OraSvr.rar 『OracleBackupService』简 ...
- Oracle数据库自动存储管理(ASM)
关于ASM的讨论很多,但是到底什么是ASM?ASM是一个有效的抽象层,使你的Oracle数据库可以与叫做diskgroups的抽象空间一起使用,而不是直接使用datafiles.这带来了很多好处,但是 ...
- Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介
作者介绍 姚远:鼎甲科技高级技术顾问,墨天轮MVP.Oracle ACE,华为云MVP,专注于 Oracle.MySQL 数据库多年,拥有 Oracle 10g.12c OCM, MySQL 5.6. ...
- mysql数据库随机生成数据库_MySQL 从零开始:08 番外:随机生成数据库数据
学习数据库时,难免需要一些数据进行实验,对于小数据量的数据来说,我们自己想一些数据并插入到数据库即可,但是如果需要大量的数据时,手动输入将是一项繁琐的工作,我们也不一定能编那么多数据.基于以上,自动生 ...
最新文章
- fetchMetadata: sill install loadAllDepsIntoIdealTree
- SAP RETAIL 根据Allocation Rule去创建分配表
- python datetime计算时间差_Python中关于日期的计算总结
- iOS开发多线程篇—线程的状态
- linux下执行shell修改用户密码,[转] 关于linux下通过shell命令(自动)修改用户密码...
- extjs官网+extjs官网案例
- matplotlib scale 刻度
- [快报]one-tom惊现16岁小龄学员。。。
- Jenkins定时构建和轮询SCM设置说明
- Python处理 JSON 数据
- C学习笔记之---八皇后算法
- Java程序设计课程设计_《JAVA程序设计》课程设计
- ArcGIS 裁剪地图显示范围
- 跟小博老师一起学习MyBatis ——MyBatis搭建运行环境
- 移动宽带连接电信服务器不稳定,移动宽带速度为啥与电信差距那么大?工信部官宣告诉你...
- 北京第二外国语学院本科毕业论文答辩PPT模板
- Python遇到过得text和text()
- 【回归预测-FNN预测】基于粒子群优化前馈网络实现对婚姻和离婚数据回归预测附matlab代码
- 形容长得丑的30句经典句子
- HTML网页设计基础笔记 • 【第1章 HTML5基础】