1、创建数据库日志表导出为文本文件的脚本tabout.ctl或tabout.sql
注意:该日志导出后在c:\HttpLog目录下
tabout.ctl脚本内容如下:
SET NEWPAGE NONE
SET HEADING OFF
SET TERM OFF
SET SPACE 0
SET PAGESIZE 0
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 2500
set feedback off
set echo off
SET VERIFY OFF
column v_date new_value filename
select to_char(sysdate,'yyyymmdd') || '.log' v_date from dual
spool ..\HttpLog\&&filename
select id||','||name from orcluser.test
spool off
exit
2、创建调用该脚本的logout.bat文件
logout.bat内容如下:
mkdir ..\HttpLog\
C:\oracle\ora92\bin\sqlplus orcluser/orcl @C:Oracleout.ctl
说明:该bat文件直接在当前目录下创建名为HttpLog的文件夹,以便tabout.ctl脚本输出的文件存放到该目录下。其通过调用Oracle中sqlplus可执行文件来执行tabout.ctl脚本,所以该文件直接双击即可运行,无需其他 *** 作。
3、通过windows定时任务实现自动定期执行
“在控制面板——任务计划——添加任务计划”中建立定期将数据库中日志表数据导出为文本格式(如:你可以根据需求设置为每天对日志表数据进行导出)。根据你当前对日志文件路径的存储需求,修改上面两个脚本中的存储路径,在windows定时任务直接调用logout.bat文件执行即可。
Oracle 数据库备份
保留最近一周的备份记录
====正文
====开始==============
echo 设置备份文件存放文件夹
set "tbuf=E:Cwaybackup"
echo 设置备份文件名(以星期几命名 即备份文件只保存最近一周)
set name=%date%
set name=%name:~ %
set name=ORCL_backup_%name%
echo 是否存在同名文件 若存在则删除同名文件
if exist %tbuf%%name% dmp del %tbuf%%name% dmp
if exist %tbuf%%name% log del %tbuf%%name% log
echo 开始备份XX项目 Oracle 数据库
exp User /PassWord @Orcl file=%tbuf%%name% dmp log= %tbuf%%name% log
echo 备份完毕!
===结束=======
==将“开始” “结束”之间的内容复制到txt文件中 修改相应的参数如 路径 数据库名称等
另存为bat格式 创建任务计划 设置每天运行即可实现数据库备份
注
( )User 要备份数据的用户名
( )PassWord 口令
lishixinzhi/Article/program/Oracle/201311/19110是的。以前我们在处理这类需求时也是这么做的。
但从ORACLE 10.1 版本开始,ORACLE 开发了一个新的包DBMS_SCHEDULER 。这个包挺复杂的,以至于我在初次学习之后,就没再去用它了。功能太强大了,其实很多我们不需要的。
我们就有这个需求,看看DBMS_SCHEDULER 是如何解决的。
在SQLPLUS 中,使用DBMS_SCHEDULER.CREATE_JOB 创建计划任务,用于调度一个存储过程。
存储过程很简单,我为这个测试而创建的,就是向一张表里插入数据。
CREATE TABLE T1 AS SELECT SYSDATE AS AA FROM DUAL
CREATE OR REPLACE PROCEDURE SP_TEST_T1 AS
BEGIN
INSERT INTO T1 SELECTD SYSDATE FROM DUAL
COMMIT
END
这个存储过程没有输入输出参数,是为了JOB 调用方便。如果实际运行过程中有参数,我们就写一个存储过程封装它,再放入JOB 中调用。
例如:
CREATE PROCEDURE GATHER_GTJA_STATS
AS
BEGIN
SYS.DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME =>'GTJA',ESTIMATE_PERCENT =>30,METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE AUTO',CASCADE =>TRUE,OPTIONS =>'GATHER')
END
使用DBMS_SCHEDULER.CREATE_JOB 创建一个JOB, 调用存储过程SP_TEST_T1 ,执行间隔2 分钟。这里的JOB_NAME 名称可以自己定义,这个摆脱了DBMS_JOB 中JOB 号不能自定义的缺点。
EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>'JOB_SP_TEST_T1',JOB_TYPE =>'STORED_PROCEDURE',JOB_ACTION =>'SP_TEST_T1' ,START_DATE =>SYSDATE ,REPEAT_INTERVAL =>'FREQ=MINUTELYINTERVAL=2')
该命令执行成功后,可以在*_SCHEDULER_JOBS 中看到JOB 的配置值。
SELECT * FROM DBA_SCHEDULER_JOBS
SELECT * FROM USER_SCHEDULER_JOBS WHERE JOB_NAME='JOB_SP_TEST_T1'
使用该命令新建的JOB ,默认是不执行的,需要将其状态改成可执行状态。
EXEC DBMS_SCHEDULER.ENABLE(NAME =>'JOB_SP_TEST_T1')
可以删除重建它。
EXEC DBMS_SCHEDULER.DROP_JOB(JOB_NAME =>'JOB_SP_TEST_T1')
EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>'JOB_SP_TEST_T1',JOB_TYPE =>'STORED_PROCEDURE',JOB_ACTION =>'SP_TEST_T1',START_DATE =>TO_DATE('2012-06-12 15:30:00','YYYY-MM-DD HH24:MI:SS') ,REPEAT_INTERVAL =>'FREQ=DAILY')
这个创建过程而言,其实和DBMS_JOB 创建JOB 的差别不大,但DBMS_SCHEDULER 可配置的地方就太多了。执行时间间隔非常非常灵活,这里不做详述了,具体请看ORACLE 官方文档。
DBMS_SCHEDULER 针对每一次JOB 执行,都做了详细记录,因此,可以查询到每一次JOB 执行的时间了。
具体可以查看两类视图*_SCHEDULER_JOB_LOG 和*_SCHEDULER_JOB_RUN_DETAILS 。
SELECT * FROM DBA_SCHEDULER_JOB_LOG
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS
如果嫌日志太多了,可以使用PURGE_LOG 去清理。
EXECUTE DBMS_SCHEDULER.PURGE_LOG
这个DBMS_SCHEDULER 包的功能太多了,用起来也累,所以很多人还是选择DBMS_JOB 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)