はじめに
AWS で RDS の DB を作成すると、デフォルトで作成できる DB の環境は、"lc_collate" と "lc_ctype" が C になってない。(GUI でポチポチ作成した場合)
その為、名前 (カナ) 列とかを昇順ソートすると思い通りのソートにならない!!
C ロケール DB の作成方法と、すでにデータがある場合のデータ移行コマンド (ダンプとリストア) を記載します。
※既存の DB のロケールを C にしたいと思いますが、できないようです……
下記の環境を想定しています
- RDS(AWS)
- PostgreSQL 13
- ssh 接続で RDS を操作
もくじ
- ロケール状態確認
- PostgreSQL インストール
- RDS 接続確認
- ダンプ
- DB 作成
- リストア
- リネーム
ロケール状態確認
現在の状態を確認するコマンド
うちの DB に限って…と思ったときに a5mk2 とかで実行
lc_ctype や lc_collate は何になっていますか…
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
PostgreSQL インストール
ここからが本題
インストール前にこちらを実行
sudo apt-get update
SQL コマンドを使うために、PostgreSQL をインストール
sudo apt-get install -y postgresql-13
RDS 接続確認
psql \
--host=RDSで作成したPostgreSQLのDNS名 \
--port=RDSで作成したPostgreSQLポート番号 \
--username=RDSで作成したPostgreSQLのユーザー名 \
--dbname=RDSで作成したPostgreSQLのDB名
ダンプ
デフォルトの DB にデータが入ってて、移行させたい場合、ダンプを取得する
※今現在いる場所に出力されます
場所の確認するコマンド pwd
実行する際は、psql から切断しておいてください。コマンドは ¥q
pg_dump \
--host=RDSで作成したPostgreSQLのDNS名 \
--port=RDSで作成したPostgreSQLポート番号 \
--username=RDSで作成したPostgreSQLのユーザー名 \
--dbname=RDSで作成したPostgreSQLのDB名 \
> my_dump.pgdump
DB 作成
C ロケールのデータベース作成
※実行する際は、RDS 接続確認 の psql 接続をしてください
create database 新しく作るDB名 lc_collate='C' lc_ctype='C' template template0;
リストア
新しく作成した DB に、旧 DB のデータを反映させる
※ダンプを取得した場所で実行してください
実行する際は、psql から切断しておいてください
psql \
--host=RDSで作成したPostgreSQLのDNS名 \
--port=RDSで作成したPostgreSQLポート番号 \
--username=RDSで作成したPostgreSQLのユーザー名 \
--dbname=新しく作ったDB名 \
< my_dump.pgdump
リネーム
旧 DB 名がベストだった場合
新 DB 名を "旧DB名2" とかでとりあえず作成した方へ
まずは旧 DB を削除するコマンド
DROP DATABASE 旧DB名;
そしてリネーム
ALTER DATABASE 新DB名 RENAME TO 旧DB名;
おわりに
実装してテストして最終段階の時にあれ?ソートおかしくない?
ってなることありますよね…
……普通もっと早く気づきますかね…