Mysql创建临时表时的lost connection 问题
2013-12-20 13:33
344 查看
问题描述:
首先是在执行一个脚本的时候(mysql < query.sql),中间会出现Lost connection during query的错误提示,但是错误日志里面没有记录。一开始想到是不是mysql时间相关的配置有问题,检查一下与时间相关的参数,基本上都很大,时间相关的参数这里就不赘述了。那么是什么问题导致的呢,没有日志,只有这个dt的错误。之后在相同的环境下测试了一个创建临时表的语句,哎,突然出现了错误,create temporary table tmp(id int) engine=InnoDB;会报错;2013-11-07 16:54:02 8013 [ERROR] InnoDB:Failed to set O_DIRECT on file /tmp/#sql1f4d_f_0.ibd: CREATE: Invalid argument,continuing anyway
2013-11-07 16:54:02 8013 [ERROR] InnoDB:O_DIRECT is known to result in 'Invalid argument' on Linux on tmpfs, see MySQLBug#26662
2013-11-07 16:54:02 8013 [ERROR] InnoDB:Failed to set O_DIRECT on file /tmp/#sql1f4d_f_0.ibd: OPEN: Invalid argument,continuing anyway
2013-11-07 16:54:02 8013 [ERROR] InnoDB:O_DIRECT is known to result in 'Invalid argument' on Linux on tmpfs, see MySQLBug#26662
之后查看 bug 26662,InnoDB should not print any message whenwriting a temporary table in tmpdir andwhen O_DIRECT is set. http://bugs.mysql.com/bug.php?id=26662http://bugs.mysql.com/bug.php?id=9709http://bugs.mysql.com/bug.php?id=70298
因此定位到是与临时表有关系了。之后测试innodb_flush_method 和tmpdir两个参数相关的配置下,mysql创建临时表的时候出现的问题
一、第一次测试:
1、在5.5.15版本下
(1)、tmpdir=/tmp 并且tmp挂在为tmpfs的,innodb_flush_method = O_DIRECT
创建临时表时,mysql服务就直接重启了(2)、设置tmpdir=/home/dba/lostConntionTest/tmp 不是tmpfs的,innodb_flush_method = O_DIRECT
创建临时表,没有任何问题2、在5.6.11版本下
(1)、tmpdir=/tmp 并且tmp挂在为tmpfs的,innodb_flush_method = O_DIRECT
创建临时表时,会有报错日志,2013-11-07 16:54:02 8013 [ERROR] InnoDB: Failed to set O_DIRECT onfile /tmp/#sql1f4d_f_0.ibd: CREATE: Invalid argument, continuing anyway2013-11-07 16:54:02 8013 [ERROR] InnoDB: O_DIRECT is known to resultin 'Invalid argument' on Linux on tmpfs, see MySQL Bug#266622013-11-07 16:54:02 8013 [ERROR] InnoDB: Failed to set O_DIRECT onfile /tmp/#sql1f4d_f_0.ibd: OPEN: Invalid argument, continuing anyway2013-11-07 16:54:02 8013 [ERROR] InnoDB: O_DIRECT is known to resultin 'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662但是mysql服务不会重启(2)、设置tmpdir=/home/dba/lostConntionTest/tmp 不是tmpfs的,innodb_flush_method = O_DIRECT
创建临时表,没有任何问题
这两个版本之间还有些不同了,那么定位,是否还有其他的参数相关的,两个测试机设置的不同呢,最后定位到innodb_use_native_aio http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_use_native_aio
查看第一次的测试环境,5.5和5.6的innodb_use_native_aio参数设置不同,进一步的统一这个参数的设置,测试时有如下的结果:
二、第二次测试
5.5.15版本的:
(1)、tmpdir=/tmp 并且tmp挂在为tmpfs的;innodb_flush_method = O_DIRECT;innodb_use_native_aio=1
创建临时表,mysql直接重启了
(2)tmpdir=/tmp 并且tmp挂在为tmpfs的;innodb_flush_method = O_DIRECT;innodb_use_native_aio=0
创建临时表时,会有报错日志,和5.6的第一次测试一样(3)、tmpdir=/tmp 并且tmp挂在为tmpfs的;innodb_flush_method = O_DSYNC;innodb_use_native_aio=0或者不设置innodb_flush_method
创建临时表OK,也没有报错
(4)、设置tmpdir=/home/dba/lostConntionTest/tmp 不是tmpfs的,innodb_flush_method = O_DIRECT或者O_DSYNC或者不设置;innodb_use_native_aio=1或者0
创建临时表OK,没有报错
5.6的和5.5的有一些不同,就是设置了tmpdir=/tmp 并且tmp挂在为tmpfs的;innodb_flush_method = O_DIRECT;innodb_use_native_aio=1;之后,启动mysql会报错,但是mysql服务还是会起来,之后查看innodb_use_native_aio任然为0,不是配置文件中设置的,这一点官网上面解释说,意思是,mysql自己会检测者几个参数的一致性innodb_use_native_aioNormally, you do not need to touchthis option, because it is enabled by default. If a problemwith the asynchronous I/O subsystem in the OS prevents InnoDB from starting, startthe server with this variable disabled (use innodb_use_native_aio=0 in theoption file). This option could also be turned off automatically duringstartup, if InnoDB detects a potential problem such as a combination of tmpdirlocation, tmpfs filesystem, and Linux kernel that that does not support AIO ontmpfs.
5.5.15的貌似没有检查,如果这几个参数都保持一直,mysql5.5.和5.6的是一样的,5.0的版本没有AIO的特性,因此只考虑tmpdir和innodb_flush_method这两个参数,和5.5、5.6的一样的。
最终的结论是:1、tmpdir文件系统是tmpfsinnodb_use_native_aio=1 innodb_flush_method=任何一个参数都会出现问题,而且mysql服务会重启2、tmpdir文件系统是tmpfsinnodb_use_native_aio=0 innodb_flush_method= O_DIRECT会有报错,但是不会重启3、
tmpdir文件系统是tmpfsinnodb_use_native_aio=0 innodb_flush_method= O_DSYNC或者Fdatasync
OK的,不会报错
4、
Tmpdir文件系统不是tmpfs的,另外的两个参数是什么都可以,不会报错
从上面的测试看到,解决上面创建临时表报错或者重启的问题,
* create your temp tables in myisam format (创建临时表是myisam引擎的)
* remove O_DIRECT from innodb_flush_method (不使用O_DIRECT)
* use non-tmpfs filesystem for temp tables (tmpdir不使用tmpfs文件系统)
本文出自 “爱mysql爱学习” 博客,请务必保留此出处http://zhuatlantis.blog.51cto.com/6106101/1343160
相关文章推荐
- mysql临时表创建问题
- mysql无法创建存储过程问题 ERROR 1307 (HY000)
- mysql 组合字段排序 创建组合索引 顺序问题
- Mysql中datetime默认值'0000-00-00 00:00:00'无法创建问题
- navicat连接CentOS的mysql在创建存储过程时出现1146 - Table ‘mysql.proc’ doesn't exist的问题
- MYSQL: 临时表问题,不支持自联接
- mysql 创建数据库名称含横线报错问题解决方法
- linux系统下无法创建mysql存储过程问题
- Navicat for mysql 建表和创建model要注意的问题
- 解决mysql创建数据库后出现:Access denied for user 'root'@'%' to database 'xxx'的问题
- 黑窗口中创建mysql存储过程时的问题
- mysql 创建表时出现的问题
- mysql 创建函数问题
- 解决windows系统些mysql创建表名小写问题
- mysql外键创建失败的问题
- mysql5.7 datetime 默认值为‘0000-00-00 00:00:00'值无法创建问题解决
- spark1.4加载mysql数据 创建Dataframe及join操作连接方法问题
- oracle 创建临时表问题实战案例一
- mysql创建和授权用户+配置文件位置+大小写敏感问题
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)