Làm cách nào để khôi phục toàn bộ đặc quyền của người dùng gốc MySQL?


108

Tôi đã vô tình xóa một số đặc quyền khỏi người dùng gốc MySQL của mình, bao gồm cả khả năng thay đổi bảng. Có cách nào để tôi có thể khôi phục người dùng này về trạng thái ban đầu (với tất cả các đặc quyền) không?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'

1
Lỗi thứ hai trông giống như một vấn đề về mật khẩu. Có thể là lỗi của tôi khi cho rằng bạn đã có tài khoản 'root' @ 'localhost'. Chạy lại mysqld với --skip-Grant-table và: "DROP USER 'root' @ 'localhost'; BẬT TẤT CẢ CÁC QUYỀN RIÊNG TƯ . ĐẾN 'root' @ '%';" thay thế? Cách tốt nhất để tìm ra tài khoản mà bạn nên cấp quyền truy cập là chạy "CHỌN Người dùng, Máy chủ TỪ mysql.user WHERE Người dùng = 'root';" ... sẽ cung cấp cho bạn tên máy chủ sẽ được sử dụng sau @ trong lệnh GRANT.
DMI

1
Đây là một hình thức tồi khi các mod đánh dấu chủ đề là lạc đề khi nó không lạc đề ngoại trừ việc có thể có một trang Stack Exchange khác phù hợp hơn cho chủ đề mà trong trường hợp đó, nó sẽ được xác định. (Xấu hổ với các mod.) Đây là nơi điều này có thể xảy ra: dba.stackexchange.com
Jon Davis

^ đã đồng ý, tôi đã bỏ phiếu để mở lại. nếu nó đã bị đóng cửa do sự tồn tại của trang web DBA, điều đó ít nhất phải được đề cập và OP đã chỉ đạo ở đó. (Hoặc có khả năng đóng cửa như một bản sao của một câu hỏi khác ở đây)
tách

Câu trả lời:


148

Nếu GRANT ALLkhông hoạt động, hãy thử:

  1. Dừng mysqldvà khởi động lại nó với --skip-grant-tablestùy chọn.
  2. Kết nối với mysqldmáy chủ chỉ với: mysql(nghĩa là không có -ptùy chọn và tên người dùng có thể không được yêu cầu).
  3. Phát hành các lệnh sau trong máy khách mysql:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

Sau đó, bạn sẽ có thể chạy GRANT ALL ON *.* TO 'root'@'localhost';và hoạt động.


7
1.Làm thế nào để kết nối với máy chủ mysqld chỉ với: mysql 2.Khi tôi phát hành CẬP NHẬT mysql.user SET Grant_priv = '1' WHERE User = 'root'; QUYỀN RIÊNG TƯ FLUSH; Tôi nhận được Truy vấn ổn, 0 hàng bị ảnh hưởng (0,00 giây) các hàng khớp: 2 hàng đã thay đổi: 0 cảnh báo: 0 Truy vấn ok, 0 hàng bị ảnh hưởng (0,00 giây). Khi tôi đăng nhập vào phpMyAdmin với tư cách người dùng root, tôi vẫn thấy "Không có đặc quyền".
Steven

Xin lỗi, sau các bước trên, bạn sẽ có thể chạy lệnh GRANT ALL. Để kết nối với mysqld, tôi có nghĩa là bạn sẽ không cần mật khẩu - tôi không thể nhớ liệu tên người dùng nào sẽ hoạt động hay nó có cần phải là "root" hay không.
DMI

2
Điều này không hoạt động. Như Steven đã nói, việc cập nhật bảng người dùng có tác dụng 0 bản ghi. Người dùng root vẫn không thể cấp quyền.
Cerin

1
Vâng, nó hoạt động. Và nếu bạn đang sử dụng windows, chỉ cần thêm tạm thời skip-grant-tablesvào [mysqld]phần của tệp cấu hình mysql của bạn để truy cập vào mysql trên dòng lệnh mà không cần mật khẩu.
markus

1
tôi bị mắc kẹt ở phần Grant (mà không làm việc) cho hơn 9 giờ và câu trả lời của bạn đã cứu tôi ... bạn là một lifesaver.thanks rất nhiều
Ali SH

91

Nếu bạn đã xóa rootnhầm người dùng của mình, bạn có thể làm một điều:

  1. Dừng dịch vụ MySQL
  2. Chạy mysqld_safe --skip-grant-tables &
  3. Nhập mysql -u root -pvà nhấn enter.
  4. Nhập mật khẩu của bạn
  5. Tại dòng lệnh mysql, hãy nhập: use mysql;

Sau đó, thực hiện truy vấn này:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

sau đó khởi động lại mysqld

CHỈNH SỬA: Ngày 6 tháng 10 năm 2018

Trong trường hợp bất kỳ ai khác cần câu trả lời này, tôi đã thử nó hôm nay bằng cách sử dụng innodb_version 5.6.36-82.010.1.24-MariaDB và nó hoạt động nếu bạn XÓA CÁC BACKTICKS (không có dấu ngoặc kép nào, chỉ cần xóa chúng):

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

1
@Bipin, Kỳ lạ là chỉ có mysqld.exetrong binthư mục, không phải mysqld_safe.exe. Bạn hiểu "mysqld_safe" nghĩa là gì?
Pacerier

4
Đối với MySQL 5.5, bạn cần thêm hai priv nữa, Event_priv và Trigger_priv.
Greg Bell

Tôi tưởng tượng điều này sẽ phá vỡ trong 5.6.5
Otheus

1
@Pacerier - theo bài đăng này, bạn không thực sự cần mysqld_safe, chỉ cần chạy nhị phân mysqld bình thường:mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber

24

tôi cũng xóa các đặc quyền của root và cơ sở dữ liệu không hiển thị trong bảng điều khiển mysql khi tôi là người dùng root, vì vậy người dùng đã thay đổi mysql>mysql -u 'userName' -p;mật khẩu và tên;

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

sau lệnh này, tất cả đều hiển thị cơ sở dữ liệu trong root.

Cảm ơn


1
Tôi đã phải làm một sự kết hợp của nhiều thứ. Tôi phải dừng dịch vụ mysqld, sau đó chạy mysqld_safe --skip-crant -boards &, sau đó là lệnh UPDATE ở trên, sau đó khởi động lại mysql, sau đó chạy GRANT ALL ON . ĐẾN 'người dùng' @ 'localhost';
Nick Woodhams 19/12/12

5

Tôi đã từ chối quyền chèn và tải lại để root. Vì vậy, sau khi cập nhật quyền, FLUSH PRIVILEGES đã không hoạt động (do thiếu đặc quyền tải lại). Vì vậy, tôi đã sử dụng người dùng debian-sys-Maint trên Ubuntu 16.04 để khôi phục đặc quyền user.root. Bạn có thể tìm thấy mật khẩu của user.debian-sys-Maint từ tệp này

sudo cat /etc/mysql/debian.cnf

Bạn cứu tôi với! GRANT không hoạt động cả trong chế độ --skip-Grant-Table, vì vậy việc nhập với tư cách ubuntu-system cho phép tôi tạo lại người dùng root của mình và tôi có thể cập nhật tất cả các đặc quyền
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Chỉ cần đăng nhập từ root bằng mật khẩu tương ứng nếu có và chỉ cần chạy lệnh trên cho bất kỳ người dùng nào.

Ví dụ:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
nhưng nếu người dùng 'root' đã mất quyền riêng tư, thì làm thế nào điều này có thể hoạt động, người dùng root không cần các đặc quyền nâng cao để làm điều này? điều này đã không làm việc cho tôi.
Terungwa

3

Chỉ cần chèn hoặc cập nhật mysql.uservới giá trị Ytrong các đặc quyền của mỗi cột.


2

Nếu bạn đang sử dụng WAMP trên máy tính cục bộ của mình (phiên bản mysql 5.7.14) Bước 1: mở tệp my.ini Bước 2: bỏ nhận xét dòng này 'bỏ qua-cấp-bảng' bằng cách xóa dấu chấm phẩy Bước 3: Khởi động lại mysql máy chủ bước 4: khởi chạy bảng điều khiển mySQL bước 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

Bước 6: Vấn đề đã được giải quyết !!!!

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.