【问题标题】:How to create parallel connections and queries to db in bash script如何在 bash 脚本中创建对 db 的并行连接和查询
【发布时间】:2019-12-07 07:02:44
【问题描述】:

我的 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

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

  • 创建连接
  • 创建一个表(此连接唯一,例如 i 作为索引)
  • 从表格中选择数据
  • 关闭连接

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

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) 我如何知道实际并行运行的连接数

【问题讨论】:

    标签: linux database bash oracle parallel-processing


    【解决方案1】:

    1) 您可以使用() 将命令分组到子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 &
    

    【讨论】:

    • 您在 1 中编写的那些命令正在执行以下操作:执行操作并断开连接,执行另一个操作并断开连接,执行另一个操作并断开连接,我希望通过 1 个连接发生 3 个操作,连接 ->做 3 个查询 -> 断开连接
    • 我修改了帖子,你可以使用!从sqlplus调用shell
    【解决方案2】:

    10000 个并行作业通常会导致溢出。如果 SQL 失败,通过设置 'WHENEVER SQLERROR EXIT SQL.SQLCODE' sqlplus 将返回错误。然后 GNU Parallel 可以重新运行查询。

    如果重新运行 3 次后查询是否失败,my.log 会显示。

    doit() {
       i=$1
       (echo "WHENEVER SQLERROR EXIT SQL.SQLCODE CREATE TABLE test$i (id NUMBER NOT NULL);"
        sleep 2
        echo "WHENEVER SQLERROR EXIT SQL.SQLCODE select * from test$i;"
        sleep 2
        echo "WHENEVER SQLERROR EXIT SQL.SQLCODE DROP TABLE test$i;") |
         sqlplus <dbuser>/<dbpass>
    }
    export -f doit
    
    seq 1 10000 | parallel --joblog my.log -j0 --retries 3 doit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2014-06-16
      • 2018-11-22
      • 2019-07-20
      • 2020-12-04
      • 2017-05-18
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多