创建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 ...
随机推荐
- Painting The Fence(贪心+优先队列)
Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...
- .bat批处理命令之设置关机倒计时脚本
@ECHO off REM 不显示后续命令行及当前命令行 TITLE Shutdown countdown REM 设置脚本标题 COLOR 0A REM 设置脚本 背景色为黑色 前景色为淡绿色 :s ...
- SQL语句操作数据试题
1.在SQL Server中,下列关于数据完整性的说法错误的是(). (选择一项) A:实体完整性要求表中的每一行数据都反映不同的试题,不能存在相同的数据行 B:域完整性是只给定列的输入有效性 C:在 ...
- pycharm plot独立窗口显示
import matplotlib.pyplot as plt ... plt.show() 进行如下设置: File->Settings->Tools->Python Scient ...
- 第06组 Beta冲刺(1/5)
队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 准备beta冲刺的内容和分工 修改了后端的一些bug GitHub签入记录 接下来的计划 ...
- Java多线程的Callable, Future, FutureCallback
Callable可以看成是一个增强版的Runnable, 带返回结果, 需要通过Future或者FutureTask来提交任务或运行线程, 然后通过Future/FutureTask的get方法得到返 ...
- docker 部署jar包
docker volume create j1ls /var/lib/docker/volumes/j1/_data 上传jardocker run -it -d --name j1 -v j1:/h ...
- odoo开发笔记 -- 模型后台方法返回前端form视图和tree视图的写法
待补充: 参考:工作单跳转到通关清单 --form(一对一) 工作单跳转到报关单列表 --tree (一对多)
- (2)PyCharm开发Flash项目之蓝图构建
下面通过在PyCharm开发工具中创建一个简单的Flask项目来体会一下Flask的蓝图构建(Blueprint). 何谓蓝图:在Flask中蓝图就在大型应用中,将不同功能的模块(module)分开管 ...
- bim模型中所有IfcWallStandardCase构件
ifc中的IfcWallStandardCase构件 //执行吊装 void startHoisting() { osg::Vec3f vec3f1 = index_node1->getBoun ...