我需要从 PostgreSQL 数据库的多个表中提取 SQL 文件。到目前为止,这是我想出的:
pg_dump -t 'thr_*' -s dbName -U userName > /home/anik/psqlTest/db_dump.sql
但是,如您所见,所有以前缀开头的表thr
都被导出到一个统一文件(db_dump.sql
)。我总共有将近 90 个表要从中提取 SQL,因此必须将数据存储到单独的文件中。
我该怎么做?提前致谢。
我需要从 PostgreSQL 数据库的多个表中提取 SQL 文件。到目前为止,这是我想出的:
pg_dump -t 'thr_*' -s dbName -U userName > /home/anik/psqlTest/db_dump.sql
但是,如您所见,所有以前缀开头的表thr
都被导出到一个统一文件(db_dump.sql
)。我总共有将近 90 个表要从中提取 SQL,因此必须将数据存储到单独的文件中。
我该怎么做?提前致谢。
如果您乐于对表列表进行硬编码,但只是希望每个表位于不同的文件中,则可以使用 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 将一次循环遍历它们。
从 PostgreSQL 9.1 版(2011 年 9 月)开始,可以在进行备份时使用目录格式输出
和 2 个版本/2 年后(PostgreSQL 9.3),--jobs/-j 使得并行备份每个对象变得更加高效
但我在你原来的问题中不明白的是,你使用了 -s 选项,它只转储对象定义(模式),而不是数据。
如果您想要数据,则不应使用 -s 而应使用 -a (仅数据)或不使用模式+数据的选项
因此,要备份目录 dbName_objects/ 上以 'th' 开头的数据库 dbName 的所有对象(表...),同时有 10 个并发作业/进程(增加服务器上的负载):
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 '表数据'
为了不压缩每个文件(在原始 SQL 中)
pg_dump --data-only --compress=0 --format=directory --file=dbName_objects --jobs=10 --table='thr_*' --username=userName --dbname=dbName
(没有足够的声誉来评论正确的帖子)我使用您的脚本进行了一些更正和一些修改供我自己使用,可能对其他人有用:
#!/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 中获取哪个密码的命令)希望有一天这对某人有所帮助。
此 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 $AUTH -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 $AUTH -t $table > $DIR/$table.sql;
done;
echo done