Di dalam MySQL, basis data (database) adalah wadah tingkat pertama untuk tabel, view, dan objek lainnya, dan pada dokumentasi resmi istilah skema (schema) dipakai sebagai padanan langsungnya. Topik ini membahas siklus hidup basis data secara utuh: membuat dengan atribut karakter yang tepat, memeriksa keadaannya melalui information_schema, mengganti nama tanpa kehilangan data, dan menghapus dengan langkah pengamanan yang benar. Setelah membacanya, setiap tahap pada siklus hidup tersebut dapat dieksekusi melalui klien mysql dengan hasil yang terkendali.
Membuat dan memeriksa basis data#
CREATE DATABASE membuat wadah baru di dalam direktori data server. Perintah yang paling aman untuk skrip adalah bentuk dengan dua pengaman. DROP DATABASE IF EXISTS di depan menjaga agar eksekusi ulang tidak menabrak basis data lama, sedangkan penentuan CHARACTER SET serta COLLATE secara eksplisit membuat atribut karakter basis data baru tidak bergantung pada pengaturan server.
# membuat ulang basis data arsip dengan atribut karakter eksplisit
mysql -u root <<'SQL'
DROP DATABASE IF EXISTS arsip_berkas;
CREATE DATABASE arsip_berkas CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SHOW CREATE DATABASE arsip_berkas\G
SQL*************************** 1. row ***************************
Database: arsip_berkas
Create Database: CREATE DATABASE `arsip_berkas` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */Keluaran SHOW CREATE DATABASE mencatat atribut yang menempel pada basis data. Nilai di dalam komentar /*!40100 ... */ adalah pernyataan yang dieksekusi oleh MySQL versi 4.1 ke atas, sehingga hasil dump tetap kompatibel antarversi. Atribut karakter pada level basis data bersifat sebagai nilai default: setiap tabel baru mewarisinya, tetapi tabel tertentu masih boleh menggantinya dengan atribut sendiri.
Keadaan seluruh basis data pada server dapat dibaca dari tabel SCHEMATA di information_schema, yaitu skema standar SQL yang menyimpan metadata server. Query berikut menampilkan basis data yang baru dibuat beserta karakter set dan collation default-nya.
# membaca metadata basis data dari information_schema
mysql -t -u root -e "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'arsip_berkas';"+--------------+----------------------------+------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------+----------------------------+------------------------+
| arsip_berkas | utf8mb4 | utf8mb4_0900_ai_ci |
+--------------+----------------------------+------------------------+Mengganti nama basis data#
MySQL tidak menyediakan pernyataan RENAME DATABASE. Perintah semacam itu pernah ada pada versi lama, kemudian dihapus karena berbahaya: tabel dapat hilang di tengah proses tanpa perlindungan transaksi. Penggantian nama dilakukan dengan membuat basis data tujuan terlebih dahulu, lalu memindahkan tabel satu per satu.
Sarana pemindahnya adalah RENAME TABLE, yang tetap berlaku lintas basis data. Pemindahan ini bersifat atomik per tabel, yaitu tabel berpindah seluruhnya atau tidak berpindah sama sekali, dan berlangsung cepat karena hanya nama pada kamus data yang diubah, bukan isi berkasnya.
Sebagai sasaran pemindahan, tabel berkas beserta empat baris arsip disiapkan lebih dahulu pada basis data lama.
# menyiapkan tabel berkas beserta empat baris arsipnya
mysql -u root <<'SQL'
USE arsip_berkas;
CREATE TABLE berkas (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(80) NOT NULL,
ukuran_kb INT UNSIGNED NOT NULL,
kategori VARCHAR(30) NOT NULL
);
INSERT INTO berkas (nama, ukuran_kb, kategori) VALUES
('laporan-tahunan-2023.pdf', 184, 'laporan'),
('nota-pengadaan-001.pdf', 12, 'nota'),
('keputusan-direksi-07.pdf', 96, 'surat'),
('inventaris-gudang.csv', 33, 'data');
SQL# membuat basis data tujuan, lalu memindahkan tabelnya
mysql -u root <<'SQL'
DROP DATABASE IF EXISTS arsip_berkas_2026;
CREATE DATABASE arsip_berkas_2026;
RENAME TABLE arsip_berkas.berkas TO arsip_berkas_2026.berkas;
SQLSetelah RENAME TABLE dijalankan, daftar tabel pada kedua basis data menunjukkan bahwa seluruh isi kini berada di arsip_berkas_2026, sedangkan arsip_berkas menjadi kosong.
# memastikan seluruh tabel berpindah beserta isinya
mysql -t -u root <<'SQL'
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA LIKE 'arsip_berkas%' ORDER BY TABLE_SCHEMA, TABLE_NAME;
SELECT COUNT(*) AS jumlah_baris FROM arsip_berkas_2026.berkas;
SQL+-------------------+------------+
| TABLE_SCHEMA | TABLE_NAME |
+-------------------+------------+
| arsip_berkas_2026 | berkas |
+-------------------+------------+
+--------------+
| jumlah_baris |
+--------------+
| 4 |
+--------------+Basis data lama yang sudah kosong langsung dihapus, sehingga penggantian nama selesai dalam dua langkah pendek. Untuk basis data dengan puluhan tabel atau tabel berukuran besar, pola alternatifnya adalah dump dan pemulihan dengan mysqldump, yang dibahas pada topik Cadangan. Meski demikian, pemindahan lewat RENAME TABLE tetap menjadi pilihan tercepat karena tidak menyalin satu baris pun.
Atribut karakter basis data baru dapat diubah setelahnya dengan ALTER DATABASE. Perubahan ini hanya menetapkan default untuk tabel yang akan dibuat berikutnya, sehingga tabel yang sudah ada mempertahankan atributnya masing-masing.
# mengubah default karakter set, memeriksa, lalu mengembalikannya
mysql -u root <<'SQL'
ALTER DATABASE arsip_berkas_2026 CHARACTER SET latin1;
SHOW CREATE DATABASE arsip_berkas_2026\G
ALTER DATABASE arsip_berkas_2026 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SQL*************************** 1. row ***************************
Database: arsip_berkas_2026
Create Database: CREATE DATABASE `arsip_berkas_2026` /*!40100 DEFAULT CHARACTER SET latin1 */ /*!80016 DEFAULT ENCRYPTION='N' */Menghapus dengan aman#
DROP DATABASE menghapus basis data beserta seluruh isinya tanpa konfirmasi dan tanpa jalan kembali: berkas-berkas tabel pada direktori data dihapus seketika. Karena kekuatan itu, penghapusannya selalu dikawal dengan dua kebiasaan. Pertama, pernyataan yang boleh dijalankan ulang memakai IF EXISTS sehingga eksekusi kedua tidak berhenti dengan error. Kedua, sebelum penghapusan pada lingkungan kerja sungguhan, cadangan dibuat terlebih dahulu.
# penghapusan biasa berjalan, penghapusan kedua ditolak
mysql -u root -e "DROP DATABASE arsip_berkas_2026;"
mysql -u root -e "DROP DATABASE arsip_berkas_2026;"ERROR 1008 (HY000) at line 1: Can't drop database 'arsip_berkas_2026'; database doesn't existPercobaan kedua menghasilkan error 1008 karena basis data tersebut sudah tidak ada. Bentuk DROP DATABASE IF EXISTS menelan keadaan itu menjadi diam tanpa error, dan justru bentuk inilah yang dipakai di awal skrip inisialisasi pada seluruh contoh jalur ini.
Kesalahan umum#
Kesalahan pertama adalah mencari pernyataan RENAME DATABASE karena banyak sumber lama masih menyebutnya. Perintah itu sudah tidak ada pada MySQL modern, dan satu-satunya jalur yang didukung adalah memindahkan tabel dengan RENAME TABLE atau membangun ulang isi melalui dump dan pemulihan.
Kesalahan kedua adalah menulis CREATE DATABASE polos pada skrip yang dijalankan berulang. Skrip seperti itu langsung berhenti dengan error 1007 pada eksekusi kedua karena basis data sudah ada, padahal maksud pembuatnya hanya menyetel ulang keadaan awal. Pengaman DROP DATABASE IF EXISTS di depan CREATE DATABASE membuat skrip bersifat idempoten, artinya hasil akhirnya sama untuk eksekusi berapa pun.
Kesalahan ketiga adalah menganggap ALTER DATABASE mengubah karakter set tabel yang sudah ada. Nilai yang diubah hanyalah default untuk tabel baru, sehingga kolom bertipe VARCHAR pada tabel lama tetap memakai karakter set pembuatannya. Konversi tabel yang sudah berjalan memerlukan ALTER TABLE pada tabel itu sendiri.
Ringkasan#
- CREATE DATABASE disertai CHARACTER SET dan COLLATE eksplisit, dan selalu didahului DROP DATABASE IF EXISTS agar skrip dapat dijalankan ulang.
- MySQL tidak memiliki RENAME DATABASE, sehingga penggantian nama dilakukan dengan membuat basis data tujuan lalu memindahkan tabel lewat RENAME TABLE yang atomik per tabel.
- Metadata seluruh basis data dapat dibaca dari information_schema.SCHEMATA, sedangkan SHOW CREATE DATABASE menampilkan pernyataan pembuatan ulangnya.
- DROP DATABASE menghapus isi tanpa konfirmasi, memakai IF EXISTS untuk skrip berulang, dan hanya aman setelah cadangan tersedia.
Referensi#
- CREATE DATABASE Statement — Oracle — Sintaks CREATE DATABASE dan arti atribut karakter set serta collation pada level basis data.
- RENAME TABLE Statement — Oracle — Aturan pemindahan tabel lintas basis data dan sifat atomiknya.
- DROP DATABASE Statement — Oracle — Perilaku penghapusan basis data beserta isi berkasnya.
- The INFORMATION_SCHEMA SCHEMATA Table — Oracle — Daftar kolom metadata basis data pada tabel SCHEMATA.