生产运维过程中,有时候会有很多的脚本需要升级。
大的公司,一般都有自己独立开发的脚本升级工具,如果遇到某个脚本,或者某一批脚本没有成功刷入的时候,可能就需要手动去批量补刷脚本。
这时候,oracle中批量刷脚本的方法就需要掌握。
1. 数据库的连接串
数据库的连接串,是shell自动登录数据库并刷入sql的基础,这里做做一个例子。因为生产中很多时候,都是多套数据库同时运行,这就可能需要将多个连接串记入文件,用脚本来循环调用。
# vim conn.list
db_user1/db_PASSwd1@192.168.100.32:3536/MYDB1
db_user2/db_PASSwd2@192.168.100.32:3536/MYDB2
conn.list是一个记录数据库连接串的文件,我们可以在装有oracle客户端的用户下,执行:
sqlplus db_user1/db_PASSwd1@192.168.100.32:3536/MYDB1
如果可以登录到oracle后台,说明连接串有效,这是基本的测试方法。
2. SQL脚本
首先,我们的SQL脚本可能不止一个,如果用shell脚本来处理批量脚本的话,需要对脚本做一个小的处理:
#!/bin/bash
for SQL_NAME in `ls *.sql`; do
echo >> ${SQL_NAME}
echo exit >> ${SQL_NAME}\
done
添加exit是为了shell脚本调用sql刷入的时候,在脚本末尾能推出sql交互窗口,继续下面脚本的刷入。
在这里,我多加了一个空行,因为有的脚本的末尾没有回车符号,如果第一次直接追加exit,可能会语法错误。
3. 批量刷sql的shell脚本
最后,是将这些东西整合在一起,用脚本进行调用,完成批量刷脚本的动作:
#!/bin/bash
mkdir logs
for SQL_SCRIPTS in `ls *.sql`; do
for CONN_STR in `cat conn.list`; do
sqlplus ${CONN_STR} @${SQL_SCRIPTS} &> logs/${SQL_SCRIPTS}.log
done
done
这里,我们嵌套了两层for循环,用遍历文件的形式导入连接串,并将sql脚本依次刷入。
值得注意的一点是,这里的脚本执行过程是串行的,要想增加输入的效率,可以采用并发的思路,这部分将在今后的FIFO用法中提到。
4. 少量sql语句在shell中快速执行
也有时候,会遇到一个很少的语句(比如我们要查询一个用户是否被锁),这时候用循环的方式就有些浪费了,我们可以快速编辑一个简答脚本,就可以实现:
#!/bin/bash
# 快速检查数据库soa用户是否被锁定
echo -e "select count(1) from all_users;" |sqlplus -s soa/soa_123456@192.168.200.30:2324/SOA1 &> /dev/null
if test $? -ne 0; then
echo "登录失败,可能用户被锁定,也可能密码不正确!"
else
echo "登录成功,用户已经成功解锁!"
fi