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= ...
随机推荐
- OO Summary Ⅲ
规格化设计的发展历史 (这一部分并没有找到答案,于是参考了好黄和温莎莎的blogs) 1950年代,第一次分离,主程序和子程序的分离程序结构模型是树状模型,子程序可先于主程序编写.通过使用库函数来简化 ...
- PHP socket以及http、socket、tcp、udp
一.TCP/UDP/Socket TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为 ...
- dns资源记录类型
资源记录的定义格式: 语法:name [TTL] IN RR_TYPE value SOA: name:当前区域的名字,例如"magedu.com.",或者"2.168. ...
- Cracking The Coding Interview3.3
//Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in re ...
- powershell玩转litedb数据库-第二版
powershell可以玩nosql数据库吗?答案是肯定的.只要这个数据库兼容.net,就可以很容易地被powershell使用. 发文初衷:世界上几乎没有讲powershell调用nosql的帖子, ...
- byte[]->new String(byte[]) -> getByte()引发的不一致问题
今天接短信接口,短信接口提供了sdk,我们可以直接用sdk发送请求然后发送对应短信. 但是想使用我们平台自定义的httpUtil实现. 然而忙了1天半,才解决这个问题,还是我同事帮忙找出问题并解决的. ...
- WebView加载页面
//使用内置浏览器webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoa ...
- 软件工程项目程序:WC
1:代码来源:http://yuncode.net/code/c_5087c8e4cd77190 2:Platform:Eclipse Language:Java 3:Bug:暂时没有 4. Func ...
- 2019-04-02-day024-内置方法
昨日回顾 反射 用"字符串"类型的属性名/方法名来找到 属性的值或者方法的内存地址 所有可以反射的内容实际上都是变量 有内存地址 内存地址存的是"具体的值",直 ...
- hive中left join、left outer join和left semi join的区别
先说结论,再举例子. hive中,left join与left outer join等价. left semi join与left outer join的区别:left semi join相当 ...