liunx 计划任务
任务脚本
#!/bin/bash
# 配置项
# Oracle 安装路径,根据实际情况修改,查看安装地址:cat /etc/oratab
ORACLE_HOME='/home/database/oracle/product/11.2.0'
# Oracle 实例名,根据实际情况修改
ORACLE_SID=
# 数据库用户名
USER=
# 数据库密码
PASSWORD=''
# 存放多个 SQL 文件的目录
SQL_FILES_DIR='/home/database/oracle/product/11.2.0/runsql'
# 日志文件存放目录
LOG_DIR='/home/database/oracle/product/11.2.0/runsql/logs'
# 导入 Oracle 环境变量
export ORACLE_HOME
export ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
# 创建日志目录(如果不存在)
mkdir -p $LOG_DIR
# 获取当前日期和时间,用于生成日志文件
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# 日志文件的时间后缀,精确到秒
LOG_TIME_SUFFIX=$(date +"%Y%m%d%H%M%S")
# 日志文件路径,带时间后缀
LOG_FILE=$LOG_DIR/sql_log_$LOG_TIME_SUFFIX.log
# 记录日志
echo "[$CURRENT_TIME] 开始执行 SQL 脚本..." >> $LOG_FILE
# 遍历 SQL 文件目录下的所有 .sql 文件并依次执行
for sql_file in $SQL_FILES_DIR/*.sql; do
echo "[$CURRENT_TIME] 执行 SQL 文件: $sql_file" >> $LOG_FILE
# 执行 SQL 文件,并在发生错误时退出 SQL*Plus
sqlplus -s / as sysdba <<EOF >> $LOG_FILE
WHENEVER SQLERROR EXIT SQL.SQLCODE
START $sql_file
EXIT;
EOF
# 检查 SQL 执行状态
if [ $? -eq 0 ]; then
echo "[$CURRENT_TIME] SQL 文件 $sql_file 执行成功。" >> $LOG_FILE
else
echo "[$CURRENT_TIME] SQL 文件 $sql_file 执行失败。" >> $LOG_FILE
echo "[$CURRENT_TIME] 停止后续 SQL 文件的执行。" >> $LOG_FILE
break # 停止后续 SQL 文件的执行
fi
done
# 记录脚本结束时间
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$CURRENT_TIME] 脚本执行结束。" >> $LOG_FILE
1、脚本尽量在oracle数据库的安装用户下执行:切换用户sudo su - oracle
2、加入为linux定时任务
查看当前定时任务
crontab -l
修改当前的定时任务
crontab -e
定时任务例子
*/5 * * * * /home/oracle/runsql_test/sqlfilerun.sh
给权限
3、脚本基本逻辑
1)指定Oracle的安装目录
2)指定日志目录
3)指定sql文件所在目录
4)执行逻辑
- 从sql文件所在目录获取所有*.sql文件
- 循环sql文件逐个执行(使用sqlplus)
- 异常处理逻辑
- 如果sql文件中的sql报错则终止执行
- 如果默认sql文件执行失败后续文件不继续执行
4、使用方式建议
1)对于不同业务模块的sql处理,建议以此sh为模板,编写多个脚本
2)基于脚本构建多套sql文件、日志目录
5、日志文件
1)每执行一次会在日志目录中,生成一个日志文件日志文件名中有当前时间精确到秒
2)日志文件中会记录每条sql的执行结果
3)日志文件会记录执行了哪些sql文件和执行结果