0

我有一个这样的bash脚本:

GITUSER="mygituser"
DBUSER="mysitedbuser"
DB="mysitedb"
SITE="mysite.com"
REPO="/var/git/myproject.git" # on the server

dropdb -U $DBUSER $DB &&
echo "remote db dump (gzip)" &&
F=`ssh $GITUSER@$SITE $REPO/dumpdb-gzip.sh` &&
echo "copying remote dump to localhost" &&
scp $GITUSER@$SITE:"$F" . &&
echo "deleting remote file" &&
ssh $GITUSER@$SITE rm "$F" &&
echo "loading dump in local db" &&
createdb -U $DBUSER -E UTF8 -O $DBUSER $DB &&
psql -U postgres -c "ALTER SCHEMA public OWNER TO $DBUSER" $DB &&
F=`echo "$F" | sed 's/^\/tmp\///'` &&
zcat "$F" | psql -q -f - -U $DBUSER $DB >/dev/null &&
rm "$F"

但是在 Mac OS X (Lion) 上运行会给我这个错误:

$ ./fetch_server_db.sh
remote db dump (gzip)
copying remote dump to localhost
pg_dump_2011-10-25_09-20-50.db.gz                     100% 1017KB 254.2KB/s   00:04    
deleting remote file
loading dump in local db
ALTER SCHEMA
./fetch_server_db.sh: line 24: 25878 Broken pipe: 13         zcat "$F"
     25879 Segmentation fault: 11  | psql -q -f - -U $DBUSER $DB > /dev/null

我在 Snow Leopard 上没有这样的错误,并且这个脚本在我的 arch linux 机器上继续运行良好。仅在我升级到 Lion 后,此脚本才因分段错误而失败。

知道可能是什么问题吗?如果没有明显的直接答案,请指出正确的方向来调试此脚本或在 Mac OS X Lion 上找到问题的根源就可以了!:-)

更新

我进一步隔离了这个问题,可能将其归咎于 postgresql 9.0.5。具体来说,当行:

zcat "$F" | psql -q -f - -U $DBUSER $DB >/dev/null

正在执行(我在终端中一一手动运行命令),我从 postgresql 收到“分段错误:11”错误,如下所示:

zcat "$F" | psql -q -f - -U mysitedbuser mysitedb >/dev/null
psql:-:32: ERROR:  relation "acl_dummy" already exists
psql:-:46: ERROR:  relation "acl_dummy_id_seq" already exists
Segmentation fault: 11

这是我在 Lion 上使用的 psql 版本:

$ psql --version
psql (PostgreSQL) 9.0.5
contains support for command-line editing

$ which psql
/opt/local/lib/postgresql90/bin/psql

$ psql -U postgres
psql (9.0.5)
Type "help" for help.

postgres=# 

有什么建议我还能做什么?

4

2 回答 2

3

Xcode 4.2 编译的 postgresql 包会出现问题(将 postgresql90 和 postgresql91 都搞砸了)。(见https://trac.macports.org/ticket/30090

解决方案是在 ~/ports/databases/postgresql90/Portfile 中编写自己的 Portfile,方法是在第 9 行的某处附加:

revision:      1

并将某处附加到第 40 行:

if {${configure.compiler} == "clang"} { 
configure.compiler llvm-gcc-4.2 
}

然后,从 /opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/databases/postgresql90/files 复制整个“文件”子目录

确保在 /opt/local/etc/macports/sources.conf 中,添加

file:///Users/whateveryourusernameis/ports

在指向 url 之前

rsync://rsync.macports.org/release/tarballs/ports.tar [default]

然后在 ~/ports 中执行 portindex 或执行 sudo port -v selfupdate。

最后卸载之前clang编译的postgresql90包,清理一下:

sudo port -v uninstall postgresql90 postgresql90-server
sudo port clean postgresql90 postgresql90-server

然后重新安装:

sudo port -v install postgresql90 postgresql90-server

在这个重新安装步骤中,您应该在标准输出中注意到您的 postgresql90 包现在正在由 llvm-gcc-4.2 编译。

作为通过 MacPorts 编译包的一般说明,我们可以使用此处的建议来选择用于特定包(端口)的编译器 - https://trac.macports.org/wiki/PortfileRecipes#compiler

于 2011-10-25T05:43:58.130 回答
0

实际上,postgres90@9.0.6 已经包含了这个修改。

您只需执行以下命令即可升级:

sudo port -v uninstall postgresql90
sudo port -v install postgresql90

postgresql91 也是如此

于 2012-01-13T14:19:08.257 回答