先放錯誤:
>>> import mysql.connector
>>> conn = mysql.connector.connect(user='root', password='zd')
Traceback (most recent call last):
File "/home/wsx/anaconda3/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 176, in _open_connection
self._cmysql.connect(**cnx_kwargs)
_mysql_connector.MySQLInterfaceError: Access denied for user 'root'@'localhost'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/wsx/anaconda3/lib/python3.7/site-packages/mysql/connector/__init__.py", line 172, in connect
return CMySQLConnection(*args, **kwargs)
File "/home/wsx/anaconda3/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 78, in __init__
self.connect(**kwargs)
File "/home/wsx/anaconda3/lib/python3.7/site-packages/mysql/connector/abstracts.py", line 731, in connect
self._open_connection()
File "/home/wsx/anaconda3/lib/python3.7/site-packages/mysql/connector/connection_cext.py", line 179, in _open_connection
sqlstate=exc.sqlstate)
mysql.connector.errors.ProgrammingError: 1698 (28000): Access denied for user 'root'@'localhost'
奇怪的是,在mysql本身能夠正常地進(jìn)行登錄和命令操作。(剛安裝和剛接觸mysql虚茶,搜索了一下午資料,滿滿的都是淚仇参。)
問題的原因在于mysql 5.7+(目前大多數(shù)linux版本)采用的是auth_socket
插件管理root用戶嘹叫,而不是密碼的方式。盡管我還按照一些搜索的文章诈乒,如# MySQL初始化root用戶密碼對root進(jìn)行了密碼初始化罩扇,而且登錄時確實也需要輸入密碼了,但plugin一項還是auth_socket
怕磨。
如果你也遇到相同的問題喂饥,而且下面命令中root的plugin值一下,說明本文的辦法可能對你有用肠鲫。
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *D2001E4688ACE550C2628D84C4DD20872570521D | auth_socket | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *85047C0F9644A80D212FF24D971538A34A6631D1 | mysql_native_password | localhost |
| wsx | *D2001E4688ACE550C2628D84C4DD20872570521D | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
鍵入語句:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'zd';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *D2001E4688ACE550C2628D84C4DD20872570521D | mysql_native_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *85047C0F9644A80D212FF24D971538A34A6631D1 | mysql_native_password | localhost |
| wsx | *D2001E4688ACE550C2628D84C4DD20872570521D | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
5 rows in set (0.00 sec)
然后再試試python連接mysql员帮。
>>> conn = mysql.connector.connect(user='root', password='zd')
>>> conn = mysql.connector.connect(user='wsx', password='zd')
>>>
root和普通用戶都沒有報錯,成功了导饲!