Database adalah jantungnya suatu aplikasi secara umum. Oleh sebab itu, backup database adalah sesuatu yang penting untuk mengantisipasi jika terjadi kerusakan server yang menyebabkan database hilang atau corrupt.
Nah! Salah satu cara untuk backup database laravel adalah menggunakan Google Drive. Selain kita bisa memanfaatkan layanan Google Drive secara gratis, keamanan data juga sangat terjamin daripada kita menyiapkan arsitektur untuk backup data sendiri.
Mengaktifkan API Google Drive
Sebelum bisa menggunakan API Google Drive, kita perlu mengaktifkan API Google Drive terlebih dahulu. Caranya adalah sebagai berikut:
- Masuk ke dashboard https://console.cloud.google.com/
- Klik menu ENABLE API AND SERVICE
- Cari Google Drive API
- Klik Aktifkan
Membuat Service Account
Pada kesempatan kali ini, kita menggunakan Service Account untuk mengelola Google Drive yang akan digunakan untuk backup database Laravel. Langkahnya adalah sebagai berikut:
- Klik burger menu di pojok kiri atas
- Sorot menu APIs and Service, Pilih Credentials
- klik menu + CREATE CREDENTIAL lalu pilih Service Account
- Isikan data pada form yang telah disediakan. Klik tombol done
- Klik service account yang baru saja dibuat
- Klik Tab KEYS
- Klik menu ADD KEY dan Pilih Json lalu klik tombol Create
Tambahkan Client Email Ke Google Drive
Setelah json key berhasil dibuat maka selanjutnya buka file tersebut dan ambil client_email untuk ditambahkan ke Google Drive. Caranya sebagai berikut:
- Buat folder di google Drive
- Klik kanan folder tersebut lalu klik menu Share/Bagikan
- Paste client_email yang didapat dari json key tadi dan ubah role menjadi editor
- Klik tombol done
Tambahkan File Json Key ke Aplikasi Laravel
- Buat folder dengan nama google di dalam directory storage/app. lalu tambahkan file json key tadi ke dalam folder tersebut.
- ganti nama file menjadi service.json
Membuat Command untuk Backup Database
Command di dalam Laravel bisa dibuat menggunakan perintah php artisan make:command NamaCommand
. Pada kesempatan kali ini, kita akan membuat Command dengan nama DataBackup maka kita perlu menjalankan perintah berikut:
php artisan make:command Databackup
Setelah itu buka file Databackup.php yang terletak pada direktory App\Console\Commands
.
Ganti bagian $signature
menjadi protected $signature = 'data:backup';
Tambahkan block kode berikut pada fungsi handle:
$filename = "backup-" . Carbon::now()->format('Y-m-d') . ".sql";
// Create backup folder and set permission if not exist.
$storageAt = storage_path() . "/app/backup/";
if (!File::exists($storageAt)) {
File::makeDirectory($storageAt, 0755, true, true);
}
//create backup file
$command = "" . env('DB_DUMP_PATH', 'mysqldump') . " --user=" . env('DB_USERNAME') . " --password=" . env('DB_PASSWORD') . " --host=" . env('DB_HOST') . " " . env('DB_DATABASE') . " | gzip > " . $storageAt . 'db.sql';
$returnVar = NULL;
$output = NULL;
exec($command, $output, $returnVar);
//get json key from storage
$sa = Storage::path('/google/service.json');
//create service using json key
$client = new Client();
$client->setAuthConfig($sa);
$client->addScope(Drive::DRIVE);
$service = new Google_Service_Drive($client);
//create file inside folder we created before
$file = new Google_Service_Drive_DriveFile([
'name' => 'Backup',
'parents' => array('ID_FOLDER')
]);
$file->setName($filename);
$result = $service->files->create($file, array(
'data' => Storage::get('/backup/db.sql'),
'mimeType' => 'application/octet-stream',
'uploadType' => 'multipart'
));
$this->info($result->name . ' berhasil dibackup');
Ganti ID_FOLDER sesuai Id Folder Google Drive. Cara mendapatkannya cukup dengan klik folder di google drive yang baru saja dibuat tadi lalu lihat di address bar browser. Segmen terakhir url tersebut adalah ID folder. Contoh ID adalah seperti ini: 1NWawGvWsiTBKnou4xnV5bByFNT6SpENn
Restore Database
Cara restore database yang telah dibackup tadi adalah dengan menjalankan perintah berikut di terminal atau command prompt.
zcat /path/file/backup-2023-07-17.sql | mysql -udb_user -p db_name
- Ganti /path/file/backup-2023-07-17.sql dengan path file database
- Ganti db_user dengan username database
- ganti db_name dengan nama database