ฐานข้อมูลผู้ใช้ MySQL ไม่มีคอลัมน์รหัสผ่าน - การติดตั้ง MySQL บน OSX


172

ฉันพยายามเปลี่ยนรหัสผ่านรูต MySql

สิ่งที่ฉันได้ทำอยู่ด้านล่าง

  1. ติดตั้ง MySql-5.7.6 ~ .dmg (Community Server) และ workbench
  2. ปิดเซิร์ฟเวอร์ในการตั้งค่าระบบ OSX
  3. เข้าถึง MySql ด้วยคอนโซล คำสั่งคือmysqld_safe --skip-grant
  4. ดำเนินการupdate user set password=password('1111') where user='root';และได้รับข้อความแสดงข้อผิดพลาด ERROR 1054 (42S22): Unknown column 'password' in 'field list'->

FYI use mysql;ผม ดังนั้นฉันเลือกแบบสอบถามในตารางผู้ใช้และพบว่าไม่มีรหัสผ่านคอลัมน์จริง ๆ

มันแปลกมาก เป็นไปได้ไหมที่ตารางผู้ใช้ดั้งเดิมไม่มีคอลัมน์รหัสผ่าน?

ฉันจะเปลี่ยนรหัสผ่านซึ่งไม่มีอยู่ได้อย่างไร

ขอบคุณสำหรับคำตอบของคุณ: D


ตอนนี้ฉันทดสอบอีกครั้งและฉันสามารถเข้าถึง MySQL ได้โดยไม่ต้อง PW :( มันเป็นการดีที่จะเปลี่ยน (ฉันหมายถึงการเปลี่ยนแปลงตารางผู้ใช้และเพิ่มคอลัมน์รหัสผ่านผ่านแบบสอบถาม) ตารางผู้ใช้?
Juneyoung Oh

ตั้งค่ารหัสผ่านสำหรับ root @ localhost = รหัสผ่าน ('new-pass') - ใช้ได้กับรุ่น mysql ใด ๆ
SIDU

UPDATE mysql.user SET authentication_string= 'password' WHERE User = 'root'; เนื่องจากฟิลด์ 'รหัสผ่าน' ถูกลบโดย mysql และแทนที่ด้วย authentication_string หมายเหตุ: ฟังก์ชั่น mysql PASSWORD ('รหัสผ่าน') ใช้อัลกอริทึม MD5 ซึ่งแตกออกมานานแล้วโดยใช้การโจมตีวันเกิด ดังนั้นการใช้มันจะให้ความรู้สึกผิด ๆ ด้านความปลอดภัยเนื่องจากผู้โจมตีสามารถวางแฮชที่ผลิตในเว็บไซต์สาธารณะเช่นhashkiller.co.uk/md5-decrypter.aspxและดึงรหัสผ่านข้อความธรรมดาของคุณ
ดร. ดีโอ

คำตอบ:


556

ใน MySQL 5.7 เขตข้อมูลรหัสผ่านในเขตข้อมูลตาราง mysql.user ถูกลบออกตอนนี้ชื่อเขตข้อมูลคือ 'authentication_string'

เลือกฐานข้อมูลก่อน:

mysql>use mysql;

จากนั้นแสดงตาราง:

mysql>show tables;

คุณจะพบตารางผู้ใช้ตอนนี้เรามาดูฟิลด์:

mysql> describe user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(16)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher             | blob                              | NO   |     | NULL                  |       |
| x509_issuer            | blob                              | NO   |     | NULL                  |       |
| x509_subject           | blob                              | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.00 sec)

เซอร์ไพร์ส! ไม่มีฟิลด์ชื่อ 'รหัสผ่าน' ฟิลด์รหัสผ่านชื่อ 'authentication_string' ดังนั้นเพียงแค่ทำสิ่งนี้:

update user set authentication_string=password('1111') where user='root';

ตอนนี้ทุกอย่างจะโอเค

เมื่อเปรียบเทียบกับ MySQL 5.6 การเปลี่ยนแปลงค่อนข้างกว้าง: มีอะไรใหม่ใน MySQL 5.7


42
คุณทำให้วันของฉัน
Bisonfan95

3
วิธีนี้ใช้ได้แม้กับข้อ จำกัด --skip-grant-tables เมื่อเริ่ม mysqld เนื่องจากคุณเป็นผู้ใช้ที่ไม่ระบุชื่อคุณไม่สามารถเปลี่ยนรหัสผ่านด้วย: ALTER USER 'root' @ 'localhost' ที่ระบุโดย 'รหัสผ่านใหม่' ALTER USER 'root' @ '*' ที่ระบุโดย 'รหัสผ่านใหม่' มันจะให้ คุณมีข้อผิดพลาดการอนุญาตผู้ใช้โดยไม่ระบุชื่อ
Bisonfan95

เกิดอะไรขึ้นถ้าไม่มีตารางเลย?
Sahand

1
การเปลี่ยนชื่อฟิลด์รหัสผ่าน ... การตัดสินใจหนึ่งอย่างที่ทำให้ผู้คนจำนวนมากเดือดร้อนมาก ...
talsibony

2
เมื่อรีเซ็ตรหัสผ่านรูทที่ขั้นตอนที่ 2) ให้เปลี่ยนปลั๊กอิน auth เป็น mysql_native_password: use mysql; update user set authentication_string=PASSWORD("") where User='root'; update user set plugin="mysql_native_password" where User='root'; # THIS LINE flush privileges; quit;
Viswa

26

ข้อผิดพลาดนี้เกิดขึ้นถ้าคุณไม่ได้ตั้งรหัสผ่านในการติดตั้งในกรณีนี้MySQL โดยใช้ปลั๊กอินยูนิกซ์ซ็อกเก็ต

แต่ถ้าลบลิงค์ปลั๊กอินจากการตั้งค่า (ตาราง mysql.user) จะมีปัญหาอื่น วิธีนี้ไม่ได้แก้ไขปัญหาและสร้างปัญหาอื่น ในการแก้ไขลิงก์ที่ถูกลบและตั้งรหัสผ่าน ("PWD") ให้ทำ:

1) เรียกใช้ด้วย--skip-grant-tablesตามที่กล่าวไว้ข้างต้น

ถ้ามันไม่ได้งานแล้วเพิ่มสตริงskip-grant-tablesในส่วนของ[mysqld] แล้วทำ/etc/mysql/mysql.conf.d/mysqld.cnf sudo service mysql restart

2) เรียกใช้mysql -u root -pแล้ว (เปลี่ยน "PWD"):

update mysql.user 
    set authentication_string=PASSWORD("PWD"), plugin="mysql_native_password" 
    where User='root' and Host='localhost';    
flush privileges;

quit

sudo service mysql restartแล้วก็ ตรวจสอบ: mysql -u root -p.

ก่อนที่จะrestartลบสตริงนั้นออกจากไฟล์ mysqld.cnf หากคุณตั้งไว้ที่นั่น


จับได้เห็นชัดตรงเผง! plugin = "mysql_native_password" ที่ต้องการและสิทธิ์ล้างข้อมูล ไม่สามารถทำให้สิ่งนี้ทำงานกับตัวอย่างอื่นได้ ขอบคุณ bl79!
TheRealWebGuy

ฉันได้รับERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '("MYNEWPASSWORD"), plugin="mysql_native_password"
โอกาสสมิ ธ

คำตอบของคุณยอดเยี่ยม! นี่เป็นคำตอบเดียวที่ช่วยฉันในระหว่างการต่อสู้ 6 ชั่วโมง
AlexNikonov

plugin = "mysql_native_password" ทำ rick ให้ฉัน
Joyner

ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
Mayank Sharma

23

หลุมพรางที่ฉันพบคือไม่มีฟิลด์รหัสผ่านตอนนี้มันถูกเปลี่ยนชื่อเป็น:

update user set password=PASSWORD("YOURPASSWORDHERE") where user='root';

ตอนนี้ควรเป็น:

update user set authentication_string=password('YOURPASSWORDHERE') where user='root';


16

ใช้ALTER USERคำสั่งแทนที่จะพยายามอัปเดตUSERแถว โปรดทราบว่าอาจมีผู้ใช้มากกว่าหนึ่งรายเนื่องจากผู้ใช้มีสิทธิ์ผ่านเครื่องที่เชื่อมต่อ

https://dev.mysql.com/doc/refman/5.7/en/alter-user.html

ตัวอย่างเช่น.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password' 
ALTER USER 'root'@'*' IDENTIFIED BY 'new-password' 

2
สำหรับ MySQL 5.7.9 ฉันต้องเปลี่ยนผู้ใช้ให้ทำงานอย่างถูกต้อง ขอบคุณ
หน้าแข้ง

เราจำเป็นต้องให้ผู้ใช้ \ g ตามด้วยคำสั่งด้านบน ใช้ MySql 5.7.12 ty
bobsouza

คำตอบนี้ใช้ได้เฉพาะกับฉันบน Ubuntu 16.04, mysql 5.7.19;
A1Gard

พวกเขาเปลี่ยนสัญลักษณ์จาก @ เป็น * หรือไม่ Grr ... ตอนนี้ฉันมีคำถามมากกว่าที่ฉันมาที่นี่
pguardiario

4

มันทำงานได้เฉพาะกับฉันเมื่อฉัน "ล้าง" หลังจากคำสั่งที่กล่าวถึงที่นี่ นี่คือรายการคำสั่งทั้งหมดที่ฉันใช้:

คำตอบก่อนหน้านี้อาจไม่ทำงานสำหรับรุ่น mysql ในภายหลัง ลองขั้นตอนเหล่านี้หากคำตอบก่อนหน้านี้ไม่ได้ผลสำหรับคุณ:

1- คลิกที่ไอคอน wamp> mysql> คอนโซล mysql

2- เขียนคำสั่งต่อไปนี้ทีละคน

use mysql;
update user set authentication_string=password('your_password') where user='root';
FLUSH PRIVILEGES;
quit

4

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. ในกรณีที่คนยังคงมีปัญหาลองสิ่งนี้

สำหรับ MySQL เวอร์ชัน 5.6 ขึ้นไป

คุณลืมรหัสผ่าน 'ROOT' ของ Mac OS X และต้องการรีเซ็ตหรือไม่ ทำตาม 4 ขั้นตอนง่าย ๆ เหล่านี้:

  1.  หยุดเซิร์ฟเวอร์ mysqld โดยทั่วไปสามารถทำได้จาก 'System Prefrences'> MySQL> 'Stop MySQL Server'
  2.  เริ่มต้นเซิร์ฟเวอร์ในเซฟโหมดด้วยการบายพาสสิทธิ์จากเทอร์มินัล:      sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  3.  ในหน้าต่างเทอร์มินัลใหม่:      sudo /usr/local/mysql/bin/mysql -u root      UPDATE mysql.user SET Password=PASSWORD('NewPassword') WHERE User='root';      FLUSH PRIVILEGES;      \q
  4.  หยุดเซิร์ฟเวอร์ mysqld อีกครั้งและรีสตาร์ทในโหมดปกติ

สำหรับ MySQL เวอร์ชั่น 5.7 ขึ้นไป

  1.  หยุดเซิร์ฟเวอร์ mysqld โดยทั่วไปสิ่งนี้สามารถทำได้โดยจาก 'System Prefrences' > MySQL > 'Stop MySQL Server'
  2.  เริ่มต้นเซิร์ฟเวอร์ในเซฟโหมดด้วยการบายพาสสิทธิ์จากเทอร์มินัล:      sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  3.  ในหน้าต่างเทอร์มินัลใหม่:            sudo /usr/local/mysql/bin/mysql -u root      UPDATE mysql.user SET authentication_string=PASSWORD('NewPassword') WHERE User='root';      FLUSH PRIVILEGES;      \q      
  4.  หยุดเซิร์ฟเวอร์ mysqld อีกครั้งและรีสตาร์ทในโหมดปกติ

สิ่งนี้ช่วยฉันในขณะที่ติดตั้ง mysql <5.7
Ankit Agarwal

3

สำหรับปัญหานี้ฉันใช้วิธีที่เรียบง่ายและหยาบคายเปลี่ยนชื่อฟิลด์เป็นรหัสผ่านเหตุผลนี้คือฉันใช้ซอฟต์แวร์พรีเมียม mac navicat ในข้อผิดพลาดในการมองเห็น: คอลัมน์ 'รหัสผ่าน' ใน 'รายการฟิลด์' ไม่รู้จัก ตัวซอฟต์แวร์เองใช้รหัสผ่านเพื่อที่ฉันจะไม่สามารถใช้งานได้อย่างง่ายดาย ดังนั้นฉันรูทเข้าไปในบรรทัดคำสั่งฐานข้อมูลให้รัน

Use mysql;

จากนั้นแก้ไขชื่อฟิลด์:

ALTER TABLE user CHANGE authentication_string password text;

หลังจากปกติทั้งหมด


0

สาเหตุหลัก: รูทไม่มีรหัสผ่านและคำสั่งการเชื่อมต่อหลามของคุณควรสะท้อนถึงสิ่งนั้น

เพื่อแก้ไขข้อผิดพลาด 1698 เปลี่ยนรหัสผ่านของคุณเชื่อมต่อหลามเป็น ''

หมายเหตุ: การอัปเดตรหัสผ่านของผู้ใช้ด้วยตนเองจะไม่สามารถแก้ปัญหาได้คุณจะยังได้รับข้อผิดพลาด 1698


0

จำรหัสผ่านจะต้องตั้งค่าเพิ่มเติมแม้หลังจากรีสตาร์ท mysql ดังนี้

SET PASSWORD = PASSWORD('root');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.