SqlServer数据库跑批脚本和备份脚本

lishengyu 484 0

因sqlserver数据库有时候需要执行大批量、数十万条数据的更新和插入等操作,但相对于mysql数据库,sqlserver数据库提供的更多是可视化工具,因而,现记录本脚本用于linux跑批量处理用。

  1. 已实现,对更新或删除操作,在执行前先进行数据备份,输出为csv格式
  2. 简单检查相关危险性语法,如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

发表评论 取消回复
表情 图片 链接 代码

分享