Cara Memperbaiki Error mysql_native_password di MySQL 8.4
Tutorial Database PHP #mysql #php #pdo #mysqli

Cara Memperbaiki Error mysql_native_password di MySQL 8.4

A
Abd. Asis
4 min read
Bagikan:

Upgrade MySQL ke versi 8.4 sering berakhir dengan kejutan yang tidak menyenangkan: aplikasi PHP tiba-tiba tidak bisa konek ke database sama sekali. Error yang muncul cukup spesifik —

Plugin ‘mysql_native_password’ is not loaded.

Pesan ini muncul karena MySQL 8.4 mengubah kebijakan autentikasi secara fundamental. Plugin mysql_native_password, yang selama bertahun-tahun menjadi metode autentikasi default, kini dinonaktifkan secara default. Jika pengguna database masih dikonfigurasi dengan plugin lama ini, koneksi akan langsung gagal bahkan sebelum query pertama dieksekusi.

Artikel ini membahas dua jalur penyelesaian yang tersedia, kapan masing-masing sebaiknya dipakai, dan cara memverifikasi bahwa koneksi berjalan kembali dengan benar.

Mengapa MySQL 8.4 Mengubah Perilaku Ini

MySQL memperkenalkan caching_sha2_password sebagai plugin autentikasi default sejak versi 8.0. Plugin ini menggunakan SHA-256 untuk hashing password dan menyimpan cache di memori server agar koneksi berulang lebih cepat. Keamanannya jauh di atas mysql_native_password yang menggunakan hashing SHA-1 — algoritma yang sudah dianggap tidak aman untuk sistem modern.

Di MySQL 8.4, keputusan itu dipertegas: mysql_native_password tidak lagi dimuat secara default. MySQL 9.0 melangkah lebih jauh dan menghapus plugin ini sepenuhnya. Artinya, mengandalkan pendekatan “aktifkan kembali plugin lama” hanya menunda masalah, bukan menyelesaikannya.

PHP sudah mendukung caching_sha2_password sejak versi 7.4.4. Jika aplikasi berjalan di PHP 7.4 ke atas, migrasi ke plugin baru ini tidak membutuhkan perubahan kode sama sekali — hanya perubahan konfigurasi database.

Mengidentifikasi Pengguna yang Terdampak

Sebelum mengubah apapun, periksa dulu pengguna mana saja yang masih menggunakan mysql_native_password. Login ke MySQL sebagai root atau pengguna dengan privilege yang cukup:

SELECT user, host, plugin FROM mysql.user WHERE plugin = 'mysql_native_password';

Output akan menampilkan daftar pengguna yang perlu dimigrasi. Jika hasilnya kosong, berarti masalah ada di tempat lain dan bukan di plugin autentikasi.

Contoh output yang menandakan ada pengguna terdampak:

+----------+-----------+------------------------+
| user     | host      | plugin                 |
+----------+-----------+------------------------+
| app_user | localhost | mysql_native_password  |
| api_svc  | %         | mysql_native_password  |
+----------+-----------+------------------------+

Solusi Utama: Migrasi ke caching_sha2_password

Ini adalah pendekatan yang direkomendasikan dan satu-satunya solusi yang tahan lama. Untuk setiap pengguna yang muncul di query sebelumnya, jalankan perintah ALTER USER berikut:

ALTER USER 'app_user'@'localhost'
  IDENTIFIED WITH caching_sha2_password
  BY 'password_baru_yang_kuat';

ALTER USER 'api_svc'@'%'
  IDENTIFIED WITH caching_sha2_password
  BY 'password_service_yang_kuat';

FLUSH PRIVILEGES;

Ganti nama pengguna, host, dan password sesuai konfigurasi aktual. Perintah FLUSH PRIVILEGES memastikan perubahan langsung aktif tanpa perlu restart MySQL.

Setelah migrasi, verifikasi bahwa plugin sudah berubah:

SELECT user, host, plugin FROM mysql.user WHERE user IN ('app_user', 'api_svc');

Catatan Penting soal Koneksi TCP Tanpa SSL

caching_sha2_password memiliki satu persyaratan yang perlu diperhatikan: untuk koneksi TCP (non-localhost), server memerlukan koneksi yang aman atau pertukaran kunci RSA. Koneksi via Unix socket (localhost) tidak terdampak karena dianggap sudah aman secara inherent.

Untuk koneksi TCP ke server MySQL jarak jauh, ada dua pilihan yang tersedia. Pilihan pertama adalah menggunakan SSL/TLS — ini opsi paling aman dan direkomendasikan untuk produksi. Pilihan kedua adalah mengaktifkan penggunaan RSA public key agar server bisa mengenkripsi password sebelum transmisi.

Untuk koneksi PDO dengan SSL:

// config/database.php (contoh konfigurasi PDO)
$options = [
    PDO::MYSQL_ATTR_SSL_CA   => '/etc/ssl/mysql/ca-cert.pem',
    PDO::MYSQL_ATTR_SSL_CERT => '/etc/ssl/mysql/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_KEY  => '/etc/ssl/mysql/client-key.pem',
];

$pdo = new PDO(
    'mysql:host=db.server.local;dbname=inventori',
    'app_user',
    'password_baru_yang_kuat',
    $options
);

Untuk MySQLi dengan RSA public key (tanpa SSL, cocok untuk jaringan internal yang terpercaya):

$mysqli = new mysqli('db.server.local', 'app_user', 'password_baru_yang_kuat', 'inventori');
$mysqli->options(MYSQLI_OPT_GET_SERVER_PUBLIC_KEY, true);

Opsi MYSQLI_OPT_GET_SERVER_PUBLIC_KEY meminta server untuk mengirimkan public key-nya, sehingga password bisa dienkripsi secara lokal sebelum dikirim melalui koneksi yang tidak terenkripsi.

Alternatif Sementara: Mengaktifkan Kembali Plugin Lama

Jika aplikasi berjalan di PHP 7.3 atau lebih lama — versi yang belum mendukung caching_sha2_password — ada opsi untuk mengaktifkan kembali plugin lama sementara proses upgrade PHP dilakukan.

Buat file konfigurasi baru di direktori MySQL:

# /etc/mysql/conf.d/legacy-auth.cnf
[mysqld]
mysql_native_password=ON

Restart MySQL setelah menyimpan file:

sudo systemctl restart mysql

Pendekatan ini hanya boleh digunakan sebagai solusi sementara selama proses migrasi. Konfigurasi mysql_native_password=ON akan menjadi parameter tidak valid di MySQL 9.0, dan menggunakannya dalam jangka panjang berarti tetap mengekspos autentikasi dengan algoritma SHA-1 yang sudah usang.

Verifikasi Koneksi Berhasil

Setelah menerapkan salah satu solusi di atas, uji koneksi dari PHP untuk memastikan error tidak lagi muncul. Buat file uji sementara:

<?php
// Simpan sebagai test-db.php, hapus setelah selesai
try {
    $pdo = new PDO(
        'mysql:host=localhost;dbname=nama_database',
        'app_user',
        'password_baru_yang_kuat'
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->query('SELECT VERSION() AS versi_mysql');
    $hasil = $stmt->fetch(PDO::FETCH_ASSOC);

    echo 'Koneksi berhasil. MySQL versi: ' . $hasil['versi_mysql'];
} catch (PDOException $e) {
    echo 'Koneksi gagal: ' . $e->getMessage();
}

Jalankan dari terminal:

php test-db.php

Output yang diharapkan:

Koneksi berhasil. MySQL versi: 8.4.x

Jika output masih menampilkan error plugin, pastikan FLUSH PRIVILEGES sudah dijalankan dan tidak ada koneksi lama yang ter-cache di sisi aplikasi.

Kesimpulan

Error mysql_native_password di MySQL 8.4 adalah sinyal bahwa sudah saatnya meninggalkan metode autentikasi lama. Migrasi ke caching_sha2_password bukan hanya memperbaiki error ini, tapi juga mempersiapkan aplikasi untuk MySQL 9.0 yang menghapus plugin tersebut sepenuhnya. Jika ada banyak pengguna database yang perlu dimigrasi, buat skrip SQL yang mengiterasi hasil query SELECT sebelumnya agar prosesnya konsisten dan tidak ada yang terlewat.

Referensi

  1. 1MySQL 8.4 Reference Manual: Caching SHA-2 Pluggable Authentication — dev.mysql.com
  2. 2PHP Manual: MySQL PDO Driver — php.net
  3. 3PHP GitHub Issue #17182: PHP 8.3 / MySQL 8.4 / PDO / caching_sha2_password — github.com/php/php-src

Tentang Penulis

Abd. Asis

Abd. Asis

Software Developer dan Laravel Programmer dari Madura, Indonesia. Passionate tentang PHP, Laravel, dan teknologi web modern.

Komentar

Artikel Terkait

Artikel lain yang mungkin menarik untuk kamu