không thể đăng nhập với tư cách người dùng gốc mysql từ tài khoản người dùng thông thường trong Ubuntu 16.04


203

Tôi chỉ cần cài đặt Ubuntu 16.04 LTS cùng với các gói php, mariadbnginx. Tôi đã chạy mysql_secure_installationvà thay đổi mật khẩu root.

Bây giờ khi tôi cố gắng đăng nhập để mysqlsử dụng tài khoản root trong khi đăng nhập Ubuntu như tài khoản người dùng bình thường, tôi bị từ chối truy cập.

Khi tôi đăng nhập bằng cách sử dụng sudo mysql, mysql thậm chí không hỏi tôi mật khẩu. Nếu tôi chạy, mysql_secure_installtiontôi thấy các cài đặt cũ không bao giờ được đặt vĩnh viễn.

Tôi đang làm gì sai?

Câu trả lời:


359

Gần đây tôi đã nâng cấp Ubuntu 15.04 lên 16.04 và điều này đã giúp tôi:

  1. Đầu tiên, kết nối trong sudo mysql

    sudo mysql -u root
    
  2. Kiểm tra tài khoản của bạn có trong db của bạn

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Xóa tài khoản root @ localhost hiện tại

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Tái tạo người dùng của bạn

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Cấp quyền cho người dùng của bạn (đừng quên xóa đặc quyền)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Thoát khỏi MySQL và cố gắng kết nối lại mà không cần sudo.

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


16
Đây là điều duy nhất làm việc cho tôi, có ai biết chính xác điều gì đã xảy ra với người dùng root khi bạn cài đặt máy chủ mysql vào ngày 16.04 không?
Ruggi

32
Giữ nó, không %có nghĩa là bạn có thể kết nối từ bất cứ đâu ... từ xa?
Stevie G

9
Bạn có thể thay đổi hàng thành: TẠO người dùng 'root' @ 'localhost' được xác định bởi '';
vladnev

11
Đối với các vấn đề liên quan đến bảo mật: mẫu kết nối mysql root @ localhost không bảo mật là một yếu tố chính của sự phát triển cục bộ nhưng sẽ không xuất hiện ở nơi nào khác.
Charney Kaye

5
Tuyên bố cấp cho người dùng root mới ở đây không cung cấp "với cấp" cho root để root không thể cấp mà không chạy nó sau: dba.stackexchange.com/a/62046/115679 Vui lòng thay đổi tuyên bố cấp chogrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren

132

Nếu bạn cài đặt 5.7 và không cung cấp mật khẩu cho rootngười dùng, nó sẽ sử dụng auth_socketplugin. Plugin đó không quan tâm và không cần mật khẩu. Nó chỉ kiểm tra xem người dùng có kết nối bằng ổ cắm UNIX hay không và sau đó so sánh tên người dùng.

Lấy từ thay đổi mật khẩu người dùng trong MySQL 5.7 Với "plugin: auth_socket"

Vì vậy, để thay đổi plugintrở lại mysql_native_password:

  1. Đăng nhập bằng sudo:

    sudo mysql -u root
    
  2. Thay đổi pluginvà đặt mật khẩu bằng một lệnh duy nhất:

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

Tất nhiên bạn cũng có thể sử dụng lệnh trên để đặt mật khẩu trống.

Chỉ dành cho bản ghi, (và MariaDB < 10.2người dùng) cũng có một cách khác để chỉ thay đổi pluginmà không cung cấp mật khẩu (để trống):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;

2
Cảm ơn, vì một số lý do, điều này đã được đặt tự động đột ngột sau khi nâng cấp apt-get tôi nghĩ ...
Tominator

4
Ngoài ra, tôi thích câu trả lời này hơn - nó ít phá hủy hơn ;-)
benzkji

3
Đối với MariaDB <10.2, để thay đổi plugin cùng với mật khẩu, đây là truy vấn: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Nguồn: stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu

5
Đây phải là câu trả lời được chấp nhận
Geo C.

3
Tôi ước tôi có thể bỏ phiếu này lên hai lần.
James Smith

21

Nói tóm lại, trên MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

nơi bạn thay thế NEWPASSWORD bằng mật khẩu bạn muốn và mọi thứ khác nguyên văn.

Vấn đề ở đây là khi MariaDB hoặc MySQL được cài đặt / cập nhật (đặc biệt nếu tại một số điểm gốc được đặt mà không có mật khẩu) thì trong bảng Người dùng mật khẩu thực sự trống (hoặc bị bỏ qua) và việc đăng nhập phụ thuộc vào người dùng hệ thống tương ứng cho người dùng MySQL. Bạn có thể kiểm tra điều này như sau bằng cách chuyển sang root hệ thống, sau đó gõ:

mysql -uroot -p

Sau đó nhập không có mật khẩu hoặc mật khẩu sai . Bạn có thể sẽ cho phép. (Thậm chí bạn có thể đăng nhập từ root unix chỉ bằng cách # mysqlmật khẩu không liên quan và người dùng được xác định).

Vậy chuyện gì đang xảy ra? Vâng, nếu bạn đăng nhập với quyền root và làm như sau:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

bạn sẽ lưu ý auth_socket(có thể đọc unix_sockettrên MariaDB). Các socket này bỏ qua mật khẩu và cho phép người dùng Unix tương ứng vào mà không cần kiểm tra mật khẩu. Đây là lý do tại sao bạn có thể đăng nhập bằng root nhưng không phải với người dùng khác.

Vì vậy, giải pháp là cập nhật Người dùng để không sử dụng auth_socket/unix_socketvà đặt mật khẩu đúng cách.

Trên MariaDB (<10.2, xem các bình luận bên dưới) trên Ubuntu phiên bản 16 kể từ năm 2017, điều này là đủ. NEWPASSWORD là mật khẩu của bạn. mysql_native_passwordbạn gõ nguyên văn.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(Có thể cài đặt plugin thành trống sẽ hoạt động. YMMV. Tôi đã không thử điều này. Vì vậy, đây là một giải pháp thay thế.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Nếu không thì:

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

Sau đó

FLUSH PRIVILEGES;

Đối với bản ghi, giải pháp liên quan đến việc xóa người dùng và tạo lại nó với '%' khiến tôi hoàn toàn bị khóa khỏi cơ sở dữ liệu và có thể gây ra các vấn đề khác trừ khi bạn nhận được grantchính xác câu lệnh - dễ dàng hơn để cập nhật root bạn đã có.

Theo kinh nghiệm của tôi, vấn đề chỉ xảy ra với người dùng root, vì những người dùng khác sẽ được thêm thủ công không phải là một phần của cài đặt / cập nhật ban đầu.


2
Tìm thấy điều này để làm việc hoàn hảo. Làm cho tôi tự hỏi mặc dù tại sao thay đổi mật khẩu root mysql_secure_installationkhông có tác dụng tương tự. Nó lưu mật khẩu mới ở đâu?
Mausy5043

Bạn có thể chỉnh sửa câu trả lời của mình và nói thêm về từng lệnh khi bạn đi không? Tôi không rõ ràng về việc áp dụng. Đây có phải là hai UPDATEs áp dụng cho MariaDB <10.2 và ALTERcác phiên bản khác không? Và là cái thứ hai UPDATEthay thế cho cái đầu tiên, hay chúng ta cần gõ cả hai? Cuối cùng, là 'mysql_native_password' để nhập nguyên văn hay chúng ta nên thay thế nó bằng mật khẩu gốc dự định cho MySQL?
Michael Scheper

1
@MichaelScheper Cách đây một thời gian nên tôi không muốn chỉnh sửa quá nhiều, nhưng đây là những gì tôi nhớ. (1) Chỉ thực hiện CẬP NHẬT đầu tiên (<10.2 có thể không phải là một yêu cầu). (2) Có, nhập nguyên văn 'mysql_native_password'. Về cơ bản, những gì bạn đang làm là nói với mariadb: "Đừng sử dụng các đặc quyền Unix, hãy sử dụng các cơ sở dữ liệu riêng tư". Các mysql_native_passwordlà tùy chọn đó.
Gazzer

Chết tiệt, tôi đánh vần 'đặc quyền' sai!
Gazzer

1
Có vẻ như bạn chỉ bỏ lỡ giới hạn thời gian chỉnh sửa 1 phút rưỡi! Đôi khi tôi cũng cảm thấy thất vọng vì điều đó. Nhưng dù sao cũng cảm ơn!
Michael Scheper

8

Nếu bạn đã cài đặt MySQL / MariaDB từ kho lưu trữ cơ sở, người dùng không thể đăng nhập vào MySQL với tư cách là người dùng root MySQL từ thông tin đăng nhập Unix của họ (không áp dụng nếu họ có quyền truy cập sudo )

  1. Đăng nhập vào shell root MySQL:

    $ sudo mysql -u root -p
    
  2. Thực hiện các truy vấn dưới đây:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Mở một vỏ mới, sau đó:

    $ mysql -u root -p
    

Nguồn


Khi tôi làm điều này, tôi không thể sudo mysql là root nữa. Tôi đã phải su trước, và sau đó có thể đăng nhập vào mysql bằng root. Vì vậy, tôi đã thay đổi nó trở lại auth_socket.
cho đến

Lệnh duy nhất:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski

Nếu bạn muốn mất quyền truy cập vào phiên bản MySQL của mình, thì câu trả lời này là cách dễ dàng.
Danila Vershinin

2

Hãy thử tạo tài khoản mysql mới, đối với tôi nó đã hoạt động (mysql 5.7.12):

  1. Đăng nhập như sudo:

    sudo mysql -uroot
    
  2. Tạo người dùng mới và cấp cho anh ta đặc quyền (không có mật khẩu):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Đăng nhập với tư cách người dùng mới:

    mysql -uadmin
    

2

Tôi đã phải làm hai việc (nhờ @Todor và @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

và sau đó:

FLUSH PRIVILEGES;

Tôi sẽ không đề nghị bỏ người dùng root.


1

Hãy thử mã này trước,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

và sau đó,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

sau đó nhấn Ctrl+Zvà gõ: bgđể chạy quy trình từ nền trước vào nền, sau đó xác minh quyền truy cập của bạn bằng cách:

mysql -u root -proot
mysql> show grants;

1

Nếu bạn chỉ chạy lệnh mysql dưới quyền người dùng root, bạn sẽ được cấp quyền truy cập mà không yêu cầu mật khẩu, vì xác thực ổ cắm được bật cho root @ localhost. .

Cách duy nhất để đặt mật khẩu là chuyển sang xác thực gốc như:

$ sudo mys

mysql ALTER USER 'root' @ 'localhost' XÁC NHẬN VỚI mysql_native_password BY 'test';


0

Tôi đã điều chỉnh một số tập lệnh cung cấp mà tôi đã tạo để sử dụng MariaDB và gặp phải vấn đề chính xác này. Ghép lại rất nhiều thông tin ở đây một câu trả lời của Gazzer thực sự không có vấn đề gì trong vấn đề này; tất cả sôi sục xuống auth_socket/ unix_socketcài đặt.

Vì vậy, khi sử dụng MariaDB 5.5 (trong Ubuntu 14.04) và MariaDB 10 trong (Ubuntu 16.04), đăng nhập vào MySQL và chạy lệnh này sẽ xóa mọi thứ ngay lập tức:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Các câu trả lời khác bao gồm cả câu trả lời được bình chọn cao nhất kể từ bài đăng này của Loremhipsum, thật sự khuyến khích các thực hành xấu bằng cách khuyến nghị bỏ một người dùng và sau đó tạo lại chúng. Đối với tôi, đó là một giải pháp khá triệt để. Giải pháp tốt nhất / đơn giản nhất để vô hiệu hóa plugingiá trị, tuôn ra các đặc quyền và tiếp tục cuộc sống.


-1

Tôi đã có cùng một vấn đề và chạy nó sau đây đã sửa nó:

mysql_upgrade --force

Đáng buồn thay đã không làm việc. Tôi đang cài đặt lại Ubuntu.
mật mã

1
Tôi vừa mới cài đặt Ubuntu 16.04 và cài đặt máy chủ mariad. Sau khi cài đặt, tôi đã chạy mysql_secure_installation và đặt mật khẩu. Sau khi trải qua các bước còn lại trong mysql_secure_installation, tôi đã chạy lại nó và có vẻ như nó không lưu các thay đổi. Tôi vẫn không thể đăng nhập từ tài khoản người dùng thông thường của mình. Nó có thể là một lỗi?
mật mã

Điều này sẽ không bao giờ giúp đỡ. Vấn đề không liên quan gì đến cài đặt thực tế của nhị phân MariaDB mà là người dùng rootđược đặt với plugincác cài đặt không chuẩn. Trường hợp cạnh duy nhất mà việc nâng cấp DB có thể giúp ích trong trường hợp như thế này là nếu mysql_upgradechính quá trình đó chiếm phần plugincài đặt mà tôi nghi ngờ.
JakeGould
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.