2011-08-26 4 views
3

저는 50 개가 넘는 테이블이있는 db에 대해 pg_dump 파일을 생성해야합니다. psql 커맨드 라인을 통해 이것을 수동으로 수행하는 방법을 알고 있지만 수동으로 수행하는 것보다 빠른 방법이 있어야한다고 생각합니다. 프로그래밍 방식으로 어떤 방법을 제안합니까? 예를 들어, 펄 스크립트가 pg_dump를 호출 할 수 있습니까? 내가 제대로 질문을 이해한다면pg_dump 개별 테이블 - 루프에서 수행 할 수 있습니까?

+2

정말로 각 테이블을 자신의 것으로 덤프해야합니까? 외래 키 제약 조건을 위반하지 않고 어떤 테이블을 어떤 순서로 복원해야하는지 어떻게 알 수 있습니까? – DrColossos

+0

수정 : 전체 테이블이 아닌 테이블 스키마 만 폐기하고있었습니다. – Elisa

답변

3

후 다음 배쉬 스크립트는 충분합니다 :

#!/bin/bash 

for table in `psql -Atc "\dt" | cut -d '|' -f2` 
do 
    pg_dump -Fp -t $table -f $table.dump; 
done 

그것은 일부 데이터베이스 내의 모든 테이블의 목록을 가져옵니다하고 각 pg_dump -t을 실행합니다. , 아마도 다음과 같은 당신의 테이블이 여러 스키마로 구성하는 경우

#!/usr/bin/perl 

@tables = qx/psql -Atc "\\dt" | cut -d '|' -f2/; 
foreach (@tables) 
{ 
    chomp($_); 
    system("pg_dump -Fp -t $_ -f $_.dump"); 
} 
+0

쿼리를 작성하는 사용자의 search_path에있는 테이블 만 잡습니다. LEFT pg_catalog 가입 더 나은 방법 pg_catalog.pg_class C로부터 "소유자"로 c.relname "이름"으로 "스키마", pg_catalog.pg_get_userbyid (c.relowner) 로' SELECT n.nspname를 사용하는 수 있습니다 .pg_namespace n ON n.oid = c.relnamespace 어디 c.relkind IN ('r', '') AND n.nspname이 아닌 ('pg_catalog', 'information_schema') AND n.nspname! ~ '^ pg_toast ' ;'테이블 목록을 얻으려면. – gsiems

+0

@gsiems : 당신은 [search_path'] (http://www.postgresql.org/docs/current/interactive/runtime-config-client.html)에 대해 옳습니다 (좀 더 엄격하게 말하면 ['pg_table_is_visible']에 관한 것입니다) ('\ dt'에있는 http://www.postgresql.org/docs/current/interactive/functions-info.html#FUNCTIONS-INFO-SCHEMA-TABLE). 그러나이 테이블이없는 한, 이것은 나에게 과도한 것처럼 보입니다. 여러 스키마에 분산되어 있습니다 (search_path는이 문제를 처리하기 위해 설정되지 않았습니다). 물론 솔루션이 더 포괄적입니다. –

+0

감사합니다. perl 스크립트가 올바른 방향으로 저를 보냈습니다. 시스템을 인식하지 못했습니다. 명령 전에. – Elisa

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 파일을 사용한다는 가정이 있습니다.

관련 문제