mysql (mariadb) ERROR 1698 (28000): Truy cập bị từ chối cho người dùng 'root' @ 'localhost'


23

Tôi đang làm việc trên Xubfox 15.04. Tôi đã cài đặt MariaDB-Server trên nhiều hệ thống khác nhau và luôn được yêu cầu nhập mật khẩu gốc trong khi cài đặt. Tuy nhiên, lần này, tôi không nhớ đã được hỏi mật khẩu. Khi tôi cố gắng đăng nhập mà không có mật khẩu (hoặc mật khẩu trống), tôi gặp Access denied for user 'root'@'localhost'lỗi. Tôi đã thử gỡ cài đặt gói hoàn toàn bằng cách

sudo apt-get remove mariadb-server
sudo apt-get purge mariadb-server

Khi tôi cài đặt lại, tôi vẫn không được hỏi mật khẩu gốc.

Tôi đã thử mysqld --skip-grant-tablescách tiếp cận từ mysql cách khắc phục Access bị từ chối cho người dùng 'root' @ 'localhost' . Tôi có thể sửa đổi mật khẩu cho người dùng root trong cơ sở dữ liệu mysql - ít nhất là thay đổi giá trị băm - nhưng tôi vẫn không thể đăng nhập bằng mật khẩu mới sau khi khởi động lại máy chủ mysql. Tôi vẫn nhận được lỗi tương tự.

Người dùng debian-sys-duy trì không tồn tại. Vì vậy, tôi không thể sử dụng nó để sửa chữa bất cứ điều gì.

Bất kỳ ý tưởng nào khác tôi có thể thử?


Một chủ đề hữu ích với cùng một câu hỏi trên StackOverflow: stackoverflow.com/questions/39281594/ mẹo
Kevin - Tái lập Monica

Câu trả lời:


36

Bạn cần đặt lại mật khẩu. vì vậy

sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;

9
"Phép thuật" không rõ ràng đối với phương pháp này là người dùng hệ điều hành gốc có thể đăng nhập vào cơ sở dữ liệu mà không phải chỉ định mật khẩu vì plugin: auth_socketđược bật theo mặc định. Nói cách khác, không cần sử dụng --skip-grant-tablesnhư những gì cần thiết trong các phiên bản MySQL trước đây. (Ngoài ra, về mặt kỹ thuật, biện pháp này không phải là "đặt lại mật khẩu"; nó đang vô hiệu hóa một plugin.)
Ben Johnson

1
+1, bạn có thể giải thích về lý do tại sao không?
A1Gard

4
Cách tiếp cận này sẽ gây ra vấn đề sau này. Nếu bạn tắt trình cắm, công việc định kỳ hàng ngày sẽ bị hỏng vì giả sử nó có thể đăng nhập bằng trình cắm đó. Xem câu trả lời của tôi để biết chi tiết.
colan

11

Ý tưởng với thiết lập mới là bạn hoàn toàn không nên sử dụng mật khẩu. Xem Plugin xác thực UNIX_SOCKET để biết chi tiết.

Điều đặc biệt có liên quan là nội dung của /usr/share/doc/mariadb-server-10.0/README.Debian.gz trên Ubuntu 16.04:

Trên các bản cài đặt mới, không có mật khẩu gốc nào được đặt và không có người dùng debian-sys-duy trì được tạo nữa. Thay vào đó, tài khoản gốc MariaDB được thiết lập để được xác thực bằng cách sử dụng ổ cắm unix, ví dụ như bất kỳ lời gọi mysqld nào bằng root hoặc qua sudo sẽ cho phép người dùng thấy lời nhắc mysqld.

Bạn có thể không bao giờ xóa "root" người dùng mysql. Mặc dù nó không có mật khẩu được đặt, nhưng plugin unix_auth đảm bảo rằng nó chỉ có thể được chạy cục bộ với tư cách là người dùng root.

Thông tin đăng nhập trong /etc/mysql/debian.cnf chỉ định người dùng được sử dụng bởi các tập lệnh init để dừng máy chủ và thực hiện đăng nhập. Điều này từng là người dùng debian-sys-duy trì không còn được sử dụng như root có thể chạy trực tiếp.

Vì vậy, nếu bạn vô hiệu hóa trình cắm đó để root và đặt mật khẩu, công việc định kỳ hàng ngày sẽ bị phá vỡ vì giả sử nó sẽ đăng nhập với quyền root mà không cần mật khẩu, nhưng với trình cắm.

Sau đó nó nói:

Các tập lệnh nên chạy khi người dùng có các khoản trợ cấp cần thiết và được xác định thông qua unix_socket.

Vì vậy, có vẻ như mật khẩu không còn được sử dụng bởi các ứng dụng.


1
Tôi vừa gặp phải vấn đề mà bạn mô tả: "So if you disable that plug-in for root and set a password, the daily cron job will break as it's assuming it will log in as root without a password..."Hàm ý không rõ ràng của Plugin xác thực UNIX_SOCKET đang được bật (hiện là mặc định) là khả năng xác thực người dùng cơ sở dữ liệu gốc bằng mật khẩu đã bị vô hiệu hóa. Không nơi nào trên mariadb.com/kb/en/mariadb/unix_socket-authentication-plugin là giới hạn đáng kể này được đề cập. Theo đó, không thể đăng nhập bằng root, ví dụ như qua SSH.
Ben Johnson

2

Tôi đã giải quyết vấn đề theo câu trả lời từ bài đăng này:

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

Người ta phải thay đổi trường plugin của mysql.user cho tất cả các gốc thành một chuỗi trống.


Vấn đề này được mô tả ở đây: percona.com/blog/2016/03/16/ trên
antonu17

3
Cách tiếp cận này sẽ gây ra vấn đề sau này. Nếu bạn tắt trình cắm, công việc định kỳ hàng ngày sẽ bị hỏng vì giả sử nó có thể đăng nhập bằng trình cắm đó. Xem câu trả lời của tôi để biết chi tiết.
colan

1

Tôi đã làm điều đó bằng cách chạy lệnh này, ngay sau khi cài đặt:

$ sudo mysql_secure_installation

Ở bước đầu tiên, mật khẩu trống, vì vậy chỉ cần nhấn Enter.


1
Nó không trống nếu đã được đặt, mà pw bị quên của tôi là nên vẫn không thể đăng nhập
Dave Everitt

0

Tôi đã có cùng một vấn đề trên một raapberry pi với căng. Giải pháp của tôi là tạo một người dùng mới với tất cả các đặc quyền bằng cách thực hiện như sau:

sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

MariaDB [(none)]> use mysql
MariaDB [mysql]> FLUSH PRIVILEGES;
GRANT ALL privileges ON mysql.* TO 'admin'@'localhost' with grant option;

Bây giờ tôi có thể đăng nhập và cho chúng tôi người dùng "quản trị" là siêu người dùng.

Tôi hy vọng điều này sẽ giúp được ai đó.


0

Chỉ cần sử dụng sudo mysql -u root- đó là nó


Chi tiết: Các phiên bản mới hơn xác thực với mysql bằng cách sử dụng xác thực hệ thống. Vì vậy, nếu bạn có thể sudo với HĐH, nó cũng giả sử bạn là root db. Bạn có thể xác nhận điều này bằng cách phát hành sudo mysql -u root -e "USE mysql; SELECT User, Host, plugin FROM mysql.user;". Bạn sẽ thấy một cái gì đó như thế này (có thể với auth_sockettrong các bản phát hành khác)

+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+

Tôi đã đăng nhập bằng root, nhưng đối với tôi lệnh này vẫn muốn mật khẩu gốc MariaDB mà tôi đã quên :-(
Dave Everitt
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.