【发布时间】:2017-12-11 09:45:07
【问题描述】:
我正在使用下面的 shell 脚本转储数据库以分隔 CSV 文件:
PGENGINE=$PGHOME/bin
PGPASSWORD=$1 $PGENGINE/psql -p $2 -h $3 -U $4 -Atc "select tablename from pg_tables where schemaname='public'" $5 |\
while read TBL; do
echo "Exporting table "$TBL
PGPASSWORD=$1 $PGENGINE/psql -p $2 -h $3 -U $4 -c "COPY public.$TBL TO STDOUT WITH CSV HEADER DELIMITER '"$SEPARATEUR_CSV"'" $5 > /$ROOT_PATH/$6/$TBL.csv
echo -e $TBL ": Export done\n"
done
这在我的测试数据库上运行良好,但我担心在生产数据库上运行它会发生什么。
我看到很多主题说 pg_dump 获取数据锁定,但我不知道 psql COPY,包括我正在对所有表进行循环这一事实。我需要确保如果用户更新我的一个表,COPY 命令仍将获得正确的数据和正确的 FK。
我的问题:
您认为这是一种正确的做法吗?存储过程在数据一致性方面是否更安全?
实现这一目标的最有效方法是什么? (因为这个生产数据库非常大 - 有些表超过 3000 万行)。
【问题讨论】:
-
您实际上是在复制
pg_dump正在做的事情。pg_dump获取的“锁”与普通 SELECT 将获取的内容以及您的 COPY 语句也获取的内容相同。它只是为了防止该表上的并发 DDL 语句,不会阻塞其他任何内容。 -
感谢您的精确。有没有办法锁定所有表或所有相关表(关于 FK)?或者也许我可以通过存储过程来实现这一点?
-
你为什么要这样做?为什么你认为你需要锁定所有的表?
-
假设有一个表 A 与表 B 的 FK。如果某些用户可以在 B 锁定时修改表 A,反之亦然,当我尝试重新加载时可能会出现一些 FK 冲突来自创建的 CSV 文件的数据库。不是吗?
-
pg_dump创建数据库的一致转储(截至数据库启动时)。无需阻止对数据库的更改。
标签: postgresql psql postgresql-9.4 consistency pg-dump