Denen blog

株式会社電縁の社員によるブログです。

PostGISを1.5から2.3環境に移行してみた

f:id:yasuaki-sakai:20180803131049j:plain

こんにちは、イノベーションオフィスの吉田です。

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 のお話でした。

それでは!

 

書いた人:イノベーションオフィス 室長 吉田

f:id:yasuaki-sakai:20171204190702j:plain