MySQL (MariaDB) kök şifresini sıfırlayamıyorum


35

Bugün PMA'da bir veritabanı oluşturmak istedim. Dedi ki: "MySQL sunucusuna giriş yapılamıyor". Bir terminal aracılığıyla aynı problemi denedim, çünkü şifrem yanlış. Ve nedenini anlayamıyorum.

Kök parolasını sıfırlamak için genel yöntemi denedim (pasoyu yerleştirme hibe tablolarını atla ve parolayı sıfırla) ancak işe yaramadı gibi görünüyor.

Şuna bak:

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'

Yanıtlar:


56

Sorunun kendisi kadar garip bir çözüm buldum.

MySQL / MariaDB yazılımını kullanarak yeniden başlatın --skip-grant-tables(web'de öğreticiler arayın). (zorunlu değil, gönderimin sonunda düzenlemelerimi oku)

Bak pluginiçine alanda mysql.usermasanın:

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

Her girişin eklenti alanını boş bir dizgiye sıfırlamak zorunda kaldım.

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

Ayrıca, bir parolanın tanımlandığından emin olun, çünkü bazen silinmiş görünmektedir ( user, passwordalanları seçin ). Değilse, şununla güncelle:

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

Ayrıcalıklar parametrelerinin açıkça kaydedilmesi gerekir:

FLUSH PRIVILEGES;

Ardından, MySQL'i normal modda yeniden başlatın ve root hesabına bağlanabilmelisiniz.

Bu Unix soketi üzerinden bağlantıyı mutlaka devre dışı bırakmaz. MySQL'im tamirden sonra, PMA'da bağlantının bir Unix soketi üzerinden kurulduğunu görebiliyorum.

EDIT , birkaç ay sonra: Artık bu sorunun sık sık geri dönmesine alışkınım, sanırım MariaDB'nin her güncellemesinde (ya da bunun gibi bir şey). Bu yüzden problemi daha iyi anladım; şifre oluşturmak zorunda kalmadan MariaDB hesabına giriş yapmanıza izin verebilecek bir UNIX_SOCKET eklentisi var, çünkü herhangi bir şifre girmek zorunda kalmadan size güvenmek için kabuğun kimlik bilgilerini kullanır. Aslında, bu eklenti bir kimlik doğrulama eklentisidir ve SQL sunucusuyla bir iletişim yöntemi değildir. Böylece, unix soketini giriş yapma yöntemi olarak kullanmazsanız güvenle devre dışı bırakabilirsiniz. Açıklayamadığım tek şey, UNIX_SOCKET eklentisinin neden düzenli bir şekilde veritabanımın her hesabına ayarlanmış olduğumu ve yanımda herhangi bir işlem yapılmamasını sağlıyor.

Bu, MariaDB'yi yeniden başlatmak zorunda kalmadan SQL sunucusunda oturum açabilmeniz için güzel bir yan etkiye sahiptir --skip-grant-tables: sadece sistemin kök hesabına giriş yapın, daha sonra mysql -u rootşifresiz bağlanın , ardından eklenti alanını sıfırlayın. yukarıda açıklandığı şekilde.

EDIT 2: Onaylandı, Ubuntu'daki her bir MariaDB güncellemesinde oluyor.


1
Bu, Ubuntu 16.04'teki (en azından) bakım kronu işini keser (en azından) çünkü bu komut dosyası soket eklentisini kullanarak bir şifre olmadan giriş yapmayı bekler. Ayrıntılar için superuser.com/questions/957708/… adresine bakın.
colan,

Tamam, ilginç, ama bu artık gerçekleşmiyor (eski şifreler kurulumum artık rastgele bozulmuyor). Belki de Unix soket eklentisi şimdi sadece root kullanıcısına kurulur, değil mi? Bunu şu anda kontrol edemedim. Ancak, işletim sisteminin benim için hangi kimlik doğrulama kurulumunu kullanacağına karar vermesinden hoşlanmıyorum.
Morgan Touverey,

Bu sorun berbattı, Debian 9'da oldu, MariaDB'yi kurduğumda root şifresi sorulmadı ve sıfırlayamadım bile. Umarım yükseltme işleminden sonra bir daha olmaz. Bu tür sorunları önlemek için MariaDB'yi MySQL ile değiştirmeli miyiz?
baptx

Hala gerçekleştiğinden emin değilim, şimdi düzeltilmiş olabilir (birisi biliyorsa postayı düzenleyebilirim). Belki de sadece kurulumda gerçekleşir, bu iyi bir varsayılan kurulum olacaktır.
Morgan Touverey,

1
Kök kullanıcısı için unix soket eklentisini kullanmazsak, phpmyadmin paketini en son Debian'a yükleyemeyeceğimizi fark ettim ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Bu nedenle en iyi çözüm, varsayılan unix soket kimlik doğrulamasını komutla kullanmaya devam etmektir sudo mysql -u root, ki bu da daha güvenli ve daha performanslı.
baptx

5

Bu cevaptan, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql, şifreyi değil, eklentiyi kullanarak root kimlik doğrulaması yapmaya çalışır. Kök için eklenti kullanımını devre dışı bırakmanız gerekir.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
Cevap olarak yazdığım şey buydu.
Morgan Touverey,

1
Güncellemenizle ilgili biraz daha kısa bir özet var.
Midilli

Bir mysql kabuğu bile alamıyorum, bu yüzden Could not open mysql.plugin table.hata günlüğünde görmeme rağmen bu benim durumumda işe yaramayacak .
Dave Everitt

0

Daha önce açıklandığı gibi bağlanın:

mysqld_safe --skip-grant-tables

Günlük dosyası gösterilecek:

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

Sağ soket için listelenen arama günlüğü (bu durumda: /usr/local/mysql/data/ab123456.domain.com.err):

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

ve mysql bağlantısında kullanın:

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

Ben sadece alıyorum $ 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/varama sadece bash istemine geri atıldım.
Dave Everitt

0

Varsayılan olarak marriadb, şifreleri ayarlamak için "unix_socket" kimlik doğrulama eklentisini kullanır, bu "mysql_native_password" olmalıdır.

veritabanını değiştir ..

use mydatabase;

ilk cadı eklenti ayarlandı bakın ..

SELECT user, plugin FROM user;

"mysql_native_password" olarak ayarla

UPDATE user SET plugin="mysql_native_password"; 

yeni şifre ayarla ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.