我的任务是为一个有 50 多个表的数据库创建 pg_dump 文件。我知道如何通过 psql 命令行手动执行此操作,但我相信必须有一种比手动执行每个操作更快的方法。关于如何以编程方式进行的任何建议?例如,perl 脚本可以调用 pg_dump 吗?
user511345
问问题
2057 次
3 回答
2
如果我正确理解了您的问题,那么遵循 Bash 脚本就足够了:
#!/bin/bash
for table in `psql -Atc "\dt" | cut -d '|' -f2`
do
pg_dump -Fp -t $table -f $table.dump;
done
它获取某个数据库中所有表的列表并pg_dump -t
为每个表执行。
如果您愿意,这里是 Perl 等价物:
#!/usr/bin/perl
@tables = qx/psql -Atc "\\dt" | cut -d '|' -f2/;
foreach (@tables)
{
chomp($_);
system("pg_dump -Fp -t $_ -f $_.dump");
}
于 2011-08-26T21:26:24.900 回答
0
如果您的表被组织成各种模式,那么以下内容可能对您有用:
#!/usr/bin/env perl
use strict;
use warnings;
my $database_name = 'book_library';
my $query = <<"EOT";
SELECT n.nspname as table_schema,
c.relname as table_name
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
AND n.nspname NOT LIKE '^pg_%'
;
EOT
$query =~ s/\n\s*/ /g;
my @results = `echo "$query" | psql -At $database_name`;
foreach (@results) {
chomp;
my ($schema, $table) = split /\|/, $_;
next unless ($schema && $table);
my $cmd = "pg_dump -U postgres -Fp -t $schema.$table -f $schema.$table.dump $database_name";
system($cmd);
}
请注意,您必须适当地设置 $database_name 变量,并且假设您使用的是 .pgpass 文件。
于 2011-08-27T17:23:22.167 回答
-3
pg_dumpall 是转储整个数据库的工具
http://www.postgresql.org/files/documentation/books/aw_pgsql/node265.html
于 2011-08-26T23:35:37.683 回答