LRI 1396 (HY000): Thao tác TẠO NGƯỜI DÙNG không thành công cho 'jack' @ 'localhost'


311

Tôi dường như không thể tạo lại một người dùng đơn giản mà tôi đã xóa, ngay cả khi đã root trong MySQL.

Trường hợp của tôi: người dùng 'jack' đã tồn tại trước đó, nhưng tôi đã xóa nó khỏi mysql.user để tạo lại nó. Tôi thấy không có dấu tích này trong bảng đó. Nếu tôi thực thi lệnh này cho một số tên người dùng ngẫu nhiên khác, giả sử 'jimmy', nó hoạt động tốt (giống như ban đầu đã làm cho 'jack').

Tôi đã làm gì để làm hỏng 'jack' của người dùng và làm cách nào tôi có thể hoàn tác tham nhũng đó để tạo lại 'jack' với tư cách là người dùng hợp lệ cho cài đặt MySQL này?

Xem ví dụ dưới đây. (Tất nhiên, ban đầu, có nhiều thời gian giữa việc tạo ra 'jack' và việc loại bỏ anh ta.)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jack             | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
5 rows in set (0.00 sec)

mysql> delete from user where user = 'jack';
Query OK, 1 row affected (0.00 sec)

mysql> select user,host from user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
4 rows in set (0.00 sec)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
ERROR 1396 (HY000): Operation CREATE USER failed for 'jack'@'localhost'
mysql> CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jimmy            | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
5 rows in set (0.00 sec)

Câu trả lời:


233

Hãy thử làm một FLUSH PRIVILEGES;. Bài đăng lỗi MySQL này trên mã lỗi đó có vẻ như báo cáo một số thành công trong trường hợp tương tự như của bạn sau khi xóa thông tin cá nhân. 


13
Tôi đã tìm thấy gợi ý này và đã thử nó sớm hơn nhưng không thành công, nhưng có lẽ có gì đó không ổn. Thử lại lần nữa, sau đó tạo lại tình huống với một người dùng khác, tôi thấy rằng điều này thực tế đã làm điều khó khăn. Tất nhiên, câu trả lời chính thức ngày hôm nay là "đừng ngu ngốc" và sử dụng REVOKE và DROP USER để làm điều đó đúng. Tôi mắc nợ cả ba câu trả lời (câu trả lời này chỉ là câu trả lời giúp tôi thoát khỏi tình trạng khó khăn hiện tại).
Russ Bateman

13
Đó là năm 2016, mysql ở phiên bản 14,14 và nó vẫn bị hỏng.
ivo Welch

4
Trước tiên tôi cần bỏ người dùng theo câu trả lời @ tver3305.
Shautieh

9
Tôi đang gặp vấn đề tương tự với 10.1.21, nhưng "đặc quyền tuôn ra" không tạo ra sự khác biệt nào. Tôi bỏ người dùng, xóa, rồi tạo, không thành công với "ERROR 1396 (HY000) ở dòng 7: Thao tác CREATE USER không thành công cho ...". Tôi ước tôi có thể yêu cầu mysql / mariadb giải thích một chút về lỗi đó, như TẠI SAO nó thất bại.
David M. Karr

3
Tôi đã gặp lỗi ngay cả khi tôi cũng cố gắng bỏ người dùng, 'đặc quyền tuôn ra' không hiệu quả với tôi, sau khi nghiên cứu một chút, tôi đã tìm ra giải pháp bằng cách thu hồi tất cả quyền truy cập và bỏ người dùng, tôi không nghĩ vậy , hoạt động tuôn ra sẽ giúp ích trong các trường hợp tương tự, tôi đã chia sẻ lời giải thích chi tiết của mình trên trang này rathishkumar.in/2018/10/ mẹo
Rathish

545

vâng lỗi này là có. Tuy nhiên, tôi tìm thấy một cách giải quyết nhỏ.

  • Giả sử người dùng ở đó, vì vậy hãy thả người dùng
  • Sau khi xóa người dùng, cần phải xóa các đặc quyền mysql
  • Bây giờ tạo người dùng.

Điều đó sẽ giải quyết nó. Giả sử chúng tôi muốn tạo quản trị viên người dùng @ localhost, đây sẽ là các lệnh:

thả quản trị người dùng @ localhost;
đặc quyền tuôn ra;
tạo quản trị viên người dùng @ localhost được xác định bởi ' admins_password '

Chúc mừng


58
Đặc quyền xả nước một mình đã không làm việc cho tôi. thả người dùng cố định mọi thứ. Cảm ơn.
Jake

3
Tương tự cho tôi. Tôi đã phải bỏ người dùng đầu tiên.
kgiannakakis

3
Giải pháp @QuantumMechanic không hiệu quả với tôi nhưng thả rồi xả nước.
hobs

Trong trường hợp của tôi, chỉ cần thả người dùng là enogh, không có đặc quyền.
Scadge

Đây là một trình bảo vệ cuộc sống HUGE - vì với @Jake phía trên phần quan trọng là người dùng thả với phần localhost
kellyfj

46

Lỗi này đã xuất hiện trên bug.mysql.com từ năm 2007 và chủ đề này chủ yếu chỉ là một câu vẹt của tất cả những câu trả lời sai thậm chí cho đến một năm trước.

Theo các tài liệu MySQL, lệnh thích CREATE USER, GRANT, REVOKE, và DROP USERkhông yêu cầu tiếp theo FLUSH PRIVILEGESlệnh. Nó khá rõ ràng tại sao, nếu một người đọc các tài liệu. Đó là bởi vì việc thay đổi các bảng MySQL trực tiếp không tải lại thông tin vào bộ nhớ; Tuy nhiên, rất nhiều giải pháp cho yêu cầu lỗi này FLUSH PRIVILEGESlà câu trả lời.

Điều này cũng có thể không phải là một lỗi. Đó là một âm mưu tài liệu - tài liệu khác nhau ở một nơi quan trọng từ phiên bản này sang phiên bản khác.

13.7.1.2. Cú pháp sử dụng DROP

...

Người dùng DROP USER [, người dùng] ...

...

NGƯỜI DÙNG DROP 'jeffrey' @ 'localhost';

Nếu bạn chỉ chỉ định phần tên người dùng của tên tài khoản, một phần tên máy chủ của '%' sẽ được sử dụng.

DROP USERnhư hiện tại trong MySQL 5.0.0 chỉ xóa các tài khoản không có đặc quyền. Trong MySQL 5.0.2, nó cũng được sửa đổi để loại bỏ các đặc quyền tài khoản. Điều này có nghĩa là quy trình xóa tài khoản phụ thuộc vào phiên bản MySQL của bạn.

Kể từ MySQL 5.0.2, bạn có thể xóa tài khoản và các đặc quyền của tài khoản như sau:

Người dùng DROP USER;

Câu lệnh xóa các hàng đặc quyền cho tài khoản khỏi tất cả các bảng cấp.

Lần duy nhất tôi gặp lỗi này là khi tôi làm DROP USER user; như tài liệu gợi ý, nhưng MySQL không coi '%' là ký tự đại diện theo cách có thể bỏ tất cả người dùng ở tất cả các máy chủ. Rốt cuộc nó không quá hoang dã. Hoặc, có thể đôi khi nó hoạt động khi xóa người dùng localhost và sau đó cố gắng xóa cái đó ở%.

Tôi thấy rõ rằng khi nó cố gắng xóa người dùng ở%, nó sẽ phát ra một thông báo lỗi và thoát. Sau đó CREATE USERtại localhost sẽ thất bại vì người dùng localhost không bao giờ bị xóa. Dường như không cần phải lãng phí thời gian để đào bới trong các bảng cấp phép tìm kiếm ma như một poster đề xuất.

Tôi thấy 7 phiếu bầu cho:

NGƯỜI DÙNG DROP 'jack @ localhost'; // xóa hoàn toàn tài khoản

Được hiểu là DROP USER 'jack@localhost'@'%';# sai

Thực tế có vẻ như có một lỗi thực sự tạo ra thông báo lỗi tương tự, nhưng nó phải xảy ra với người dùng được tạo đầu tiên (sau khi cài đặt máy chủ mysql mới) bị hủy. Cho dù lỗi đó đã được sửa, tôi không biết; nhưng tôi không nhớ điều đó xảy ra gần đây và tôi lên đến phiên bản 5.5.27 vào lúc này.


8
Bạn có phải là người viết tài liệu MySQL không?
Pacerier

Đây là câu trả lời cho tôi. Mariadb đã thừa hưởng lỗi này.
ghi lại

Tại sao đây không phải là câu trả lời được chấp nhận: /. Dù sao, cảm ơn bạn @ user1969061. Điều này chắc chắn đã làm việc cho tôi trongmariadb-server-5.5.60-1.el7_5.x86_64
han solo

36

Nếu bạn sử dụng một DELETEcâu lệnh trên mysql.userbảng trong nỗ lực xóa người dùng, sau đó thử thiết lập lại người dùng với CREATE USER, bạn sẽ gặp 1396lỗi. Loại bỏ lỗi này bằng cách chạyDROP USER 'username'@'host';

DELETE 
  FROM mysql.user 
 WHERE user = 'jack';

(Bạn sẽ nhận được 1396 lỗi nếu bạn cố gắng tạo lại jack)

CREATE USER 'jack'@'localhost' IDENTIFIED BY PASSWORD '*Fi47ytFF3CD5B14E7EjkjkkC1D3F8086A5C0-krn';

(Thoát khỏi tình huống này bằng cách chạy DROP USER)

DROP USER 'jack'@'localhost';

(Tôi cho rằng FLUSH PRIVILEGESkhông thể làm tổn thương, nhưng chắc chắn bỏ người dùng trước.)


24

Bạn không nên xóa thủ công theo cách đó. MySQL có REVOKEcú pháp để loại bỏ các đặc quyền và DROP USERđể xóa chúng:

REVOKE priv1,priv2,priv3,etc... FROM 'jack@localhost'; // remove certain privileges
DROP USER 'jack@localhost'; // completely delete the account

Tốt nhất để sử dụng các công cụ được cung cấp thay vì mucking xung quanh trong nền.


2
Đây là câu trả lời thực sự, nhưng không phải là vấn đề tôi gặp phải (được tạo ra bởi sự ngu ngốc của tôi). Cảm ơn bạn rất nhiều vì đã đặt tôi thẳng!
Russ Bateman

@Marc, vậy thì tại sao họ thậm chí còn phát minh ra ngay flush privilegestừ đầu? Các tài liệu MySQL chính thức làm nói về những thứ như thế delete from user where user = 'jack';flush privileges. Tại sao bạn nói rằng chúng không phải là một phần của các công cụ được cung cấp?
Pacerier

1
Như @ user1969061 chỉ ra, 'jack@localhost'có lẽ nên 'jack'@'localhost'ở đây.
jochen

11

Thả người dùng, tuôn ra các đặc quyền; Sau đó, tạo người dùng. Nó không hoạt động!


1
Đặc quyền xả nước một mình không hoạt động cho đến khi tôi bỏ người dùng. Cảm ơn.
Brandon Fitzpatrick

10

thử delete from mysql.db where user = 'jack'và sau đó tạo người dùng


1
Điều này rất hữu ích trong việc giúp tôi hiểu cách tôi đã làm hỏng cài đặt của mình. Cảm ơn rât nhiều.
Russ Bateman

Đọc thêm về bình luận của Fely. Có nhiều bảng liên quan hơn.
Tù nhân 13

6

Trong MySQL 5.6 sử dụng Drop user userid;không hoạt động. Sử dụng: Drop user 'userid'@'localhost';và / hoặc Drop user 'userid'@'%';. Bằng cách này, tôi đã có thể bỏ người dùng và tạo lại nó.


5
two method 
one :
setp 1: drop user 'jack'@'localhost';
setp 2: create user 'jack'@localhost identified by 'ddd';

two:
setp 1: delete from user where user='jack'and host='localhost';
setp 2: flush privileges;
setp 3: create user 'jack'@'localhost' identified by 'ddd';

5

Kiểm tra nếu là

'người sử dụng'@'%'

hoặc là

'người dùng' @ 'localhost'


4

Nếu bạn muốn xóa một người dùng với sql, bạn cần phải xóa các dữ liệu có liên quan trong các bảng: columns_priv, db, procs_priv, tables_priv. Sau đó thực hiệnflush privileges;


Câu trả lời tốt đẹp !! Câu trả lời của bạn phơi bày vấn đề 'đằng sau hậu trường' về những gì thực sự xảy ra thay vì chỉ "Sử dụng bản vá này và bạn vẫn ổn". Tôi thích cả hai loại câu trả lời bao gồm tất cả cùng nhau để tôi có thể hiểu nó từ súp đến các loại hạt. Bây giờ tôi biết sẽ làm được bao nhiêu công việc theo cách này nếu bạn sẽ làm đúng - và điều đó càng củng cố lý do tại sao người ta nên sử dụng các phương pháp được người khác vạch ra. Tuyệt vời! Mặc dù nhiều câu trả lời ở trên là tốt, tôi sẽ cho bạn phiếu bầu của tôi vì tôi biết những gì mới là người mới đến trang web này. Họ làm cho nó thực sự khó khăn để giúp đỡ người khác khi bạn mới.
Tù nhân 13

Đây phải là một câu trả lời thay thế được chấp nhận. Tôi đang sử dụng mysql 5.5 và DROP USER NẾU EXISTS chưa khả dụng nên tôi phải sử dụng cú pháp XÓA TỪ người dùng (trước tiên tôi phải kiểm tra sự tồn tại của người dùng). Xóa khỏi bảng người dùng một mình không hoạt động. Cũng không có QUYỀN RIÊNG TƯ. Bạn phải xóa từ các bảng khác ở trên.
alds

4

Vui thay, bàn làm việc của MySQL đã giải quyết nó cho tôi. Trong tab Quản trị -> Người dùng và Đặc quyền, người dùng được liệt kê có lỗi. Sử dụng tùy chọn xóa đã giải quyết vấn đề.


3

Một công việc đơn giản xung quanh vấn đề này. Vì lệnh "xóa" chỉ xóa hồ sơ người dùng trong bảng "người dùng" của cơ sở dữ liệu "mysql", chúng tôi có thể thêm lại và sau đó loại bỏ hoàn toàn người dùng. Sau đó, bạn có thể tạo người dùng có cùng tên.

Bước 1. tìm định dạng bản ghi của bảng người dùng trong cơ sở dữ liệu mysql

use mysql;
select * from user;

Bước 2. Theo các cột được hiển thị trong bước 1, tạo một bản ghi giả với tên người dùng. Ví dụ, chèn nó vào bảng, được nhắc thay thế "tên người dùng" bằng tên người dùng của bạn.

Insert into user value ('%','username','N','N','N','N','N',
'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
'N','N','N','N','N','N','N','N','N','','','','','0','0','0',
'0','mysql_native_password',
'*52C5E3AC6BC5E2E0BFF86978BF62A1481AC79D58','N',
'2016-12-10 23:59:12',null,'N');

Lưu ý: đôi khi bạn có thể gặp phải sự cố khi chèn, chỉ cần thay đổi dữ liệu để làm cho nó hoạt động.

Bước 3. Thả người dùng.

drop user username;

Bây giờ bạn có thể tạo người dùng có cùng tên.


Hãy thử MÔ TẢ <tablename>
Tù nhân 13

2

Bài đăng này MySQL ERROR 1045 (28000): Truy cập bị từ chối cho người dùng 'bill' @ 'localhost' (sử dụng mật khẩu: CÓ) là hữu ích. Đôi khi, có một người dùng ẩn danh '' @ 'localhost' hoặc '' @ '127.0.0.1'. Vì vậy, để giải quyết vấn đề,

  1. đầu tiên thả người dùng có 'tạo người dùng' không thành công.

  2. Tạo người dùng mới.

  3. Cấp đặc quyền cần thiết cho người dùng mới.

  4. Đặc quyền xả nước.


Cảm ơn vì điều đó. Tôi đã quên chạy mysql_secure_installation đã xóa người dùng ẩn danh.
ablackhat

2

Tôi đã có những lỗi giống nhau. Nhưng chỉ huy "QUYỀN RIÊNG TƯ;" đã không giúp đỡ. Tôi đã làm như thế:

CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
UPDATE mysql.user SET USER='jack' WHERE USER='jimmy';

0

Máy chủ MySQL đang chạy với tùy chọn --skip-Grant-bảng để nó không thể thực thi câu lệnh này


0

Tôi biết điều này đã cũ, nhưng vì nó là kết quả đầu tiên trong Google nên tôi nghĩ rằng tôi nên thêm giải pháp của mình. Trong trường hợp của tôi, người dùng đã hoạt động tốt, nhưng việc tạo lại người dùng đã cho tôi một "ERROR 2013 (HY000): Mất kết nối với máy chủ MySQL trong khi truy vấn" và "ERROR 2006 (HY000): Máy chủ MySQL đã biến mất." Tôi đã thử các đặc quyền tuôn ra -> thả giải pháp người dùng, nhưng vẫn gặp lỗi tương tự.

Trong trường hợp của tôi, lỗi là do nâng cấp mysql từ 5.1 -> 5.6. Xem các bản ghi lỗi, tôi nhận thấy rằng nó chạy để chạy mysql_upTHER. Đã làm điều đó và tuyên bố người dùng tạo của tôi làm việc tốt!


0

Gần đây tôi đã gặp lỗi này.

Điều làm việc cho tôi là kiểm tra trong bàn làm việc của mysql 'Người dùng và Đặc quyền' và nhận ra người dùng vẫn tồn tại.

Sau khi xóa nó từ đó, tôi đã có thể tạo lại người dùng.


0

mysql> DELETE FROM mysql.db WHERE user = 'jack'

Khởi động lại máy chủ:

# mysql.server restart

Sau đó làm CREATE USERlệnh của bạn .


Điều này không hữu ích. Các lỗi đã gặp phải CREATEsau DELETE.
waqasgard

0

Tôi đã đối mặt với vấn đề này ngày hôm nay và tôi đã giải quyết nó bằng cách thực hiện các bước sau:

1) chèn thủ công người dùng đang gặp rắc rối cung cấp giá trị của các trường bắt buộc vào mysql.user

mysql> insert into user(Host, User, Password, ssl_type) 
   values ('localhost', 'jack', 'jack', 'ANY');

2)

mysql> select * from user where User = 'jack';
   1 row in set (0.00 sec)

3) A.

mysql> drop user jack;
Query OK, 0 rows affected (0.00 sec)

B. mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

C. mysql> create user 'jack' identified by 'jack';
Query OK, 0 rows affected (0.00 sec)

D. mysql> select Host, User, Password, ssl_type  from user where User = 'jack';
+-----------+-----------+-------------------------------------------+----------+
| Host      | User      | Password                                  | ssl_type |
+-----------+-----------+-------------------------------------------+----------+
| localhost | jack      | jack                                      | ANY      |
| %         | jack      | *45BB7035F11303D8F09B2877A00D2510DCE4D758 |          |
+-----------+-----------+-------------------------------------------+----------+
2 rows in set (0.00 sec)

4) A.

mysql> delete from user 
 where User = 'nyse_user' and 
       Host = 'localhost' and 
       Password ='nyse';
Query OK, 1 row affected (0.00 sec)

B.

mysql> select Host, User, Password, ssl_type  from user where User = 'jack';
+------+-----------+-------------------------------------------+----------+
| Host | User      | Password                                  | ssl_type |
+------+-----------+-------------------------------------------+----------+
| %    | jack      | *45BB7035F11303D8F09B2877A00D2510DCE4D758 |          |
+------+-----------+-------------------------------------------+----------+
1 row in set (0.00 sec)

Hi vọng điêu nay co ich.


-2

Chỉ cần xóa dữ liệu liên quan đến người dùng khỏi mysql.db (có thể từ các bảng khác nữa), sau đó tạo lại cả hai.


-2

Tôi cũng đã phải đối mặt với cùng một vấn đề, sau vài lần tìm kiếm, tôi đã tìm thấy một giải pháp hiệu quả cho mình. Tôi hy vọng nó sẽ giúp bạn. Như bạn đã tạo người dùng, bây giờ hãy thử thực hiện FLUSH PRIVILEGEStrên bảng điều khiển Mysql của bạn. Vấn đề này đã có trong bài viết lỗi MySql. Bạn cũng có thể kiểm tra cái này. Bây giờ sau khi xả, bạn có thể tạo một người dùng mới. làm theo các bước dưới đây:

Step-1: Open terminal Ctrl+Alt+T
Step-2: mysql -u root -p  , it will ask for your MySQL password.

Bây giờ bạn có thể thấy giao diện điều khiển Mysql.

Step-3: CREATE USER 'username'@'host' IDENTIFIED by 'PASSWORD';

Thay vì tên người dùng, bạn có thể đặt tên người dùng bạn muốn. Nếu bạn đang chạy Mysql trên máy cục bộ của mình, hãy nhập "localhost" thay vì máy chủ, nếu không hãy đặt tên máy chủ mà bạn muốn truy cập.

Ví dụ: TẠO NGƯỜI DÙNG smruti @ localhost XÁC NHẬN bằng 'xin chào';

Bây giờ người dùng mới được tạo. Nếu bạn muốn cung cấp cho tất cả quyền truy cập thì gõ

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Bây giờ bạn có thể thoát khỏi MySQL bằng cách nhập \q. Bây giờ hãy đăng nhập lại

mysql -u newusername -p, sau đó nhấn Enter. Bạn có thể thấy mọi thứ.

Hi vọng điêu nay co ich.

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.