Ubuntu下安装MySQL,并实现与Python的连接

做项目,需要在Ubuntu环境下,使用MySQL存储从豆瓣上爬取的电影数据。于是从零开始在虚拟机上折腾了很久,期间被MySQL的配置折磨的一度想砸电脑……

MySQL配置

我自己的Ubuntu环境是20.04,虚拟机环境
安装MySQL:

sudo apt-get update # 升级所有的依赖包
sudo apt-get install mysql-server

然后初始化环境

sudo mysql_secure_installation

配置的部分参考教程Ubuntu18.04下安装MySQL
到这里都是很友好的环节

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以后的版本,一定要先看这个文章,因为上一篇的做法在这一版里是毁灭性的错误

Python库

Linux下推荐直接采用anaconda作为开发库,修改源为国内镜像
anaconda如果直接从官网下载,速度会让人怀疑人生。Linux下所有的配置基本都不用想着用原始源了,直接都改成国内镜像吧(比如我个人偏好的清华源)
但是修改之后,可能会出现一些奇怪的问题……
在这里插入图片描述
如果修改了pycharm中调用的anaconda的源,可能会导致这种显示不出来第三方库源的情况
我自己没有找到特别有效的解决方式,最终是通过关掉conda安装方式解决的(也就是换回pip源进行安装)
把这个绿色的按钮点消去
到此,Python的基础开发环境也能够完成了

用pymysql库连接MySQL

这里是困扰了我足足一整天的地方,牵涉到很多细节

import pymysql as py
def Database():
	conn = py.connect(host="127.0.0.1", user="root", password="123456", port = 3306, database="douban")

就是这一行代码,让我连续应付了一堆问题:

1. 定位问题

第一个想到的肯定是代码写错了。检查了很久pymysql的用法,没有找到问题所在
通常有两种解释:

  1. connect里的所有内容最好写成字典的形式
  2. localhost这种写法在socket通信中容易报错,建议改成127.0.0.1

然而这两种常见的错误我都没有犯,说明问题不在这里
这时候需要检查错误报告了

2. 解决socket通信

运行的第一个报错是如下:

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,说明端口压根没开,初步确认是端口的锅

3. 如何打开端口

第一个找到的方式是防火墙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的端口……

4. skip-grant-tables

当时到这里的时候我是挺崩溃的,因为网上大部分都是这种教程,到这里都应该成功了才对。在此基础上我还尝试了诸如修改user密码,远程访问权限等,但是依然没啥效果。
直到最后看到了一个教程,才意识到一个问题
还记得前面提过的一个地方吗?MySQL最开始有个跳过口令的环节?
于是我又去检查了一下mysqld.conf,结果发现……
我没删掉这句话
删去之后……连接成功了
嗯,现实就是这么尴尬……

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值