做项目,需要在Ubuntu环境下,使用MySQL存储从豆瓣上爬取的电影数据。于是从零开始在虚拟机上折腾了很久,期间被MySQL的配置折磨的一度想砸电脑……
我自己的Ubuntu环境是20.04,虚拟机环境
安装MySQL:
sudo apt-get update # 升级所有的依赖包
sudo apt-get install mysql-server
然后初始化环境
sudo mysql_secure_installation
配置的部分参考教程Ubuntu18.04下安装MySQL
到这里都是很友好的环节
从这里开始,如果一直到最后都没有困扰到你的地方,那么你一定是一个极度幸运的体验者,建议立刻抽卡当欧皇。就我自己而言,下面的步骤每一步都充满了血泪教训
sudo mysql -u root -p
输入密码:# 输入你的root密码
如果成功,见到的画面应该是:
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21-1 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
如果失败的话,参考这个教程。
虽然没有直接列出,但这里留个记号,待会可能还得回来……
MySQL登录失败的参考(针对18.0及以前版本的Ubuntu,参考这篇文章)
如果不幸使用的是Ubuntu20.04以后的版本,一定要先看这个文章,因为上一篇的做法在这一版里是毁灭性的错误
Linux下推荐直接采用anaconda作为开发库,修改源为国内镜像
anaconda如果直接从官网下载,速度会让人怀疑人生。Linux下所有的配置基本都不用想着用原始源了,直接都改成国内镜像吧(比如我个人偏好的清华源)
但是修改之后,可能会出现一些奇怪的问题……
如果修改了pycharm中调用的anaconda的源,可能会导致这种显示不出来第三方库源的情况
我自己没有找到特别有效的解决方式,最终是通过关掉conda安装方式解决的(也就是换回pip源进行安装)
到此,Python的基础开发环境也能够完成了
这里是困扰了我足足一整天的地方,牵涉到很多细节
import pymysql as py
def Database():
conn = py.connect(host="127.0.0.1", user="root", password="123456", port = 3306, database="douban")
就是这一行代码,让我连续应付了一堆问题:
第一个想到的肯定是代码写错了。检查了很久pymysql的用法,没有找到问题所在
通常有两种解释:
然而这两种常见的错误我都没有犯,说明问题不在这里
这时候需要检查错误报告了
运行的第一个报错是如下:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1'(111)
首先检查2003号错误,显示是目标计算机拒绝访问。
于是检查端口:MySQL默认在Ubuntu下采用3306号端口监听外部访问,该配置可以在/etc/mysql/mysql.conf.d/mysqld.conf
下看到
sudo vim /etc/mysql/mysql.conf.d/mysqld.conf
可以看到端口的配置信息
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
datadir = /var/lib/mysql
skip-grant-tables
于是采用netstat检查3306端口
如果没有netstat工具,可以先安装
apt-get install net-tools
# 安装完成之后
netstat -ntlp | grep 3306 # 检查3306号端口
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
激活Internet连接 (仅服务器)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN - -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp6 0 0 127.0.0.1:6942 :::* LISTEN 8219/java
tcp6 0 0 127.0.0.1:63342 :::* LISTEN 8219/java
tcp6 0 0 ::1:631 :::* LISTEN -
这里根本没有3306,说明端口压根没开,初步确认是端口的锅
第一个找到的方式是防火墙ufw
sudo ufw status # 查看端口,没有3306开放
# 于是需要手动打开3306的权限
sudo ufw disable # 关闭防火墙
sudo ufw allow 3306
sudo ufw enable
结果没效果
第二个是用iptables指令
sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
sudo iptables-save
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload
但是也没啥用,还是检测不到3306的端口……
当时到这里的时候我是挺崩溃的,因为网上大部分都是这种教程,到这里都应该成功了才对。在此基础上我还尝试了诸如修改user密码,远程访问权限等,但是依然没啥效果。
直到最后看到了一个教程,才意识到一个问题
还记得前面提过的一个地方吗?MySQL最开始有个跳过口令的环节?
于是我又去检查了一下mysqld.conf,结果发现……
我没删掉这句话
删去之后……连接成功了
嗯,现实就是这么尴尬……