mysql 案例 ~ 常见案例汇总
一 简介:这里汇总了一些mysql常见的问题
二 案例场景
问题1 mysql设置了默认慢日志记录1S,为何会记录不超过1S的sql语句
答案 mysql~log_queries_not_using_indexes变量会记录全表扫描的语句,判断优先级高于执行时间,也就是说,你如果打开这个变量,哪怕执行不到1S的查询也会记录到慢日志中,建议关闭
问题2 程序错误信息 max_allowed_packet 设置过小导致java程序写入失败
答案 1 max_allowed_packet=32M 写入配置文件并重启
2 set global max_allowed_packet=33554432
问题3 mysql崩溃后无法启动,mysql.error中报BUG错误
分析 此问题最常见于断电后数据库无法启动造成的
1数据页损坏
2数据字典损坏
在ibdata1中(或以其他方式命名)文件中的数据与在单个表空间/.ibd / .frm文件的数据之间有明显的关联。当该关联丢失或损坏,可能会发生不好的情况。所以这像这样的数据字典的错误出现,最常见的原因是有些文件被手动移动或修改。它通常归结为:“数据字典预计这一文件或表空间在这里,但它不在!”,或“.ibd / .frm文件预计此项目在数据字典中,但它不在! “。再次记住,数据字典存储在ibdata文件中,在大多数环境中,就是MySQL数据目录中的ibdata1。
3 日志页损坏
4 版本BUG
通用解决办法:
一 调整恢复级别
1 调整恢复级别,请注意,恢复前先备份下,因为恢复是有代价的
2 设置参数 innodb_force_recovery=N 下面是恢复参数代价
1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。
mysql进程停止下
1 /nnochecksum -f /tol/mysql/data/ibdata1 ibdata1文件修复
2 #!/bin/bash ibd文件修复
for i in $( ls /var/lib/mysql/*/*.ibd)
do
innochecksum $i
done
3 过滤出拥有页损坏的表
4 mysqldump导出非页损坏的表 然后导入到新实例
问题4 mysql所在服务器的linux时间不对 该怎么办
分析 时间不对要根据分析进行定位
时间对mysql数据的影响有几个方面,由于mysql默认采用的是linux系统时间 1 now(),curdate()等时间函数 2 线程连接时间 Time()统计 3 datetime的uptime属性,默认插入时间等
j解决办法: 1 如果时间小于正确时间,采用ntp更改即可,然后通过show processlst观察更改时间前后的数量统计,是否有连接数断开->如果更改时间,线程的time会加上你更改的时间段,防止超过wait_timeout限制而断开连接
2 如果时间大于正确时间,慎重修改,因为有人测试过,修改后,重启mysql服务会产生异常,最好采用MHA切换后再修改
补充:强烈建议在机器上线时启动NTP服务,校对好,防止出问题
四 innodb自增长不连续可能是什么情况
1 数据库重启造成的ID不连续
分析 因为自增ID的值是保存在内存中的,如果重启后,最大增值ID会从表中取,而内存中的已经丢失,造成ID增长异常
2 数据库插入数据唯一键冲突
分析 当唯一键冲突插入失败时,虽然没有插入数据,但是自增ID还是需要+1的,这样就造成了不连续
3 事务回滚
分析 事务回滚也会造成增长ID不连续,因为涉及到复杂的回滚判断机制
4 批量插入语句
分析
insert select load data等批量插入语句,mysql对于自增ID锁的申请并不会一次申请一个,会一次申请的数量慢慢增多,可能造成ID增长异常
五 因为memory导致的主从同步异常
现象:主库down机后MHA切换,从库指向新主却发生同步异常
分析: 通过binlog定位分析出这是一张内存表,所以哪怕备份,内存表也是无法保存的,搭建的新的从库照样会有同步异常
解决: 1 将内存表转化为innodb引擎 2 主从同步跳过内存表错误 3取消内存表相关业务
注意: 1 在row格式下,内存表的操作也是记录在binlog中的 2 memory引擎表是和myisam一样,表级别的锁
六 insert into a select from b 究竟加什么锁
分析 在RR模式下 insert select 会对B进行扫描加锁,包括行锁和gap lock,
1 insert into a selec from b 是默认扫描逐行加锁,并非表级锁,效果等同于order id(PK)
总结 1 由于在RR模式下要维持一致性读,所以需要加锁
2 这条语句属于一个事务
3 尽量在业务低峰期进行操作,减少影响
4 利用explain进行条件观察,减少锁定行数,条件必须要利用到索引,否则会导致锁定全表
七 获取最新插入主键值,你需要知道什么
目的 当我们向主键是自增型的数据库表中(如 user 表)插入一条记录时,我们期望获取刚刚写入这条记录的id,(因为某些场景下需要获得这个id去做其他的操作),此时我们需要使用SELECT LAST_INSERT_ID()这个语句来获取插入记录后返回的自增id的值;
注意 1假如你使用一条INSERT语句插入多个行, LAST_INSERT_ID() 只会返回插入的第一行数据时产生的值。
初次建立的LAST_INSERT_ID默认值为0,一旦有值插入,则获取自增列的最大值作为默认值
2 每次session建立的LAST_INSERT_ID()都是独立的,新建立的session
1 对于主键,插入的值为获取主键最大值+1
2 对于其他,插入的值为初始化值0
3 对于insert后执行,会获取指定的插入ID,符合我们的预期,请注意,对于每次的所有表插入操作都会进行统计,查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是你所不希望看到的
八 一个由于触发BUG导致的mysql cash问题
日志输出 Error: semaphore wait has lasted > 600 seconds , 剩下的就是常见的叙述,您可能遇到一个mysql bug之类的
现象分析 通过文档和相关资料查询,自适应hash索引可能导致 rw latch争用,导致cash
解决方案 官方和网上都建议关闭自适应hash索引(set global innodb_adaptive_hash_index=0),但是这样会降低性能,而且此库压力本来就大
我的方案 因为有MHA,可以高可用.先进行程序优化,减小压力(我觉得是因为压力导致的争用).如果再发生一次MHA切换,我就会考虑关闭自适应hash索引
九 pt-osc导致的死锁问题
1 死锁日志表现形式
事务1 INSERT LOW_PRIORITY IGNORE INTO
事务2 REPLACE INTO
2 分析
pt-osc的死锁问题造成的核心就是自增锁的问题,
路线1 pt-osc insert select是分段的,会在新表申请自增锁,然后插入.
路线2 pt-osc tigger触发动作以replace into方式插入新表
锁相关
事务一
持有:原表记录上的x锁
等待:new表上的auto-inc lock
事务二
持有:new 表上的auto-inc lock
等待:原 表上的S锁
描述 程序日志也会打印针对原表的死锁
3 解决方式
1 尽量切割减少锁定范围 chunk-size
2 不要在表活动高峰期采用pt-osc工作
4 总结
1 insert新表的时候,是区间进行对原表查询,在还没有insert完成的情况下,对原表这个区间的数据进行了更新操作,导致死锁的发生
2 pt-osc其实还是很少发生死锁的
十一 mysqldump引发的数据覆盖
需求:因为要同步线上库,又要保留本地测试库,所以mysqldump出一份,结果测试数据库被覆盖失误了
分析: mysqldump -B 选项 会在sql文本里增加use选项,所以在指定新库然后导入后还是会选择覆盖原库.强烈不建议使用
-add-drop-database 这里会添加删除想通库的提示,也请不要加入这个选项.为了您的数据安全
十一 安装mysql相关工具导致的依赖包问题
分析:安装MHA和xtrabackup工具发生依赖冲突,解决了好久
解决方式: 1 删除/etc/yum/respond.d的yum源
2 下载两个yum源
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
3 yum clean all 执行后重新安装
十二 mysql通过show processlist 大量处于open /close table阶段
分析 open/close table基本是与table_cache有关,mysql相关的参数大概有2个
table_open_cache 表缓存个数,与数量有关
table_open_cache_instances 涉及缓存表缓存的锁争用
解决方式 1 降低查询本身频率 2 优化慢sql 3 设置读写分离 4 调整以上两个数值
十三 mysql在执行truncate时候,大量表处于open/close状态,但是一旦truncate完成,这种状态就会消失
分析 这种案例和上面的案例有些相似,却又不同.八怪大神经过pt-stack跟踪源码问题,定位到了是AHI导致的可能BUG问题
解决方式 关闭 自适应HASH索引
补充: 1 上面也有一个因为AHI导致的BUG问题 导致mysql索引
2 是否选择关闭AHI,要看关闭前后的程序效率对比,如果大量下降,请不要关闭.如果没什么影响,则建议关闭
mysql 案例 ~ 常见案例汇总的更多相关文章
- mysql案例~非常规操作汇总
一 简介:此文汇总mysql不常见的数据库的操作二 mysql表修改最大自增ID 目的: 修复canal相关问题 语法: alter table a AUTO_INCREMENT=num; 执行速度: ...
- jQuery常见案例
jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...
- 上海苹果维修点分享苹果电脑MACBOOK故障维修常见案例
苹果的电子设备无论是外观和性能都是无与伦比的美丽,很多开发者都开始选用苹果电脑macbook.近年来苹果售后维修点来维修苹果电脑的用户也越来越多,我们上海苹果维修点就整理分享了一些苹果电脑MACBOO ...
- Android内存溢出、内存泄漏常见案例及最佳实践总结
内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...
- 记一次血淋淋的MySQL崩溃修复案例
摘要:今天给大家带来一篇MySQL数据库崩溃的修复案例 本文分享自华为云社区<记一次MySQL崩溃修复案例,再也不用删库跑路了>,作者: 冰 河. 问题描述 研究MySQL源代码,调试并压 ...
- mysql主主复制汇总整理
mysql主主复制汇总整理 一.Mysql主主.主从复制主要思路: 1.mysql复制实质: 就是其他的MySQL数据库服务器将这个数据变更的二进制日志在本机上再执行一遍,因此非常重要的一点是mysq ...
- mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
- MySQL同步常见问题解答(自己的小心得)
前几天刚刚注册了博客园,我想写一些技巧性的教程,今天给大家分享一个MySQL同步常见问题解答. Q:如果主服务器正在运行并且不想停止主服务器,怎样配置一个从服务器? A:有多种方法.如果你在某时间点做 ...
- 李洪强iOS开发之OC常见错误汇总
// // main.m // 16 - 常见错误汇总 // // Created by vic fan on 16/7/13. // Copyright © 2016年 李洪强. All r ...
随机推荐
- javase的网络编程(InetAddress,UDP,TCP,URL,Socket,DatagramSocket)
通过一段时间对java网络编程相关内容的学习,写下这篇随笔,对这一部分的知识进行梳理和总结. 网络编程 一.网络编程三要素: IP地址:网络会给每个联网的主机分配一个数字的编码地址,该地址就是IP地址 ...
- 交叉编译jpeglib遇到的问题
由于要在开发板中加载libjpeg,不能使用gcc编译的库文件给以使用,需要自己配置使用另外的编译器编译该库文件. /usr/bin/ld: .libs/jaricom.o: Relocations ...
- mysql 自定义函数与自定义存储过程的调用方法
存储过程:call 过程名(参数) 函数: select 函数名(参数)
- Luogu P2617 Dynamic Rankings
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...
- sed 的|
#!/bin/bash/etc/init.d/nginx start && \sed -i "s|/project/env/|/${PROJ}/${ENVT}/|g" ...
- 正则表达式(_ % regexp_like)
'[^\.0-9]'——不含小数点和数字的字符串,^在中括号内表非 select '123' aa from dual where regexp_like( '123', '[^\.0-9]' ) - ...
- 关键字(8):数据库记录的增删查改insert,delete,select,update
insert:一般只要参数个数和类型没问题,不会插入异常 INSERT INTO t_pos_dynamic_map(autoid, lt_termno, lt_merchno) VALUES(SEQ ...
- 被顶级学术期刊枪毙的p.Value到底是个什么鬼
总结一下,在我看来,p.Value仅仅是在,假设检验,这理论框架下,对于证据力度的一个测量.而且,我们不大可能推翻假设检验这个框架,似乎也不必要,因为,这个框架非常合理,有广泛的应用场景,有强大的生命 ...
- Jz2440 环境安装
目录 Jz2440 环境安装 Ubuntu 设置 烧写工具 交叉编译环境 使用说明 烧写特性 title: Jz2440 环境安装 tags: linux date: 2018-09-20 22:56 ...
- Spring Boot笔记四:日志框架介绍
我是一名程序员,我喜欢写System.out.println来打印一些重要的信息...后来我学了面向对象,我把这些输出语句整合到了一个工具类里面,可以打印,也可以保存日志. 我是一名积极思考的程序员, ...