Masalah Saat Menghubungkan ke Database Saat Menggunakan MySQL 8.x

Baru-baru ini, saya membuat masalah di repositori perintah entitas WP-CLI untuk memperkenalkan wp site generateperintah yang memungkinkan penginstalan multisite dengan mudah diisi untuk tujuan pengujian.

Saya memutuskan untuk menyiapkan kotak pasir WP-CLI lokal di mesin saya (bukan dalam mesin virtual) sehingga saya dapat lebih mudah dan konsisten berkontribusi pada proyek. Ada dokumentasi bagus yang merinci bagaimana menyumbangkan kode ke proyek di buku pegangan WP-CLI . Saya akhirnya menggunakanitu wp-cli-dev repo sebaliknya, yang menyiapkan setiap paket untuk pengembangan.

Setelah saya mengatur semuanya, saya mengalami masalah koneksi database yang membutuhkan waktu cukup lama untuk mengetahuinya. Saya harap ini akan membantu menghemat waktu dan frustrasi orang lain!

MySQL 8.0 mengubah plugin otentikasi pilihandari mysql_native_password untuk caching_sha2_password,yang belum didukung PHP. Menjalankan perintah ini akan memperbaiki masalah untukitu wp_cli_test penggunadiharapkan saat menjalankan tes Behat WP-CLI

ALTER USER 'wp_cli_test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password1';

Masalahnya: Lebih Detail

Berada di MacOS, saya menggunakan Homebrew untuk menginstal berbagai paket di mesin saya. Setelahmenginstal mysql dengan Homebrew, menciptakan file yg dibutuhkan wp_cli_test database dan pengguna, dan memberikan pengguna itu hak istimewa yang diperlukan untuk database itu, saya tidak bisa menghubungkan WP-CLI (menghubungkan melalui baris perintah berfungsi dengan baik).

$ wp core install Error: Error establishing a database connection. This either means that the username and password information in your `wp-config.php` file is incorrect or we can’t contact the database server at `localhost`. This could mean your host’s database server is down.

Yang membuat situasinya semakin aneh adalah bahwa tugas-tugas database tertentu tampaknya berhasil diselesaikan.

$ wp db check Success: Database checked. $ wp db optimize Success: Database optimized.

Saya mengatasi masalah tersebut dengan rekan kerja dan mereka dapat mereproduksi masalah tersebut. Kami menggali lebih dalam dan menemukan kesalahan berikut:

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/lib/plugin/caching_sha2_password.so, 2): image not found

Setelah meneliti, saya menemukan bahwa ada beberapa variasi lain dari pemberitahuan ini.

Authentication plugin 'caching_sha2_password' is not supported

Warning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password]

Apa yang terjadi

Di MySQL 8.0, plugin otentikasi default telah diubah dari mysql_native_password untuk caching_sha2_password(di server MySQL). Ini adalah masalah ketika klien (PHP dalam hal ini) tidak mengetahui perubahan ini atau tidak mendukung plugin baru.

Kapan wp core install adalah disebut, API Database WordPress adalah bekas. Ini berarti bahwa panggilan dimulai oleh PHP sebagai klien MySQL. Kapan wp db check adalahdipanggil, hasilnya adalah mysqlcheckpanggilan langsung ke server MySQL, yang mengetahui dan mendukung otentikasi baruplugin.

HPHP tampaknya tidak memiliki dukungan untukbaru caching_sha2_password pluginnamun. Itu menjelaskan mengapa permintaan yang dimulai PHP ke database gagal.

Solusinya

Setelah beberapa pencarian dan coba-coba, saya menemukan tiga solusi yang berhasil.

Solusi Pertama

Anda dapat mengubah plugin otentikasi yang digunakan per pengguna dengan menjalankan perintah MySQL ini :ALTER USER 'wp_cli_test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password1';

Saya memilih rute ini karena saya hanya ingin mengonfigurasi satu pengguna untuk menjalankan tes WP-CLI dan saya ingin mulai menggunakan plugin otentikasi baru segera setelah didukung oleh PHP. Kegagalan koneksi di masa mendatang untuk pengguna baru akan mengingatkan saya untuk memeriksa masalah ini.

Solusi Kedua

Jika Anda ingin memperbaiki masalah untuk semua pengguna baru , Anda dapat mengedit file konfigurasi server untuk menggunakan plugin otentikasi default sebelumnya ( mysql_native_password) secara default. Untuk melakukan ini, Anda perlu menambahkan baris keitu my.cnf terletak di /etc/.Saat menguji solusi ini, saya tidak memiliki my.cnffile. Jadi, saya harus membuatnya.cd /etc sudo touch my.cnf

Tambahkan berikut ini ke file itu:default_authentication_plugin=mysql_native_password

Simpan dan keluar, lalu mulai ulang server.mysql.server restart

Catatan: Perubahan ini hanya akan berlaku untuk pengguna baru. Plugin otentikasi untuk pengguna yang dibuat setelah menginstal atau meningkatkan ke MySQL> = 8.0 tidak akan berubah. Anda perlu menerapkan solusi pertama untuk masing-masing pengguna ini.

Solusi alternatif

Ada pilihan ketiga yang bisa Anda ambil yang saya tidak terlalu merekomendasikan. Anda dapat menghapus MySQL 8.x dan menginstal 5.7.x. Secara pribadi, saya selalu mencoba bekerja menggunakan versi terbaru dari paket dan alat. Jika Anda ingin mengambil pendekatan ini, ini adalah proses yang menurut saya paling berhasil (ini adalah kombinasi langkah-langkah yang ditemukan di beberapa lokasi berbeda ).

Catatan: Ini akan menghapus semua data terkait MySQL. Pastikan untuk mencadangkan database apa pun yang Anda butuhkan.ps -ax | grep mysql mysql.server stop brew remove mysql brew cleanup sudo rm /usr/local/mysql sudo rm -rf /usr/local/var/mysql sudo rm -rf /usr/local/mysql* sudo rm ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /Library/PreferencePanes/My* launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist rm -rf ~/Library/PreferencePanes/My* sudo rm -rf /Library/Receipts/mysql* sudo rm -rf /Library/Receipts/MySQL* sudo rm -rf /private/var/db/receipts/*mysql* sudo rm /etc/my.cnf

Memeriksa anda .bash_profile mengajukan untuk kode terkait MySQL dan mulai ulang komputer Anda.brew doctor brew update brew install mysql@5.7 echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile

Buka jendela terminal baru.mysql.server start

Catatan

Perlu disebutkan bahwa semua ini hanya merupakan perbaikan sementara dan bukan solusi jangka panjang atau permanen. caching_sha2_passworddiperkenalkan untuk memberikan keamanan dan kinerja yang lebih baik dan harus digunakan jika memungkinkan.

Jika Anda ingin membaca lebih lanjut, rincian lengkap dari perubahan ini dapat ditemukan di Panduan Referensi MySQL 8.0 , dan beberapa detail tentang masalah di PHP dapat ditemukan di halaman ini . Saya juga telah membuka PR untuk menambahkan pemberitahuan tentang ini di halaman Permintaan Tarik di buku pegangan WP-CLI .

Tinggalkan komentar

Rancang situs seperti ini dengan WordPress.com
Mulai