这篇文章看起来有点简陋小白,但是如果你也遇到了这样的问题需求,仔细把它看完,对你一定有所帮助。
首次写shell脚本,语法很菜,希望大家指点跟进
我在这不多废话,开始
spool脚本
首先spool脚本常用命令:
spool C:\Users\AnYi\Desktop\ODS\a.dat--文件生成位置
set colsep '@|@'--输出分隔符(建议在sql中分隔:||'@|@'||如下:)
set echo off--显示命令
set feedback on--处理的记录条数
set pagesize 0--输出每页行数,缺省为24,为了避免分页,设定为0
set termout on--显示脚本中的命令的执行结果(控制台打印)
set trimspool on--除每行后面空格
set linesize 200--设置行宽,默认100
select NAME||'@|@'||CREATE_TIME||'@|@'||BUS_TYPE||'@|@'||STATUS||'@|@' from TableName;
spool off--结束
exit--退出
例:这是我的卸数spool脚本
准备:spoolBJ.sql
set echo off
set feedback off
set pagesize 0
set trimspool off
set termout off
set linesize 200
spool /home/odstest/2022/JRBJ_BS_INTEGRATION.dat--卸数地址,关联下面截图查看
SELECT NAME||'@|@'||STATUS||'@|@'||UNION_CODE||'@|@'||TO_CHAR(CREATE_TIME,'YYYY-MM-DD HH24:MI:SS')||'@|@' from JRBJ_BS_INTEGRATION;
spool off
我首次测试是这样子的:
执行
./test.sh spoolBJ.sql
导出成功,再通过shell实现更多要求
shell脚本:
准备:
#!/bin/bash
#spoolSql路径
SPSQL_PATH="/home/odstest"
#-- .dat/.ctl/.gz 文件生成存放路径
File_Path="/home/odstest/2022/"
# .ctl / .gz 备份地址
bak_PATH="/home/odstest/odsbak"
BUS="JRBJ_BUS.dat"
INTEGRATION="JRBJ_BS_INTEGRATION.dat"
DEPT="JRBJ_DEPT.dat"
#备份
A=$(pwd)
cd $File_Path
for var in *.gz;do mv "$var" "$(date '+%Y%m%d')$var";done
for var in *.ctl;do mv "$var" "$(date '+%Y%m%d')$var";done
mv $(date '+%Y%m%d')* $bak_PATH
cd $A
#-----------------------------------------------开始导数,生成.dat文件
#卸数
export ORACLE_BASE=/data/app/oracle
export ORACLE_HOME=/data/app/oracle/product/11.2.0.4/db_1
export ORACLE_SID=test
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LANG=C
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#以上代码为Oracle的系统环境变量设置,必须添加,否则crontab定时任务计划不能执行。
sqlplus nane/pwd@11.11.111.123:1521/test <<EOF
@$SPSQL_PATH/spoolDept.sql
@$SPSQL_PATH/spoolBJ.sql
@$SPSQL_PATH/spoolBus.sql
exit
EOF
#-----------------------------------------------导出.dat格式数据完成
#-- .dat/.ctl 文件存放路径
#File_Path="/home/odstest/2022/"
#-----------------------------打包文件
cd $File_Path
gzip -c $BUS > $BUS.gz
gzip -c $INTEGRATION > $INTEGRATION.gz
gzip -c $DEPT > $DEPT.gz
#-----------------------------以下是创建.dat对应的.ctl控制文件
DEPTctl="JRBJ_DEPT.ctl"
BUSctl="JRBJ_BUS.ctl"
INTEGRATIONctl="JRBJ_BS_INTEGRATION.ctl"
#-----部门控制文件检查
if [ -f "$DEPTctl" ]; then
echo "$DEPTctl存在"
else
touch $DEPTctl
cat > $DEPTctl <<EO
DEPT_NAME@|@DEPT_CODE@|@DEPT_FULL_NAME@|@DEPT_UNI_CODE@|@DEPT_LEVEL@|@
@TABLE_NAME=JRBJ_DEPT
@SYS_NAME=YDYH
@DATA_DT=$(date +'%Y%m%d')
@LOAD_TIME=$(date +'%Y%m%d %H:%M:%S')
@ROW_COUNT=$(wc -l < JRBJ_DEPT.dat)
@LIST_SEP=@|@
@TGT_SYSTEM=ODS
@ADD_FLG=ADD
EO
fi
#-----业务流水控制文件检查
if [ -f "$BUSctl" ]; then
echo "$BUSctl存在"
else
touch $BUSctl
cat > $BUSctl <<EO
NAME@|@DEPT_CODE@|@UNION_CODE@|@CREATE_BY@|@STATUS@|@BUS_TYPE@|@CARD_TYPE_ID@|@
@TABLE_NAME=JRBJ_BUS
@SYS_NAME=YDYH
@DATA_DT=$(date +'%Y%m%d')
@LOAD_TIME=$(date +'%Y%m%d %H:%M:%S')
@ROW_COUNT=$(wc -l < JRBJ_BUS.dat)
@LIST_SEP=@|@
@TGT_SYSTEM=ODS
@ADD_FLG=ADD
EO
fi
#-----背夹控制文件检查
if [ -f "$INTEGRATIONctl" ]; then
echo "$INTEGRATIONctl存在"
else
touch $INTEGRATIONctl
cat > $INTEGRATIONctl <<EO
NAME@|@STATUS@|@UNION_CODE@|@CREATE_TIME@|@
@TABLE_NAME=JRBJ_BS_INTEGRATION
@SYS_NAME=YDYH
@DATA_DT=$(date +'%Y%m%d')
@LOAD_TIME=$(date +'%Y%m%d %H:%M:%S')
@ROW_COUNT=$(wc -l < JRBJ_BS_INTEGRATION.dat)
@LIST_SEP=@|@
@TGT_SYSTEM=ODS
@ADD_FLG=ADD
EO
fi
#-------------------------------------------------- 结束
Linux测试主目录:
以下是准备卸数文件存放地址及备份文件地址
测试结果
执行./test.sh脚本后效果:
生成.dat数据.ctl控制文件,并且将.dat打包
这里进入odsbak备份目录,因为之前为空,没数据可备份
再次执行脚本,看到2022目录中导出了新文件(注意时间),并且odsbak目录中备份了上一波的文件。(上线肯定是使用crontab 定时器执行脚本的哈)
Linux创建crontab定时器任务:
crontab -e #修改定时任务配置
#进入i编辑,写入
0 23 * * * /home/odstest/test.sh #例:每天晚上11点执行
service crond start #启动定时任务
service crond restart #重启定时任务
crontab -l #查看定时任务列表
service crond stop #关闭定时任务