【发布时间】:2012-08-24 20:06:39
【问题描述】:
我正在开发一个 shell 脚本,它遍历一系列 Postgres 数据库表名并转储表数据。例如:
# dump data
psql -h $SRC_IP_ADDRESS -p 5432 -U postgres -c "BEGIN;" AWARE
do
:
pg_dump -U postgres -h $IP_ADDRESS -p 5432 -t $i -a --inserts MYDB >> \
out.sql
done
psql -h $IP_ADDRESS -p 5432 -U postgres -c "COMMIT;" MYDB
不过,我担心并发访问数据库。由于 Postgres 没有数据库锁,我尝试在循环周围包裹一个 BEGIN 和 COMMIT(使用 psql,如上所示)。这导致来自 psql 命令的错误消息,说:
WARNING: there is no transaction in progress
有什么方法可以实现吗?如果没有,有什么替代方案?
谢谢!
【问题讨论】:
-
我不久前写过这个话题。简短的版本是“驱动
psql作为与coproc命令的协同进程,或使用支持连接到 Pg 的脚本语言。请参阅 stackoverflow.com/a/8305578/398670 。但是,如果你是使用 pg_dump,它只对 psql 有用。 -
顺便说一句,有一种方法可以将所有其他用户(超级用户除外)锁定在数据库之外。您可以在数据库中为除您自己以外的所有人使用
REVOKE和CONNECT(尽管超级用户始终可以连接),然后在针对pg_stat_activity的查询中使用pg_terminate_backend(pid)启动其他所有人。我承认,这不是微不足道的。在这种情况下,我认为无论如何您都在用这种方法完全错误地吠叫,请参阅 ruakh 的回答。
标签: linux postgresql shell