Cadangan (backup) adalah salinan data yang dapat dipulihkan ketika data aslinya rusak, terhapus, atau hilang. Pada MySQL, cadangan paling lazim dibuat dengan alat baris perintah mysqldump, yang menghasilkan berkas berisi pernyataan SQL. Topik ini membahas pembuatan dump dengan mysqldump, status alat mysqlpump yang telah dinyatakan deprecated, artinya masih ada tetapi tidak lagi dikembangkan, serta latihan pemulihan penuh dari nol hingga jumlah baris terbukti kembali sama. Setelah membacanya, siklus cadangan dan pemulihan pada basis data latihan dapat dilalui dari ujung ke ujung dengan bukti keluaran nyata.
Membuat dump dengan mysqldump#
mysqldump membaca struktur dan isi basis data, lalu menuliskannya sebagai rangkaian pernyataan SQL: DROP TABLE, CREATE TABLE, dan INSERT untuk setiap tabel. Karena berkasnya berupa SQL biasa, dump tersebut dapat dibaca, dipindahkan antarversi, dan dijalankan ulang oleh klien mysql pada basis data mana pun. Basis data perpustakaan disiapkan terlebih dahulu lewat berkas skema berikut.
-- tidak-dijalankan
DROP DATABASE IF EXISTS perpustakaan;
CREATE DATABASE perpustakaan;
USE perpustakaan;
CREATE TABLE buku (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
judul VARCHAR(120) NOT NULL,
penulis VARCHAR(80) NOT NULL,
tahun SMALLINT UNSIGNED NOT NULL,
stok TINYINT UNSIGNED NOT NULL DEFAULT 0
);
CREATE TABLE anggota (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(80) NOT NULL,
email VARCHAR(120) NOT NULL
);
INSERT INTO buku (judul, penulis, tahun, stok) VALUES
('Dasar Basis Data Relasional', 'Dewi Sartika', 2021, 4),
('Jaringan Komputer Dasar', 'Ali Rahman', 2020, 2),
('Pengantar Statistika', 'Budi Hartono', 2022, 7),
('Pemrograman SQL untuk Pemula', 'Citra Lestari', 2023, 3),
('Struktur Data dan Algoritma', 'Dewi Sartika', 2019, 5),
('Pengantar Arsitektur Komputer','Ali Rahman', 2021, 1);
INSERT INTO anggota (nama, email) VALUES
('Ali Rahman', '[email protected]'),
('Budi Santoso', '[email protected]'),
('Citra Lestari','[email protected]'),
('Dewi Anggraini','[email protected]');# memuat skema dan data awal perpustakaan
mysql -u root < skema-perpustakaan.sqlPerintah dumpnya sederhana: nama basis data ditulis sebagai argumen, dan keluaran standarnya dialihkan ke sebuah berkas. Setelah berkas cadangan tercipta, isinya diperiksa sekilas dengan mencari baris CREATE TABLE dan INSERT untuk memastikan kedua tabel benar-benar tercakup.
# membuat berkas cadangan lalu memeriksa cakupannya
mysqldump -u root perpustakaan > cadangan-perpustakaan.sql
grep -n "CREATE TABLE\|INSERT INTO" cadangan-perpustakaan.sql25:CREATE TABLE `anggota` (
39:INSERT INTO `anggota` VALUES (1,'Ali Rahman','[email protected]'),(2,'Budi Santoso','[email protected]'),(3,'Citra Lestari','[email protected]'),(4,'Dewi Anggraini','[email protected]');
50:CREATE TABLE `buku` (
66:INSERT INTO `buku` VALUES (1,'Dasar Basis Data Relasional','Dewi Sartika',2021,4),(2,'Jaringan Komputer Dasar','Ali Rahman',2020,2),(3,'Pengantar Statistika','Budi Hartono',2022,7),(4,'Pemrograman SQL untuk Pemula','Citra Lestari',2023,3),(5,'Struktur Data dan Algoritma','Dewi Sartika',2019,5),(6,'Pengantar Arsitektur Komputer','Ali Rahman',2021,1);Kedua tabel tercakup lengkap beserta seluruh barisnya. Sebelum latihan pemulihan pada bagian ini dimulai, jumlah baris kedua tabel dicatat sebagai pembanding akhir, sebab keberhasilan pemulihan dinyatakan oleh angka, bukan oleh perasaan.
mysqldump juga melayani kebutuhan parsial melalui opsi tambahan. Opsi --no-data menghasilkan dump yang hanya berisi struktur tabel, berguna untuk menyebarkan skema ke lingkungan uji tanpa membawa data produksi, sedangkan --no-create-info menghasilkan kebalikannya, yaitu data tanpa pernyataan pembuatan tabel. Nama tabel dapat dituliskan setelah nama basis data untuk membatasi dump pada tabel tertentu saja, misalnya mysqldump -u root perpustakaan buku. Seluruh variasi itu memakai pola pemulihan yang sama, sehingga latihan pada bagian berikutnya tetap mewakili.
# mencatat jumlah baris sebelum bencana disimulasikan
mysql -t -u root <<'SQL'
SELECT COUNT(*) AS jumlah_buku FROM perpustakaan.buku;
SELECT COUNT(*) AS jumlah_anggota FROM perpustakaan.anggota;
SQL+-------------+
| jumlah_buku |
+-------------+
| 6 |
+-------------+
+----------------+
| jumlah_anggota |
+----------------+
| 4 |
+----------------+mysqlpump dan statusnya#
mysqlpump adalah alat dump generasi sebelum mysqldump modern yang menawarkan eksekusi paralel antartabel. Sejak MySQL 8.0.34, mysqlpump dinyatakan deprecated dan akan dihapus pada versi mendatang. Pesan peringatannya sendiri sudah menyarankan pemakaian mysqldump.
# memeriksa keberadaan dan status mysqlpump
mysqlpump --versionWARNING: mysqlpump is deprecated and will be removed in a future version. Use mysqldump instead.
mysqlpump Ver 8.0.46 for Linux on x86_64 (MySQL Community Server - GPL)Alat ini tetap dijalankan sekali agar perilakunya dikenal secara langsung, dengan catatan bahwa hasilnya tidak dipakai untuk latihan pemulihan pada topik ini. Keluaran diagnostik mysqlpump diarahkan ke /dev/null, lalu jumlah baris INSERT pada berkas cadangannya dihitung sebagai bukti bahwa dump paralel itu memang berisi data.
# menjalankan mysqlpump sekali untuk mengenali perilakunya
mysqlpump -u root perpustakaan > cadangan-pump.sql 2>/dev/null
grep -c "INSERT INTO" cadangan-pump.sql2Hasilnya dua, yaitu satu pernyataan INSERT untuk setiap tabel. Untuk pekerjaan cadangan baru, mysqldump tetap menjadi pilihan, sedangkan kebutuhan pencadangan berukuran besar pada instalasi modern dilayani MySQL Shell dengan utilitas util.dumpInstance yang tidak dibahas pada topik ini.
Pemulihan penuh dari nol#
Latihan pemulihan pada bagian ini dimulai dengan mensimulasikan bencana sungguhan: basis data perpustakaan dihapus seluruhnya. Percobaan membaca sesudahnya menghasilkan error 1049, yaitu konfirmasi bahwa basis data itu memang sudah tidak ada.
# mensimulasikan kehilangan basis data perpustakaan
mysql -u root -e "DROP DATABASE perpustakaan;"
mysql -u root -e "SELECT COUNT(*) FROM perpustakaan.buku;"ERROR 1049 (42000) at line 1: Unknown database 'perpustakaan'Pemulihan berjalan ke basis data baru bernama perpustakaan_pulih agar prosesnya terlihat bersih: basis data tujuan disetel ulang dari nol dengan DROP DATABASE IF EXISTS, kemudian berkas dump dijalankan terhadap basis data itu oleh klien mysql.
# memulihkan dump ke basis data baru
mysql -u root -e "DROP DATABASE IF EXISTS perpustakaan_pulih; CREATE DATABASE perpustakaan_pulih;"
mysql -u root perpustakaan_pulih < cadangan-perpustakaan.sqlTahap terakhir pada latihan ini adalah pembandingan. Jumlah baris pada basis data hasil pemulihan dihitung dan disandingkan dengan catatan sebelum bencana, yaitu 6 buku dan 4 anggota.
# membandingkan jumlah baris hasil pemulihan
mysql -t -u root <<'SQL'
SELECT COUNT(*) AS jumlah_buku FROM perpustakaan_pulih.buku;
SELECT COUNT(*) AS jumlah_anggota FROM perpustakaan_pulih.anggota;
SQL+-------------+
| jumlah_buku |
+-------------+
| 6 |
+-------------+
+----------------+
| jumlah_anggota |
+----------------+
| 4 |
+----------------+Angka yang sama pada kedua sisi menandakan pemulihan penuh berhasil. Apabila nama aslinya ingin dikembalikan, basis data hasil pemulihan cukup dijadikan sumber dump baru, atau tabel-tabelnya dipindahkan dengan RENAME TABLE sebagaimana dibahas pada topik Basis Data dan Skema.
Kesalahan umum#
Kesalahan pertama adalah memiliki cadangan yang tidak pernah dipulihkan. Berkas dump yang gagal dibaca, terpotong, atau tidak lengkap baru diketahui justru pada saat bencana, sehingga terlambat. Latihan pemulihan pada topik ini menunjukkan pola yang benar: setiap cadangan diuji dengan dipulihkan ke basis data lain lalu dihitung ulang isinya.
Kesalahan kedua adalah lupa membuat basis data tujuan sebelum memulihkan. Dump yang dibuat dengan mysqldump -u root perpustakaan tidak memuat pernyataan CREATE DATABASE, sehingga klien menolak berkasnya dengan error 1049 apabila basis data tujuan belum ada. Bentuk mysqldump --databases perpustakaan menyertakan pernyataan pembuatannya, dan perbedaan kedua bentuk ini perlu diketahui sebelum memulihkan di bawah tekanan.
Kesalahan ketiga adalah memakai mysqlpump untuk pekerjaan baru. Alat itu dinyatakan deprecated sejak MySQL 8.0.34 dan dijamin dihapus pada versi mendatang, sehingga skrip cadangan yang dibangun di atasnya pasti rusak saat peningkatan versi. Skrip baru ditulis dengan mysqldump atau MySQL Shell.
Ringkasan#
- mysqldump menghasilkan berkas berisi pernyataan SQL yang dapat dijalankan ulang oleh klien mysql pada basis data mana pun.
- mysqlpump masih tersedia tetapi deprecated sejak MySQL 8.0.34, sehingga pekerjaan cadangan baru memakai mysqldump atau MySQL Shell.
- Pemulihan penuh terdiri atas pembuatan basis data tujuan, eksekusi berkas dump, dan pembandingan jumlah baris dengan catatan sebelum bencana.
- Dump hanya menangkap satu titik waktu, dan pemulihan titik waktu menyusul perubahan memerlukan binlog.
Referensi#
- mysqldump — A Database Backup Program — Oracle — Opsi mysqldump, termasuk perbedaan dump satu basis data dengan bentuk –databases.
- mysqlpump — A Database Backup Program — Oracle — Catatan resmi status deprecated mysqlpump sejak MySQL 8.0.34.
- Backup and Recovery Types — Oracle — Klasifikasi cadangan fisik dan logis serta konsep pemulihan titik waktu.