【问题标题】:Using open database connection to PostgreSQL in BASH?在 BASH 中使用与 PostgreSQL 的开放数据库连接?
【发布时间】:2012-02-08 19:17:30
【问题描述】:

我必须使用 BASH 连接到我们的 PostgreSQL 9.1 数据库服务器来执行各种 SQL 语句。

我们遇到了由于重复打开/关闭太多数据库连接而导致的性能问题(现在,我们将每个语句发送到 psql 命令)。

我正在研究使用命名管道为 SQL 语句块维护开放数据库连接的可能性。

我遇到的问题是,一旦打开连接并执行 SQL 语句,我不知道何时停止从 psql 读取。我考虑过解析输出以查找提示,但考虑到字符可能嵌入 SELECT 输出中的可能性,我不知道这是否安全。

有人有什么建议吗?

这是迄今为止我所拥有的一个简化示例......

#!/bin/bash

PIPE_IN=/tmp/pipe.in
PIPE_OUT=/tmp/pipe.out

mkfifo $PIPE_IN $PIPE_OUT
psql -A -t jkim_edr_md_xxx_db < $PIPE_IN > $PIPE_OUT &
exec 5> $PIPE_IN; rm -f $PIPE_IN
exec 4< $PIPE_OUT; rm -f $PIPE_OUT

echo 'SELECT * FROM some_table' >&5

# unfortunately, this loop blocks
while read -u 4 LINE
do
    echo LINE=$LINE
done

【问题讨论】:

  • PostgreSQL 支持持久连接。您不需要一直打开和关闭连接。

标签: bash postgresql named-pipes postgresql-9.1


【解决方案1】:

使用--file=filename 进行批处理。

根据您对流控制的需要,您可能希望使用另一种具有更灵活 DB API 的语言(Python 是我的选择,但可以使用任何可行的语言)。

【讨论】:

  • 我需要单独处理 SQL 语句的结果,所以我认为批量执行不适合我。
【解决方案2】:
            echo >&5 "SELECT * FROM some_table"

应该阅读

            echo 'SELECT * FROM some_table' >&5

重定向运算符&gt;&amp; 出现在echo 的参数之后;而且,如果你使用"" 引号,一些标点符号可能会被shell 特殊处理,从而导致后面的错误和神秘的错误。另一方面,引用' 将是……丑陋的。 SELECT * FROM some_table WHERE foo=\'Can\'\'t read\''

您可能还想在比/tmp 更安全的地方创建这些管道。存在一个很大的安全漏洞竞争条件,主机上的其他人可能会劫持您的连接。尝试使用0700 权限创建像/var/run/yournamehere/ 这样的文件夹,并在那里创建管道,最好使用像PIPE_IN=/var/run/jinkimsqltool/sql.pipe.in.$$ 这样的名称——$$ 将是您的进程ID,因此同时执行的脚本不会相互干扰。 (为了加剧安全漏洞,管道不需要rm -rf,但聪明的破解者可以利用这种特权提升滥用那里的-r。只需rm -f就足够了。)

【讨论】:

  • 谢谢,我已经根据您的一些建议更新了我的帖子。
【解决方案3】:

在psql中可以使用

\o YOUR_PIPE
SELECT whatever;
\o

这将打开、写入和关闭管道。你的 BASH-fu 似乎比我的强很多,所以我会让你弄清楚细节:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多