追記(2015.8.6)PostgreSQL 9.5ではもっと簡単で、846日の記事にしました。


要約:
一昨日の続きです。pgAdmindblinkを使いました。下のSQLが全ての手順。
import_udig_sample.sqlSelectRawtextBitbucket
CREATE DATABASE udig;
CREATE EXTENSION dblink;
CREATE EXTENSION postgis; -- assume 2.0+ for TypMod

-- optional setting: schema
-- CREATE SCHEMA hoge;
-- SET search_path TO hoge, public;

-- connect to remote DB
SELECT dblink_connect('
    host=www.refractions.net
    port=5432
    dbname=demo-bc
    user=demo
    password=demo
');

-- border, 5199 rows
-- this srid is 4326, the others 3005)
CREATE TABLE bc_border AS
SELECT * FROM dblink('SELECT * FROM bc_border') t (
    gid int,
    border_id int,
    the_geom geometry(Linestring, 4326));
ALTER TABLE bc_border ADD PRIMARY KEY (gid);

-- hospitals, 44 rows
CREATE TABLE bc_hospitals AS
SELECT * FROM dblink('SELECT * FROM bc_hospitals') t (
    gid int,
    id int2,
    authority varchar(25),
    name varchar(42),
    the_geom geometry(Point, 3005));
ALTER TABLE bc_hospitals ADD PRIMARY KEY (gid);

-- municipality, 162 rows
CREATE TABLE bc_municipality AS
SELECT * FROM dblink('SELECT * FROM bc_municipality') t (
    gid int,
    code int2,
    name varchar(40),
    the_geom geometry(Polygon, 3005));
ALTER TABLE bc_municipality ADD PRIMARY KEY (gid);

-- pubs, 417 rows
CREATE TABLE bc_pubs AS
SELECT * FROM dblink('SELECT * FROM bc_pubs') t (
    gid int,
    id int2,
    name varchar(55),
    address varchar(47),
    city varchar(20),
    province varchar(17),
    postal varchar(7),
    the_geom geometry(Point, 3005));
ALTER TABLE bc_pubs ADD PRIMARY KEY (gid);

-- voting areas, 7986 rows
CREATE TABLE bc_voting_areas AS
SELECT * FROM dblink('SELECT * FROM bc_voting_areas') t (
    gid int,
    code varchar(3),
    id varchar(8),
    riding varchar(29),
    region varchar(29),
    "number" varchar(4),
    ndp int,
    lib int,
    gp int,
    upbc int,
    vtotal int,
    vreject int,
    vregist int,
    the_geom geometry(Multipolygon, 3005));
ALTER TABLE bc_voting_areas ADD PRIMARY KEY (gid);

-- disconnect from remote DB
SELECT dblink_disconnect();

実行環境はWindows 7 32bit + PostgreSQL Portable 9.4.1 + PostGIS 2.1.5。上記のSQLを実行すると、下のようになります(コピー先スキーマをhogeに設定)。テーブルサイズ合計は約14MB。先方のDBの送出速度が遅いので、約100秒かかりました。

短い説明
もともとuDigチュートリアル用のDBですが、接続クライアントがuDigに限定されてなく、利用上の制約も特に見当たらないのでコピーしてみました。テーブル定義のジオメトリ列に、PostGIS 2.0から導入された簡単な書き方(TypMod、型修飾子、下記参照)を使っています。

»Boundless : PostGIS 2.0 New Features: Typmod


pg_dumpは使えず
最初pg_dumpで取得できるか試したところ、テーブルにserial型があって駄目。pg_dumpが自動的に連番の元の情報(シーケンスのテーブル)を見に行き、こちらのアクセス権限がないのでエラーになります。下の例と同じ。

»Stack Overflow : Dump a table without sequence table in postgres


テーブル定義を手動でコピー
そこで、テーブル定義を一つずつ確認しSQLを作成することに。pgAdminでサンプルDBに接続し、オブジェクトブラウザで各テーブルをクリックすればSQLペインにテーブル定義が出るので ↓ 手動でコピーして控え。DB接続に必要なパラメータは一昨日の記事の冒頭にあります。


ところでpgAdminで接続する際、「このpgAdminがサポートするPostgreSQL8.4から9.4だけど、接続先は違うよ?」と警告が出ます。接続してPostgreSQLのバージョンを見ると8.3でした。


PostgreSQL8.3と古く、
PostGIS Support MatrixによればPostGIS 2.0以降がサポートされていないので、おそらく先方のPostGIS1.x系。テーブル定義にジオメトリ列への制約が3つ付いていますが ↓PostGIS 2.0以降ではもっと簡単になりました。画像の下が少し詳しい説明。
-- PostGIS 1.x
CREATE TABLE hoge (
    gid int,
    geom geometry,
    
    -- Dimension
    CONSTRAINT enforce_dims_geom CHECK (ndims(geom) = 2),
    
    -- Geometry Type
    CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL),
    
    -- SRID
    CONSTRAINT enforce_srid_geom CHECK (srid(geom) = 4326)
);

-- PostGIS 2.x using TypMod
CREATE TABLE hoge (
    gid int,
    geom geometry(LineString, 4326) -- 2D LineString, SRID 4326
);


dblinkでデータ取得とテーブル作成を同時に
外部DBに接続してデータを持ってくるには、dblinkpostgres_fdwという拡張が使えます。後者の方が新しいですが、今回は経験のあるdblinkを概ね下のように使いました。最初に外部DBに接続、次にテーブルをSELECTしてそのままコピー先DBのテーブルに保存。ここでテーブルの列名・型を指定する必要があり、先ほどpgAdminでコピーし控えておいたテーブル定義文を使います。その際、ジオメトリ列への制約は使わずTypModに書き換え。
-- connect to remote DB
SELECT dblink_connect('
    host=
    port=
    dbname=
    user=
    password=
');

-- create table and import data
CREATE TABLE fuga AS
SELECT * FROM dblink('SELECT * FROM remote_table') AS t (
    column1 columntype,
    column2 columntype,
    column3 columntype,,,
    -- paste from DDL using TypMod
);

-- disconnect from remote DB
SELECT dblink_disconnect();

上のひな形で各テーブルのCREATE ... AS SELECT文を作り、主キーを追加したのが冒頭のSQL。これを実行してサンプルDBをローカルにコピーできました。テーブル定義を一つずつ手動で控えるのが手間でしたが、pgAdmin上で作業が完結したので良しとします。