首页 > 解决方案 > 如何在 bash 脚本中创建对 db 的并行连接和查询

问题描述

我的 Linux 机器上有一个 oracle 数据库。通过 bash 的单个 sql 查询(1 个连接)如下:

su - oracle
sqlplus <dbuser>/<dbpass>
select * from cat;
exit

我正在尝试通过 bash 运行并行查询,以下脚本用于并行运行 10000 个连接(如果我错了,请纠正我):

for i in $(seq 1 10000); do echo "select * from <tableName>;" | sqlplus <dbuser>/<dbpass>&done

我想让这段代码更加健壮和灵活,例如,我想在以下每个命令之间添加一个睡眠:

以下代码是我这样做的尝试:(不工作)

for i in $(seq 1 10000); 
do 
   echo "CREATE TABLE test+i (id NUMBER NOT NULL);" 
   sleep 2
   echo "select * from test+i"
   sleep 2 
   echo "DROP TABLE test+i" | sqlplus <dbuser>/<dbpass>& 
done

1) 从句法上讲,我应该怎么写?

2) 我怎么知道有多少查询/连接成功,有多少失败?

3) 我如何知道实际并行运行的连接数

标签: linuxdatabasebashoracleparallel-processing

解决方案


1)您可以使用(and)将命令分组到子shell中,并将它们发送到后台:

for i in $(seq 1 10000); 
do
   echo "CREATE TABLE test_$i (id NUMBER NOT NULL);
   !sleep 2
   select * from test_$i;
   !sleep 2
   DROP TABLE test_$i;" | sqlplus <dbuser>/<dbpass> &
done

2)您可以在每次 sqlplus 调用后设置错误处理(检查输出或退出值)

     echo "CREATE TABLE test_$i (id NUMBER NOT NULL);"  | sqlplus <dbuser>/<dbpass> 2>&1 | grep -i error

3)您可以使用该jobs命令来检查有多少作业在后台运行:

> sleep 100 &
[1] 31642
> jobs
[1]+  Running                 sleep 100 &

推荐阅读