Menggunakan MySQL Database Server tidak jarang kita temui error yang entah kenapa itu terjadi misalnya seperti MySQL 1045 Error Access Denied. Yang menjadi alasan sulit diatasi mungkin karena pesan yang tidak kita perhatikan secara detail sehingga menjadi sulit untuk diatasi.
MySQL menggunakan kode unik untuk merujuk pada error tertentu, jadi sebenarnya bisa kita lihat langsung didokumentasi resminya. Seperti contoh di atas kode 1045 mungkin kalian pernah alami atau saat ini mengalaminya. Mari kita lihat beberapa hal pemicu error tersebut.
1. Terhubung ke Host yang salah
[dev@server]# mysql -u root -p12345
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)
Jika tidak secara spesifik terhubung ke host tertentu (-h flag), MySQL client akan mencoba akses ke localhost yang mungkin sebenarnya kita ingin akses ke host lain. Jadi perlu kita cek kembali akses yang ingin kita gunakan.
[dev@server]# mysql -u root -p12345 -h -P 3306
2. User tidak ditemukan
[dev@server]# mysql -u newuser -p12345 -h localhost
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'newuser'@'localhost' (using password: YES)
Pastikan user yang digunakan ada tersimpan didalam tabel user. Jika tidak ditemukan, bisa kita buat dulu user tersebut. Bisa dibilang menggunakan non-root user adalah best practice dan jangan dibiasakan menggunakan root user.
mysql> SELECT User FROM mysql.user WHERE User='newuser';
Empty set (0.00 sec)
mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'sekret';
Query OK, 0 rows affected (0.00 sec)
3. Client tidak ada permission access
[dev@server]# mysql -u newuser -p12345
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'newuser'@'localhost' (using password: YES)
Bisa kita cek informasinya melalui perintah berikut ini:
dsini
mysql> SELECT Host, User FROM mysql.user WHERE User='newuser';
+-------------+-------------+
| Host | User |
+-------------+-------------+
| 172.17.0.1 | newuser |
+-------------+-------------+
1 row in set (0.00 sec)
Lalu kita bisa lihat dari IP mana client mencoba akses ke database.
[dev@server]# ip address | grep inet | grep -v inet6
inet 127.0.0.1/8 scope host lo
inet 172.17.0.20/24 brd 172.17.0.255 scope global dynamic wlp3s0
Untuk mengatasi ini cukup tentukan IP yang kita gunakan di client, atau cara yang paling mudah adalah dengan menggunakan tanda '%' yang otomatis akan memperbolehkan akses dari segala IP.
mysql> CREATE USER 'newuser'@'%' IDENTIFIED BY '12345';
Query OK, 0 rows affected (0.00 sec)
4. Password salah
Hal ini mungkin saja terjadi, kita lupa password atau kita sudah ganti password dan tidak mengingat password yang baru. Cara mengeceknya cukup mudah, pastikan kolom forgotten sama dengan kolom authentication_string, dan pastikan juga password yang kita gunakan sudah benar untuk user dan host yang sesuai.
mysql> SELECT authentication_string, PASSWORD('123456') FROM mysql.user WHERE User='newuser';
+-------------------------------------------+---------------------------+
| authentication_string | PASSWORD('123456') |
+-------------------------------------------+---------------------------+
| *827CCB0EEA8A706C4C34A16891F84E7B | *E10ADC3949BA59ABBE56E057F20F883E |
| *827CCB0EEA8A706C4C34A16891F84E7B | *E10ADC3949BA59ABBE56E057F20F883E |
+-------------+-------------+-------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
Mudahnya, kita bisa ganti password langsung dengan perintah berikut:
mysql> set password for 'newuser'@'%' = 'abc123';
Empty set (0.00 sec)
5. Symbol pada password di Convert
Ini pernah saya alami, ternyata kendala ada di terminal yang digunakan, password otomatis dikonversi oleh Bash. Untuk mengatasinya, gunakan passwrod dalam tanda petik (').
[dev@server]# mysql -u newuser -pstrong!pas$word
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'nonexistant'@'localhost' (using password: YES)
[dev@server]# mysql -u newuser -p'strong!pas$word'
mysql: [Warning] Using a password on the command line interface can be insecure
...
mysql>
Jika kalian tidak punya akses sama sekali ke dalam MySQL shell, berikut ini beberapa langkah yang bisa digunakan untuk mengatasinya.
- Matikan service MySQL
- Modifikasi my.cnf dan tambahkan skip-grant-tables dibawah [mysqld]. Pada MySQL versi 8.x, efek dari config tersebut sudah otomatis berjalan (hanya berlaku untuk localhost)
- Nyalakan kembali service MySQL
- Akses dengan user root: mysql -u root -h localhost
- Ganti password dengan yang baru: UPDATE mysql.user SET authentication_string=PASSWORD(‘abc123’) WHERE User=’root’ and Host=’localhost’;
- Matikan service MySQL
- Hapus skip-grant-tables dari [mysqld] (jika kalian tambahkan sebelumnya)
- Nyalakan kembali MySQL
Dengan begitu kita sudah bisa kembali mendapatkan akses ke MySQL dengan user root. Itulah beberapa kendala dan cara menangani masalah yang terkait dengan MySQL 1045 Error Access Denied. Semoga dapat membantu kalian, selamat mencoba dan jangan lupa berikan komentar jika masih terkendala.
Sumber: percona
Headline image: kinsta