コンテンツにスキップ

Top

Windows の Laravel で DB のバックアップ & レストア

Laravel の データベース のデータをバックアップしたりレストアしたりしたい。

phpMyAdminでエクスポートしてインポートしようとか思ったけど、その場合、テーブルがdropされているわけではないので普通に重複エラーになる。

dbをdropしてからcreate db をして云々というのも考えたが、なんか毎回それやるの面倒。

エクスポートするときに詳細な設定ができるけど、詳細すぎてあばばっばばばってなる。

なので、もっと簡単にレストアできるSQL文を排出してくれる方法を調べたら、Laravel自身にバックアップする機能があることが判明。

その機能を使って出力した sql 文は何の問題もなくレストアできることがわかったので以下に記す。

バックアップはLaravelの機能で

phpMyAdminにもエクスポート機能はあるわけですが、この機能で出力して出てくるsql文は 詳細設定でいろいろごちょごちょしないと、ただのcreate table とinsertみたいなのしかなく、正直、レストア時に面倒です。

ので、 Laravel の持つ機能でバックアップします。

まずcomposer で lkaravel-backup を入れましょう。

composer require spatie/laravel-backup

この時、以下のようなエラーが出る場合があります。

composer require spatie/laravel-backup

Using version ^8.4 for spatie/laravel-backup
./composer.json has been updated
Running composer update spatie/laravel-backup
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - spatie/laravel-backup v8.x-dev requires illuminate/console ^9.0 -> found illuminate/console[v9.0.0-beta.1, ..., 9.x-dev] but these were not loaded, likely because it conflicts with another require.
    - spatie/laravel-backup 8.4.0 requires illuminate/console ^10.10.0 -> found illuminate/console[v10.10.0, ..., 10.x-dev] but these were not loaded, likely because it conflicts with another require.
    - Root composer.json requires spatie/laravel-backup ^8.4 -> satisfiable by spatie/laravel-backup[8.4.0, v8.x-dev].

You can also try re-running composer require with an explicit version constraint, e.g. "composer require spatie/laravel-backup:*" to figure out if any version is installable, or "composer require spatie/laravel-backup:^2.1" if you know which you need.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.
バージョンがおかしいずら、と言われているので、以下を実施しましょう。

composer require spatie/laravel-backup:*

なにやらどばばばばばーと入ってしまいました。まぁよしとします。

次にバックアップ用の設定ファイルを作成しましょう。

php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
これにより、/config/backup.php が生成されているはずです。

特に変更はしません。

ではバックアップしましょう。

php artisan backup:run --only-db
Starting backup...
Dumping database db_name...
Backup failed because The dump process failed with a none successful exitcode.
Exitcode
========
1: General error

Output
======
<no output>

Error Output
============

....

おや?(ログは省略しましたが)ものすごい量のエラーが出てしまいました。

理由は mysqldump.exeのある場所にパスが通ってないからなんですね。

ので環境変数のpathにC:\xampp\mysql\binのパスを通してあげましょう。

とりあえずであれば、コマンドプロンプトであれば、

set PATH=%PATH%;C:\xampp\mysql\bin;
PowerShellであれば、
$ENV:Path += "C:\xampp\mysql\bin;"
とすれば一時的にパスが追加されます。

その状態でもう一度、

php artisan backup:run --only-db

Starting backup...
Dumping database db_name...
Determining files to backup...
Zipping 1 files and directories...
Created zip containing 1 files and directories. Size is 39.78 KB
Copying zip to disk named local...
Successfully copied zip to disk named local.
Sending notification failed
Backup completed!

うーん、まだエラーが出ますね。 Sending notification failed。何か送ろうとして失敗しているようです。
調べたところ、バックアップおわた、とメールを投げる機能があるそうなのですが、上記でつくったconfig/backup.phpで特に何も設定していないのでエラーになったようです。
そもそもメールとかいらん!ということで、notificationを無効にして実行します。

php artisan backup:run --only-db --disable-notifications

Starting backup...
Dumping database db_name...
Determining files to backup...
Zipping 1 files and directories...
Created zip containing 1 files and directories. Size is 39.78 KB
Copying zip to disk named local...
Successfully copied zip to disk named local.
Backup completed!
OKです!やりました!
で、どこにデータが出力されているのでしょうか?
それは、/storage/app/サーバー名/の下に、日付名のzipで出力されています。
zipのままでは使えませんのでレストアするときにはzipを解凍して出てきたsqlファイルを使います。

バックアップは以上です。

レストアはphpMyAdminのインポート機能で

まぁ、コマンドでもできるんですけどね、レストア。

ただまぁphpMayAdminでやったほうがどうせ中身は言ったか目視で確認するでしょ、ってな話。

コマンドラインだと、コマンドプロンプトとPowerShellで異なるので注意が必要です。

コマンドプロンプトの場合

mysql -uusername -ppassword db_name < C:\xampp\htdocs\server\storage\app\server\db-dumps\mysql-db_name.sql

PowerShellの場合

mysql -uusername -ppassword db_name --execute="source C:\xampp\htdocs\server\storage\app\server\db-dumps\mysql-db_name.sql"

コマンドプロンプトと違って、PowerShell は "<" が使えないのでこのような形になります。
-uの後ろにユーザー名、-pの後ろにパスワードを書くわけですが、空白があってはいけません。
ここでいうユーザー名、パスワードはMySQL作ったときに設定した値ですが、要はphpMyAdminにログインするときに使ってるやつですね。
初期値のままだと root で パスワードは無しだと思います。パスワードが無い場合は -p がいりません。
db_name のところはデータベース名です。

と、コマンドラインでも問題なくレストアできちゃいますが、phpMyAdminのインポートを使うともっと簡単です。
データベース名のリンクをクリックした状態で、インポートを選択、ファイルにバックアップしたsqlファイルを指定してあげて、画面下部のインポートボタン押したら完了です。
ただ、固まったみたいな感じで待たされるのでちょっとあれですが...

以上、Laravelのデータベースのバックアップレストアでした!