Cara Mengatasi MySQL Can't Connect to Local Server Through Socket di VPS Ubuntu

Apa Arti Error MySQL Socket Ini?

Anda menjalankan mysql -u root -p di VPS Ubuntu, lalu muncul pesan seperti ini:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Pesan ini sering membuat panik, padahal artinya cukup spesifik: klien MySQL mencoba terhubung lewat berkas socket Unix lokal, tetapi tidak menemukan atau tidak bisa mengakses berkas socket itu. Socket bukan port jaringan. Ia adalah berkas khusus di sistem berkas yang dipakai klien dan server MySQL di mesin yang sama untuk berbicara satu sama lain — lebih tepatnya, titik temu lokal, bukan koneksi jaringan.

Penting untuk membedakan artikel ini dari masalah MySQL lain. Artikel ini bukan tentang "too many connections" (server berjalan tetapi kehabisan slot koneksi) dan bukan tentang password salah (Access denied). Pada error 2002, klien bahkan belum sampai ke tahap otentikasi — ia tidak menemukan jalannya ke server. Karena itu solusinya berpusat pada tiga hal: apakah server berjalan, di mana letak socket yang sebenarnya, dan apakah konfigurasi klien menunjuk ke tempat yang sama.

Dokumentasi resmi MySQL menegaskan urutan diagnosis yang sama: pertama pastikan server berjalan, karena bila server tidak berjalan, klien tidak bisa terhubung. Kedua, bila server berjalan tetapi Anda memakai port, named pipe, atau socket yang berbeda dari yang didengarkan server, tentukan socket yang benar dengan opsi --socket atau temukan lewat perintah seperti netstat -ln | grep mysql.

Jawaban Singkat: Urutan Perbaikan Error 2002

  1. Periksa status layanan: sudo systemctl status mysql. Bila tidak berjalan, jalankan sudo systemctl start mysql lalu uji lagi.
  2. Bila layanan gagal start, baca log-nya dulu (sudo journalctl -u mysql dan sudo tail -n 50 /var/log/mysql/error.log) sebelum mengubah konfigurasi apa pun.
  3. Temukan socket yang sebenarnya: sudo ss -ln | grep mysql atau periksa nilai socket di konfigurasi server.
  4. Samakan konfigurasi klien dengan server, atau sambungkan sekali jalan dengan mysql --socket=/var/run/mysqld/mysqld.sock -u root -p.
  5. Bila perlu jalan pintas darurat dan server berjalan normal, sambungkan lewat TCP dengan mysql -h 127.0.0.1 -u root -p — ini melewati socket sama sekali, tetapi bukan perbaikan permanen untuk konfigurasi socket yang salah.

Jangan langsung menghapus berkas socket, mengubah kepemilikan direktori secara membabi buta, atau menginstal ulang MySQL sebelum tahu penyebabnya. Sebagian besar kasus error 2002 selesai pada langkah 1–4, dan tindakan drastis justru menambah masalah baru.

Memahami Socket: Mengapa "localhost" Berbeda dari "127.0.0.1"

Ini adalah sumber kebingungan paling umum, dan dokumentasi MySQL menjelaskannya secara eksplisit: untuk koneksi ke localhost, program MySQL mencoba terhubung ke server lokal lewat berkas socket Unix, kecuali ada parameter koneksi yang memaksanya memakai TCP/IP. Sebaliknya, bila Anda menyebut --host=127.0.0.1, klien akan memakai koneksi TCP/IP ke server lokal.

Implikasinya praktis: perintah mysql -h 127.0.0.1 yang berhasil tidak membuktikan socket Anda sehat — ia hanya membuktikan server berjalan dan menerima TCP. Sebaliknya, mysql tanpa host (yang berarti localhost) yang gagal, sementara TCP berhasil, hampir pasti menunjukkan masalah socket: server tidak berjalan, socket tidak dibuat, atau jalurnya tidak cocok. Tes perbandingan inilah yang memisahkan masalah socket dari masalah server mati total.

Di Ubuntu/Debian, jalur socket yang umum adalah /var/run/mysqld/mysqld.sock. Di instalasi lain, jalur default yang disebut dokumentasi MySQL adalah /tmp/mysql.sock. Perbedaan ini normal — yang penting adalah server dan klien menunjuk ke jalur yang sama, bukan menghafal satu jalur tertentu.

Tabel Diagnosis: Kode di Dalam Kurung dan Artinya

Angka di dalam kurung pada akhir pesan error adalah petunjuk, bukan hiasan:

Pesan / kodeArti yang paling mungkinLangkah pertama
(2) — No such file or directorySocket tidak ada: server belum berjalan, atau server membuat socket di tempat lainCek systemctl status mysql, lalu cari socket yang sebenarnya
(13) — Permission deniedSocket ada, tetapi pengguna/direktori tidak punya izin mengaksesnyaPeriksa kepemilikan dan izin direktori socket; jangan memakai chmod 777
(111) — Connection refused (pada contoh dokumentasi)Server tidak berjalan atau tidak mendengarkan di jalur tersebutSama seperti (2): pastikan server berjalan, baca log bila gagal start
Berhasil lewat -h 127.0.0.1, gagal lewat localhostServer hidup, konfigurasi socket tidak cocokSamakan nilai socket di [mysqld] dan [client]
Gagal total, termasuk lewat TCPServer tidak berjalan atau gagal startBaca error log; jangan mengutak-atik socket dulu
Error muncul setelah update/restartKonfigurasi berubah, direktori socket terhapus, atau ada proses mysqld gandaCek status, proses, dan perubahan konfigurasi terakhir

Persiapan dan Peringatan Sebelum Mengubah Apa Pun

  • Anda perlu akses sudo di VPS. Hampir semua perintah diagnosis dan perbaikan di artikel ini memakai sudo.
  • Jangan menghapus data. Jangan menghapus isi /var/lib/mysql (direktori data). Menghapus direktori data berarti menghapus database. Socket hanya berkas titik temu; data tinggal di tempat lain.
  • Backup dulu bila Anda akan mengubah konfigurasi. Salin berkas konfigurasi sebelum mengedit: sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak. Bila Anda bisa masuk ke MySQL lewat TCP, buat juga dump database penting dengan mysqldump sebelum perubahan besar.
  • Satu perubahan dalam satu waktu. Ubah satu hal, restart, uji. Bila Anda mengubah tiga hal sekaligus dan masalah hilang, Anda tidak akan tahu mana yang memperbaikinya — dan tidak akan tahu mana yang harus dikembalikan bila masalah kembali.
  • Bedakan MySQL dan MariaDB. Di Ubuntu, layanan bisa bernama mysql atau mariadb tergantung apa yang terinstal. Perintah di artikel ini memakai mysql; bila layanan Anda bernama mariadb, sesuaikan nama layanannya. Jangan menjalankan keduanya bersamaan untuk data yang sama.

Langkah 1: Periksa Apakah Server Berjalan

sudo systemctl status mysql

Bila hasilnya active (running), lanjut ke Langkah 3 — server hidup, jadi masalahnya ada di jalur socket atau izin. Bila hasilnya inactive (dead) atau failed, coba jalankan:

sudo systemctl start mysql
sudo systemctl status mysql

Bila server berhasil jalan dan error 2002 hilang, selesai — penyebabnya sesederhana server yang belum berjalan (misalnya VPS baru saja reboot dan layanan tidak aktif otomatis). Agar server selalu jalan setelah reboot, aktifkan:

sudo systemctl enable mysql

Bila server gagal start, jangan langsung melompat ke perbaikan socket. Server yang gagal start tidak akan membuat socket apa pun, sehingga mengutak-atik socket dalam kondisi ini sia-sia. Lanjut ke Langkah 2.

Langkah 2: Bila Server Gagal Start — Baca Log Dulu

sudo journalctl -u mysql --no-pager -n 100
sudo tail -n 50 /var/log/mysql/error.log

Log akan memberi tahu penyebab sebenarnya. Beberapa pola yang sering muncul:

  • Direktori data atau socket tidak bisa diakses (permission denied). Periksa kepemilikan: direktori data dan direktori socket harus dimiliki pengguna mysql. Jangan memperbaiki dengan chmod 777 — itu membuka akses ke semua pengguna dan bukan perbaikan yang aman.
  • Port atau socket sudah dipakai (address already in use / bind on unix socket). Dokumentasi MySQL tentang troubleshooting startup menyatakan kemungkinan ini: program lain — mungkin server mysqld lain — memakai port TCP atau berkas socket yang ingin dipakai mysqld. Periksa proses yang berjalan dengan ps aux | grep mysqld dan pastikan tidak ada dua server yang berebut jalur yang sama.
  • Konfigurasi tidak valid. Kesalahan ketik di berkas konfigurasi bisa menggagalkan start. Kembalikan dari berkas .bak yang Anda buat, atau periksa baris terakhir yang Anda ubah.
  • Ruang disk penuh atau direktori data rusak. Ini masalah yang lebih dalam dan berada di luar cakupan error socket semata — log akan menunjukkannya, dan penanganannya harus mengikuti isi log, bukan tebakan.

Setelah memperbaiki penyebab yang ditunjukkan log, restart dan uji lagi:

sudo systemctl restart mysql
sudo systemctl status mysql

Langkah 3: Temukan Socket yang Sebenarnya

Bila server berjalan tetapi klien tetap error 2002, cari tahu di mana server benar-benar membuat socket-nya:

sudo ss -ln | grep mysql
ls -l /var/run/mysqld/

Perintah pertama menampilkan socket yang sedang didengarkan. Perintah kedua menampilkan isi direktori socket standar Ubuntu. Bila mysqld.sock ada di sana tetapi klien mencari di tempat lain (misalnya /tmp/mysql.sock), Anda sudah menemukan ketidakcocokan jalurnya.

Anda juga bisa melihat nilai socket yang dikonfigurasi di server:

sudo grep -R "socket" /etc/mysql/

Di Ubuntu, berkas yang biasanya memegang pengaturan ini adalah /etc/mysql/mysql.conf.d/mysqld.cnf pada bagian [mysqld]. Catat nilai yang tertulis di sana — itulah jalur yang dipakai server.

Langkah 4: Uji dengan Socket Eksplisit

Sebelum mengubah konfigurasi permanen, buktikan dulu bahwa jalur yang Anda temukan memang benar:

mysql --socket=/var/run/mysqld/mysqld.sock -u root -p

Ganti jalur di atas dengan jalur yang Anda temukan pada Langkah 3 bila berbeda. Bila perintah ini berhasil masuk, diagnosis Anda terkonfirmasi: server sehat, socket ada, hanya saja konfigurasi default klien menunjuk ke tempat yang salah. Bila perintah ini tetap gagal dengan kode (13), masalahnya adalah izin — lanjut ke Langkah 6. Bila tetap gagal dengan kode (2) padahal berkas socket terlihat ada, periksa kembali: mungkin ada dua instalasi MySQL, atau direktori socket yang Anda lihat milik server lain.

Langkah 5: Samakan Konfigurasi Klien dan Server (Perbaikan Permanen)

Buka berkas konfigurasi MySQL dan pastikan kedua bagian ini menunjuk ke jalur yang sama. Contoh untuk Ubuntu:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Pastikan bagian server memuat:

[mysqld]
socket = /var/run/mysqld/mysqld.sock

Lalu pastikan ada bagian klien dengan nilai yang sama. Bila belum ada bagian [client], tambahkan di berkas konfigurasi klien yang sesuai (misalnya /etc/mysql/my.cnf atau berkas di bawah /etc/mysql/conf.d/):

[client]
socket = /var/run/mysqld/mysqld.sock

Simpan, lalu restart agar server memakai konfigurasi baru dan klien memakai jalur yang sama:

sudo systemctl restart mysql
mysql -u root -p

Perintah terakhir tanpa --socket kini harus berhasil, karena klien sudah tahu ke mana harus pergi tanpa diberitahu setiap kali.

Catatan tentang symlink sebagai jalan pintas: membuat tautan simbolik dari jalur yang dicari klien ke jalur sebenarnya (misalnya sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock) kadang dipakai sebagai perbaikan cepat. Ini bisa bekerja, tetapi rapuh — tautan bisa hilang saat reboot atau saat direktori dibersihkan, dan ia menyembunyikan ketidakcocokan konfigurasi alih-alih memperbaikinya. Gunakan symlink hanya sebagai darurat sementara, dan tetap perbaiki konfigurasinya.

Langkah 6: Bila Masalahnya Izin (Kode 13)

Bila socket ada tetapi klien mendapat permission denied, periksa kepemilikan direktori socket:

ls -ld /var/run/mysqld
ls -l /var/run/mysqld/

Direktori socket harus dimiliki mysql:mysql dan bisa diakses oleh server. Bila kepemilikannya salah — misalnya setelah pemulihan dari backup dengan pengguna yang salah — perbaiki kepemilikannya dan restart:

sudo chown mysql:mysql /var/run/mysqld
sudo systemctl restart mysql

Perhatian: /var/run adalah tmpfs yang dibersihkan saat reboot, dan systemd biasanya membuat ulang direktori socket saat layanan start. Karena itu, perbaikan izin manual yang tidak diikuti restart layanan sering tidak bertahan. Bila masalah izin kembali setiap reboot, penyebabnya ada di unit systemd atau skrip startup, bukan di perintah chown sekali jalan — periksa konfigurasi layanan, bukan mengulang chown setiap pagi.

Jangan pernah memakai chmod 777 pada direktori socket atau data. Izin terbuka lebar membuat socket bisa diakses siapa saja dan melanggar prinsip akses minimal, tanpa menyelesaikan akar masalah kepemilikan.

Jalan Pintas Darurat: Lewat TCP

Bila Anda sedang diburu waktu — misalnya situs WordPress down dan Anda harus memeriksa database sekarang — sambungkan lewat TCP:

mysql -h 127.0.0.1 -u root -p

Perintah ini melewati socket sepenuhnya. Ia berguna untuk memastikan server hidup dan untuk membuat backup darurat. Tetapi ingat batasannya: aplikasi yang dikonfigurasi memakai socket (misalnya WordPress dengan DB_HOST bernilai localhost) akan tetap gagal selama socket belum diperbaiki. TCP adalah jalan memutar, bukan perbaikan. Setelah keadaan darurat reda, kembali ke Langkah 3–5 dan perbaiki socketnya.

Verifikasi: Bagaimana Tahu Masalah Sudah Beres?

  1. sudo systemctl status mysql menampilkan active (running).
  2. mysql -u root -p tanpa opsi --socket dan tanpa -h 127.0.0.1 berhasil masuk — ini membuktikan jalur socket default sudah benar.
  3. ls -l /var/run/mysqld/mysqld.sock menampilkan berkas socket dengan kepemilikan mysql:mysql.
  4. Aplikasi yang memakai database (misalnya WordPress) bisa dibuka normal tanpa error koneksi database.
  5. Setelah reboot VPS, ulangi pemeriksaan 1–2. Socket yang hanya bertahan sampai reboot berikutnya belum benar-benar diperbaiki.

Troubleshooting Lanjutan

GejalaPenyebab yang mungkinYang dilakukan
Server tidak mau start sama sekaliKonfigurasi salah, izin direktori data, disk penuh, proses gandaBaca error log; perbaiki sesuai isi log; jangan menebak
Berhasil setelah restart, kambuh setelah rebootDirektori socket di tmpfs tidak dibuat ulang dengan benar, layanan tidak di-enablePastikan systemctl enable mysql; periksa unit systemd
Dua instalasi MySQL/MariaDB berebut socketMySQL dan MariaDB terinstal bersamaanTentukan satu yang dipakai; hentikan dan nonaktifkan yang lain
WordPress masih "Error establishing a database connection"WordPress memakai socket tetapi socket belum diperbaiki, atau kredensial di wp-config.php salahPerbaiki socket dulu; bila masih gagal, periksa DB_NAME/DB_USER/DB_PASSWORD/DB_HOST secara terpisah
Error 2002 hanya untuk satu pengguna/aplikasiKonfigurasi klien per pengguna (misalnya ~/.my.cnf) menunjuk ke socket lamaPeriksa berkas konfigurasi di home pengguna tersebut
Kode berubah dari (2) menjadi (13) setelah perbaikanSocket ketemu, tetapi izin belum benarLanjut ke Langkah 6; jangan kembali mengutak-atik jalur

FAQ

Apakah saya harus membuat berkas mysqld.sock secara manual dengan touch?

Tidak. Socket dibuat otomatis oleh server saat berjalan. Berkas kosong hasil touch bukan socket dan tidak akan membuat koneksi berhasil. Bila socket tidak ada, artinya server tidak berjalan atau membuatnya di tempat lain — cari penyebabnya, jangan memalsukan berkasnya.

Kenapa mysql -h 127.0.0.1 berhasil tapi mysql biasa gagal?

Karena keduanya memakai jalur berbeda: 127.0.0.1 memakai TCP, sedangkan tanpa host (localhost) memakai socket Unix. Keberhasilan TCP membuktikan server hidup; kegagalan localhost menunjukkan masalahnya ada di socket.

Apakah error 2002 sama dengan "too many connections"?

Tidak. Too many connections berarti server berjalan dan menolak koneksi baru karena sudah penuh. Error 2002 berarti klien tidak menemukan server lewat socket sama sekali. Penanganannya berbeda total.

Apakah aman menghapus berkas mysqld.sock yang sudah usang?

Hanya bila server sedang berhenti dan Anda yakin berkas itu sisa dari proses yang sudah mati. Jangan menghapus socket saat server berjalan. Dalam kebanyakan kasus, restart layanan yang bersih sudah cukup; penghapusan manual jarang diperlukan.

Apakah saya perlu membuka port 3306 ke internet agar socket berfungsi?

Tidak, dan jangan melakukannya. Socket lokal tidak memakai jaringan sama sekali. Membuka 3306 ke internet justru menambah risiko keamanan tanpa memperbaiki apa pun. Port 3306 hanya relevan untuk koneksi TCP jarak jauh, bukan untuk socket lokal.

Setelah diperbaiki, apakah perlu mengubah konfigurasi WordPress?

Bila WordPress memakai localhost sebagai DB_HOST, tidak — ia akan memakai socket yang sudah diperbaiki secara otomatis. Ubah konfigurasi WordPress hanya bila DB_HOST-nya memang salah atau kredensialnya bermasalah, yang merupakan masalah terpisah dari socket.

Kesimpulan

Error 2002 hampir selalu bermuara pada tiga pertanyaan berurutan: apakah server berjalan, di mana socket yang sebenarnya, dan apakah klien menunjuk ke tempat yang sama. Mulai dari status layanan, baca log bila server gagal start, temukan socket yang benar, buktikan dengan --socket eksplisit, lalu samakan konfigurasi klien dan server sebagai perbaikan permanen. TCP lewat 127.0.0.1 adalah jalan darurat yang berguna, tetapi bukan pengganti perbaikan socket. Dan satu hal yang tidak boleh dilakukan: memalsukan socket dengan berkas kosong, atau menghapus direktori data karena panik. Socket adalah titik temu — bila titik temunya sudah benar, klien dan server akan bertemu lagi dengan sendirinya.

Cookie Consent