Memasang MySQL hanya satu perintah. Sebagian besar pekerjaan datang sesudahnya: pengguna untuk aplikasi, cara menjangkau database dari komputer Anda tanpa menaruh port 3306 di internet, pengaturan memori untuk server kecil, dan cadangan yang berjalan tanpa Anda. Panduan ini membahas keempatnya di Ubuntu 24.04. Setiap langkah dijalankan di image Ubuntu 24.04 kami, dan angka di bawah berasal dari server itu.
Jalankan perintah sebagai pengguna dengan sudo. Panduan menyiapkan Ubuntu membuatkan satu.
1. Pasang
sudo apt update
sudo apt install -y mysql-server
mysql --version
Di server kami pemasangan memakan 51 detik dan menghasilkan MySQL 8.0.46. Ia langsung berjalan, berjalan lagi setiap boot, dan mendengarkan hanya di server itu sendiri: 127.0.0.1:3306 untuk koneksi biasa dan 127.0.0.1:33060 untuk protokol X MySQL yang lebih baru. Belum ada yang bisa dijangkau dari luar.
2. Buat database dan pengguna
Di Ubuntu, akun root MySQL memakai autentikasi soket, jadi sudo mysql memasukkan Anda tanpa kata sandi. Buat database dan pengguna untuk aplikasi Anda:
sudo mysql
CREATE DATABASE app CHARACTER SET utf8mb4;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
EXIT;
Uji dengan cara yang sama seperti aplikasi akan terhubung:
mysql -u app -p app -e "SELECT CURRENT_USER();"
Hasilnya harus app@localhost. Kata sandi yang salah mendapat ERROR 1045 (28000): Access denied for user 'app'@'localhost'. Pengguna ini bisa melakukan apa saja di dalam app dan tidak bisa apa-apa di luarnya.
3. Terhubung dari komputer Anda: tunnel SSH
Untuk memakai klien desktop seperti DBeaver, MySQL Workbench, atau baris perintah mysql di mesin Anda, jangan buka port. Teruskan satu port lewat SSH:
ssh -L 3307:127.0.0.1:3306 deploy@YOUR.SERVER.IP
Di paket NAT, tambahkan -p dan port SSH pribadi dari dasbor. Selama jendela itu terbuka, arahkan klien ke host 127.0.0.1, port 3307, pengguna app. Di sisi lokal kami memakai 3307 agar tidak bentrok dengan MySQL yang mungkin berjalan di komputer Anda. Dalam uji kami server langsung menjawab lewat tunnel, sedangkan koneksi langsung ke alamatnya di port 3306 ditolak.
4. Akses langsung untuk satu server lain
Kadang aplikasi berjalan di server kedua dan harus terhubung langsung. Untuk itu database membutuhkan paket dengan IPv4 sendiri, karena paket NAT hanya meneruskan port SSH Anda. Ada tiga perubahan, semuanya dibatasi pada alamat server aplikasi (di sini 203.0.113.20):
sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'203.0.113.20';
Jika ufw belum aktif, izinkan SSH dulu (sudo ufw allow OpenSSH), lalu jalankan sudo ufw enable. Rinciannya ada di panduan ufw.
Kami memeriksa kedua kunci secara terpisah. Dengan aturan firewall terpasang tetapi tanpa pengguna MySQL yang cocok, server menolak dengan error 1130: Host '…' is not allowed to connect to this MySQL server. Setelah pengguna ditambahkan, koneksi berhasil. Setelah aturan firewall dihapus, koneksi hanya kehabisan waktu. Alamat lain mana pun di internet mendapat kehabisan waktu yang sama.
5. Pakai RAM lebih sedikit
Saat diam dan tanpa data sendiri, MySQL 8.0 memakai 383 MB di server kami. Sebagian besarnya adalah Performance Schema, fitur diagnostik yang memesan memori di depan. Di VPS kecil, matikan fitur itu dan tentukan sendiri ukuran cache utama:
sudo tee /etc/mysql/mysql.conf.d/zz-small-vps.cnf >/dev/null <<'EOF'
[mysqld]
performance_schema = OFF
innodb_buffer_pool_size = 256M
max_connections = 50
EOF
sudo systemctl restart mysql
ps -o rss= -C mysqld
Setelah dimulai ulang, ia memakai 165 MB. Buffer pool menyimpan data dan indeks Anda di cache, dan 256 MB cocok untuk server 2 GB yang juga menjalankan aplikasi. Naikkan jika database adalah tugas utama server dan sudah lebih besar dari cache. max_connections = 50 lebih dari cukup untuk satu aplikasi dengan connection pool. Anda kehilangan statistik performance_schema. Nyalakan lagi jika suatu saat perlu menelusuri kueri lambat secara rinci.
6. Cadangan setiap malam
mysqldump --single-transaction mengambil salinan tabel InnoDB yang konsisten tanpa mengunci aplikasi. Taruh di skrip kecil:
sudo tee /usr/local/bin/mysql-backup >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
umask 077
mkdir -p /var/backups/mysql
mysqldump --single-transaction --routines --triggers app | gzip > /var/backups/mysql/app-$(date +%F).sql.gz
find /var/backups/mysql -name 'app-*.sql.gz' -mtime +14 -delete
EOF
sudo chmod 755 /usr/local/bin/mysql-backup
echo '0 3 * * * root /usr/local/bin/mysql-backup' | sudo tee /etc/cron.d/mysql-backup
sudo /usr/local/bin/mysql-backup && sudo ls -l /var/backups/mysql
Setiap baris punya alasan:
umask 077membuat dump hanya bisa dibaca root (-rw-------), karena berisi semua data Anda.pipefailmembuat seluruh skrip gagal jikamysqldumpgagal. Tanpanya,gzipakan menulis arsip kecil yang kosong dan melaporkan sukses. Kami sengaja merusak perintahnya, dan skrip berakhir dengan kode 2 sebagaimana mestinya.find … -mtime +14 -deletemenyimpan salinan dua minggu.- Skrip berjalan sebagai root, jadi
mysqldumplogin lewat soket dan tidak ada kata sandi tersimpan di berkas.
Cadangan yang belum pernah Anda pulihkan belum terhitung. Pulihkan ke database sementara dan lihat datanya:
sudo mysql -e "CREATE DATABASE app_restore"
gunzip -c /var/backups/mysql/app-2026-10-25.sql.gz | sudo mysql app_restore
sudo mysql -e "SHOW TABLES FROM app_restore"
sudo mysql -e "DROP DATABASE app_restore"
Dalam uji kami, tabel yang dipulihkan berisi baris yang sama dengan aslinya. Salinan di disk yang sama tidak melindungi Anda jika server hilang, jadi sesekali pindahkan ke mesin lain dengan scp atau restic. Managed Backups menambahkan titik pemulihan harian untuk seluruh server di atasnya.
Paket mana
Micro (2 vCPU, 2 GB, 25 GB, $5/bulan) menampung MySQL yang disetel seperti di atas plus aplikasi web. Jika database-nya sendiri melewati beberapa gigabyte, Small dengan 4 GB dan 35 GB seharga $8/bulan memungkinkan Anda memberi buffer pool 1 GB atau lebih. Keduanya paket NAT, dan tunnel SSH dari langkah 3 berjalan di sana. Langkah 4 memerlukan IPv4 sendiri: Micro-IP seharga $10/bulan.
Lebih suka PostgreSQL? Panduan PostgreSQL mengikuti rencana yang sama. Semua paket ada di VPS, dan pembayaran dengan USDT, USDC, atau ETH di jaringan Base, Ethereum, atau Polygon.
Komentar
Belum ada komentar. Jadilah yang pertama.