Cara Reset Password Root MySQL atau MariaDB di Ubuntu 24.04
Kehilangan password root MySQL atau MariaDB tidak mengharuskan Anda menginstal ulang server atau mengorbankan data. Selama direktori data masih utuh, password root dapat ditetapkan ulang lewat akses sudo atau berkas inisialisasi sementara. Kedua cara tersebut berlaku untuk MySQL 8.0 dan MariaDB 10.11 di Ubuntu 24.04.
Requirementsโ
- Ubuntu Server 24.04 LTS dengan akses
sudomelalui konsol atau SSH. - MySQL 8.0 (
mysql-server) atau MariaDB 10.11 (mariadb-server) sudah terpasang. - Salinan cadangan data terbaru.
Environmentโ
- OS: Ubuntu Server 24.04 LTS (x86_64).
- Database: MySQL 8.0.x atau MariaDB 10.11.x.
- Direktori data:
/var/lib/mysql. - Socket lokal:
/var/run/mysqld/mysqld.sock. - Layanan:
mysql.serviceataumariadb.service.
Gejala umumโ
Server berjalan normal tetapi login root ditolak. Gejala yang paling sering muncul:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)saat menjalankanmysql -u root -p.ERROR 1698 (28000): Access denied for user 'root'@'localhost'pada MariaDB yang memakai pluginunix_socket.sudo mysqlatausudo mariadbjustru berhasil tanpa password, sehingga tidak ada password yang bisa dipakai aplikasi.ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.saat masa berlaku password root habis.systemctl status mysqlatausystemctl status mariadbmenampilkanactive (running), jadi proses server hidup dan masalahnya ada pada autentikasi.
Penyebabโ
- Password root tidak diketahui atau catatannya keliru. Gejalanya
ERROR 1045 ... (using password: YES). Perbaikannya adalah menetapkan password baru lewatinit_filepada bagian Perbaikan. - Akun root memakai plugin autentikasi socket. MySQL bawaan Ubuntu memakai
auth_socket, sedangkan MariaDB 10.4 dan versi setelahnya memakaiunix_socket. Login dengan password ditolak, tetapisudo mysqlatausudo mariadbberhasil. Perbaikannya adalah menetapkan password lewat koneksi socket. - Host akun tidak cocok. Kredensial
'root'@'localhost'berbeda dari'root'@'127.0.0.1'atau'root'@'%', sehingga koneksi TCP ke127.0.0.1ditolak meskipun login socket berhasil. Perbaikannya adalah memakai socket atau menetapkan password untuk host yang tepat. - Password root kedaluwarsa. Error
ERROR 1862muncul dan login biasa ditolak. Perbaikannya adalah menetapkan ulang password, lalu menyesuaikandefault_password_lifetime.
Diagnostikโ
Periksa server dan layananโ
dpkg -l | grep -E '^ii +(mysql-server|mariadb-server) '
Output menampilkan paket yang terpasang, misalnya:
ii mysql-server 8.0.46-0ubuntu0.24.04.4 all MySQL database server (metapackage depending on the latest version)
Periksa layanan yang aktif. Salah satu perintah boleh gagal jika paketnya tidak ada.
systemctl is-active mysql 2>/dev/null || true
systemctl is-active mariadb 2>/dev/null || true
Output yang diharapkan adalah active untuk server yang terpasang.
Uji login socketโ
Jalankan perintah sesuai server yang terpasang. Koneksi tanpa password ini hanya berhasil jika akun root masih memakai plugin socket.
Jika memakai MySQL:
sudo mysql -N -e "SELECT VERSION(), CURRENT_USER();"
Jika memakai MariaDB:
sudo mariadb -N -e "SELECT VERSION(), CURRENT_USER();"
Jika perintah di atas berhasil, lanjutkan ke Metode 1. Jika muncul Access denied, lanjutkan ke Metode 2.
Periksa plugin rootโ
Langkah ini hanya bisa dijalankan setelah koneksi socket berhasil.
Jika memakai MySQL:
sudo mysql -N -e "SHOW CREATE USER 'root'@'localhost';"
Jika memakai MariaDB:
sudo mariadb -N -e "SHOW CREATE USER 'root'@'localhost';"
Pada instalasi bawaan Ubuntu, output MySQL menampilkan IDENTIFIED WITH 'auth_socket'. Output MariaDB menampilkan kombinasi plugin, misalnya IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket, yang berarti login tanpa password lewat socket tetap diizinkan.
Periksa log errorโ
MySQL menulis log ke berkas, sedangkan MariaDB bawaan Ubuntu mengirim log ke journal systemd.
Jika memakai MySQL:
sudo tail -n 20 /var/log/mysql/error.log
Jika memakai MariaDB:
sudo journalctl -u mariadb -n 20 --no-pager
Keduanya menampilkan baris startup terakhir. Baris Access denied menegaskan kegagalan autentikasi, bukan kegagalan proses.
Perbaikanโ
Ganti nilai GANTI_DENGAN_PASSWORD_BARU pada setiap perintah dengan password kuat pilihan Anda sebelum dijalankan. Simpan password tersebut di tempat aman. String itu adalah penanda yang harus diganti, bukan password yang dipakai.
Metode 1: Login socketโ
Gunakan metode ini jika sudo mysql atau sudo mariadb berhasil login pada langkah diagnostik.
Jika memakai MySQL:
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'GANTI_DENGAN_PASSWORD_BARU';"
Jika memakai MariaDB:
sudo mariadb -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'GANTI_DENGAN_PASSWORD_BARU';"
ALTER USER di atas mengganti autentikasi akun root. Setelah perintah berhasil, login sudo mysql atau sudo mariadb tanpa password tidak lagi menjadi satu-satunya jalan masuk. Catat password baru sebelum menutup sesi. Jika password baru salah ketik atau hilang, pulihkan akun dengan Metode 2.
Uji login dengan password baru:
mysql -u root -p'GANTI_DENGAN_PASSWORD_BARU' -e "SELECT CURRENT_USER();"
Output yang diharapkan:
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
Metode 2: Berkas init_fileโ
Gunakan metode ini jika login root sudah memakai password dan password tersebut tidak diketahui. init_file adalah system variable MySQL dan MariaDB yang menjalankan pernyataan SQL dari sebuah berkas saat server start.
Langkah 1: Catat konfigurasi saat ini agar mudah dibandingkan jika terjadi masalah.
sudo cp -a /etc/mysql /root/mysql-config-backup
Langkah 2: Hentikan layanan database. Pilih perintah sesuai server yang terpasang.
Jika memakai MySQL:
sudo systemctl stop mysql
Jika memakai MariaDB:
sudo systemctl stop mariadb
Menghentikan layanan database memutus semua koneksi aktif dan menghentikan sementara aplikasi yang memakainya. Lakukan pada jendela pemeliharaan. Jalankan sudo systemctl start mysql atau sudo systemctl start mariadb untuk memulihkan layanan.
Langkah 3: Buat berkas SQL berisi perintah reset. Berkas harus bisa dibaca oleh user sistem mysql.
Jika memakai MySQL:
sudo tee /var/lib/mysql/reset-root.sql > /dev/null <<'SQL'
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'GANTI_DENGAN_PASSWORD_BARU';
SQL
sudo chown mysql:mysql /var/lib/mysql/reset-root.sql
sudo chmod 600 /var/lib/mysql/reset-root.sql
Jika memakai MariaDB:
sudo tee /var/lib/mysql/reset-root.sql > /dev/null <<'SQL'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'GANTI_DENGAN_PASSWORD_BARU';
SQL
sudo chown mysql:mysql /var/lib/mysql/reset-root.sql
sudo chmod 600 /var/lib/mysql/reset-root.sql
Langkah 4: Aktifkan init_file lewat drop-in configuration. Berkas drop-in ini juga menyertakan skip_networking agar proses reset tetap dilayani lewat socket lokal.
Jika memakai MySQL:
sudo tee /etc/mysql/mysql.conf.d/zz-reset-root.cnf > /dev/null <<'CNF'
[mysqld]
init_file=/var/lib/mysql/reset-root.sql
skip_networking
CNF
Jika memakai MariaDB:
sudo tee /etc/mysql/mariadb.conf.d/zz-reset-root.cnf > /dev/null <<'CNF'
[mysqld]
init_file=/var/lib/mysql/reset-root.sql
skip_networking
CNF
Langkah 5: Jalankan layanan. Saat server mulai berjalan, isi reset-root.sql dijalankan dan password root diganti.
Jika memakai MySQL:
sudo systemctl start mysql
systemctl is-active mysql
Jika memakai MariaDB:
sudo systemctl start mariadb
systemctl is-active mariadb
Output yang diharapkan:
active
Langkah 6: Verifikasi login dengan password baru sebelum menghapus berkas sementara.
Jika memakai MySQL:
mysql -u root -p'GANTI_DENGAN_PASSWORD_BARU' -e "SELECT CURRENT_USER();"
Jika memakai MariaDB:
mariadb -u root -p'GANTI_DENGAN_PASSWORD_BARU' -e "SELECT CURRENT_USER();"
Langkah 7: Hapus berkas reset dan drop-in configuration, lalu restart layanan agar kembali normal.
Perintah rm berikut menghapus berkas reset sementara yang Anda buat, bukan data database. Jangan hapus berkasnya jika langkah verifikasi login belum berhasil. Jika login gagal, periksa log error dan ulangi Langkah 5.
Jika memakai MySQL:
sudo rm /etc/mysql/mysql.conf.d/zz-reset-root.cnf /var/lib/mysql/reset-root.sql
sudo systemctl restart mysql
Jika memakai MariaDB:
sudo rm /etc/mysql/mariadb.conf.d/zz-reset-root.cnf /var/lib/mysql/reset-root.sql
sudo systemctl restart mariadb
Pengujian Fungsionalโ
Uji 1: Tulis dan baca data sebagai root. Ganti nama database pada contoh jika perlu.
Jika memakai MySQL:
mysql -u root -p'GANTI_DENGAN_PASSWORD_BARU' <<'SQL'
CREATE DATABASE uji_reset;
CREATE TABLE uji_reset.akses (id INT PRIMARY KEY, catatan VARCHAR(32));
INSERT INTO uji_reset.akses VALUES (1, 'reset-berhasil');
SELECT * FROM uji_reset.akses;
DROP DATABASE uji_reset;
SQL
Jika memakai MariaDB:
mariadb -u root -p'GANTI_DENGAN_PASSWORD_BARU' <<'SQL'
CREATE DATABASE uji_reset;
CREATE TABLE uji_reset.akses (id INT PRIMARY KEY, catatan VARCHAR(32));
INSERT INTO uji_reset.akses VALUES (1, 'reset-berhasil');
SELECT * FROM uji_reset.akses;
DROP DATABASE uji_reset;
SQL
Output yang diharapkan menampilkan baris yang baru disisipkan:
+----+----------------+
| id | catatan |
+----+----------------+
| 1 | reset-berhasil |
+----+----------------+
Uji 2: Restart layanan dan login ulang. Ini memastikan password bertahan pada proses start normal, bukan hanya saat init_file aktif.
Jika memakai MySQL:
sudo systemctl restart mysql
mysql -u root -p'GANTI_DENGAN_PASSWORD_BARU' -e "SELECT 1 AS ok;"
Jika memakai MariaDB:
sudo systemctl restart mariadb
mariadb -u root -p'GANTI_DENGAN_PASSWORD_BARU' -e "SELECT 1 AS ok;"
Output yang diharapkan:
+----+
| ok |
+----+
| 1 |
+----+
Troubleshootingโ
ERROR 1045masih muncul setelah Metode 2. Periksa apakahinit_filebenar-benar dibaca denganmy_print_defaults mysqld | grep init_file. Periksa kepemilikan berkas denganls -l /var/lib/mysql/reset-root.sql, nilainya harusmysql mysql. Periksa juga/var/log/mysql/error.log.- Layanan gagal start dengan pesan
Job for mysql.service failedatauJob for mariadb.service failed. Jalankansudo journalctl -u mysql -n 30atausudo journalctl -u mariadb -n 30. Penyebab umum adalah salah tulisinit_fileatau berkas yang tidak bisa dibaca. Hapus drop-inzz-reset-root.cnf, jalankansudo systemctl start mysqlatausudo systemctl start mariadb, lalu ulangi Metode 2. ERROR 1698 (28000)pada MariaDB. Akun root memakaiunix_socket. Jalankansudo mariadb, lalu gunakan Metode 1.Can't connect to local server through socket '/var/run/mysqld/mysqld.sock' (2). Layanan belum siap atau socket belum dibuat. Periksasystemctl status mysqldan pastikan direktori/var/run/mysqldada.- Password berhasil diganti tetapi aplikasi tetap gagal terhubung. Pastikan aplikasi memakai host dan port yang benar serta akun aplikasi tersendiri, bukan akun
root.
Verifikasiโ
-
Layanan aktif setelah seluruh langkah.
systemctl is-active mysqlsystemctl is-active mariadb -
Status server dan autentikasi root.
mysqladmin -u root -p'GANTI_DENGAN_PASSWORD_BARU' statusmariadb -u root -p'GANTI_DENGAN_PASSWORD_BARU' -e "SHOW GLOBAL STATUS LIKE 'Uptime';"Output
mysqladmin statusmenampilkanUptime, jumlah thread, danQueries per second avg, sedangkan outputSHOW GLOBAL STATUSmenampilkan nilaiUptimedalam detik. Keduanya menandakan koneksi admin berhasil. -
Berkas sementara sudah tidak ada dan
init_filetidak lagi aktif.ls /var/lib/mysql/reset-root.sql 2>&1my_print_defaults mysqld | grep -c init_fileOutput yang diharapkan adalah pesan
No such file or directorydan angka0.
