Oracle批量刷脚本 sqlplus批量刷脚本

Oracle Liemer_Lius 1378℃

生产运维过程中,有时候会有很多的脚本需要升级。

大的公司,一般都有自己独立开发的脚本升级工具,如果遇到某个脚本,或者某一批脚本没有成功刷入的时候,可能就需要手动去批量补刷脚本。

这时候,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

 

 

转载请注明:liutianfeng.com » Oracle批量刷脚本 sqlplus批量刷脚本

喜欢 (3)

评论已关闭。