Mysql问题和解决办法

1,428 阅读4分钟

第一个问题:ModuleNotFoundError: No module named 'DBUtils'

用python写数据库连接时要用到数据连接池于是就想到了DBUtils ,这个简单pip install DBUtile

安装完后写代码测试一下

from DBUtils.PooledDB import PooledDB
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named DBUtils.PooledDB

居然报错了!!!!!

pip list 查看一下

已经安装了呀

版本2.0可能是版本导致的

找到官网查看一下手册

pypi.org/project/DBU…

webwareforpython.github.io/DBUtils/mai…

原因:

果然2.0的写法是

from dbutils.pooled_db import PooledDB

我的写法(是1.3的写法)

from DBUtils.PooledDB import PooledDB

解决方法:

  • 使用 from dbutils.pooled_db import PooledDB

  • pip install DBUtils==1.3 重装1.3版本

第二个问题:MySQL source导入sql文件过慢,解决办法

博主100多万条数据,导了好久没有完成,看了mysql配置,设置之后基本能在几分钟完成。

设置连接
mysql -u root -p -h 127.0.0.1

mysql>use test;
Database changed

mysql> set global innodb_flush_log_at_trx_commit=0;
Query OK, 0 rows affected (0.03 sec)

mysql> set global max_allowed_packet=1024*1024*20;
Query OK, 0 rows affected (0.00 sec)

mysql> set global bulk_insert_buffer_size=32*1024*1024;
Query OK, 0 rows affected (0.00 sec)

mysql> set global innodb_buffer_pool_size=32*1024*1024;
Query OK, 0 rows affected, 1 warning (0.09 sec)

mysql source /root/test.sql

常见问题

上面设置的参数只在当前连接和新连接上生效永久生效请修改my.cnf。实际使用只会在连接上设置,这些参数在生产环境不适合使用,所以导入成功后请 重启使这些设置失效 。 shell mysql 客户端连接的时候出现

[root@localhost ~]# mysql -u root -p 
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@localhost ~]# 

这是安装的时候出现问题,只会在使用mysql客户端连接时出现,可以指定 -h 127.0.0.1 修改

mysql -u root -p -h 127.0.0.1

第三个问题:MySQL 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded

很多用户在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be loaded的错误。

原因:

出现这个原因是mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password

解决问题

  • 一种是升级navicat驱动
  • 一种是把mysql用户登录密码加密规则还原成mysql_native_password.

这里用第二种方式 ,解决方法如下

1. 管理员权限运行命令提示符

 登陆MySQL(记得添加环境变量)

  mysql -u root -p
  password:                                     #登入mysql

img

2. 修改账户密码加密规则并更新用户密码

  ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;  #修改加密规则 

  ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';  #更新一下用户的密码 

3. 刷新权限并重置密码

  FLUSH PRIVILEGES;  #刷新权限 

上面两步对应的截图

img

最后

单独重置密码命令:alter user 'root'@'localhost' identified by '111111';

现在再次打开Navicat Premium 12连接MySQL问题数据库就会发现可以连接成功了

第四个问题:解决MySQL外键约束中的引用列和引用列不兼容问题

初学MySQL,相信大家也绕了不少弯。通常会遇到MySQL外键约束中的引用列和引用列不兼容问题

程序报错:

ERROR 3780 (HY000): Referencing column 'xxx' and referenced column 'xxx' in foreign key constraint 'xxxxxx' are incompatible.

原因:

外键约束中的引用列和引用列在编码格式上不同,导致不兼容报错。

这个的主要原因是我在设置外键的时候,对应的外键是主键,主键中我设置了自动递增和无符号,但是我用做外键的字段并没有进行设置,这样我们的两个字段的类型不一致,导致了最后的冲突

解决办法:

  • 我们保持两个部分的统一即可,在设置外键的字段上,增加无符号属性

第五个问题:python的pymysql中以表名作为变量传递进查询语句中

在我们学习使用pymysql的时候有时需要把表名当做变量传递到sql语句中去执行, 然而我们的固定思维模式有时却限制了我们: 如:我们知道传递变量可以用占位符%s,后面加上变量就行, 在pymysql中也有同样的问题,我们在执行sql语句的时候可以把变量传递进去 类似:

sql = 'insert into TabName + ' value (%s %s)'
cursor.execute(sql, [name,age])

如果我们的TabName也是变量的话我们就会习惯性的这样加

sql = 'insert into %s + ' value (%s %s)'
cursor.execute(sql, [tabname,name,age])

然后这样报错了我们才知道这样不行,然后再去查原因,发现我们被自己的固定思维给限制住了(反正我是这样的)

我也是在网上找了半天再找到了解决办法,只要跳出这样的思维就行了

错误:
sql = 'insert into %s + ' value (%s %s)'
cursor.execute(sql, [tabname,name,age])

改为:
sql = 'insert into %s(name,age)' %TabName + ' value (%s)'
cursor.execute(sql, [name])

这样就没问题了,有时候我们是能解决这类似的问题的,但是我们却是往往被自己的固定思维给坑了!