PostgreSQL - 将每个表转储到不同的文件中

时间:2013-08-20 08:27:45

标签: sql database postgresql postgresql-9.1 pg-dump

我需要从PostgreSQL数据库的多个表中提取SQL文件。这是我到目前为止所提出的:

pg_dump -t 'thr_*' -s dbName -U userName > /home/anik/psqlTest/db_dump.sql

但是,如您所见,所有以前缀thr开头的表都将导出到单个统一文件(db_dump.sql)。我总共有近90个表来提取SQL,所以必须将数据存储到单独的文件中。

我该怎么办?提前致谢。

4 个答案:

答案 0 :(得分:14)

如果您乐于对表列表进行硬编码,但只希望每个表都在不同的文件中,您可以使用shell脚本循环多次运行pg_dump命令,在表中替换每次围绕循环命名:

for table in table1 table2 table3 etc;
do pg_dump -t $table -U userName dbName > /home/anik/psqlTest/db_dump_dir/$table.sql;
done;

编辑:可以通过psql运行查询并将结果反馈到循环而不是硬编码列表来扩展此方法以动态获取表列表:

for table in $(psql -U userName -d dbName -t -c "Select table_name From information_schema.tables Where table_type='BASE TABLE' and table_name like 'thr_%'");
do pg_dump -t $table -U userName dbName > /home/anik/psqlTest/db_dump_dir/$table.sql;
done;

此处psql -t -c "SQL"运行SQL并输出没有页眉或页脚的结果;由于只选择了一列,因此$(command)捕获的输出的每一行都会有一个表名,而你的shell将一次循环一个。

答案 1 :(得分:4)

自PostgreSQL版本9.1(2011年9月)以来,在进行备份时可以使用目录格式输出

和2个版本/ 2年后(PostgreSQL 9.3), - job / -j使得并行备份每个对象的效率更高

但是我在原始问题中无法理解的是,您使用的-s选项仅转储对象定义(架构),而不是数据。

如果你想要数据,你不应该使用-s而是-a(仅数据)或没有选项来使用模式+数据

所以,要备份目录dbName_objects /上有10个并发作业/进程的数据库dbName以'th'开头的所有对象(表...)(增加服务器上的负载):

  

pg_dump -Fd -f dbName_objects -j 10 -t'thr_ *'-U userName dbName

(如果你想要对象的数据或架构,也可以使用-a / -s)

因此,目录将使用toc.dat(所有对象的内容表)和每个对象的一个​​文件(.dat.gz)以压缩形式填充

每个文件都以它的对象编号命名,您可以使用以下pg_restore命令检索列表:

  

pg_restore --list -Fd dbName_objects / | grep'TABLE DATA'

为了让每个文件都不被压缩(在原始SQL中)

  

pg_dump --data-only --compress = 0 --format = directory --file = dbName_objects --jobs = 10 --table ='thr_ *' - username = userName --dbname = dbName

答案 2 :(得分:0)

这个bash脚本将使用每个表一个文件进行备份:

#!/bin/bash

# Config:
DB=dbName
U=userName
# tablename searchpattern, if you want all tables enter "":
P=""
# directory to dump files without trailing slash:
DIR=~/psql_db_dump_dir

mkdir -p $DIR
AUTH="-d $DB -U $U"
TABLES="$(psql -d $DB -U $U -t -c "SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE' AND table_name LIKE '%$P%' ORDER BY table_name")"
for table in $TABLES; do
  echo backup $table ...
  pg_dump $ -t $table > $DIR/$table.sql;
done;
echo done

答案 3 :(得分:0)

(没有足够的声誉评论正确的帖子) 我使用你的脚本进行了一些修改和一些修改供我自己使用,对其他人可能有用:

#!/bin/bash

# Config:
DB=rezopilotdatabase
U=postgres
# tablename searchpattern, if you want all tables enter "":
P=""
# directory to dump files without trailing slash:
DIR=~/psql_db_dump_dir

mkdir -p $DIR
TABLES="$(psql -d $DB -U $U -t -c "SELECT table_name FROM 
information_schema.tables WHERE table_type='BASE TABLE' AND table_name 
LIKE '%$P%' ORDER BY table_name")"
for table in $TABLES; do
  echo backup $table ...
  pg_dump $DB -U $U -w -t $table > $DIR/$table.sql;
done;
echo done

(我想你忘了在pg_dumb命令中添加$ DB,我添加了一个-w,对于一个自动脚本,最好不要有psw提示我想,为此,我创建了一个〜/。带有密码的pgpass文件 我还给了用户命令,知道要获取哪个密码.pgpass) 希望有一天能帮到某人。