環境
windows10
前提・実現したいこと
docker上のpostgresql(漢字など日本語を含む)からバックアップをして、別のdocker上のpostgresqlへリストアしたいです。
発生している問題・エラーメッセージ
バックアップ先のdockerコンテナで
PowerShell
1docker-compose exec db pg_dumpall -U postgres > dump.sql
(dbはコンテナ名)
をしてdump.sqlを作ります。
リストア先のdockerコンテナで
PowerShell
1cat dump.sql | docker exec -i db psql -U postgres
をしてリストア
リストア先のpostgresqlを中が文字化けしてしまいます。
具体的には漢字やひらがななどの日本語部分が「?」になっています。
dump.sqlの中身を見ると日本語部分が文字化けしていました。
リストア時に下記の文章がでます。
PowerShell
1ERROR: syntax error at or near "Unable" 2LINE 1: Unable to close the console
試したこと
バックアップ時のコマンドを変えてみました(-E SJISを追加)
PowerShell
1docker-compose exec db pg_dumpall -U postgres -E SJIS > dump.sql
これだとdump.sqlの中身は文字化けしていませんが、リストア後に日本語部分が「?」の文字になってしまいました。
試したこと2
データベースのコンテナに入り、エンコーディングを確認しました。
docker-compose exec db bash (Docker上のPostgreSQLコンテナに入る)
su - postgres (ルートユーザーをpostgresに変更)
psql postgres (データベースに入る)
\l
上の手順で下記結果が得られました。
PowerShell
1 List of databases 2 Name | Owner | Encoding | Collate | Ctype | Access privileges 3-----------+----------+----------+------------+------------+----------------------- 4 postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | 5 template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + 6 | | | | | postgres=CTc/postgres 7 template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + 8 | | | | | postgres=CTc/postgres 9(3 rows)
試したこと3
また、docker立ち上げの際のymlファイルを書き換えて下記の状態にもしましたが、dump.sql作成時の文字化けは解消されませんでした、、、
docker
1 db: 2 build: ./db #日本語用postgres dockerfile読み込み 3 container_name: db 4 ports: 5 - "5432:5432" 6 # トップレベルで指定したvolumeをマウントする 7 volumes: 8 - "dbdata:/var/lib/postgresql/data" 9 environment: 10 POSTGRES_PASSWORD: password # settings.pyで設定した値と同じにする 11 POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=ja_JP.UTF-8" # ←追記 Localeの初期値
と設定ファイルを書き換えて得られたものが↓
PowerShell
1 List of databases 2 Name | Owner | Encoding | Collate | Ctype | Access privileges 3-----------+----------+----------+-------------+-------------+----------------------- 4 postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | 5 template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + 6 | | | | | postgres=CTc/postgres 7 template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + 8 | | | | | postgres=CTc/postgres 9(3 rows)
試したこと4
docker
1 db: 2 image: postgres:11 3 container_name: db 4 ports: 5 - "5432:5432" 6 # トップレベルで指定したvolumeをマウントする 7 volumes: 8 - "dbdata:/var/lib/postgresql/data" 9 environment: 10 POSTGRES_PASSWORD: password # settings.pyで設定した値と同じにする 11 POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C" # ←追記 Localeの初期値
と設定ファイルを書き換えて得られたものが↓
PowerShell
1 List of databases 2 Name | Owner | Encoding | Collate | Ctype | Access privileges 3-----------+----------+----------+---------+-------+----------------------- 4 postgres | postgres | UTF8 | C | C | 5 template0 | postgres | UTF8 | C | C | =c/postgres + 6 | | | | | postgres=CTc/postgres 7 template1 | postgres | UTF8 | C | C | =c/postgres + 8 | | | | | postgres=CTc/postgres 9(3 rows)
この状態でもdump.sql作成時の解消されませんでした、、、
試したこと4
postgresqlの中で「SHOW client_encoding;」コマンドを打つと、
「SQL_ASCII」が出力されました。
おそらくclient_encodingの設定を変えればうまくいくのではと思います。
そのためにpostgresql.confを書き換える必要があるようです。
https://qiita.com/ihatov08/items/72bb5bd4feeef87e77a5
↑を参考にして
postgresql.confの中身を
#client_encoding = sql_ascii ↓ client_encoding = utf8
に書き換えましたが、SHOW client_encoding;→SQL_ASCIIは変更されませんでした。
どうやらpostgresql.confよりもpostgresql.auto.confの設定のほうが優先されるらしく、postgresql.auto.confの設定を変える方法を現在調べ中です。
補足情報
また、
docker-compose exec db bash (Docker上のPostgreSQLコンテナに入る)
su - postgres (ルートユーザーをpostgresに変更)
psql postgres (データベースに入る)
\encoding
では下記の結果が得られました。
PowerShell
1SQL_ASCII
補足情報2
下記サイトを参考にしました。
https://qiita.com/dtan4/items/5147a3f858d5919965c9
補足情報3
dump.sqlの中身は↓です。
https://github.com/masuda-u/dockerPostgresql/blob/main/dump.sql