こんにちは、イノベーションオフィスの吉田です。
8月に入っても暑いですね。
今日は PostGIS のお話をさせていただこうと思います。
皆さんは PostGIS をご存知でしょうか?
簡単に言うと PostgreSQL で地理情報系のデータを扱うためのエクステンションの事です。
詳しくは以下も参照ください。
PostGISとは? | Let's Postgres
で、先日 PostGIS の 1.5 が入っている環境から 2.3 の入っている環境にデータを移行したのでそこら辺をまとめてみました。
0.前提
移行前後の環境は以下の通りです。
<旧環境>
自前サーバ
PostgreSQL 8.4
PostGIS 1.5
<新環境>
AWS
RDS 上の PostgreSQL 9.6
PostGIS 2.3
1.データのダンプ
ダンプはいつも通り、以下の感じのコマンドで大丈夫です。
pg_dump -Fc gis_db /tmp/gis_db.dump
2.移行先サーバでデータベースの作成
続いては以降先サーバでデータベースを作成していきます。
※今回は RDS での手順になります。
psql でログインして以下のコマンドを実行していきます。
postgres=> create database gis_db;
postgres=> \c gis_db
gis_db=> create extension postgis;
CREATE EXTENSION
gis_db=> create extension fuzzystrmatch;
CREATE EXTENSION
gis_db=> create extension postgis_tiger_geocoder;
CREATE EXTENSION
gis_db=> create extension postgis_topology;
CREATE EXTENSION
gis_db=> select postgis_version();
postgis_version
---------------------------------------
2.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
昔に比べたら PostGIS の組み込みもだいぶ簡単になりましたね・・・
3.ダンプデータのリストア
それではリストアしてみましょう。
まずは pg_restore します。
pg_restore -h ***.rds.amazonaws.com -C -d gis_db /tmp/gis_db.dump
※Warning エラー等が出ますがいったん無視しましょう。
その後 psql でログインして以下のコマンドを実行していきます。
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(geometry);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(geography);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(geometry,int4);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(geography,int4);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(int4,geometry);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(int4,geography);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(int4,geometry,int4);
DROP FUNCTION
testgis=> DROP FUNCTION IF EXISTS ST_AsGeoJson(int4,geography,int4);
DROP FUNCTION
これで作業完了です。
最後の DROP FUNCTION をしないと以下のようなエラーが出てしまいます。
function ST_AsGeoJSON is not unique
これはリストアした際に古いバージョンの関数が残ってしまっているからです。
必ず DROP FUNCTION を実行してください。
と言うわけで PostGIS のお話でした。
それでは!
書いた人:イノベーションオフィス 室長 吉田