pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

Powershell:MariaDBのdump/importで'\0'(バイナリ・ゼロ)問題、CMDで回避

結論:dump は PowerShell で OK、import は CMD を使うと安全
Win11PCのAとBでMariaDBデータを、Poweshell使ってdump/importしましたが苦戦しました。その回避はcmdを使うことでした。備忘録としてUPします。齟齬などありましたらお知らせください。

なお、MySQLのパスが通っている、PC-Bに現にあるデータベースはデータが消える、などご注意ください。

状況1:MariaDB(≒MySQL)で作っていたデータをAからBへPowershell使いましたがimport失敗

PC-A(win11)

mysqldump -u root -p --databases dbA dbB > c:\dump.sql

powershell(管理者)で上記を実行すると、パスワードを尋ねられ、指定先にsqlファイルができます。
このあと、権限関係でブロックされるのを回避するため、USBへコピペ。このUSBをPC-BのCドライブ直下へコピペ。
この場合も、管理者権限が求められ、続行を選択し、進行。

PC-B(win11)

mysql -u root -p < c:\dump.sql

ここで、最初のエラーが表示されました。
上記スクリプトの中に「<」がpowershellには使わせたくない文字との旨の赤表示でした。

状況2:CMDで同様コマンド実行したけど別エラー'\0'があると赤エラー出現

AI-Copilotに相談したら、(状況1は)CMDを使うと回避できる、とのことでした。で、実行してみると、今度は「\0」(バイナリ・ゼロ)があるのでNGとの調査結果に。
なぜ \0が入ったのか、原因探索が始まりました。

  • データベース、テーブルには含まれてない
  • テーブルにアップロードした際のCSVにもない
  • しかし、dump.sqlには\0がある

Powershellでdump.sqlのimportを試した際に失敗し、意図せず「\0」が混入する因果関係を想像

前後を確かめてみると、powershellでdump.sqlのimportを試したら失敗になり、そのタイミングでdump.sqlが破損し、\0が紛れ込んだ可能性がある――そう考えると因果関係として理解しやすい、と想像しました。

つまり、powershellでdump.sql作成→powershellでdump.sqlをimport→失敗、というタイミングで紛れ込んだ→これをcmdを使ってimportしようとすると\0がありNGになった、という流れを想像しやすいということです。

Copilotの助言に助けられ、importの際にpowershellを使わず作業する手順を選びました。

dumpはpowershell、importはcmdでやったら成功

powershellでimportを試さない、という手順で、次のような流れでした。

  1. PC-Aで、powershell使い、dump.sqlをC直下に作成
  2. PC-Aで、c:\dump.sqlをusbへコピペ
  3. PC-Bで、usbのdump.sqlをC直下へコピペ
  4. PC-Bで、CMDを使い、importする(※ココがエラー回避のポイント、今回の場合にpowershellが<を扱わないことによる)

cmdの呼び出し/使い方

cmdの呼び出し/使い方を以下に紹介します。

  1. スタート右の検索窓にcmdを入力→候補が表示されるので、管理者で実行を選択→コマンドプロンプトが点滅
  2. mysql -u root -p < c:\dump.sql を実行(powershellと同様操作)

これで dbA dbBのデータベース構造・データがPC-Bにできていることと思います。

その他の注意点:文字コード、BOM問題

今回、爺は途中でテキストエディタで開くなどの作業を行いませんでした。もしテキストエディタで開いたりするとNULL変換をはじめ、文字コード、UTF8でも BOM付などのトラップがありそうです。

dumpファイルは触らず、単にコピペだけを確実に実行する、その上で管理者権限でdump/importする、importはCMDで、というのが肝になりそうです。

Copilotが教えてくれた:PowerShell が 「<」 を嫌う理由、dump.sqlを触らないようにする訳、注目点

Copilotは次のようにもアドバイスしてくれました。

PowerShell が 「<」 を嫌う理由

PowerShell では < は「ファイルを読み込むコマンド」として予約されているため、MySQL のリダイレクトとして使えない。

dump.sqlを触らないようにする訳

• エディタが BOM を付ける可能性
• 改行コードが変わる可能性
• NULL(\0)を別の文字に変換する可能性
• 文字コードが UTF-8 以外に変わる可能性

注目点

• PowerShell は < をリダイレクトとして扱わない
• dump は PowerShell で問題ない
• import は CMD を使うと安全
• dump.sql は編集しない
• USB コピー時は管理者権限が必要な場合がある