2015-06-07 11 views
93

我正在嘗試更改MySql root密碼。MySQL用戶數據庫沒有密碼列 - 在OSX上安裝MySQL

我所做的是以下。

  1. 安裝MySql-5.7.6〜.dmg(社區服務器)和工作臺。
  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'

僅供參考,我做了use mysql;。 所以我沒有選擇查詢用戶表,發現密碼列實際上不存在。

這很奇怪。原始用戶表可能沒有密碼列嗎?

如何更改密碼,該密碼不存在?

感謝您的答案:d

+0

現在我再次測試,我可以訪問MySQL沒有PW :(是否更改(我的意思是改變用戶表,並添加密碼列通過查詢)用戶表? –

+0

SET密碼爲root @ localhost =密碼('新 - 傳) - 適用於任何版本的MySQL – SIDU

回答

315

在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) 

驚喜!沒有名爲'password'的字段,密碼字段名爲'authentication_string'。所以,只要這樣做:

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

現在,一切都會好的。

相比的MySQL 5.6,變化是相當廣泛:What’s New in MySQL 5.7

+13

你先生讓我很快樂。 – Bisonfan95

+2

即使在啓動mysqld時使用--skip-grant-tables限制,此方法仍然有效。由於您是匿名用戶,因此您無法更改密碼與: ALTER USER'root'@'localhost'IDENTIFIED BY'new-password' ALTER USER'root'@'*'IDENTIFIED BY'new-password' 它會給你一個匿名用戶權限錯誤。 – Bisonfan95

+0

毀了我整整一天後...... –

13

使用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,我不得不ALTER USER正常工作謝謝 – shin

+0

我們需要用戶一個\ g其次是上面的命令使用MySQL 5.7.12 TY。。 – bobsouza

+0

這個答案只爲我工作,在Ubuntu 16.04中,MySQL 19年7月5日; –

2

它只是和我工作的時候,這裏提到的命令後,我「刷新」。以下是我使用的命令的完整列表:

以前的答案可能不適用於以後的mysql版本。請嘗試以下步驟如果以前的答案沒有爲你工作:>的mysql> mysql的控制檯

2-寫下面的命令,逐一

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

1-點擊WAMP圖標謝謝您的幫助。如果人們仍然有問題,請嘗試一下。

對於MySQL 5.6版,並在

你忘了你的Mac OS X「根」密碼需要重置?遵循以下4個簡單步驟:

  1. 停止mysqld服務器。 sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  2. 在一個新的終端窗口:      sudo /usr/local/mysql/bin/mysql -u root      UPDATE mysql.user SET Password=PASSWORD('NewPassword') WHERE User='root';      FLUSH PRIVILEGES;      \q
  3. 通常,這可以通過「系統Prefrences」> MySQL的>「停止MySQL服務器」
  4. 以安全模式啓動的服務器權限繞過 從終端來完成
  5. 再次停止mysqld服務器並在正常模式下重新啓動它。

對於MySQL 5.7版本及以上

  1. 停止mysqld服務器。 sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  2. 在一個新的終端窗口:      sudo /usr/local/mysql/bin/mysql -u root      UPDATE mysql.user SET authentication_string=PASSWORD('NewPassword') WHERE User='root';      FLUSH PRIVILEGES;      \q      
  3. 再次停止mysqld服務器並重新啓動它通常,這可以通過從'System Prefrences' > MySQL > 'Stop MySQL Server'
  4. 開始與特權旁路 在安全模式下啓動服務器從終端來完成正常模式。
16

一個陷阱我掉進是有沒有密碼字段現在,它已更名爲這樣:

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

現在應該是:

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

+0

感謝您的更新回答b –

+0

這是正確的答案爲了我! – lean

2

對於這個問題,我用一個簡單而粗魯的方法,將字段名重命名爲密碼,原因是我使用了mac navicat prem ium軟件中的可視化操作錯誤:'字段列表'中的未知列'密碼',軟件本身使用密碼,因此我無法輕鬆操作。 因此,我根到數據庫命令行,運行

Use mysql; 

然後修改字段名:

ALTER TABLE user CHANGE authentication_string password text; 

一切正常後。

4

如果您未在安裝時設置密碼,此例中爲mysql using unix-socket plugin,則會發生此錯誤。

但是,如果刪除的設置(表mysql.user)插件鏈接將其他問題。這不能解決問題,並造成另一個問題。要修復被刪除的鏈接,並設置密碼(「PWD」)做:

1)如上表示,與--skip-grant-tables運行。

如果它不起作用,則在/etc/mysql/mysql.conf.d/mysqld.cnf的部分[mysqld]中添加字符串skip-grant-tables。然後做 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該字符串,如果你設置它。