Làm thế nào để sửa lỗi Truy cập bị từ chối cho người dùng 'root' @ 'localhost'


123

Trước khi tôi làm hỏng cái gì đó, khi tôi đăng nhập bằng cách sử dụng $ mysql -u root -pvà hiển thị cơ sở dữ liệu:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

Sau đó, tôi đã cố gắng tạo một người dùng mới và nhận thấy có gì đó không ổn với RIÊNG TƯ.

Vì vậy, tôi đã xóa những người dùng mới và tôi đoán rằng tôi đã vô tình xóa 'root' và 'Admin'.

Sau đó, tôi cố gắng tạo lại 'root' một lần nữa, nhưng nhận được quyền truy cập bị từ chối khi thực hiện cấp tất cả các đặc quyền.

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Nếu tôi đăng nhập lại vào MySQL bằng cách sử dụng $ mysql -u root -pvà hiển thị cơ sở dữ liệu,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

Tất cả các cơ sở dữ liệu khác đã biến mất.

Làm cách nào để sửa lỗi MySQL bây giờ?

Tôi không thể tìm thấy cơ sở dữ liệu 'mysql', không thể tạo cơ sở dữ liệu, tạo người dùng, bất cứ điều gì tôi cố gắng làm đều sẽ gặp lỗi.

LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu: CÓ).

Tôi có nên cài đặt lại MySQL bằng MacPorts không? Nếu cài đặt lại, tôi sẽ mất cơ sở dữ liệu game_data, phải không?


Hãy thử tích hợp máy chủ với 'root'@'127.0.0.1' khác với 'root' @ 'localhost'. Sau đó, ban hành lệnh tạo người dùng 'root' @ 'localhost' và cấp tất cả các đặc quyền cho nó.
Gimmy

Xem thêm Làm thế nào để MySQL có quyền người dùng root? trên Siêu người dùng. Nó cố gắng tránh đặt lại mật khẩu.
jww

Tôi chỉ có một khoảng trống giữa -pvà mật khẩu. Tôi biết nó ngớ ngẩn nhưng có thể giúp đỡ một ai đó.
Vinay Wadhwa

Câu trả lời:


132

Làm theo các bước dưới đây.

  1. Bắt đầu phiên bản máy chủ MySQL hoặc daemon với --skip-grant-tablestùy chọn (cài đặt bảo mật).

    $ mysqld --skip-grant-tables
    
  2. Thực hiện các tuyên bố này.

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

Nếu bạn gặp phải trường không xác định Lỗi mật khẩu ở trên, hãy sử dụng:

update user set authentication_string=password('my_password') where user='root';
  1. Cuối cùng, khởi động lại thể hiện / daemon mà không có --skip-grant-tablestùy chọn.

    $ /etc/init.d/mysql restart
    

Bây giờ bạn có thể kết nối với mật khẩu mới của bạn.

$ mysql -u root -p

Nhập mật khẩu: my_password

Khắc phục lỗi MySQL không thể khóa lỗi ibdata1

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart

1
.

xem cập nhật của tôi ở trên
Yogus

Tôi thấy rằng việc dừng mysql trước khi ban hành lệnh 1 sẽ ngăn lỗi khóa xảy ra - dịch vụ dừng mysql
Frank Tzan.usis

7
Rõ ràng cột 'mật khẩu' không còn tồn tại ... nó đã được thay thế bằng 'xác thực_ chuỗi'. Vì vậy, chuỗi cập nhật mật khẩu bây giờ là: CẬP NHẬT người dùng SET xác thực_ chuỗi = PASSWORD ('my_password') trong đó USER = 'root';
jdmcnair

1
Cảm ơn bạn! Và bây giờ tôi tò mò: điều gì có thể gây ra điều này? Trên Windows?
Ilia Andrienko

64

Không có gì ở trên là hữu ích cho tôi. Tôi thấy tôi cần phải xóa phương thức plugin. Trong 5.6, tôi có thể làm:

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

Trong 5.7, tôi thấy tôi cần phải:

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

Theo các tài liệu, với plugin được đặt thành một chuỗi trống, đáng lẽ nó phải được mặc định thành mysql_native_password một cách hiệu quả, nhưng có thể bị nhầm lẫn bởi hàm băm mật khẩu trống. Để biết thêm sắc thái, bạn có thể đọc tài liệu ở đây: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html


5
Điều này đã giải quyết nó cho tôi. Khi tôi xem trạng thái của trình nền mysql, tôi thấy cảnh báo này: "[Cảnh báo] 'user' entry 'root @ localhost' có cả mật khẩu và plugin xác thực được chỉ định. Mật khẩu sẽ bị bỏ qua." Đặt plugin thành '' cho phép tôi đăng nhập lại. Cảm ơn bạn, @Mario Flores
SpacePope

Plugin của tôi trống Điều buồn cười là nó tự động thay đổi thành trống. Xin lưu ý rằng tôi đang nói về một cài đặt trên máy tính cá nhân của tôi, nơi tôi sử dụng nâng cấp dist, vì vậy đó có thể là lý do tại sao người dùng root bị hỏng.
Bạn của Kim

2
set plugin='mysql_native_password'đã làm điều đó cho tôi, cảm ơn! Để tham khảo: dev.mysql.com/doc/refman/5.7/en/
Koen.

Tại sao điều này vẫn còn là một vấn đề cho việc cài đặt gói khởi động vào năm 2018?
mckenzm

1
ubfox 18, và nó đã hoạt động
Rahal K Biếnka

8

Cũng đảm bảo rằng bản ghi cần thiết trong bảng userplugintrường trống (ví dụ: có thể có "unix_socket").

Kể từ phiên bản 5.5.7, mysql có nhiều plugin xác thực hỗ trợ https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

Vì vậy, nếu bạn có trường không trống pluginthì mật khẩu sẽ bị bỏ qua và sẽ có cảnh báo tại nhật ký lỗi mysql (đối với tôi đó là /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.


1
Đối với người khác chạy ngang qua điều này, khi chạy máy chủ mysql 5.7.15, điều này thực sự khóa người dùng của bạn nếu bạn không cung cấp plugin. Có lẽ những gì bạn đang tìm kiếm là một plugintrong mysql_native_password.
Jonathan Cantrell

8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Bạn có thể thấy một cái gì đó như thế này;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

Đảm bảo việc triển khai máy chủ MySQL.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

Nếu bạn thấy nó nói

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

Xem 10 phút cuối của video này , nó dạy cho bạn cách bạn làm nó.


Mặc dù điều này có thể trả lời câu hỏi, bạn nên đưa ra một mô tả chi tiết hơn về nội dung được liên kết và giải thích nó liên quan đến câu hỏi như thế nào. Điều này sẽ giúp đảm bảo rằng câu trả lời này vẫn hữu ích trong trường hợp trang được liên kết bị xóa hoặc ngoại tuyến. Để biết thêm thông tin, hãy xem bài đăng Meta Stack Exchange này .
bwDraco

Đây là trường hợp sử dụng mà tôi thấy, tôi đang cài đặt mysql trên RHEL7 trong AWS với Ansible và tôi cũng có hành vi tương tự sau khi cấu hình lại và khởi động lại DB. Bạn có biết tại sao điều này xảy ra ở nơi đầu tiên, đang chặn Ansible truy cập mysqld cục bộ và định cấu hình nó. Đây chỉ là cho mục đích thử nghiệm.
einarc

Rõ ràng nó phụ thuộc vào cách bạn khởi tạo máy chủ, hãy xem bước 4 tại đây: dev.mysql.com/doc/refman/5.7/en/ Kẻ
einarc

3

Thử nó:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;

6
Bạn có thể mô tả những gì các --no-defaults --forcecông tắc làm? Mặt khác, đó là bản sao VLQ của câu trả lời trên, được chấp nhận.
Luke Canada

@CanadianLuke không mặc định bỏ qua bất kỳ tệp cấu hình nào có mặt mà nó bao gồm, buộc tiếp tục hoạt động ngay cả khi bất kỳ lệnh SQL nào được ban hành không thành công. Khi nghi ngờ, hãy kiểm tra hướng dẫn sử dụng
deucalion

3
Nó cần được chỉnh sửa để trả lời
Canada Luke

2
Tôi nhận đượcERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jonathan


3

Trong trường hợp của tôi, tôi đã bị hỏng cơ sở dữ liệu, sau khi khởi động lại mysql trên Debian, đăng nhập gốc không có mật khẩu. Giải pháp là đây:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

Một số câu trả lời khác cũng đã đề cập đến plugin gốc_password nhưng đây là cách bạn có thể làm điều đó mà không phải loay hoay phức tạp. Đó là cách nó được thay đổi.

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.