本文的追查过程来源于某次mysql无法正常关闭。
1、复现
第一次出现时环境比较复杂,多次试验后发现,如下过程能够稳定复现。
a) 系统环境
gcc版本
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure –prefix=/usr –mandir=/usr/share/man –infodir=/usr/share/info –enable-shared –enable-threads=posix
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
b) 复现过程
安装(使用版本mysql-5.1.45, innodb-plugin1.0.6)
./configure -prefix=/data/mysql5 –with-plugins=partition,heap,innodb_plugin,myisam,myisammrg,csv,example –with-extra-charsets=all –enable-assemble –enable-static –enable-thread-safe-client |
make && make install |
执行
1) >use test;2) >create table t(c int) ENGINE=InnoDB;
3) >alter table t add index c(`c`);
4) >quit;
5) #bin/myqladmin –uroot –p shutdown //终端下关闭
|
现象:执行shutdown语句时,输出如下
bin/mysqld_safe: line 137: 15569 Segmentation fault nohup /data/mysql5/libexec/mysqld –defaults-file=my.cnf –based1100919 15:53:40 mysqld_safe Number of processes running now: 0100919 15:53:40 mysqld_safe mysqld restarted |
说明:正常的执行mysqladmin应该输出如下
100919 15:50:18 mysqld_safe mysqld from pid file /data/mysql5/run/mysqld.pid ended |
2、追查
刚开始以为是代码问题,改用debug模式时发现在执行步骤3)的时候mysqld就dump导致重启了。追查导致dump的代码执行路径如下
add_index –> row_merge_build_indexes –> row_merge_sort –> row_merge –> row_merge_blocks_copy
前两个函数在handler/handler0alter.cc,后面的函数在row/row0merge.c,功能是新建的索引排序并合并到同一个文件中。
发现dump的点居然是row_merge_blocks_copy函数的传参过程,因此怀疑是内存访问方面的问题。使用valgrind试运行。
在非debug模式下使用valgrind启动mysql,发现在执行shutdown命令时,valgrind有如下输出:
==5998== Thread 16:==5998== Invalid read of size 4==5998== at 0×30B560B0F0: pthread_kill (in /lib64/libpthread-2.5.so)==5998== by 0×7822A4: thr_alarm (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×598E62: my_real_read(st_net*, unsigned long*) (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×599264: my_net_read (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×5AA14E: handle_one_connection (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×30B56062F6: start_thread (in /lib64/libpthread-2.5.so)
==5998== by 0×30B4AD1B6C: clone (in /lib64/libc-2.5.so)
==5998== Address 0×3197D9D0 is on thread 15’s stack
|
thread 16访问了thread 15的栈空间数据!
3、分析
这里我们先不考虑两个thread分别是作什么的,但这种错误必然留下隐患。
在手头的其他环境对照试验如下:
环境 |
Os & gcc版本 |
结果 |
原环境 |
x86_64-redhat-linux
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
|
异常 |
对照1 |
x86_64-redhat-linux
gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)
|
正常 |
对照2 |
Target: i386-redhat-linux
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
|
正常 |
手头环境不多,初步认为是: 在64位机器上gcc版本为4.1.2时,会出现如上问题。
需要查出为什么环境不同造成生成的可执行版本有差异。想到Makefile。
将不同环境下的Makefile作diff后赫然发现,出问题版本的Makefile有这行
CXXFLAGS = -O3 -fno-implicit-templates -fno-exceptions -fno-rtti 与其他机器不同。
而这个文件中CFLAGS确是-O2! 是否因为优化级别不同造成的?
在原环境中重复步骤,当将./configure 改成 CFLAG=”-O2 ” CXXFLAGS=”-O2 ” ./configure, 结果发现运行正常了。
4、阶段结论及后续思考
1) 阶段结论: 由于出问题环境中configure后生成的Makefile中CXXFLAGS为-O3,与CFLAGS中的-O2冲突,导致线程访问出错。
为验证此结论,将CFLAGS和CXXFLAGS都设置为-O3或-O2,在原环境上重复步骤,运行正常。
因此对于用于线上的服务,编译时最好明确指明需要的参数,以防默认参数之间的冲突造成异常。
2)后续的问题是, 为什么这两个优化级别不同会导致如上的现象? Debug模式下参数传递过程中dump是否也是这个原因?优化级别是如何影响到此过程的? 另查。
分享到:
相关推荐
- **问题3**:如果MySQL服务经常无法正常关闭,需要检查MySQL的配置文件是否存在错误,并且检查是否有其他程序正在使用MySQL的数据文件或端口。 #### 四、总结 通过对CentOS环境下MySQL服务启动与关闭命令的详细...
9. **监控资源**:确保服务器有足够的磁盘空间和内存来运行MySQL,过度的压力可能导致MySQL无法正常启动。 总的来说,处理MySQL启动后立即关闭的问题需要深入理解数据库的工作原理,以及如何读取和分析错误日志。...
mysql 服务启动与关闭脚本,Windows 批处理,双击启动或者关闭
- 如果MySQL服务由于某种原因没有正常启动或停止,脚本应该包含适当的错误处理机制,以便提供反馈或建议解决方案。 总结起来,"mysql快速启动关闭脚本"是一个实用的工具,它通过批处理文件简化了Windows用户对MySQL...
mysql关闭不了的解决办法: 右键点击电脑的任务栏,打开任务管理器 点击服务,找到mysql服务 右键点击该服务,选择停止就可以了 内容扩展: mac系统mysqld进程无法kill掉的问题 mac安装比linux恶心的太多,权限太...
"mybatis连接MySQL8出现的问题解决方法" MyBatis是当前最流行的持久层框架之一,它提供了一个简单的方式来访问数据库。然而,在使用MyBatis连接MySQL8时,可能会出现一些问题。本文将介绍MyBatis连接MySQL8出现的...
4. **智能连接管理**:选择一个支持连接健康检查和自动回收的连接池实现,如HikariCP,它可以检测到因超时被MySQL关闭的连接并自动替换。 5. **合理设计事务和连接使用**:避免长时间持有数据库连接,尽快完成事务...
在本案例中,我们有一个名为"MySQLService.bat"的批处理文件,它被设计用来启动和关闭MySQL服务。 批处理脚本是基于Microsoft Windows操作系统的一种简单编程方式,使用DOS命令行进行任务自动化。在这个...
然而,在实际操作过程中,我们可能会遇到MySQL服务无法启动的问题,这不仅会影响到数据的正常读写,还可能对业务运行造成严重影响。本文将基于亲身体验,分享几种有效的MySQL服务无法启动的解决办法。 ### MySQL...
在遇到“MySQL无法安装的解决方案”这个问题时,通常是因为在重装或升级MySQL过程中,旧的服务残留在系统中,导致新安装的MySQL无法创建服务。错误提示“cannot create windows service for mysql error 0”意味着...
3. **配置 MySQL**:安装完成后,根据需要配置 MySQL 服务,例如设置 root 用户密码、开启或关闭网络连接等。 #### 四、总结 在 Windows Server 2008 R2 64位操作系统上安装 MySQL 5.7.19 时,可能会遇到各种问题...
在日常使用MySQL数据库的过程中,有时会遇到“MySQL服务无法启动,报1067错误”的问题。这种情况通常发生在Windows系统上,并且会让用户感到非常困扰,因为这直接影响到了MySQL服务的正常运行。本文将详细探讨这一...
如果一切正常,MySQL应该已经开始运行。 6. **初始化数据库**:首次安装时,你需要为MySQL创建root用户的密码和其他必要的系统数据库。 然而,在Windows 11中,可能会遇到安装问题。这可能是由于系统权限、防火墙...
1 MYSQL视频教程_什么是MYSQL及MYSQL的启动与关闭几种方式,通过命令行客户端操作MYSQL
在Windows环境中,MySQL服务可能会出现无法启动的问题,表现为无法连接数据库、无法停止或重启MySQL服务,即使重启计算机也无法解决。此类问题通常伴随着错误1067:“进程意外终止”。 **解决方案:** 1. **确认...
可是安装后却遇到一个麻烦事,就是这个Mysql启动后就会过几秒就显示Mysql已经停止(这个是我现在的我已经解决这个问题了,应该是个红色的方框,不要介意,/嘿嘿)。重启了很多遍。还是无法启动。 这个时候不仅...
Navicat无法远程连接MySql服务器问题的解决方法写在前面: 操作系统:中标麒麟4.0; 数据库:MySQL5.7.26; JDK:采用中标麒麟系统自带的openjdk; 客户端工具:Navicat; 前置条件: MySQL服务安装完毕; 情景: ...
### 开启MySQL远程访问(关闭防火墙) #### 知识点概述 本文档主要介绍了如何在Linux环境下通过关闭防火墙来实现MySQL的远程访问。在实际应用中,MySQL默认只允许本地连接,若想实现远程访问,则需要进行一系列...
本问题聚焦于一个具体的实例,即在尝试安装Jira 7.2.2时遇到了无法连接到MySQL 5.7数据库的难题。这个问题的核心在于数据库连接驱动的兼容性问题。 首先,Jira是一款非常流行的项目管理和问题追踪工具,它依赖于...