Không thể đặt lại mật khẩu gốc MySQL (MariaDB)


33

Hôm nay, tôi muốn tạo một cơ sở dữ liệu trong PMA. Nó nói: "Không thể đăng nhập vào máy chủ MySQL". Tôi đã thử qua một thiết bị đầu cuối, cùng một vấn đề, và đó là do mật khẩu của tôi sai. Và tôi không thể hiểu tại sao.

Tôi đã thử phương pháp thông thường để đặt lại mật khẩu gốc (bỏ qua việc gắn bảng và đặt lại mật khẩu) nhưng có vẻ như nó không hoạt động.

Xem đó:

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'

Câu trả lời:


51

Tôi đã tìm thấy một giải pháp kỳ lạ như chính vấn đề.

Khởi động lại MySQL / MariaDB bằng cách sử dụng --skip-grant-tables (tìm kiếm hướng dẫn trên web). (không cần thiết chút nào, hãy đọc các chỉnh sửa của tôi ở cuối bài)

Nhìn vào plugin lĩnh vực vào mysql.user bàn:

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

Tôi đã phải đặt lại trường plugin của mỗi mục thành một chuỗi trống.

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

Ngoài ra, hãy chắc chắn rằng mật khẩu được xác định, bởi vì đôi khi nó dường như bị xóa (chọn vào user, password lĩnh vực). Nếu không, hãy cập nhật nó với:

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

Các tham số đặc quyền cần được lưu một cách rõ ràng:

FLUSH PRIVILEGES;

Sau đó, khởi động lại MySQL ở chế độ bình thường và bạn sẽ có thể kết nối với tài khoản root.

Điều này sẽ không nhất thiết vô hiệu hóa kết nối thông qua ổ cắm Unix. Sau khi MySQL và sửa chữa của tôi, trong PMA, tôi có thể thấy rằng kết nối được thiết lập thông qua một ổ cắm Unix.

CHỈNH SỬA , vài tháng sau: Bây giờ tôi đã quen với vấn đề này thường xuyên quay trở lại, tôi nghĩ tại mỗi bản cập nhật của MariaDB (hoặc đại loại như thế). Vì vậy, tôi đã hiểu rõ hơn về con mồi; có một plugin UNIX_SOCKET có thể cho phép bạn đăng nhập tài khoản MariaDB mà không phải tạo mật khẩu, vì nó sử dụng thông tin đăng nhập của shell để tin tưởng bạn mà không cần phải nhập bất kỳ mật khẩu nào. Trên thực tế, plugin này là một plugin xác thực và không phải là một phương thức giao tiếp với máy chủ SQL. Vì vậy, bạn có thể vô hiệu hóa nó một cách an toàn nếu bạn không sử dụng ổ cắm unix làm phương thức đăng nhập. Điều duy nhất tôi không thể giải thích là tại sao plugin UNIX_SOCKET thường được đặt trên mỗi tài khoản của cơ sở dữ liệu mà không có bất kỳ hành động nào về phía tôi.

Điều này có tác dụng phụ rất hay, khi nó xảy ra, bạn có thể đăng nhập vào máy chủ SQL mà không phải khởi động lại MariaDB bằng --skip-grant-tables: chỉ cần đăng nhập vào tài khoản gốc của hệ thống, sau đó chỉ cần kết nối với mysql -u root không có mật khẩu, sau đó đặt lại trường plugin theo cách được giải thích ở trên.

EDIT 2: Xác nhận, nó xảy ra trên mỗi bản nâng cấp MariaDB trên Ubuntu.


1
Điều này phá vỡ công việc bảo trì trên Ubuntu 16.04 (ít nhất) bởi vì tập lệnh đó dự kiến ​​sẽ đăng nhập mà không cần mật khẩu bằng cách sử dụng trình cắm thêm. Xem superuser.com/questions/957708/ giết để biết chi tiết.
colan

Được rồi, thú vị, nhưng điều này không xảy ra nữa (thiết lập mật khẩu cũ của tôi không bị phá vỡ ngẫu nhiên bây giờ). Có lẽ bây giờ plugin socket Unix chỉ được đặt trên người dùng root? Không thể kiểm tra ngay bây giờ. Nhưng tôi không thích ý tưởng rằng HĐH quyết định cho tôi sử dụng thiết lập xác thực nào.
Morgan Touverey Quilling

Vấn đề này thật tệ, nó đã xảy ra trên Debian 9, không có mật khẩu root nào được hỏi khi tôi cài đặt MariaDB và tôi thậm chí không thể đặt lại được. Tôi hy vọng nó sẽ không xảy ra lần nữa sau khi nâng cấp. Chúng ta có nên thay MariaDB bằng MySQL để tránh những vấn đề như vậy không?
baptx

Không chắc nó vẫn xảy ra, nó có thể đã được sửa ngay bây giờ (tôi có thể chỉnh sửa bài nếu có ai biết). Có lẽ nó chỉ xảy ra khi cài đặt, đây sẽ là một thiết lập mặc định tốt.
Morgan Touverey Quilling

1
Tôi chỉ nhận thấy rằng nếu chúng tôi không sử dụng plugin unix socket cho người dùng root, thì sẽ không cài đặt gói phpmyadmin trên Debian mới nhất: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Vì vậy, giải pháp tốt nhất là tiếp tục sử dụng xác thực ổ cắm unix mặc định bằng lệnh sudo mysql -u root, mà tôi nghĩ cũng an toàn và hiệu quả hơn.
baptx

4

Từ câu trả lời này, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql cố gắng xác thực root bằng plugin chứ không phải mật khẩu. Bạn cần phải vô hiệu hóa việc sử dụng plugin cho root.

shell$ sudo mysql -u root

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

2
Đó chính xác là những gì tôi đã đăng như một câu trả lời.
Morgan Touverey Quilling

Đó là một bản tóm tắt ngắn gọn hơn một chút với bản cập nhật của bạn.
ponies

0

Kết nối như được mô tả trước đây:

mysqld_safe --skip-grant-tables

Tệp nhật ký sẽ được hiển thị:

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

Nhật ký tìm kiếm được liệt kê (trong trường hợp này: /usr/local/mysql/data/ab123456.domain.com

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

và sử dụng nó trong kết nối 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

0

Theo mặc định, marriadb sử dụng plugin xác thực "unix_socket" để đặt mật khẩu đây phải là "mysql_native_password" vì vậy

chuyển đổi cơ sở dữ liệu ..

use mydatabase;

Đầu tiên hãy xem plugin phù thủy được thiết lập ..

SELECT user, plugin FROM user;

đặt nó thành "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

đặt mật khẩu mới ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.