Thay đổi quyền lưu trữ cho người dùng MySQL


44

Tôi có các khoản trợ cấp sau cho người dùng / cơ sở dữ liệu

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

Để cho phép truy cập bên ngoài vào cơ sở dữ liệu, tôi cần thay đổi localhost thành %. Một cách để làm điều này là REVOKEtất cả các quyền và thiết lập lại. Vấn đề là, có một mật khẩu được đặt mà tôi không biết, vì vậy nếu tôi thu hồi quyền, tôi không thể đặt lại mật khẩu.

Có cách nào để thay đổi tên máy chủ localhostthành %(và quay lại lần nữa) mà không thu hồi quyền không?

Câu trả lời:


59

Nếu bạn có quyền truy cập vào mysqlcơ sở dữ liệu, bạn có thể thay đổi trực tiếp các bảng cấp:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... và một cách tương tự UPDATEđể thay đổi nó trở lại.

Ngoài ra, bạn cũng có thể cần phải thay đổi mysql.dbbảng:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';

Một chút sửa chữa (phiên bản máy chủ mysql: 5.7.5-m15 - Máy chủ cộng đồng MySQL): cả từ phpmyadmin cũng như dấu nhắc lệnh mysql - CẬP NHẬT mysql. userSET Host= 'localhost' Ở ĐÂU user. Host= '%' VÀ user. User= 'XXXdbusr';
Jadeye 21/07/2015

1
Đối với một cơ sở dữ liệu sản xuất, tôi sẽ cẩn thận với%, nó có thể là một rủi ro bảo mật. Nếu bạn có nhiều máy chủ web, bạn cũng có thể sử dụng các máy chủ có ký tự đại diện như '192.168.0.%' Hoặc ''% .example.com ''. Một tùy chọn khác là thêm cùng một người dùng nhiều lần cho mỗi máy chủ hoặc tạo một người dùng được đặt tên riêng cho mỗi máy chủ web.
okdewit

Nếu, giống như tôi, đã cố gắng cho phép truy cập root trên máy kiểm tra cục bộ (RasPi trong trường hợp của tôi), thì điều này sẽ không hoạt động kể từ MySQL 5.7. Xem chủ đề này
Raul Pinto

@RaulPinto: chủ đề đó dường như là về phpMyAdmin, không hoàn toàn phù hợp ở đây, nhưng rất tốt để lưu ý cho những người chỉ sử dụng nó.
nickgrim

Tốt hơn để sử dụng tuyên bố tài liệu tốt RENAME USER
Antonio Bardazzi

6

Câu trả lời hay nhất trên Stackoverflow gợi ý sử dụng RENAME USERbản sao đặc quyền người dùng.

Sử dụng Ngôn ngữ điều khiển dữ liệu (các câu lệnh như GRANT, REVOKE, RENAME, v.v.) không yêu cầu FLUSH PRIVILEGES;và được yêu cầu trong kiến ​​trúc như Galera hoặc Sao chép nhóm trong đó các bảng MyISAM không được sao chép.


2

Tôi cũng tình cờ tìm thấy giải pháp này và giải pháp đề xuất không hoạt động, vì các đặc quyền cụ thể của cơ sở dữ liệu cũng sẽ không được di chuyển. tôi đã làm gì:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

Và "nó" có hoạt động không?
Pierre.Vriens

1

Để thay đổi đặc quyền, trước tiên hãy thu hồi tất cả các quyền cho người dùng

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;

Đó chính xác là vấn đề của tôi, tôi không thể thu hồi quyền vì mật khẩu. Xin vui lòng đọc câu hỏi của tôi.
Fu86

Bạn có thể đặt băm mật khẩu giống với mật khẩu cũ thông qua bản cập nhật. Bạn không cần phải biết mật khẩu thực tế để làm điều đó.
rủ rê

0

Thiếu rất nhiều bảng nếu bạn có các đặc quyền khác ngoài db (như bảng hoặc cột, v.v.). Tùy thuộc vào những gì người dùng của bạn cấp, bạn có thể cần cập nhật tất cả các bảng này hoặc một số bảng:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
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.