web-dev-qa-db-ja.com

PostgreSQL:データベースからスキーマを1つだけバックアップし、それを別のサーバーに復元する方法

2つのスキーマ「B」と「C」を持つ「A」という名前のデータベースがあります。別のサーバーでスキーマ "B"をバックアップおよび復元したいのですが?私はPostgresを初めて使用するので、これを行う方法がわかりません。 「A」という名前の新しいサーバーに新しいDBを作成してから、スキーマ「B」を復元する必要がありますか? plsはコマンドに役立ちます。

--- Peterの回答に関するコメントからの情報:

スキーマ "B" +データをバックアップおよび復元したい。次に、Ubuntu 12.04で実行されているPostgresql 9.1について言及するのを忘れていました。

23
user30422

Pg_dumpの-nオプションを使用して、ダンプするスキーマを選択できます。スキーマBのダンプを作成します。

pg_dump ...other...options... -Fc -n B >dump.dmp

ダンプファイルを復元します。

pg_restore -d somedb dump.dmp

ターゲットデータベースは、元のデータベースと同じ名前である必要はありません。

スキーマBがスキーマCに依存している場合は問題が発生することに注意してください。そうすると、スキーマBを個別に復元することができなくなります。

17

パラメータ-n [schema name]を追加できます。このパラメータのコメントは次のとおりです:

-n schema
--schema=schema

スキーマに一致するスキーマのみをダンプします。これにより、スキーマ自体とそれに含まれるすべてのオブジェクトの両方が選択されます。このオプションが指定されていない場合、ターゲットデータベース内のすべての非システムスキーマがダンプされます。

10
yosaku01
  • Pg_dumpツール( pg_dump doc を参照)およびpg_restore( pg_restore doc を参照)を使用できます
  • 新しいサーバーに新しいデータベース名「A」を作成する必要はありません。

*基本的な例:

ダンプ/復元するウィンドウに「dump.bat」と「restore.bat」ファイルを作成します

1 /バックアップ:

"C:\Program Files\PostgreSQL\9.1\bin\pg_dump.exe" --Host localhost --port 5432 --username "postgres" --role "postgres" --format plain --encoding UTF8 --schema-only  --file "dump_resul.sql" --schema "name_schema_B" "name_database_A" 

結果:

-- PostgreSQL database dump

-- Dumped from database version 9.1.4
-- Dumped by pg_dump version 9.1.4

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

CREATE TABLE abtb_temp (
    id bigint NOT NULL,
    app_code character varying(100)
); ....

*注:いくつかの重要なオプション:

--data-only, --format=format (ex: format=tar -> if you have a big database), --schema-only, --table=table (ex: --table=schema_name.table_name) ...

2 /復元:"C:\Program Files\PostgreSQL\9.1\bin\pg_restore.exe" --Host localhost --port 5432 --username "postgres" --dbname "any_database" --no-password --no-owner --no-privileges --schema name_schema_B --verbose "C:\dump_resul.sql"(**)

(**)実際には、フォーマットファイルが* .sqlの場合、pgAdmin(またはpsql)を使用してを復元できます。ファイルを復元するには、pg_restoreを使用する必要があります。tar(。bakup ...)

3
Luan Huynh

これを簡単にするスクリプトを書きました。 SQL関数とテーブルスキーマを個々の*.sqlファイルに簡単にエクスポートできます。管理、バックアップ、ソース管理が簡単になります。

#!/bin/sh

# Export all table schemas and functions into individual *.sql files for easy management and source control.

TEMP_WORK_PATH="/tmp/postgres"
BACKUP_ROOT_PATH="/vagrant/backup" # This is where your *.sql files will be exported at
DATABASE_NAME="myapp_db"
DATABASE_TABLES_PREFIX="myapp_"
POSTGRES_USER="postgres"
POSTGRES_PASSWORD="postgres"


[ -d $TEMP_WORK_PATH ] || mkdir -p $TEMP_WORK_PATH
rm -rf $TEMP_WORK_PATH/*

[ -d $BACKUP_ROOT_PATH ] || mkdir -p $BACKUP_ROOT_PATH
rm -rf $BACKUP_ROOT_PATH/*

mkdir $BACKUP_ROOT_PATH/tables
mkdir $BACKUP_ROOT_PATH/routines

export PGPASSWORD=$POSTGRES_PASSWORD

cd $TEMP_WORK_PATH

# Get all table schemas and write to individual files
echo "Export table schemas..."
for table in $(psql -U $POSTGRES_USER -d $DATABASE_NAME -t -c "Select table_name From information_schema.tables Where table_type='BASE TABLE' and table_name like '$DATABASE_TABLES_PREFIX%'");
do pg_dump -st $table -U $POSTGRES_USER $DATABASE_NAME > $BACKUP_ROOT_PATH/tables/$table.sql;
done;

# Get all functions in db and output to one file
echo "Getting stored functions..."
psql -U $POSTGRES_USER -At $DATABASE_NAME > $TEMP_WORK_PATH/db_functions.sql <<EOF
SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';
EOF

# Split function file into separate files per function
echo "Exporting stored functions..."
csplit -f function -b '%d.sql' db_functions.sql '/FUNCTION/' '{*}'

# Rename the function files to match the function name in the file
# then place the files into the target backup directory
counter=1
while [ -f $TEMP_WORK_PATH/function$counter.sql ]
do
  name=$(head -1 function$counter.sql | awk {'print $5'})
  name=$(echo $name | cut -d "." --f 2 | cut -d "(" --f 1)
  mv function$counter.sql $BACKUP_ROOT_PATH/routines/$name.sql
  counter=$((counter+1))
done

echo "done"

https://Gist.github.com/dantheman213/aff70ee42a11f2d1fa46983878cd62e1

0
Dan