LaravelのDBのバックアップを取得するのに、パッケージ「Laravel Backup」が便利みたいなので、試してみました。
Introduction | laravel-backup | Spatie
ちなみに今回は、Windows 10、PHP 7.3、Laravel 5.8、MySQLの環境下で試しました。
Laravel Backupをインストール
早速ですが、composerを使用してパッケージをインストールします。
ちなみに「Laravel Backup」の現時点での最新バージョン6をインストールするためには、PHP 7.2以上、Laravel 5.8以上が必要となります。
> composer require spatie/laravel-backup
インストールが成功したら、次に以下のコマンドで設定ファイルを生成します。
> php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
設定ファイル「…/config/backup.php」が作成されました。
設定ファイルを開き、通知メールの送信先を設定します。
'mail' => [ 'to' => (通知メールの送信先),
また、APP_NAMEが日本語の場合、バックアップ出力先のフォルダ名が日本語になってしまうので、設定ファイルを調整します。
'backup' => [ // 'name' => env('APP_NAME', 'laravel-backup'), 'name' => 'laravel-backup',
バックアップを実行
以下のコマンドでバックアップを実行します。
実行すると、先ほど設定した通知メールの送信先へ、バックアップ結果がメールで通知されます。
> php artisan backup:run
バックアップ内容はソース一式とDBで、ファイル「…/storage/app/laravel-backup/2021-01-03-12-00-00.zip」が出力されます。
ちなみに、MySQLのバックアップを取得する場合、コマンド「mysqldump」が使用できる環境が必要になります。
メール通知が不要の場合は、オプション「–disable-notifications」を指定します。
> php artisan backup:run --disable-notifications
また、私の場合、laravelのソースはgitで管理してるので、DBのみのバックアップを取得したいです。DBのみのバックアップにはオプション「–only-db」を指定します。
> php artisan backup:run --disable-notifications --only-db
DBバックアップファイルからリストア
バックアップで出力されたzipファイルを解凍すると、DBのバックアップファイル「mysql-dbname.sql」があります。
これは今回のMySQLのケースでいうと、コマンド「mysqldump」で出力したファイルなので、以下のコマンドでリストアすることが可能です。
> mysql -uusername -ppassword dbname < mysql-dbname.sql
「-u」とユーザ名、「-p」とパスワードの間にスペースがない点に注意します。
また、phpMyAdminを使用している場合、画面からインポートでファイル「mysql-dbname.sql」を指定すれば、簡単にリストアすることができます。
古いバックアップファイルを削除
バックアップを実行し続けると、バックアップファイルが蓄積され続け、ストレージを圧迫することが懸念されます。
そこで、以下のコマンドで、古いバックアップファイルを削除します。通常は、バックアップ取得コマンドの前にセットで実行します。
> php artisan backup:clean --disable-notifications > php artisan backup:run --disable-notifications --only-db
ちなみに、設定ファイルの以下の項目で、クリーンコマンドを細かく調整できます。
'cleanup' => [ 'default_strategy' => [ 'keep_all_backups_for_days' => 7, 'keep_daily_backups_for_days' => 16, 'keep_weekly_backups_for_weeks' => 8, 'keep_monthly_backups_for_months' => 4, 'keep_yearly_backups_for_years' => 2, 'delete_oldest_backups_when_using_more_megabytes_than' => 5000, ], ],
日々取得したバックアップファイルの過去何日分のファイルを残すかどうか、毎週取得したバックアップファイルの過去何週間分のファイルを残すかどうか、など。また、ファイル容量が設定値をオーバーした場合に削除するなど、細かい設定が可能です。
バックアップを定期的に自動実行する
Laravelのタスクスケジュール機能を使えば、バックアップを定期的に自動実行することができます。
今回は、cron設定は割愛し、タスクスケジュールが利用できることを前提にします。
ファイル「.../app/Console/Kernel.php」を開き、先ほど実行したコマンドを追記します。
protected function schedule(Schedule $schedule) { $schedule->command('backup:clean --disable-notifications')->daily(); $schedule->command('backup:run --disable-notifications --only-db')->daily(); }
「daily()」とすることで、毎日午前0時にバックアップが実行されます。
コメントする