linux - 使用Bash脚本在X时间内创建短和长的sqlplus连接

标签 linux bash oracle shell sqlplus

我需要使用sqlplus客户端和bash脚本创建与Oracle db的短/长连接10分钟(出于示例目的),两者之间的区别如下:

长连接:

  • 已建立连接
  • 每5到10秒,连接就会执行某种
  • 查询
  • 在10分钟结束时,客户端终止

  • 短连接:
  • 建立的连接
  • 进行查询
  • 连接已关闭
  • 重复该过程10分钟(连接打开和关闭,一直保持10个连接)

  • 我有一个基准,我需要针对上述情况(2个不同的bash文件)进行调整:
    #!/bin/sh
    for i in $(seq 1 10);
    do
       echo "CREATE TABLE oracle_BEQ_$i (id NUMBER NOT NULL);
       ! sleep 30
       select * from oracle_BEQ_$i ;
       ! sleep 30
       DROP TABLE oracle_BEQ_$i;" | sqlplus <user>/<password> &
    done
    wait
    

    该脚本当前仅执行以下操作:

    1)创建10个连接(同时)

    2)运行3个查询

    3)完成后,关闭连接

    对于上述2种情况,我需要进行哪些调整?

    最佳答案

    示例1.
    您可以在后台运行脚本pipe.sh。然后在另一个 session 中,发送sql文件或sql。与重新连接后运行sql。

    more pipe.sh
    
    #!/bin/bash
    
    rm /tmp/sqlplus_pipe.sql
    mknod /tmp/sqlplus_pipe.sql p
    
    while :
    do
    
    $ORACLE_HOME/bin/sqlplus   "system/manager" <<EOF
    @/tmp/sqlplus_pipe.sql
    EOF
    
    sleep 1
    done
    

    在backgroud中运行此脚本
       nohup ./pipe.sh  >pipe_log.log 2>&1  & 
    

    在其他bash session 中,您可以将sql文件或sql发送到此背景进程。
    oracle@esmd:/tmp> cat test2.sql >>/tmp/sqlplus_pipe.sql
    oracle@esmd:/tmp> cat test2.sql >>/tmp/sqlplus_pipe.sql
    
    oracle@esmd:/tmp> echo "select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;" >>/tmp/sqlplus_pipe.sql
    oracle@esmd:/tmp> echo "select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;" >>/tmp/sqlplus_pipe.sql
    
    
    oracle@esmd:/tmp> more test2.sql
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
    
    
    
    oracle@esmd:~> more pipe_log.log
    
    SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 8 14:50:35 2019
    
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    
    SQL>
    TO_CHAR(SYSDATE,'DD
    -------------------
    08-08-2019 14:50:46
    
    SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    
    SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 8 14:50:47 2019
    
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    
    SQL>
    TO_CHAR(SYSDATE,'DD
    -------------------
    08-08-2019 14:50:48
    
    SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    
    SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 8 14:50:49 2019
    
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    
    SQL>
    TO_CHAR(SYSDATE,'DD
    -------------------
    08-08-2019 14:50:49
    
    SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    

    更新。
    示例2.
    您可以在Oracle数据库服务器的后台运行脚本pipev2.sh。然后在另一个 session 中,发送sql文件或sql。运行sql后无需重新连接。
     nohup ./pipev2.sh >output.log 2>&1 &
    
    #!/bin/bash
    
    rm /home/trs/db2Toora/sql/sqlplus_pipe.sql
    mknod /home/trs/db2Toora/sql/sqlplus_pipe.sql p
    
    
    $ORACLE_HOME/bin/sqlplus   "system/manager" <<EOF
    SET SERVEROUTPUT ON 
        BEGIN
          RUN_SQL;
        END;
    /
    EOF
    
    
    CREATE OR REPLACE DIRECTORY TEMP_DIR_CHANGE AS '/home/trs/db2Toora/sql'
    /
    GRANT READ ON DIRECTORY TEMP_DIR_CHANGE TO SYSTEM
    /
    GRANT WRITE ON DIRECTORY TEMP_DIR_CHANGE TO SYSTEM
    /
    
    
        CREATE OR REPALCE PROCEDURE RUN_SQL
    
    is
        sql_text VARCHAR2(2000);
        file_sql_name VARCHAR2(100):='sqlplus_pipe.sql';
        sql_delimiter VARCHAR2(1):=';';
        stop_script VARCHAR2(10):='%QUIT%';
        sql_output VARCHAR2(2000);
        InFile           utl_file.file_type;
        vNewLine         VARCHAR2(4000);
        k  pls_integer :=0;
        BEGIN
        dbms_output.enable;
        while k <>1
        loop
        InFile := utl_file.fopen('TEMP_DIR_CHANGE', file_sql_name,'r');
    
        LOOP
          BEGIN
    
          utl_file.get_line(InFile, vNewLine);
    
          if vNewLine like '%'||sql_delimiter||'%' then
             sql_text:=sql_text||vNewLine;
          dbms_output.put_line(sql_text);
           begin
    
            execute immediate replace(sql_text,sql_delimiter,'' ) into sql_output;
    
            EXCEPTION
            WHEN OTHERS THEN
            dbms_output.put_line('!---!--Error--!---!');
            dbms_output.put_line(substr(sqlerrm, 1, 500));
           end;
          dbms_output.put_line(sql_output);
          dbms_output.put_line('---------------------------------------------------------------');
          sql_text:='';
          elsif vNewLine like  stop_script then
          dbms_output.put_line('---!--QUIT--!---');
          EXIT;
          else
          sql_text:=sql_text||vNewLine;
          end if;
    
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
            EXIT;
          END;
    
    
        END LOOP;
          if vNewLine like stop_script then
           exit;
          end if;
    
    end loop;
    
        utl_file.fclose(InFile);
    
        END;
    

    测试
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql> echo 'QUIT'  >sqlplus_pipe.sql
    oracle@esmd:/home/trs/db2Toora/sql>
    
    
    oracle@esmd:/home/trs/db2Toora/sql> more test2.sql
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')
    from dual
    ;
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')
    from dual
    ;
    
    
    nohup: ignoring input
    
    SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 13 10:11:23 2019
    
    Copyright (c) 1982, 2011, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    
    SQL> SQL>   2    3    4  select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')  from dual;
    13-08-2019 10:11:34
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')  from dual;
    13-08-2019 10:11
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')  from dual;
    13-08-2019 10:11:35
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')  from dual;
    13-08-2019 10:11
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')  from dual;
    13-08-2019 10:11:35
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')  from dual;
    13-08-2019 10:11
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')  from dual;
    13-08-2019 10:11:36
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')  from dual;
    13-08-2019 10:11
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')  from dual;
    13-08-2019 10:11:36
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')  from dual;
    13-08-2019 10:11
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')  from dual;
    13-08-2019 10:11:37
    ---------------------------------------------------------------
    select to_char(sysdate,'DD-MM-YYYY HH24:MI')  from dual;
    13-08-2019 12:19
    ---------------------------------------------------------------
    ---!--QUIT--!---
    
    PL/SQL procedure successfully completed.
    
    SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
    

    关于linux - 使用Bash脚本在X时间内创建短和长的sqlplus连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045640/

    相关文章:

    linux - 命令脚本将文件识别为目录

    bash - FFmpeg 和 bash,使用保存路径将多个文件转码到另一个驱动器

    c - 没有这样的文件或目录打开系统调用错误

    php - 仅浏览器端的 Socket.io?

    linux - 如何将 "title"添加到 Awk 中的名称字段

    sql - 预聚合/已按指标分组的中值计算

    sql - 触发检查重复项

    sql - 就像在 SQL 中搜索数字列一样

    java - 如何在现代 Linux 中轻松制作图形?

    c - 由于 malloc 大小不正确导致的不确定性故障?