MySql中的一些小坑
1. mysql启动时,若使用mysqld_safe的方式启动服务,需要使用mysqladmin shutdown的方式来停止服务。
若使用mysqld shutdown的方式停止服务,有可能会出现如下报错:
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another
mysqld process
原因推测为:mysqld_safe启动mysql服务之后,mysqld_safe自身也占用着mysqld的进程,导致无法单纯使用mysqld进行服务的关闭。
2. mysql安装结束后,因为linux中的mysql,对表名是默认区分大小写的,应当尽快在my.cnf文件的[mysqld]下,添加“lower_case_table_names=1”
此语句的作用,在广泛意义上,可以理解为:对表名不区分大小写
但准确理解应当为:对输入语句中的表名,先将表名强制转为小写,再执行语句。
3. 若使用 DROP SCHEMA schema_name 或 DROP DATABASE database_name 欲删除数据库时报以下错误:
ERROR 1010 (HY000): Error dropping database (can’t rmdir ‘.\[schema_name/database_name]’, errno: 17)
可能为:
1. 数据库文件目录中的文件包含人为添加的文件
2. mysql的清理动作没有将数据库文件目录中的数据对象文件完全清理。
上述两种情况,均属于执行rmdir之前,对应的目录没有清空。
上述所说的数据库文件目录,是指:my.cnf文件中的datadir目录下,DROP SCHEMA或DROP DATABASE语句中的schema_name或database_name对应的目录名称。
如:my.cnf文件中,datadir 为“/var/lib/mysql”,报错是在执行“DROP SCHEMA hap_dev”发生,则 数据库文件目录 为“/var/lib/mysql”,此目录正常情况下应当只包含在mysql中创建的数据对象的文件,如:创建了表“sys_lang_b”之后,此目录就会产生sys_lang_b对应的数据对象文件。
结合今天的经历,描述一下上述的2和3:
A. 首先,在没有配置“lower_case_table_names=1”的情况下,启动数据库并且使用脚本批量创建了数据对象,语句中的表名均为大写。schema名为“hap_dev”
B. 然后,发现进行查询时,只有使用表名大写才能查询到相应的表,以sys_lang_b为例:
“select * from sys_lang_b”查询失败
“select * from SYS_LANG_B”查询成功
C. 配置“lower_case_table_names=1”并重启mysql服务
D. 此时会发现,无论使用“select * from sys_lang_b”还是 “select * from SYS_LANG_B”都无法查找到sys_lang_b这张表,因为:
在一开始批量创建数据对象时,sys_lang_b就是以大写的“SYS_LANG_B”存入数据库的,而配置了“lower_case_table_names=1”之后,输入的语句中的表名,无论大小写都会先转为小写再去执行,即最终执行的语句都是“select * from sys_lang_b”,导致无法查询到“SYS_LANG_B”。
E. OK现在需要清理整个数据库然后再使用脚本重新批量创建对象。收回schema(hap_dev)所涉及的用户的所有权限,并将用户删除,然后执行“drop schema hap_dev”。
执行“drop schema hap_dev”时报错:ERROR 1010 (HY000): Error dropping database (can’t rmdir ‘./hap_dev’, errno: 17)
F. 在网上查阅发现,大多数情况为:在datadir/schema_name(笔者相应的目录为:/var/lib/mysql/hap_dev)目录下,存在人为产生的非数据库对象文件,导致mysql执行rmdir时,因对应的目录不为空而报错。
而linux中rmdir的语法,的确要求其对应的目标目录需要为空目录
在上述事实下,我们可以这样推断,mysql执行drop schema时,会先清理数据对象,因此datadir/schema_name下的数据对象文件会先被清空,若清空数据对象文件后,datadir/schema_name目录下仍存在文件,则rmdir报错。
G. 现在来看看我的情况,在我的/var/lib/mysql/hap_dev目录下,均为之前批量创建的“SYS_LANG_B”等数据对象,不存在任何人为放进入的文件。同时,我也通过放开这个目录的所有权限排除了rmdir的权限问题。
也就是说,如果/var/lib/mysql/hap_dev最后不为空,则里面残留的很可能是数据对象,比如“SYS_LANG_B”等数据表。
是的!大写的“SYS_LANG_B”!
现在mysql中的配置是“lower_case_table_names=1”,在它进行“drop schema hap_dev”时,清理数据对象的阶段中,是否所有输入的表名全部转为小写了,导致“SYS_LANG_B”这些大写表名的数据表都不会被清空,/var/lib/mysql/hap_dev最终残留着这些数据对象文件,最终导致rmdir失败。
H. 是的,最终的解决方法的确奏效了:
取消配置“lower_case_table_names=1”后重启mysql服务,执行drop schema hap_dev成功。
接着再添加配置“lower_case_table_names=1”并重启mysql。执行批量创建数据对象的脚本之后,可正常查询。事实上,我们还会发现,此时数据库中的表名,实际上均为小写。
MySql中的一些小坑的更多相关文章
- 一次 react-router 中遇到的小坑
react-router Link 标签不生效的问题 废话不多说, 直接上问题, 排解过程和答案 现象: 发现 使用 Link 标签没有 元素的样式和效果, 也不能进行跳转 代码如下: render( ...
- mysql中权限的小知识
参考:https://www.cnblogs.com/apollo1616/articles/10294490.html mysql中user表中host列的值的意义 % 匹配所有主机 localho ...
- JDBC 连接 MySQL 时碰到的小坑
最近从MS SQL Server换到了MySQL,已经是8.11版本了,安装的时候似乎还用了新的身份认证方式之类的,连接过程中也是磕磕绊绊,碰到很多奇奇怪怪的问题,在此记录下来. 驱动加载: 以前使用 ...
- python无法连接mysql,有个小坑,需要注意一下!
尝试用python链接mysql数据库,按照教程里链接了小半夜,就是没有链接上,找了各种文章,最后发现是版本的问题,我想使用的模块是MySQLdb,刚刚去他们的官网看了一下,最近一次更新是2014年, ...
- JAVA开发过程中的各种小坑
1.有时候你在本地跑的ECLIPSE中得到的正确的结果,部署到服务器上使用其他容器,如tomcat或WARS的时候,跑出的结果也许就不一致, 我们程序员会经常抱怨,在我机器上跑的好好的. 在不同的容器 ...
- Symfony4框架中单元测试和接口测试中的一些小坑
前提说明: symfony 版本 4.1.*,使用 composer create-project symfony/website-skeleton 进行安装. 目标:在一个单元测试用例中对当前工 ...
- iOS总结:项目中的各种小坑汇总
一.字符串转JSON 在网络请求时,如果服务端返回的是字符串,那么就需要我们自己封装一个类,将请求下来的字符串转换成json对象,从而存入模型中. 注意: 字符串中如果含有一些特殊转意符(如\n.\t ...
- python开发中常见的小坑
(1)可变参数类型作为函数参数默认值,函数参数默认值的设置在Python中只会被执行一次,也就是定义该函数的时候. 解决办法,设置为None,然后判断 (2)Python中的变量名解析遵循所谓的LEG ...
- 今天碰到的angular 中的一个小坑
最近在自个儿研究angular,在写一个demo的时候总是有问题,最后发现居然是大小写的问题,卧槽 特tm的坑爹了,代码如下: <!DOCTYPE html> <html lang= ...
随机推荐
- 初学Linux系统最应该做对的4件事情[长文]
“闲来无事,逛逛贴吧”已经是本人无事消磨时间的最佳选择了.五花八门的问题,各式各样的回答,总能给自己带来无限的欢乐.当然也有些问题值得自己去思考或者回答.之前就有人在贴吧里问到“Linux好难啊!该怎 ...
- python 学习 模块
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就越来越长,越来越不容易 维护, 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很 ...
- MariaDB Role
一.MariaDB Role介绍 MariaDB从10.0/10.1版本开始支持role. Role相当于各种权限的集合,可以给多个账户统一权限的修改直接通过修改role来实现,不需要每个账户一个一个 ...
- day06 小数据池,再谈编码
今日所学 一. 小数据池 二. is 和==的区别 三. 编码的问题 一.小数据池的作用 用来缓存数据 可以作用的数据类型: 整数(int), 字符串(str), 布尔值(bool). 什么是块 ...
- Cracking The Coding Interview 4.4
//Given a binary search tree, design an algorithm which creates a linked list of all the nodes at ea ...
- Linux音频驱动学习之:(2)移植wm8976声卡驱动(linux-3.4.2)
1.wm8976驱动程序: /* * wm8976.h -- WM8976 Soc Audio driver * * This program is free software; you can re ...
- 谷歌浏览器慎用有道词典插件(<audio></audio>) (转载)
谷歌浏览器慎用有道词典插件(<audio></audio>) 原文 :http://blog.csdn.net/u010556394/article/details/7112 ...
- JAVA 中的MessageDigest类和Mac类的使用
MessageDigest 消息摘要 例子: MD5加密: try{ MessageDigest md5 = MessageDigest.getInstance("MD5"); m ...
- python23的区别-日常记录
1. xrange:python3 中取消了range函数,把python2中的xrange重新命名为range,所以在python3中直接用range就行. 2. print:python3中pri ...
- WIFI探针 搞定