web-dev-qa-db-ja.com

ソースデータベースと同じロケール設定でPostgreSQLデータベースを復元する

Ubuntu 14.04 LTS本番マシンにPostreSQL 9.xデータベースがあります。私の開発マシンはWindows 7ベースで、PostreSQL 9.yを提供しています。

開発マシンでUbuntu PostreSQLデータベースを復元したい。

Ubuntuデータベースは次のロケール設定を使用していることに気付きました。

  • 文字セットエンコーディング= UTF8
  • 照合順、文字列のソート順= en_US.UTF-8
  • 文字タイプ、文字分類= en_US.UTF-8

ロケールを指定せずにWindowsマシンでデータベースを復元すると、次のように設定されます

  • 文字セットエンコーディング= UTF8
  • 照合順、文字列のソート順= German_Germany.1252
  • 文字タイプ、文字分類= German_Germany.1252

私の計画では、開発マシンのデータベースを、Ubuntuマシンのデータベースと可能な限り同じにすることです。したがって、私の考えは、まずWindowsマシン上にプロダクションが一致するロケールでデータベースを作成し、次にUbuntuデータベースprod-db.backupバックアップファイルをその作成されたデータベースに復元することでした。

createdb --Host=localhost --username=postgres --encoding=Unicode --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8 --owner=prod prod-db
pg_restore --Host=localhost --username=postgres --format=custom prod-db.backup --dbname=prod-db

Windowsのcreatedbがエラーinvalid locale name en_US.UTF-8で不平を言うので、このアイデアは機能しません。

Windowsロケール名 を含むUbuntuロケール名と一致する template0テンプレートデータベースen_US.UTF-8en_us_utf8などのさまざまなロケール識別子を試してみると、インターネットに散在していることがわかりましたが、解決策は機能しません。

  • Ubuntuのen_US.UTF-8と一致するWindowsのロケール識別子はありますか?
  • または、ロケールGerman_Germany.1252en_US.UTF-8と同じ(十分)なので、ロケールを気にせず、ロケールを気にする必要はありません。クエリ結果などの側面に関して、データベースクエリが同じように動作することを確認したいセット注文。
5
Abdull

これらは、PostgreSQL 9.5データベース(en_US.UTF-8エンコーディングを使用してLinuxにエクスポートされた)のコピーをWindows 7上のPostgreSQL 9.3またはWindows 8.1上のPostgreSQL 9.5にインポートするための正確な手順です。 SQLファイルをロードする前に、適切なエンコーディングでデータベースを作成する必要があります。そうしないと、Linuxからのエンコーディング(en_US.UTF-8)により、デフォルトのエンコーディングを使用するようにWindowsに要求されます。

REM WARNING: Console code page (65001) differs from Windows code page (1252) 8-bit characters might not work correctly. See psql reference page "Notes for Windows users" for details.
chcp 1252

C:\PostgreSQL\9.5\bin\psql.exe -U postgres -d postgres_password -c "CREATE DATABASE my_db WITH TEMPLATE=template0 ENCODING='UTF-8' LC_COLLATE='american_usa' LC_CTYPE='american_usa'"

REM Grant privileges to the appropriate database user.
C:\PostgreSQL\9.5\bin\psql.exe -U postgres -d postgres_password -c "GRANT ALL PRIVILEGES ON DATABASE my_db TO myuser"

REM Import my_db.sql. Ignore the following error (it comes from a line in the SQL file, but we have already created the database with the correct locale, so we are ok):
REM psql:my_db.sql:22: ERROR:  invalid locale name: "en_US.UTF-8"

C:\PostgreSQL\9.5\bin\psql.exe -o nul --quiet -U postgres -d postgres_password -f my_db.sql

ここ で説明したように、Windowsのロケールはamerican_usa(Windows 7)である必要があります。 Windows 8.1では、american_usaまたはen-US(UNIXのen_USではなく)のいずれかが機能します。

4
vallismortis