結論
mysqldump を使う時はオプションの –result-file=dump.sql を付けた方が良い。トラブルを防げます。
問題の発端
PowerShell でこのようなコードを書いたことが元凶。
chcp 65001
& mysqldump ... > dump.sql
このdump.sql を後でリストアしようとすると、以下のようなエラーが発生しました。
mysql ... < dump.sql
... invalid character '-◻︎' ...
理由は、PowerShell のリダイレクト(>)が文字コードに余計な手を加えるため、MySql のパーサが読んでくれません。
一時回避
PowerShell 経由でファイルを読み書きしてから、MySql パーサに読ませます。一見無意味に見えますが、実際には文字コードが変わります。
Get-Content dump.sql | Out-File dump.sql.clean
mysql ... < dump.sql.clean
こちらは正しくリストアできます。ただし、dump.sql が巨大な場合はメモリ使用量が問題になり、Get-Content でエラーになります。
Stream で文字コードを変更する案もあるのですが、試したものの結局MySql パーサは読み込んでくれませんでした。
根本的な解決方法
以下のように mysqldump に –result-file オプションを明示的に指定することで解決しました。
mysqldump --result-file=dump.sql ...
この方法で出力されたファイルは余計な文字コード変換が起きず、そのままリストア可能です。
感想
結局、windows のリダイレクトが余計な気配りをしてくるのが問題でした。個人的には、Unix系OSの方がトラブルが少ないので、運用するにはそちらの方が安定すると思います。
コメントを残す