Penyiapan Lingkungan

Menginstal MySQL 8.0, mengenal klien mysql, opsi Docker, dan memuat basis data contoh sakila.

Daftar isi

Topik ini menyiapkan lingkungan latihan MySQL dari awal. Pembahasannya mencakup pemasangan MySQL 8.0 pada Debian dan Ubuntu, alternatif berupa kontainer Docker, pengenalan klien mysql, serta pemuatan basis data contoh sakila. Server pada sandbox jalur ini sudah terpasang dan berjalan, sehingga perintah yang aman dieksekusi ditampilkan bersama keluarannya, sedangkan perintah pemasangan yang memerlukan hak istimewa dan internet hanya ditampilkan sebagai contoh.

Menginstal MySQL 8.0 pada Debian dan Ubuntu#

Distribusi Ubuntu menyediakan paket mysql-server pada repositorinya, dan sejak Ubuntu 20.04 paket tersebut berisi MySQL 8.0. Pemasangan cukup dilakukan dengan dua perintah apt berikut. Perintah pertama memperbarui indeks paket, sedangkan perintah kedua memasang server beserta klien dan dependensinya. Kedua perintah memerlukan sudo dan koneksi internet, sehingga bloknya ditandai sebagai contoh dan tidak dieksekusi di sandbox.

bash
# tidak-dijalankan
# memasang MySQL 8.0 dari repositori Ubuntu
sudo apt-get update
sudo apt-get install mysql-server

Pada Debian murni, repositori bawaan tidak selalu menyediakan MySQL. Jalur yang direkomendasikan dokumentasi resmi adalah memasang repositori APT MySQL terlebih dahulu, yang kemudian menyediakan paket mysql-server terbaru beserta pembaruan rutinnya. Panduan lengkapnya dirujuk pada bagian Referensi, dan langkah terakhir kedua jalur sama saja, yaitu apt-get install mysql-server.

Setelah pemasangan selesai, layanan server dijalankan otomatis oleh systemd. Statusnya diperiksa dengan sudo systemctl status mysql, sedangkan pengerasan keamanan awal, seperti penentuan password root dan penghapusan pengguna anonim, dilakukan melalui program mysql_secure_installation. Program itu berjalan secara interaktif dan menanyakan keputusan keamanan satu per satu, sehingga cukup dijalankan sekali pada awal pemasangan.

bash
# tidak-dijalankan
# memeriksa layanan dan menjalankan pengerasan keamanan awal
sudo systemctl status mysql
sudo mysql_secure_installation

Menjalankan MySQL dengan Docker#

Alternatif yang tidak menyentuh sistem operasi induk adalah menjalankan MySQL sebagai kontainer Docker. Pendekatan ini memisahkan seluruh berkas MySQL dari komputer utama dan memudahkan pergantian versi. Seluruh pemasangan dapat dibuang bersih begitu kontainernya dihapus. Perintah berikut membuat kontainer bernama mysql-latihan dari citra resmi mysql:8.0. Perintah itu ditampilkan sebagai contoh karena memerlukan Docker dan unduhan citra dari internet.

bash
# tidak-dijalankan
# menjalankan server MySQL 8.0 sebagai kontainer Docker
docker run --name mysql-latihan -e MYSQL_ROOT_PASSWORD=rahasia -p 3306:3306 -d mysql:8.0

Opsi -e mengatur password root dari variabel MYSQL_ROOT_PASSWORD, sedangkan opsi -p membuka port 3306 di komputer utama. Apabila data harus bertahan setelah kontainer dihapus, tambahkan volume melalui opsi -v mysql-latihan-data:/var/lib/mysql. Koneksi ke server kontainer dilakukan dari dalam kontainernya sendiri, sehingga klien tidak perlu dipasang di komputer utama.

bash
# tidak-dijalankan
# membuka klien mysql di dalam kontainer
docker exec -it mysql-latihan mysql -u root -p

Opsi -p tanpa nilai pada perintah di atas membuat klien meminta password terlebih dahulu, karena kontainer resmi MySQL selalu mengatur password root. Untuk menghentikan kontainer, gunakan docker stop mysql-latihan, dan untuk menghapusnya, gunakan docker rm mysql-latihan. Nama mysql-latihan pada kedua perintah itu merujuk kontainer yang dibuat sebelumnya.

Mengenal klien mysql#

Klien mysql adalah program command line yang menjadi pintu utama berinteraksi dengan server. Klien menerima pernyataan dari keyboard, mengirimkannya ke server, lalu menampilkan hasilnya di layar. Bentuk perintah yang paling umum adalah mysql -u nama_pengguna -p, yang menyambung ke server lokal dengan pengguna tertentu dan meminta password terlebih dahulu.

Setelah tersambung, klien menampilkan prompt mysql> yang menunggu pernyataan satu per satu, dan sesi ditutup dengan perintah exit. Untuk menjalankan satu pernyataan tanpa masuk ke sesi, gunakan opsi -e, sebagaimana dipakai pada blok-blok berikut. Dua pemeriksaan cepat di bawah ini memastikan klien dan server siap dipakai.

bash
# menampilkan versi klien mysql
mysql --version
text Keluaran
mysql  Ver 8.0.46 for Linux on x86_64 (MySQL Community Server - GPL)
bash
# menyambung ke server dan menanyakan versinya
mysql -t -u root -e "SELECT VERSION();"
text Keluaran
+-----------+
| VERSION() |
+-----------+
| 8.0.46    |
+-----------+

Perintah pertama hanya menjalankan klien tanpa menyambung ke mana pun, sehingga 8.0.46 pada keluarannya adalah versi klien. Perintah kedua benar-benar menyambung ke server, sehingga 8.0.46 yang muncul berasal dari jawaban server. Kedua versi tidak wajib sama dalam praktik, tetapi pada sandbox ini keduanya serumpun karena dipasang dari satu paket yang sama.

Server juga dapat diuji tanpa masuk ke pernyataan SQL sama sekali melalui utilitas mysqladmin.

bash
# menguji keberadaan server melalui mysqladmin
mysqladmin -u root ping
text Keluaran
mysqld is alive

Memuat basis data contoh sakila#

Sakila adalah basis data contoh resmi MySQL yang meniru perusahaan persewaan film fiktif bernama Sakila. Skemanya berisi 16 tabel dan 7 view yang saling berhubungan, dengan pusat kegiatan pada film (film), pemain (actor), penyewaan (rental), dan pembayaran (payment). Isinya statis dan ukurannya pas untuk latihan, sehingga sakila menjadi tempat berlatih query yang menyambung banyak tabel tanpa perlu menyiapkan data sendiri.

Sakila didistribusikan sebagai arsip zip yang berisi dua berkas SQL, yaitu sakila-schema.sql untuk struktur dan sakila-data.sql untuk isinya. Unduhan dan pemuatannya dilakukan dengan rangkaian berikut. Rangkaian ini ditandai sebagai contoh karena membutuhkan internet, dan sandbox jalur ini sudah memuat sakila sejak awal.

bash
# tidak-dijalankan
# mengunduh arsip sakila lalu memuat struktur dan datanya
wget https://downloads.mysql.com/docs/sakila-db.zip
unzip sakila-db.zip
mysql -u root < sakila-schema.sql
mysql -u root < sakila-data.sql

Keberhasilan pemuatan diverifikasi dengan menghitung baris pada tabel-tabel utamanya. Jalankan query berikut, yang menyusun jumlah baris empat tabel kunci dalam satu keluaran.

bash
# memverifikasi pemuatan sakila dengan menghitung baris tabel utamanya
mysql -t -u root -e "SELECT (SELECT COUNT(*) FROM sakila.film) AS film, (SELECT COUNT(*) FROM sakila.actor) AS actor, (SELECT COUNT(*) FROM sakila.rental) AS rental, (SELECT COUNT(*) FROM sakila.payment) AS payment;"
text Keluaran
+------+-------+--------+---------+
| film | actor | rental | payment |
+------+-------+--------+---------+
| 1000 |   200 |  16044 |   16044 |
+------+-------+--------+---------+

Keluaran menunjukkan 1000 film, 200 pemain, serta 16044 penyewaan dan pembayaran, sesuai isi resmi sakila. Jumlah objeknya juga dapat diperiksa melalui katalog information_schema.

bash
# menghitung jumlah objek yang termuat pada basis data sakila
mysql -t -u root -e "SELECT COUNT(*) AS jumlah_objek FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'sakila';"
text Keluaran
+--------------+
| jumlah_objek |
+--------------+
|           23 |
+--------------+

Dataset inilah yang dipakai untuk latihan join dan penalaan, sedangkan latihan-latihan awal membuat basis data sendiri yang kecil dan mudah dihitung ulang.

Kesalahan umum#

Kesalahan pertama adalah menyambung dengan password yang keliru atau terlewat. Server menolak koneksi semacam itu dengan pesan ERROR 1045 (28000): Access denied for user 'root'@'localhost'. Kata using password: YES atau NO di ujung pesan menyatakan apakah password memang dikirim, sehingga arah perbaikannya dapat ditentukan, yaitu melengkapi opsi -p atau memperbaiki passwordnya. Bentuk errornya dapat dilihat langsung dengan sengaja memakai password yang salah.

bash
# sengaja memakai password yang salah untuk melihat bentuk errornya
mysql -u root -psalah -e "SELECT 1;"
text Keluaran
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Tanda Warning pada baris pertama berasal dari klien itu sendiri, yaitu pengingat bahwa password yang disandingkan pada baris perintah dapat terbaca dari riwayat shell. Pesan itu wajar muncul pada demonstrasi, tetapi pada pemakaian sehari-hari, gunakan -p tanpa nilai agar password diminta melalui prompt.

Kesalahan kedua adalah menyambung padahal server tidak berjalan. Pada keadaan ini klien melaporkan ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock', yang berarti klien tidak menemukan proses servernya. Perbaikannya, jalankan layanan terlebih dahulu, misalnya sudo systemctl start mysql, baru ulangi koneksi.

Kesalahan ketiga adalah menjalankan klien interaktif di dalam blok otomatis. Klien mysql tanpa opsi -e membuka sesi yang menunggu input dari keyboard, sehingga skrip atau blok perintah otomatis berhenti di sana. Untuk eksekusi otomatis, sediakan pernyataan melalui -e, berkas SQL melalui pengalihan <, atau pipa heredoc.

Ringkasan#

  • MySQL 8.0 dipasang pada Ubuntu melalui paket mysql-server, pada Debian melalui repositori APT MySQL, atau sebagai kontainer Docker resmi mysql:8.0.
  • Klien mysql menjadi pintu utama ke server, dengan opsi -u untuk pengguna, -p untuk password, dan -e untuk eksekusi satu pernyataan.
  • Basis data contoh sakila dimuat dari arsip resmi MySQL dan terverifikasi berisi 1000 film, 200 pemain, serta 16044 penyewaan dan pembayaran.
  • Pesan Access denied menunjuk kredensial yang keliru, sedangkan pesan Can't connect menunjuk server yang tidak berjalan.

Referensi#