Tidak dapat mengatur ulang kata sandi root MySQL (MariaDB)

35

Hari ini, saya ingin membuat database di PMA. Bunyinya: "Tidak bisa masuk ke server MySQL". Saya mencoba melalui terminal, masalah yang sama, dan itu karena kata sandi saya salah. Dan saya tidak mengerti mengapa.

Saya mencoba metode yang biasa untuk mengatur ulang kata sandi root (lewati tabel hibah untuk pemasangan dan setel ulang passord) tetapi tampaknya tidak berhasil.

Lihat itu:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Morgan Touverey Quilling
sumber

Jawaban:

56

Saya telah menemukan solusi yang seaneh masalah itu sendiri.

Reboot MySQL / MariaDB using --skip-grant-tables(cari tutorial di web). (sama sekali tidak perlu, baca suntingan saya di akhir posting)

Lihatlah pluginbidang ke dalam mysql.usertabel:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Saya harus mengatur ulang bidang plugin dari setiap entri ke string kosong.

UPDATE user SET plugin="";   // without WHERE clause

Juga, pastikan kata sandi didefinisikan, karena kadang-kadang kata itu tampaknya terhapus (pilih user, passwordbidang). Jika tidak, perbarui dengan:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

Parameter privilege perlu disimpan secara eksplisit:

FLUSH PRIVILEGES;

Kemudian, restart MySQL dalam mode normal dan Anda harus dapat terhubung ke akun root.

Ini tidak akan serta merta menonaktifkan koneksi melalui soket Unix. Setelah MySQL saya diperbaiki, dalam PMA, saya dapat melihat bahwa koneksi dibuat melalui soket Unix.

EDIT , beberapa bulan kemudian: Saya sekarang terbiasa memiliki masalah ini sering kembali, saya pikir pada setiap pembaruan MariaDB (atau sesuatu seperti itu). Jadi saya punya pemahaman yang lebih baik tentang masalah itu; ada plugin UNIX_SOCKET yang memungkinkan Anda masuk ke akun MariaDB tanpa harus membuat kata sandi, karena menggunakan kredensial shell untuk mempercayai Anda, tanpa harus memasukkan kata sandi apa pun. Bahkan, plugin ini adalah plugin otentikasi dan bukan metode komunikasi dengan server SQL. Jadi Anda dapat dengan aman menonaktifkannya jika Anda tidak menggunakan soket unix sebagai metode masuk. Satu-satunya hal yang tidak dapat saya jelaskan adalah mengapa plugin UNIX_SOCKET diatur secara teratur pada setiap akun basis data, tanpa ada tindakan apa pun di pihak saya.

Ini memiliki efek samping yang bagus, ketika itu terjadi, Anda dapat masuk ke server SQL tanpa harus me-restart MariaDB dengan --skip-grant-tables: cukup masuk ke akun root sistem, lalu cukup terhubung dengan mysql -u roottanpa kata sandi, lalu setel ulang bidang plugin di cara itu dijelaskan di atas.

EDIT 2: Dikonfirmasi, itu terjadi pada setiap peningkatan MariaDB di Ubuntu.

Morgan Touverey Quilling
sumber
1
Ini memecah pekerjaan cron pemeliharaan di Ubuntu 16.04 (setidaknya) karena skrip itu diharapkan untuk masuk tanpa kata sandi menggunakan plug-in soket. Lihat superuser.com/questions/957708/… untuk detailnya.
colan
Oke, menarik, tetapi ini tidak terjadi lagi (pengaturan kata sandi warisan saya tidak rusak secara acak sekarang). Mungkin plugin soket Unix diatur pada pengguna root saja, sekarang? Tidak bisa memeriksanya sekarang. Tapi saya tidak suka gagasan bahwa OS memutuskan untuk saya setup otentikasi apa yang harus digunakan.
Morgan Touverey Quilling
Masalah ini menyebalkan, itu terjadi pada Debian 9, tidak ada kata sandi root ditanya ketika saya menginstal MariaDB dan saya bahkan tidak bisa mengatur ulang. Saya harap ini tidak akan terjadi lagi setelah peningkatan. Haruskah kita mengganti MariaDB dengan MySQL untuk menghindari masalah seperti itu?
baptx
Tidak yakin itu masih terjadi, mungkin sudah diperbaiki sekarang (saya dapat mengedit posting jika ada yang tahu). Mungkin itu hanya terjadi pada instalasi, yang akan menjadi pengaturan default yang baik.
Morgan Touverey Quilling
1
Saya hanya melihat bahwa jika kita tidak menggunakan unix socket plugin untuk user root, maka akan gagal untuk menginstal paket phpmyadmin pada Debian terbaru: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Jadi solusi terbaik adalah tetap menggunakan otentikasi unix socket default dengan perintah sudo mysql -u root, yang menurut saya juga lebih aman dan performant.
baptx
5

Dari jawaban ini, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql mencoba untuk mengotentikasi root menggunakan plugin, bukan kata sandi. Anda harus menonaktifkan penggunaan plugin untuk root.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q
kuda poni
sumber
2
Itulah yang saya posting sebagai jawaban.
Morgan Touverey Quilling
1
Ini adalah rollup yang sedikit lebih ringkas dengan pembaruan Anda.
kuda poni
Saya bahkan tidak bisa mendapatkan shell mysql, jadi ini tidak akan berfungsi dalam kasus saya, meskipun saya melihat Could not open mysql.plugin table.di log kesalahan.
Dave Everitt
0

Hubungkan seperti yang dijelaskan sebelumnya:

mysqld_safe --skip-grant-tables

File log akan ditampilkan:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Log pencarian terdaftar (dalam hal ini: /usr/local/mysql/data/ab123456.domain.com.err) untuk socket kanan:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

dan menggunakannya dalam koneksi mysql:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server
wiesia.stachanczyk
sumber
Saya baru saja mendapatkan $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/vartetapi saya baru saja kembali ke bash prompt.
Dave Everitt
0

Secara default marriadb menggunakan plugin autentikasi "unix_socket" untuk menetapkan kata sandi, ini harus "mysql_native_password" jadi

beralih basis data ..

use mydatabase;

pertama kali lihat plugin penyihir diatur ..

SELECT user, plugin FROM user;

setel ke "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

setel kata sandi baru ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
André Verwijs
sumber