希望互相学习,共同进步
1.背景
附件表 t_file 中有创建时间,需求是抽取202407-202408 月创建的附件到指定目录,并保持层级目录。
解决方案:由于抽取的附件条数比较多,采用:SQL查询+生成附件清单+cp脚本的方式。
2.实验:脚本抽取
思路:通过sql将文件目录清单 抽取到指定文件中,然后用cp命令脚本执行。
脚本:extract_file_feng.sh (生成cp脚本+移动附件到 current_menu)
extract_table_name.txt 存放要执行的sql文件名,可以多个
sql_model :存放待查询的sql文件
ok_file : 存放生成的cp 脚本文件
current_menu :存放抽取的附件结果
1)指定sql
[sxnhtc@appx-container performance]$ cat extract_table_name.txt
cloud_xpt_202407to08
[sxnhtc@appx-container performance]$
2)sql_model 写入sql
准备sql
sql
select 'cp -r '||FOLDER||'/'||NEW_FILE_NAME ||' /home/sxnhtc/script/performance/current_menu'||FOLDER||'/' aa
from t_file t
where to_char(T.created,'yyyy-mm') BETWEEN '2024-07' AND '2024-08'
and t.bank_code ='014001007';
截图:共44条
vim ./sql_model/cloud_xpt_202407to08.sql
sql
将sql写入cloud_xpt_202407to08.sql
[sxnhtc@appx-container performance]$ cd ./sql_model/
[sxnhtc@appx-container sql_model]$ vim cloud_xpt_202407to08.sql
[sxnhtc@appx-container sql_model]$ cat cloud_xpt_202407to08.sql
FLAG=CLOUD
sql="select 'cp -r '||FOLDER||'/'||NEW_FILE_NAME ||' /home/sxnhtc/script/performance/current_menu'||FOLDER||'/' aa
from t_file t
where to_char(T.created,'yyyy-mm') BETWEEN '2024-07' AND '2024-08'
and t.bank_code ='014001007';"
[sxnhtc@appx-container sql_model]$
3)ok_file 中模版文件
sql
[sxnhtc@appx-container performance]$ cd /home/sxnhtc/script/performance/ok_file/
[sxnhtc@appx-container ok_file]$ ll
总用量 4
-rw-rw-r-- 1 sxnhtc sxnhtc 15 10月 19 13:51 templet.sh
[sxnhtc@appx-container ok_file]$
[sxnhtc@appx-container ok_file]$ cat templet.sh
#! /bin/bash
[sxnhtc@appx-container ok_file]$
4)脚本文件 .sh
vim extract_file_feng.sh
bash
[sxnhtc@appx-container performance]$ cat extract_file_feng.sh
#!/bin/bash
#Date: 2024年 10月 19日 星期六 12:09:40 CST
#Description: 连接数据库查询所需拷贝文件清单,并根据清单抽取文件到指定目录下
#Description: /home/sxnhtc/script/performance/current_menu/
#Version:1.0
source ~/.bash_profile
startTime=`date +%Y%m%d-%H:%M:%S`
startTime_s=`date +%s`
#Oracle 数据库 IP 地址
IP="192.168.3.16"
#Oracle数据库 SID
SID="orclpdb1"
#配置文件目录
CONFIG_FILE="/home/sxnhtc/script/performance"
#导出表清单名单
ExpTableName="${CONFIG_FILE}/extract_table_name.txt"
#导出 sql 文件存放位置
SqlFilePath="${CONFIG_FILE}/sql_model"
#导出 结果清单 文件存放位置
OKFileResult="${CONFIG_FILE}/ok_file"
#日期批次 服务器当前时间 减 一个月
#DateBatch=`date --date="1 month ago" '+%Y%m%d'`
DateBatch=${1}
if [ "$#" -ne 1 ]; then
echo "请传入日期参数,参数格式为: 20240810"
exit 1
fi
echo ${DateBatch}
#2020
YEAR=${DateBatch:0:4}
#08
MONTH=${DateBatch:4:2}
#01
DAY=${DateBatch:6:2}
DAYDATA=${YEAR}-${MONTH}-${DAY}
#抽取数据表清单生成位置
OKFile="${CONFIG_FILE}/${DateBatch}"
#判断文件是否存在,不存在就创建
if [ ! -d ${OKFile} ];then
echo -e "创建 表清单生成的位置\n"
`/usr/bin/mkdir -p ${OKFile}`
else
cd /tmp/
rm -rf ${OKFile}/*
fi
#抽取文件到临时位置
OutPutFileTemp="/home/sxnhtc/script/performance/current_menu/"
if [ ! -d ${OutPutFileTemp} ];then
echo -e "创建所需文件拷贝的current_menu目录位置\n"
`/usr/bin/mkdir -p ${OutPutFile}`
fi
OutPutFile="${CONFIG_FILE}/${YEAR}-${MONTH}"
# 生成的 压缩文件,需要拷贝的位置
#OutZip="/backup/performance/extract_file/tmp/${DAYDATA}"
if [ ! -d ${OutPutFile} ];then
echo -e "创建所需文件拷贝的目录位置\n"
`/usr/bin/mkdir -p ${OutPutFile}`
else
cd /tmp/
` rm -rf ${OutPutFile} `
`/usr/bin/mkdir -p ${OutPutFile}`
fi
echo -e "开始连Oracle数据库导出清单\n"
#遍历需要导出的表清单名单
for TableName in `cat ${ExpTableName}`
do
#进入到生成数据文本目录
cd ${OKFile}/
#删除旧数据,防止数据重复
rm -rf ${TableName}.ok
#提取相关变量
#source "${SqlFilePath}/${TableName}.sql"
source "/home/sxnhtc/script/performance/sql_model/cloud_xpt_202407to08.sql"
#判断所属用户
UPD="nh_mcro_cloud/xxx@${IP}/${SID}"
YM=${YEAR}-${MONTH}
#替换指定字符串
SqlNew=${sql//SXNHTC/${YM}}
echo ${SqlNew}
#执行导出
sqluldr2 ${UPD} query="${SqlNew}" field="0x1b" charset=UTF8 safe=yes file=${OKFile}/${TableName}.ok
done
echo -e "清单导出完毕\n"
#echo -e "根据清单拷贝文件\n"
#passwd='xxx'
#根据表清单,开始抽取文件到指定位置
#for FileName in `cat ${OKFile}/${TableName}.ok`
#do
# 覆盖拷贝
#cp -f ${FileName} ${OutPutFile}/
#`/usr/bin/expect <<-EOF
#set timeout -1
#spawn rsync -av szptmcro@xxx:${FileName} ${OutPutFile}/
#expect "*password:"
#send "$passwd\r"
#interact
#expect eof
#EOF`
#done
echo -e "生成拷贝脚本\n"
cp -f ${OKFileResult}/templet.sh ${OKFileResult}/${TableName}.sh
cat ${OKFile}/${TableName}.ok >> ${OKFileResult}/${TableName}.sh
sh ${OKFileResult}/${TableName}.sh >>${OKFileResult}/${TableName}.log
echo -e "文件拷贝完毕\n"
cd ${OutPutFile}/
touch ${OutPutFile}/${DateBatch}.ok
endTime=`date +%Y%m%d-%H:%M:%S`
endTime_s=`date +%s`
sumTime=$[ ${endTime_s} - ${startTime_s} ]
echo "${startTime} ---> ${endTime}" "Total: ${sumTime} seconds"
5)执行脚本
sh extract_file_feng.sh 20241019
bash
[sxnhtc@appx-container performance]$ sh extract_file_feng.sh 20241019
20241019
开始连Oracle数据库导出清单
select 'cp -r '||FOLDER||'/'||NEW_FILE_NAME ||' /home/sxnhtc/script/performance/current_menu'||FOLDER||'/' aa from t_file t where to_char(T.created,'yyyy-mm') BETWEEN '2024-07' AND '2024-08' and t.bank_code ='014001007';
0 rows exported at 2024-10-19 15:37:00, size 0 MB.
44 rows exported at 2024-10-19 15:37:00, size 0 MB.
.ok closed at 44 rows, size 0 MB./script/performance//20241019/cloud_xpt_202407to08
清单导出完毕
生成拷贝脚本
文件拷贝完毕
20241019-15:36:58 ---> 20241019-15:37:00 Total: 2 seconds
[sxnhtc@appx-container performance]$
3.生产移动 ok
改为生产要导出的sql:
bash
[sxnhtc@appx-container 20241019]$ cd /home/sxnhtc/script/performance/sql_model/
[sxnhtc@appx-container sql_model]$ cat cloud_xpt_202407to08.sql
FLAG=CLOUD
sql="select 'cp -r '||FOLDER||'/'||NEW_FILE_NAME ||' /home/sxnhtc/script/performance/current_menu'||FOLDER||'/' aa
from t_file t
where to_char(T.created,'yyyy-mm') BETWEEN '2024-07' AND '2024-08';"
[sxnhtc@appx-container sql_model]$
执行:nohup sh extract_file_feng.sh 20241019 >extract_file_feng.log &
sql
[sxnhtc@appx-container performance]$ nohup sh extract_file_feng.sh 20241019 >extract_file_feng.log &
[1] 216429
[sxnhtc@appx-container performance]$ nohup: 忽略输入重定向错误到标准输出端
^C
[sxnhtc@appx-container performance]$ ps -ef |grep extract_file_feng.sh
sxnhtc 216429 126005 0 16:28 pts/0 00:00:00 sh extract_file_feng.sh 20241019
sxnhtc 216648 126005 0 16:28 pts/0 00:00:00 grep --color=auto extract_file_feng.sh
[sxnhtc@appx-container performance]$
[sxnhtc@appx-container performance]$ tail -200f extract_file_feng.log
结果截图: ok
脚本位置生成:
目标位置 文件生成:/home/sxnhtc/script/performance/current_menu/
find . -type d | wc -l # 统计子目录数量
find . -type f | wc -l # 统计文件数量
find .:在当前目录及其子目录中查找。
-type d:指定查找的类型为目录。
-type f:指定查找的类型为普通文件。
|:管道命令,将前一个命令的输出作为下一个命令的输入。
wc -l:统计行数,这里每个目录或文件占一行
至此,结束。 ok
项目管理--相关知识
项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客
项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客
项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客
Oracle其他文档,希望互相学习,共同进步
Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客
oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客
ORA-12899报错,遇到数据表某字段长度奇怪现象:"Oracle字符型,长度50"但length查却没有50_varchar(50) oracle 超出截断-CSDN博客