laravel8で、s3に大量のファイルをアップロードしてるとs3keyを保持しつつmigrateしてテーブルを作り直したかったので、backup用DBインスタンスを作って避難場所にしてみた。php artisan migrate:fresh –seedした時にinsertするコードも書いてみた。同じMySQLサーバ内なら、だいたい10万レコード/秒くらいでコピーしてくれた。
既存のlaravelテーブルから、backupデータベースに同じテーブルを作成する
1 2 3 4 5 |
CREATE TABLE backup.photos AS SELECT * FROM laravel.photos; |
backupデータベースからlaravelテーブルに戻す
1 2 3 |
insert into laravel.photos SELECT * FROM backup.photos; |
バックアップしたいテーブルの分だけSQLを書く。
何十万レコードもあると、seederで毎回作るも大変なので、こうやってbackup用DBインスタンスに避難して置くと、良いと思う。
実際にやってみると、手動でSQL文を実行するのがめんどい。
php artisan migrate:fresh –seed した時に、このSQLを自動実行させたいので
database/seeders/DatabaseSeeder.phpにバックアップからレコードコピーする記述を書いておく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; // この2つを追加 use Illuminate\Support\Facades\DB; use Illuminate\Database\Query\Builder; class DatabaseSeeder extends Seeder { public function run() { // \App\Models\User::factory(10)->create(); // DB::table('laravel.photos')->insertUsing( [], function (Builder $query) { $query->select(['*'])->from('backup.photos'); } ); // SQL文でもOK。同じ構造ならカラム指定は不要 // DB::insert("insert into laravel.photos select * from backup.photos;"); } } |
同じMySQLサーバ内なら、だいたい10万レコード/秒くらいでコピーしてくれた。