因sqlserver数据库有时候需要执行大批量、数十万条数据的更新和插入等操作,但相对于mysql数据库,sqlserver数据库提供的更多是可视化工具,因而,现记录本脚本用于linux跑批量处理用。
- 已实现,对更新或删除操作,在执行前先进行数据备份,输出为csv格式
- 简单检查相关危险性语法,如delete操作缺少条件,update操作条件前误带;等简单检测。
#!/bin/bash user=sa pass=lishengyu host=192.168.2.152 db=test port=1433 #备份格式 _time=`date +%F-%H_%M` #备份文件 dir=./backup #修改默认换行符 old=$IFS IFS=' ' #检测是什么语句 #检测条件前面是否有; #替换语句为select,进行查询备份 #检测是否存在备份目录 [ -d $dir ] || mkdir $dir -p #初始化文件和参数 i=1 >/tmp/sql_resu.txt #[ $# -ne 2 ] && echo “Usage: `basename $0` dbname sqltxt” && exit #开始摘取语句 backup() { for line1 in `awk '{print $0}' $1` do #检测摘取的语句是否为空 sql_type=`echo $line1 | awk '{print $1}'` [ -z "$sql_type" ] && exit && echo “error…… 1 ” #检测语句是否是update类型 if [[ "$sql_type" = "UPDATE" || "$sql_type" = "UPDATE" ]];then #检测相关表 table=`echo $line1 | awk ‘{print $2}’` #检测语句是否有;符号 resu=`echo $line1 | sed -r 's#(.*)(where)(.*)#\1#i' | grep ";"` [ $? -ne 1 ] && echo "error, sql have ; please check...." && exit #构造语句 rep_sql=`echo $line1 | sed -r "s#(.*)(where)(.*)#select * from $table \2 \3#i"` #记录语句到文件中去 echo $rep_sql >> /tmp/sql_resu.txt fi #检测delete语句 if [[ "$sql_type" = "DELETE" || "$sql_type" = "delete" ]];then # table=`echo $line | sed -r ‘s#.*from (.*) where#\1#i’` table=`echo $line1 | awk '{print $3}'` #检测delete语句是否带有条件 resu=`echo $line1 | sed -r 's#(.*)(where)(.*)#\1\2#i' | grep "where"` [ $? -ne 0 ] && echo "error, sql have ; …. please check....." && exit #构造语句 rep_sql=`echo $line1 | sed -r "s#(.*)(where)(.*)#select * from $table \2 \3#"` echo $rep_sql >> /tmp/sql_resu.txt fi done #执行备份 /opt/mssql-tools/bin/sqlcmd -U $user -P${pass} -S ${host},${port} -b -d ${db} -s , -W -i /tmp/sql_resu.txt -o $dir/${_time}.csv } #安装sqlcmd check_install () { which sqlcmd &> /dev/null if [ $? -ne 0 ];then echo -e $bule"sqlcmd 没有安装....现在开始安装......"$end curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/msprod.repo yum remove mssql-tools unixODBC-utf16-devel &> /dev/null echo -e $bule"请稍等......"$end sudo yum install mssql-tools unixODBC-devel -y echo -e $bule"添加环境变量......"$end echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> /etc/profile source /etc/profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> /etc/bashrc source /etc/bashrc which sqlcmd &> /dev/null if [ $? -eq 0 ];then echo -e $greed"sqlcmd 安装成功........"$end else echo -e $red"sqlcmd 安装失败,请检查........"$end exit fi fi } #统计执行次数 k=1 #清空相关存放文件,初始化 > /tmp/do_sql.txt > /tmp/done_sql.txt echo "start........." #开始循环 for line in `awk '{print $0}' sql.txt` do #打印执行的序号 echo "第 $k 条开始执行......" #输出读取到的内容到文件 echo -e "$line" >> /tmp/do_sql.txt echo "go" >> /tmp/do_sql.txt #开始执行 /opt/mssql-tools/bin/sqlcmd -U $user -P${pass} -S ${host},${port} -b -d ${db} -i /tmp/do_sql.txt [ $? -ne 0 ] && echo "check /tmp/do_sql.txt !!!!" && exit #初始化文件 echo echo -e "第 $k 条执行完成......" echo > /tmp/do_sql.txt > /tmp/do_sql.txt #记录已执行的语句 echo "$line" >> /tmp/done_sql.txt let k++ done echo "done....." echo "总共执行: $k" IFS=$old
本文作者为lishengyu,转载请注明。