Ubuntu系统下Jupyter无法连接MySQL,提示1045权限拒绝错误
解决Jupyter连接MySQL权限拒绝(终端可正常访问)的问题
可能原因及对应解决方法
1. MySQL账号的host权限限制
终端连接MySQL默认使用Unix socket,匹配的是stedman@localhost账号;而Jupyter的MySQL连接器可能默认使用TCP/IP连接,匹配的是stedman@127.0.0.1账号——这两个在MySQL里是独立账号,权限不共享。
解决步骤:
- 终端登录MySQL:
mysql -u stedman -p - 查询当前账号的host列表:
SELECT user, host FROM mysql.user WHERE user = 'stedman'; - 如果结果里没有
127.0.0.1,给该host授权:-- 替换your_database为实际数据库名,your_password为你的密码 GRANT ALL PRIVILEGES ON your_database.* TO 'stedman'@'127.0.0.1' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES; - 之后在Jupyter里把连接的host改成
127.0.0.1重试。
2. 密码特殊字符转义错误
如果密码包含\、'、"这类特殊字符,终端输入时会自动处理,但Python字符串里需要手动转义,否则传递的密码和终端输入的不一致。
解决方法:
- 使用Python原始字符串(加
r前缀)包裹密码,示例:import mysql.connector cnx = mysql.connector.connect( user='stedman', password=r'my\special"password', # 加r避免转义 host='localhost', database='your_db' )
3. Jupyter与终端使用不同Python环境
Jupyter可能运行在和终端不同的虚拟环境中,导致连接器配置或版本有差异。
检查与解决:
- 在Jupyter中运行以下代码查看当前Python路径:
import sys print(sys.executable) - 终端运行
which python对比路径,若不一致:- 切换到Jupyter对应的环境,重新安装连接器:
pip install mysql-connector-python - 确保连接参数和终端测试的完全一致。
- 切换到Jupyter对应的环境,重新安装连接器:
4. 指定Unix Socket路径强制匹配终端连接方式
不想修改账号权限的话,可直接在Jupyter连接参数里指定MySQL的socket文件路径,强制使用和终端一样的socket连接方式。
示例代码:
import mysql.connector cnx = mysql.connector.connect( user='stedman', password='your_password', host='localhost', unix_socket='/var/run/mysqld/mysqld.sock', # Ubuntu下MySQL默认socket路径,可通过`mysql_config --socket`查询实际路径 database='your_db' )
内容的提问来源于stack exchange,提问作者C. Sheku
相关产品推荐
相关产品推荐

