Job定时删除数据

需求:对一个表,每天删除一月前的历史数据

思路
.编写SQL,删除一月前的历史数据,使用函数取值
.测试JOB创建,查询,维护,管理
.测试布置job,满足效果 ***测试数据准备
select dbms_metadata.get_ddl('TABLE','xxx','IMAGE_APP') ddl_text from dual
DDL_TEXT
--------------------------------------------------------------------------------
create tablespace xxx datafile '/home/oracle/test1.dbf' size 1m autoextend on next 10m maxsize unlimited;
create tablespace xxxdatafile '/home/oracle/test2.dbf' size 1m autoextend on next 10m maxsize unlimited; create user xxxidentified by abc default tablespace IMAGE_APP_TBS;
grant dba to xxx;
CREATE TABLE "xxx"."IMAGE_CLEAN_LOG"
( "IMAGE_CLEAN_LOG_ID" NUMBER(,) NOT NULL ENABLE,
"IMAGE_PIC_ID" NUMBER(,),
"CLEAN_TIME" TIMESTAMP (),
"CACHE_CODE" CHAR(),
"SUCCESS_FLAG" CHAR(),
"FAIL_REASON_ID" CHAR(),
"FAIL_REASON_DESC" VARCHAR2(),
CONSTRAINT "PK_IMAGE_CLEAN_LOG" PRIMARY KEY ("IMAGE_CLEAN_LOG_ID")
USING INDEX PCTFREE INITRANS MAXTRANS COMPUTE STATISTICS
STORAGE(INITIAL NEXT MINEXTENTS MAXEXTENTS
PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT)
TABLESPACE "xxx" ENABLE
) PCTFREE PCTUSED INITRANS MAXTRANS NOCOMPRESS LOGGING
STORAGE(INITIAL NEXT MINEXTENTS MAXEXTENTS
PCTINCREASE FREELISTS FREELIST GROUPS BUFFER_POOL DEFAULT)
TABLESPACE "xxx"; CREATE INDEX "xxx"."I_ICL_CLEAN_TIME" ON "xxx"."IMAGE_CLEAN_LOG" (
"CLEAN_TIME") TABLESPACE "xxx" global PARTITION BY HASH ("CLEAN_TIME") PARTITIONS ; insert into "xxx"."IMAGE_CLEAN_LOG" (IMAGE_CLEAN_LOG_ID,IMAGE_PIC_ID,
CLEAN_TIME,CACHE_CODE,SUCCESS_FLAG,FAIL_REASON_ID,FAIL_REASON_DESC)
select rownum,rownum,
to_date(to_char(sysdate-,'J')+ trunc(dbms_random.value(,)),'J'),
'a',
'b',
'c',
rpad('*',,'*')
from dual
connect by rownum <= ;
commit; SQL> select to_char(CLEAN_TIME,'yyyymm'),count(*) from "IMAGE_APP"."IMAGE_CLEAN_LOG"
group by to_char(CLEAN_TIME,'yyyymm') order by ; TO_CHA COUNT(*)
------ ---------- rows selected. .编写SQL,删除一月前的历史数据,使用函数取值 SQL> select sysdate,add_months(sysdate,),add_months(sysdate,-),trunc(add_months(sysdate,)) from dual;
SYSDATE ADD_MONTHS(SYSDATE, ADD_MONTHS(SYSDATE, TRUNC(ADD_MONTHS(SY
------------------- ------------------- ------------------- -------------------
-- :: -- :: -- :: -- ::
SQL> select sysdate-,add_months(sysdate,-),add_months(sysdate,-) from dual;
SYSDATE- ADD_MONTH ADD_MONTH
--------- --------- ---------
-OCT- -AUG- -SEP-
SYSDATE- ADD_MONTHS(SYSDATE, ADD_MONTHS(SYSDATE,
------------------- ------------------- -------------------
-- :: -- :: -- :: --测试between and
create table a(id int);
insert into a values();
insert into a values();
insert into a values();
insert into a values();
select * from a where id between and ;
ID
---------- delete "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME between add_months(sysdate,-) and add_months(sysdate,-); select count(*) from "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME between add_months(sysdate,-) and add_months(sysdate,-);
COUNT(*)
---------- --OK
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
spool /home/oracle/work_dir/yz/delete_month_20181025.log
select 'delete' as execute_script,sysdate from dual;
select sysdate from dual;
set timing on
set lines pages
set serveroutput on
declare
begin_date date:=to_date('2011-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
end_date date;
v_sql varchar2();
v_out date;
begin
for i in ..
loop
select sysdate into v_out from dual;
end_date:=add_months(begin_date,);
v_sql:='delete from xxx.IMAGE_CLEAN_LOG t
where CLEAN_TIME >= to_date('''||begin_date ||''',''yyyy-mm-dd hh24:mi:ss'')
and CLEAN_TIME < to_date('''||end_date||''',''yyyy-mm-dd hh24:mi:ss'')';
dbms_output.put_line(begin_date);
execute immediate v_sql;
dbms_output.put_line(v_sql);
sys.dbms_output.put_line(v_out);
commit;
begin_date:=add_months(begin_date,);
exit when begin_date>=to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
end loop;
end;
/
select sysdate from dual;
spool off
exit select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME>=to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
---------- select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME> add_months(sysdate,-);
COUNT(*)
---------- delete "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME between add_months(sysdate,-) and add_months(sysdate,-);
SQL> select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME>=to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
---------- SQL> roll;
Rollback complete.
SQL> select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME>=to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss'); COUNT(*)
---------- .测试JOB创建,查询,维护,管理 create or replace procedure delete_log
as begin
delete "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME between add_months(sysdate,-) and add_months(sysdate,-);
commit;
end;
/
exec delete_log declare
job number;
BEGIN DBMS_JOB.SUBMIT(JOB => job,/*自动生成JOB_ID*/
WHAT=>'delete_log;',/*需要执行的存储过程名称或SQL语句*/
NEXT_DATE=>sysdate,/*初次执行时间-立即执行*/
INTERVAL=>'TRUNC(sysdate+1)+1/24'); /*每天凌晨一点执行一次*/
end;
/ select job,SCHEMA_USER,LAST_DATE,NEXT_DATE,BROKEN,INTERVAL,WHAT,FAILURES from dba_jobs where what like 'delete%';
JOB SCHEMA_USE LAST NEXT_DATE B INTERVAL WHAT FAILURES
---------- ---------- ---- ------------------- - ------------------------- ---------------------
SYS -- :: N TRUNC(sysdate+)+/ delete_log; --
begin
DBMS_JOB.RUN(); /*40 job的id*/
end; SQL> select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME>=to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
---------- --JOB调用成功
select job,SCHEMA_USER,LAST_DATE,NEXT_DATE,BROKEN,INTERVAL,WHAT,FAILURES from dba_jobs where what like 'delete%';
JOB SCHEMA_USE LAST_DATE NEXT_DATE B INTERVAL WHAT FAILURES
---- ---------- ------------------------------ ------------------- - ------------------------- ------------- ----------
SYS -- :: -- :: N TRUNC(sysdate+)+/ delete_log; ***********以上测试初步成功****
如下再次测试JOB的自动效果
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => 'delete_log;', /*需要执行的存储过程名称或SQL语句*/
NEXT_DATE => sysdate, /*初次执行时间-立即执行*/
INTERVAL => 'sysdate+1/1440' /*每分钟执行一次*/
);
commit;
end;
/ begin
DBMS_JOB.RUN(); /*40 job的id*/
end; *删除JOB
begin
dbms_job.remove(); /*删除自动执行的job,参数是 job的id*/
commit;
end;
SQL> select job,SCHEMA_USER,LAST_DATE,NEXT_DATE,BROKEN,INTERVAL,WHAT,FAILURES from dba_jobs where what like 'delete%'; JOB SCHEMA_USE LAST_DATE NEXT_DATE B INTERVAL WHAT FAILURES
---------- ---------- ------------------------------ ------------------- - ------------------------- ------------- ----------
SYS -- :: -- :: N TRUNC(sysdate+)+/ delete_log;
SYS -- :: -- :: N sysdate+/ delete_log; Elapsed: ::00.00
SQL> select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME>=to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss'); COUNT(*)
---------- 插入测试数据
create table abc as select * from xxx.IMAGE_CLEAN_LOG;
update abc set CLEAN_TIME=CLEAN_TIME-;
commit;
select count(*) from abc where CLEAN_TIME between
to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2018-09-27 00:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
---------- insert into xxx.IMAGE_CLEAN_LOG select * from abc;
commit;
select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME
between to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2018-09-27 00:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
---------- --ALTER TABLE IMAGE_APP.IMAGE_CLEAN_LOG disable CONSTRAINT PK_IMAGE_CLEAN_LOG;
ORA-: unique constraint (IMAGE_APP.PK_IMAGE_CLEAN_LOG) violated --测试发现,自动执行JOB,且成功删除数据
SQL> select sysdate from dual;
SYSDATE
-------------------
-- ::
Elapsed: ::00.00
SQL> select count(*) from xxx.IMAGE_CLEAN_LOG where CLEAN_TIME
between to_date('2018-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2018-09-27 00:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
---------- SQL> select job,SCHEMA_USER,LAST_DATE,NEXT_DATE,BROKEN,INTERVAL,WHAT,FAILURES from dba_jobs where what like 'delete%';
JOB SCHEMA_USE LAST_DATE NEXT_DATE B INTERVAL WHAT FAILURES
---------- ---------- ------------------------------ ------------------- - ------------------------- ------------- ----------
SYS -- :: -- :: N TRUNC(sysdate+)+/ delete_log;
SYS -- :: -- :: N sysdate+/ delete_log; .测试布置job,满足效果 create or replace procedure delete_log
as begin
delete "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME between add_months(sysdate,-) and add_months(sysdate,-);
commit;
end;
/ declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job, /*自动生成JOB_ID*/
WHAT => 'delete_log;', /*需要执行的存储过程名称或SQL语句*/
NEXT_DATE => sysdate, /*初次执行时间-立即执行*/
INTERVAL => 'TRUNC(sysdate+1)+1/24' /*每天凌晨一点执行一次*/
);
--commit;
end;
/
--查询JOB信息
SQL> select job,SCHEMA_USER,LAST_DATE,NEXT_DATE,BROKEN,INTERVAL,WHAT,FAILURES from dba_jobs where what like 'delete%'; --第一次需要手动执行
begin
DBMS_JOB.RUN(); /*40 job的id*/
end; --再次查询JOB自动调用时间
SQL> select job,SCHEMA_USER,LAST_DATE,NEXT_DATE,BROKEN,INTERVAL,WHAT,FAILURES from dba_jobs where what like 'delete%'; ---------------------------------------------------------------------------------------------------------- --记录数量
create table job_delete_log_image(d_date date,n_type varchar2(),n_sum int) tablespace IMAGE_APP_TBS;
create or replace procedure delete_log
as begin
insert into job_delete_log_image select sysdate,'old_delete_count',count(*)
from "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME<sysdate-;
delete "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME<sysdate-;
insert into job_delete_log_image select sysdate,'new_delete_count',count(*)
from "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME<sysdate-;
commit;
end;
/ exec delete_log; ****
--------------------------------------------------------------------------------------
truncate table job_delete_log_image;
truncate table "xxx"."IMAGE_CLEAN_LOG";
insert into "xxx"."IMAGE_CLEAN_LOG"
(IMAGE_CLEAN_LOG_ID,IMAGE_PIC_ID,CLEAN_TIME,
CACHE_CODE,SUCCESS_FLAG,
FAIL_REASON_ID,FAIL_REASON_DESC)
select rownum,rownum,
to_date(to_char(sysdate-,'J')+ trunc(dbms_random.value(,)),'J'),
'a',
'b',
'c',
rpad('*',,'*')
from dual
connect by rownum <= ;
commit; ******* 记录日志 创建日志表
--drop table job_delete_log_image purge;
create table job_delete_log_image
(id int,
job_stime date,
job_etime date,
job_sql varchar2(),
rows_deleted int,
row_check int
) tablespace xxx; create index job_delete_index on job_delete_log_image(id); set serveroutput on
create or replace procedure delete_log
as
v_sql varchar2();
sql_rowcount number;
sequence_id int;
delete_date varchar2();
begin
select to_char(trunc(sysdate-),'yyyymmdd hh24:mi:ss') into delete_date from dual;
insert into job_delete_log_image(id,job_stime) select to_char(sysdate,'yyyymmddhh24miss'),sysdate from dual;
v_sql:='delete "xxx"."IMAGE_CLEAN_LOG" where CLEAN_TIME<to_date('''||delete_date||''',''yyyymmdd hh24:mi:ss'')';
execute immediate v_sql;
sql_rowcount := sql%rowcount;
select max(id) into sequence_id from job_delete_log_image;
update job_delete_log_image
set job_etime=sysdate,
job_sql=v_sql,
rows_deleted=sql_rowcount,
row_check=
(select count(*) from "xxx"."IMAGE_CLEAN_LOG"
where CLEAN_TIME<to_date(delete_date,'yyyymmdd hh24:mi:ss')) where id=sequence_id;
commit;
end delete_log;
/ exec delete_log
select * from job_delete_log_image;

创建job,delete定时清理数据的更多相关文章

  1. Android开发 定时任务清理数据

    原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...

  2. Linux日志定时清理

    linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...

  3. 基于SpringBoot实现定时任务的设置(常用:定时清理数据库)

    1.构建SpringBoot工程项目 1)创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplication @Ena ...

  4. 针对mysql delete删除表数据后占用空间不变小的问题

    开发环境 Yii1版本 MySQL PHP5.6.27 前言 物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据 ...

  5. 定时删除日志文件---linux定时清理日志

    linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...

  6. Linux定时备份数据到百度云盘

    导读:如今的百度云盘免费容量都是2T了,即使把电脑上所有的东东都放上去,也还有大把的剩余空间.对于站长来说,是完全可以充分利用这些硬盘空间的,现在我们就用百度云盘来备份Linux服务器上的数据. 一直 ...

  7. Ubuntu如何定时清理内存

    Ubuntu如何定时清理内存 1.进入su jiqing@Ubuntu:~$ su 密码: root@Ubuntu:/home/jiqing# 2.创建cleanCache.sh #!/bin/bas ...

  8. 定时清理docker私服镜像

    定时清理docker私服镜像 使用CI构建docker镜像进行发布极大促进了大家的版本发布效率,于是镜像仓库也就急速膨胀.为了缓解磁盘压力,我们需要设置一些清理策略. 对于不同docker镜像的清理策 ...

  9. sqlserver2008 如何定时清理索引碎片

    sqlserver2008 如何定时清理索引碎片 查询索引引起的表垃圾碎片sql脚本:  SELECT object_name(a.object_id) [TableName] ,a.index_id ...

随机推荐

  1. C语言博客作业00--我的第一篇博客

    1.你对网络专业或者计算机专业了解是怎样? 起初 起初对于我来说,计算机专业毕业后就相当于程序员,或者去开发一些游戏,软件等等,而学得特别优秀的可能会成为黑客,就像电影电视剧里演得那样,这是我一开始的 ...

  2. c++中二叉树的先序中序后序遍历

    c++中二叉树的先(前)序.中序.后序遍历 讲解版 首先先看一个遍历的定义(源自度娘): 所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的 ...

  3. 笔记 - 数据结构 - 区间第k大

    Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2 - Optimal Subsequence ...

  4. Koa Session的使用

    Session 简单介绍 session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上. Session 的工作流程 当浏览器访问服务器 ...

  5. arts lettcode 题目

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  6. XmlIgnore的解释和使用

    XmlIgnore是一个自定义属性,用来指明在序列化时是否序列化一个属性.如下面的例子: public class Group { public string GroupName; [XmlIgnor ...

  7. C# System.Net.Mail.MailMessage 发邮件

    C# System.Net.Mail.MailMessage 发邮件 上篇文化在哪个可以看到使用 System.Web.Mail.MailMessage 发邮件时会提示 ,提供用于构造电子邮件的属性和 ...

  8. jmeter 参数化大数据取唯一值方式

    jmeter 参数化大数据取唯一值方式 一.用时间函数: 因为时间戳永远没有重复,jmeter参数化,而且要取唯一值,可以考虑用时间函数加上其他函数一起: # 以13位的时间戳作为 userID no ...

  9. Electron 入门第一篇

    官网:http://electronjs.org/docs/tutorial/application-architecture 转载:https://blog.csdn.net/qq_33323731 ...

  10. odoo开发笔记 -- 模型(类)继承的几种机制

    1. 类继承 2. 原型继承 3. 委托继承 待完善 https://www.cnblogs.com/chenshuquan/p/10523626.html