GALAT 1396 (HY000): Operasi BUAT PENGGUNA gagal karena 'jack' @ 'localhost'

311

Sepertinya saya tidak dapat membuat kembali pengguna sederhana yang saya hapus, bahkan sebagai root di MySQL.

Kasus saya: 'jack' pengguna ada sebelumnya, tetapi saya menghapusnya dari mysql.user untuk membuatnya kembali. Saya tidak melihat tanda-tanda ini di meja itu. Jika saya menjalankan perintah ini untuk beberapa nama pengguna lain yang acak, katakan 'jimmy', itu berfungsi dengan baik (seperti yang awalnya dilakukan untuk 'jack').

Apa yang telah saya lakukan untuk merusak 'jack' pengguna dan bagaimana saya bisa membatalkan korupsi itu untuk membuat kembali 'jack' sebagai pengguna yang valid untuk instalasi MySQL ini?

Lihat contoh di bawah ini. (Tentu saja, awalnya, ada banyak waktu antara penciptaan 'jack' dan pemindahannya.)

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)
Russ Bateman
sumber

Jawaban:

233

Coba lakukan a FLUSH PRIVILEGES;. Posting bug MySQL ini pada kode kesalahan itu muncul untuk melaporkan beberapa keberhasilan dalam kasus yang mirip dengan Anda setelah pembilasan privasi. 

Mekanika Kuantum
sumber
13
Saya telah menemukan saran ini dan mencobanya sebelumnya tanpa hasil, tetapi mungkin ada sesuatu yang salah. Mencoba sekarang lagi, lalu menciptakan kembali situasi dengan pengguna lain, saya menemukan bahwa ini memang melakukan trik. Tentu saja, jawaban resmi hari ini adalah "tidak bodoh" dan menggunakan REVOKE dan DROP USER untuk melakukannya dengan benar. Saya berhutang budi pada ketiga jawaban (yang satu ini kebetulan adalah jawaban yang membebaskan saya dari kesulitan saya sekarang).
Russ Bateman
13
Ini 2016, mysql di v14.14, dan itu masih rusak.
ivo Welch
4
Saya pertama-tama harus menjatuhkan pengguna sesuai jawaban @ tver3305.
Shautieh
9
Saya melihat masalah yang sama dengan 10.1.21, tetapi "hak istimewa flush" tidak membuat perbedaan. Saya jatuhkan pengguna, siram, lalu buat, yang gagal dengan "ERROR 1396 (HY000) di baris 7: Operasi BUAT PENGGUNA gagal untuk ...". Saya berharap saya bisa mendapatkan mysql / mariadb untuk menguraikan sedikit tentang kesalahan itu, seperti MENGAPA gagal.
David M. Karr
3
Saya mendapatkan kesalahan bahkan ketika saya mencoba untuk menjatuhkan pengguna juga, 'hak istimewa flush' tidak bekerja untuk saya, setelah melakukan sedikit riset, saya menemukan solusinya dengan mencabut semua akses dan menjatuhkan pengguna, saya tidak berpikir begitu , operasi flush akan membantu dalam kasus serupa, saya telah berbagi penjelasan terperinci saya di halaman ini rathishkumar.in/2018/10/…
Rathish
545

ya bug ini ada di sana. Namun, saya menemukan solusi kecil.

  • Asumsikan pengguna ada di sana, jadi jatuhkan pengguna
  • Setelah menghapus pengguna, ada kebutuhan untuk menghapus hak mysql
  • Sekarang buat pengguna.

Itu harus menyelesaikannya. Dengan asumsi kami ingin membuat admin pengguna @ localhost, ini akan menjadi perintah:

jatuhkan admin pengguna @ localhost;
hak istimewa;
buat admin pengguna @ localhost diidentifikasi oleh ' admins_password '

Bersulang

tver3305
sumber
58
Hak istimewa flush saja tidak bekerja untuk saya. menjatuhkan pengguna memperbaiki segalanya. Terima kasih.
Jake
3
Sama untuk ku. Saya harus menurunkan pengguna terlebih dahulu.
kgiannakakis
3
Solusi @ QuantumMechanic tidak bekerja untuk saya tetapi drop kemudian siram tidak.
hobs
Dalam kasus saya, hanya menjatuhkan pengguna adalah enogh, tanpa hak istimewa.
Scadge
Ini adalah penyelamat BESAR - karena dengan @Jake di atas bagian kuncinya adalah pengguna drop dengan bagian localhost
kellyfj
46

Bug ini telah ada di bugs.mysql.com sejak 2007 dan utas ini terutama merupakan parrot dari semua jawaban yang salah itu bahkan hingga setahun yang lalu.

Menurut dokumentasi MySQL, perintah seperti CREATE USER, GRANT, REVOKE, dan DROP USERtidak memerlukan berikutnya FLUSH PRIVILEGESperintah. Cukup jelas mengapa, jika seseorang membaca dokumen. Itu karena mengubah tabel MySQL secara langsung tidak memuat ulang info ke dalam memori; namun kebanyakan solusi untuk klaim bug ini FLUSH PRIVILEGESadalah jawabannya.

Ini bahkan mungkin bukan bug. Ini adalah konspirasi dokumentasi - dokumen bervariasi di satu tempat kritis dari satu versi ke versi lainnya.

13.7.1.2. Sintaks PENGGUNA DROP

...

Pengguna DROP USER [, pengguna] ...

...

DROP USER 'jeffrey' @ 'localhost';

Jika Anda hanya menentukan bagian nama pengguna dari nama akun, bagian nama host dari '%' digunakan.

DROP USERseperti yang ada di MySQL 5.0.0 hanya menghapus akun yang tidak memiliki hak istimewa. Di MySQL 5.0.2, itu dimodifikasi untuk menghapus hak akun juga. Ini berarti bahwa prosedur untuk menghapus akun tergantung pada versi MySQL Anda.

Pada MySQL 5.0.2, Anda dapat menghapus akun dan hak istimewanya sebagai berikut:

Pengguna DROP USER;

Pernyataan itu menghapus baris privilege untuk akun dari semua tabel hibah.

Satu-satunya waktu saya mendapatkan kesalahan ini adalah ketika saya melakukannya DROP USER user; seperti yang disarankan oleh dokumen, tetapi MySQL tidak memperlakukan '%' sebagai wildcard dengan cara yang akan menjatuhkan semua pengguna di semua host. Lagipula tidak begitu liar. Atau, mungkin terkadang berfungsi saat menghapus pengguna localhost dan kemudian mencoba menghapus yang di%.

Jelas bagi saya bahwa ketika mencoba menghapus pengguna di%, ia mengeluarkan pesan kesalahan dan berhenti. Selanjutnya CREATE USERdi localhost akan gagal karena pengguna localhost tidak pernah dihapus. Tampaknya tidak perlu membuang waktu menggali di meja hibah untuk mencari hantu seperti yang disarankan oleh salah satu poster.

Saya melihat 7 suara untuk:

DROP USER 'jack @ localhost'; // hapus akun sepenuhnya

Yang diartikan sebagai DROP USER 'jack@localhost'@'%';# salah

Tampaknya sebenarnya ada bug nyata yang menghasilkan pesan kesalahan yang sama, tetapi itu ada hubungannya dengan pengguna yang dibuat pertama (setelah menginstal server mysql baru) yang dihapus. Apakah bug itu sudah diperbaiki, saya tidak tahu; tapi saya tidak ingat itu terjadi akhir-akhir ini dan saya sampai ver 5.5.27 saat ini.

pengguna1969061
sumber
8
Apakah Anda seorang penulis dokumen MySQL?
Pacerier
Ini jawaban untuk saya. Mariadb telah mewarisi bug ini.
zerpsed
Mengapa ini bukan jawaban yang diterima: /. Bagaimanapun, terima kasih @ user1969061. Hal ini tentu bekerja untuk saya dimariadb-server-5.5.60-1.el7_5.x86_64
han bersama
36

Jika Anda menggunakan DELETEpernyataan di atas mysql.usermeja dalam upaya untuk menghapus pengguna, kemudian mencoba untuk membangun kembali pengguna CREATE USER, Anda akan mendapatkan 1396kesalahan. Singkirkan kesalahan ini dengan menjalankanDROP USER 'username'@'host';

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

(Anda akan mendapatkan 1396 kesalahan jika Anda mencoba membuat kembali jack)

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

(Keluar dari situasi ini dengan berlari DROP USER)

DROP USER 'jack'@'localhost';

(Saya kira FLUSH PRIVILEGEStidak ada salahnya, tapi pasti jatuhkan pengguna terlebih dahulu.)

Anthony Rutledge
sumber
24

Anda seharusnya tidak secara manual menghapus pengguna dengan cara itu. MySQL memiliki REVOKEsintaks untuk menghapus privilege dan DROP USERmenghapusnya:

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

Cara terbaik untuk menggunakan alat yang disediakan daripada mucking di latar belakang.

Marc B
sumber
2
Ini adalah jawaban yang sebenarnya, tetapi tidak untuk masalah yang saya alami (yang diciptakan oleh kebodohan saya). Terima kasih banyak telah meluruskan saya!
Russ Bateman
@ Mark, Lalu , mengapa mereka bahkan menciptakan flush privilegesdi tempat pertama? Dokumentasi MySQL resmi melakukan pembicaraan tentang hal-hal seperti delete from user where user = 'jack'; dan flush privileges. Mengapa Anda mengatakan bahwa itu bukan bagian dari alat yang disediakan?
Pacerier
1
Seperti yang ditunjukkan oleh @ user1969061, 'jack@localhost'mungkin harus ada di 'jack'@'localhost'sini.
jochen
11

Jatuhkan pengguna, siram hak istimewa; lalu, buat pengguna. Itu berhasil!

罗俊峰
sumber
1
Hak istimewa flushing saja tidak berfungsi sampai saya menjatuhkan pengguna. Terima kasih.
Brandon Fitzpatrick
10

coba delete from mysql.db where user = 'jack'lalu buat pengguna

a1ex07
sumber
1
Ini berguna untuk membantu saya memahami bagaimana saya telah merusak instalasi saya. Terima kasih banyak.
Russ Bateman
Baca lebih lanjut ke komentar Fely. Ada lebih banyak tabel yang terlibat.
Tahanan 13
6

Di MySQL 5.6 menggunakan Drop user userid;tidak berfungsi. Gunakan: Drop user 'userid'@'localhost';dan / atau Drop user 'userid'@'%';. Dengan cara ini saya bisa menjatuhkan pengguna dan membuatnya kembali.

Joilson Cardoso
sumber
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';
TonyWu
sumber
5

Periksa apakah ada

'pengguna' @ '%'

atau

'pengguna' @ 'localhost'

Inês Gomes
sumber
4

Jika Anda ingin menghapus pengguna dengan sql, Anda perlu menghapus data terkait dalam tabel ini: columns_priv, db, procs_priv, tables_priv. Kemudian jalankanflush privileges;

sungguh-sungguh
sumber
Jawaban bagus!! Jawaban Anda menunjukkan masalah 'di balik layar' tentang apa yang sebenarnya terjadi, bukan hanya "Gunakan tambalan ini dan Anda siap melakukannya". Saya suka kedua jenis jawaban termasuk semuanya sehingga saya bisa memahaminya dari sup menjadi kacang. Sekarang saya tahu berapa banyak pekerjaan yang harus dilakukan dengan cara ini jika Anda akan melakukannya dengan benar - dan itu semakin memperkuat mengapa seseorang harus menggunakan metode yang digariskan oleh orang lain. Luar biasa! Meskipun banyak jawaban di atas baik, saya memberikan Anda suara saya karena saya tahu bagaimana rasanya menjadi pendatang baru di situs ini. Mereka membuatnya sangat sulit untuk membantu orang lain ketika Anda baru.
Tahanan 13
Ini harus menjadi jawaban alternatif yang diterima. Saya menggunakan mysql 5.5 dan DROP USER JIKA ADA belum tersedia sehingga saya harus menggunakan sintaks pengguna DELETE FROM (saya harus menguji keberadaan pengguna terlebih dahulu). Menghapus dari tabel pengguna saja tidak berhasil. FLUSH PRIVILEGES juga tidak. Anda harus menghapus dari tabel lain di atas.
alds
4

Lucunya, meja kerja MySQL menyelesaikannya untuk saya. Di tab Administrasi -> Pengguna dan Hak Istimewa, pengguna terdaftar dengan kesalahan. Menggunakan opsi hapus memecahkan masalah.

juettemann
sumber
3

Pekerjaan sederhana tentang masalah ini. Karena perintah "delete" hanya menghapus catatan pengguna dalam tabel "user" dari database "mysql", kita bisa menambahkannya kembali dan kemudian menjatuhkan pengguna sepenuhnya. Kemudian Anda bisa membuat pengguna dengan nama yang sama.

Langkah 1. temukan format rekaman tabel pengguna di database mysql

use mysql;
select * from user;

Langkah 2. Menurut kolom yang ditunjukkan pada langkah1, buat catatan boneka dengan nama pengguna. Masukkan ke dalam tabel, misalnya, diingatkan untuk mengganti "nama pengguna" dengan nama pengguna Anda.

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');

Catatan: kadang-kadang Anda mungkin mengalami masalah dalam menyisipkan, cukup ubah data untuk membuatnya berfungsi.

Langkah 3. Jatuhkan pengguna.

drop user username;

Sekarang Anda dapat membuat pengguna dengan nama yang sama.

Jason Mao
sumber
Coba DESCRIBE <tablename>
Prisoner 13
2

Posting ini MySQL ERROR 1045 (28000): Akses ditolak untuk 'tagihan' @ 'localhost' pengguna (menggunakan kata sandi: YES) berguna. Terkadang, ada pengguna anonim '' @ 'localhost' atau '' @ '127.0.0.1'. Jadi, untuk menyelesaikan masalah,

  1. jatuhkan dulu pengguna yang 'buat pengguna' gagal.

  2. Buat pengguna baru.

  3. Berikan hak istimewa yang diperlukan kepada pengguna baru.

  4. Hak istimewa flush.

user_19
sumber
Terima kasih untuk ini. Saya lupa menjalankan mysql_secure_installation yang menghapus pengguna anonim.
ablackhat
2

Saya memiliki kesalahan yang sama. Tetapi perintahkan "FLUSH PRIVILEGES;" tidak membantu. Saya memang suka itu:

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

Server MySQL berjalan dengan opsi --skip-grant-tables sehingga tidak dapat menjalankan pernyataan ini

irfan habib
sumber
0

Saya tahu ini sudah tua, tetapi karena ini adalah hasil pertama di Google saya pikir saya harus menambahkan solusi saya. Dalam kasus saya menjatuhkan pengguna bekerja dengan baik, tetapi menciptakan kembali pengguna memberi saya "ERROR 2013 (HY000): Sambungan hilang ke server MySQL selama permintaan" dan "ERROR 2006 (HY000): Server MySQL telah pergi." Saya mencoba hak flush -> drop solusi pengguna, tetapi masih memiliki kesalahan yang sama.

Dalam kasus saya kesalahannya adalah karena upgrade mysql dari 5.1 -> 5.6. Melihat log kesalahan, saya perhatikan bahwa dikatakan untuk menjalankan mysql_upgrade. Apakah itu dan pernyataan pengguna buat saya berfungsi dengan baik!

vik
sumber
0

Saya baru saja mendapat kesalahan ini.

Apa yang berhasil bagi saya adalah memeriksa di meja kerja mysql 'Pengguna dan Hak Istimewa' dan menyadari pengguna masih ada.

Setelah menghapusnya dari sana, saya dapat membuat ulang pengguna.

Demena
sumber
0

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

Mulai ulang server:

# mysql.server restart

Kemudian lakukan CREATE USERperintah Anda .

emallove
sumber
Ini tidak berguna. Kesalahan ditemukan CREATEsetelah DELETE.
waqasgard
0

Saya menghadapi masalah ini hari ini, dan saya mengatasinya dengan melakukan langkah-langkah berikut:

1) secara manual memasukkan pengguna bermasalah yang memberikan nilai bidang wajib ke dalam 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)

Semoga ini membantu.

monika mendiratta
sumber
-2

Hapus saja data terkait pengguna dari mysql.db (mungkin dari tabel lain juga), lalu buat kembali keduanya.

Richard Abonyi
sumber
-2

Saya juga menghadapi masalah yang sama, setelah beberapa pencarian, saya menemukan solusi yang bekerja untuk saya. Saya harap ini akan membantu Anda. Karena Anda telah membuat pengguna, sekarang coba lakukan FLUSH PRIVILEGESdi konsol Mysql Anda. Masalah ini sudah ada di pos bug MySql. Anda juga dapat memeriksa yang ini. Sekarang setelah pembilasan, Anda dapat membuat pengguna baru. ikuti Langkah-langkah di bawah ini:

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

Sekarang Anda dapat melihat konsol Mysql.

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

Alih-alih nama pengguna Anda dapat memasukkan nama pengguna yang Anda inginkan. Jika Anda menjalankan Mysql di mesin lokal Anda, ketikkan "localhost" alih-alih tuan rumah, jika tidak berikan nama server yang ingin Anda akses.

Contoh: CREATE USER smruti @ localhost IDENTIFIED oleh 'hello';

Sekarang pengguna baru dibuat. Jika Anda ingin memberikan semua akses, ketikkan

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

Sekarang Anda dapat keluar dari MySQL dengan mengetik \q. Sekarang masuk kembali

mysql -u newusername -p, lalu tekan Enter. Anda bisa melihat semuanya.

Semoga ini membantu.

PyDevSRS
sumber