4

我的任务是为一个有 50 多个表的数据库创建 pg_dump 文件。我知道如何通过 psql 命令行手动执行此操作,但我相信必须有一种比手动执行每个操作更快的方法。关于如何以编程方式进行的任何建议?例如,perl 脚本可以调用 pg_dump 吗?

4

3 回答 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 回答