创建job,delete定时清理数据
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定时清理数据的更多相关文章
- Android开发 定时任务清理数据
原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...
- Linux日志定时清理
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- 基于SpringBoot实现定时任务的设置(常用:定时清理数据库)
1.构建SpringBoot工程项目 1)创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplication @Ena ...
- 针对mysql delete删除表数据后占用空间不变小的问题
开发环境 Yii1版本 MySQL PHP5.6.27 前言 物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据 ...
- 定时删除日志文件---linux定时清理日志
linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...
- Linux定时备份数据到百度云盘
导读:如今的百度云盘免费容量都是2T了,即使把电脑上所有的东东都放上去,也还有大把的剩余空间.对于站长来说,是完全可以充分利用这些硬盘空间的,现在我们就用百度云盘来备份Linux服务器上的数据. 一直 ...
- Ubuntu如何定时清理内存
Ubuntu如何定时清理内存 1.进入su jiqing@Ubuntu:~$ su 密码: root@Ubuntu:/home/jiqing# 2.创建cleanCache.sh #!/bin/bas ...
- 定时清理docker私服镜像
定时清理docker私服镜像 使用CI构建docker镜像进行发布极大促进了大家的版本发布效率,于是镜像仓库也就急速膨胀.为了缓解磁盘压力,我们需要设置一些清理策略. 对于不同docker镜像的清理策 ...
- sqlserver2008 如何定时清理索引碎片
sqlserver2008 如何定时清理索引碎片 查询索引引起的表垃圾碎片sql脚本: SELECT object_name(a.object_id) [TableName] ,a.index_id ...
随机推荐
- 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)
最小二乘线性回归,感知机,逻辑回归的比较: 最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...
- 意图Intent
意图点击官方链接 前言 对意图Intent,学习安卓需掌握.以官方链接:http://www.android-doc.com/reference/android/content/Intent.html ...
- redis状态详解
redis查看状态信息 info all|default Info 指定项 server服务器信息 redis_version : Redis 服务器版本 redis_git_sha1 : Git S ...
- Lomok @Data使用
看了廖师兄的Springboot视频发现很多很好玩的小工具,lombok就是其中一个.lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来 ...
- Linux 磁盘格式化、检验、挂载
分区完毕之后自然要进行文件系统的格式化.格式化命令mkfs(make file system)这个命令.这是个综合命令,它会去调用正确的文件系统格式化工具软件. 磁盘格式化 mkfs mke2fs m ...
- thread 线程分析工具
(1) https://fastthread.io/ 将线程 jstack pid 出来之后,压缩一下成为zip 然后 上传上去
- 《The Boost C++ Libraries》 第一章 智能指针
Boost.SmartPointers中提供了多种智能指针,它们采用在智能指针析构时释放内存的方式,帮助管理动态分配的对象.由于析构函数在智能指针生命周期结束时被执行,所以由它管理的动态分配对象可以保 ...
- openstack错误问题定位及调试
- [转]Json字符串和map和HashMap之间的转换
需要导入alibaba.fastJsonmaven中的依赖为 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> ...
- Python之内置装饰器property
# -*- coding: utf-8 -*- # author:baoshan class Student(object): def __init__(self, name): self.name ...