EQVPS
DasborMulai

Cara memasang MySQL di VPS: pengguna, akses jarak jauh yang aman, RAM lebih hemat, dan cadangan

Pasang MySQL 8.0 di VPS Ubuntu 24.04, buat database dan pengguna untuk aplikasi, akses dari komputer Anda tanpa membuka port 3306, turunkan memori saat diam dari 383 MB ke 165 MB, dan buat cadangan setiap malam dengan skrip yang gagal secara jelas bila ada masalah.

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 077 membuat dump hanya bisa dibaca root (-rw-------), karena berisi semua data Anda.
  • pipefail membuat seluruh skrip gagal jika mysqldump gagal. Tanpanya, gzip akan menulis arsip kecil yang kosong dan melaporkan sukses. Kami sengaja merusak perintahnya, dan skrip berakhir dengan kode 2 sebagaimana mestinya.
  • find … -mtime +14 -delete menyimpan salinan dua minggu.
  • Skrip berjalan sebagai root, jadi mysqldump login 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.

FAQ

MySQL atau MariaDB?

Keduanya ada di repositori bawaan Ubuntu 24.04: mysql-server memasang MySQL 8.0 dan mariadb-server memasang MariaDB 10.11. Sebagian besar aplikasi yang meminta "MySQL" berjalan dengan keduanya. Pakai yang disebut dokumentasi aplikasi Anda, dan MySQL 8.0 jika tidak masalah. Panduan ini memakai MySQL.

Apa kata sandi root MySQL?

Tidak ada. Di Ubuntu, akun root MySQL memakai autentikasi soket: sudo mysql memasukkan Anda sebagai root, dan tidak ada yang bisa login sebagai root lewat jaringan. Biarkan begitu dan buat pengguna terpisah untuk aplikasi Anda.

Perlukah saya membuka port 3306 ke internet?

Tidak. Port database yang terbuka terus dipindai dan dicoba kata sandinya. Dari komputer Anda, sambungkan lewat tunnel SSH. Jika server lain harus terhubung langsung, izinkan hanya IP server itu, baik di MySQL maupun di firewall.

Berapa RAM yang dibutuhkan MySQL?

Tepat setelah dipasang, MySQL 8.0 memakai 383 MB di server uji kami tanpa database sendiri. Dengan Performance Schema dimatikan dan buffer pool yang sedang, turun ke 165 MB. Paket Micro 2 GB menjalankan MySQL dan sebuah aplikasi dengan lega; setelah penyetelan itu, 1 GB pun cukup untuk situs kecil.

Perlukah menjalankan mysql_secure_installation?

Di Ubuntu 24.04 sebagian besar pekerjaannya sudah beres. Pemasangan baru kami tidak punya pengguna anonim maupun database uji, dan root hanya bisa login lewat soket lokal. Jalankan jika Anda ingin komponen pemeriksa kekuatan kata sandi yang ditawarkannya; jika tidak, lewati saja.

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.