重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.查参数配置
成都创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达十年累计超上千家客户的网站建设总结了一套系统有效的营销解决方案,现已广泛运用于各行各业的客户,其中包括:酒店设计等企业,备受客户赞扬。
目前积累的使用经验中,存储过程函数触发器视图 在MySQL场景下是不适合的。性能不好,又容易发现内存不释放的问题,所以建议尽量避免.
2.存储过程函数
3.视图
4.触发器
5.1 总内存使用
5.2 分事件统计内存
5.3 账号级别统计
5.4 线程对应sql语句,内存使用统计
5.5 打开所有内存性能监控,会影响性能,需注意
5.6 系统表内存监控信息
6.top 命令
8.ps命令
9.pmap 命令
pmap是Linux调试及运维一个很好的工具,查看进程的内存映像信息
用法1:执行一段时间记录数据变化,最少20个记录,下面69265是MySQL pid
用法2:linux 命令pmap MySQL pid导出内存,下面69265是MySQL pid
RSS就是这个process实际占用的物理内存。
Dirty: 脏页的字节数(包括共享和私有的)。
Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)。
writeable/private:进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小。
1.首先使用/top/free/ps在系统级确定是否有内存泄露。如有,可以从top输出确定哪一个process。
2.pmap工具是能帮助确定process是否有memory leak。确定memory leak的原则:writeable/private (‘pmap –d’输出)如果在做重复的操作过程中一直保持稳定增长,那么一定有内存泄露
最近接了一个锅,进入新公司接手了一个进入交付阶段的项目.在code review的时候发现很多问题,然后开始修复bug.
在测试阶段突然发现几乎所有涉及到更新的操作都失败,下面贴出异常信息.
第一次 出现的时候百度了一下,猜想可能是多服务部署资源冲突,重启服务故障消失.所以没有特别重视
第二次 出现的时候只有测试环境部署,不存在多机资源冲突的问题,猜想是多线程资源交叉导致的,于是给可能导致资源竞争的地方加上了分布式锁.
由于无法重现故障,所以并没有确认问题得到解决.
第三次 故障依旧,当发现问题依然存在的时候,开始认真反思,发现自己解决问题的思路明显有问题,过于片面,一直都只在应用层面寻求解决问题的办法,而且解决问题的方式也只是在尝试百度出来的方法.并没有去思考更深层的问题.
在Mysql5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎);
INNODB_TRX ## 当前运行的所有事务
INNODB _LOCKS ## 当前出现的锁
INNODB_LOCK_WAITS ## 锁等待的对应关系
通过查询 INNODB_TRX 发现
当前事务中又两个RUNNING状态开始时间在一个小时之前
开始一直以为是锁表了
查看了 INNODB _LOCKS 事务信息之后发现有4行数据被锁住了一直没有释放
从这里开始发现问题了,应用已经抛了异常,事务理所当然的应该回滚才对,为什么资源依然没有释放,导致持续的阻塞呢?
其实最开始的异常信息就已经给出了答案,回到开始的地方,再看异常信息就很清楚了,应用里面的异常类是 MySQLTransactionRollBackException
是一个回滚异常, 这就说明在事务回滚的时候出了问题资源没有得到释放
然后开始查询 MySQLTransactionRollBackException 相关的信息
这个时候 innodb_rollback_on_timeout =0(默认配置)这个MySQL的配置开始进入我的视线,
举个栗子
事务在锁等待超时后是回滚事务内所有的statement还是最后一条语句;
0表示rollback最后一条语句,默认值; 有点坑爹啊( 细思极恐 )
1表示回滚事务内所有的statements;(此参数是只读参数,需在my.cnf中配置,并且重启生效;)
吃过一次亏,这次并没有盲目的相信百度到的信息
于是开始测试
一、验证innodb_rollback_on_timeout=off的情况
1.session A
开启事务,事务未提交,锁住id=1的数据
2.session B
开启事务,执行更新id=2的数据成功(事务未提交,锁住id=2),然后请求id=1等待锁超时,id=2的数据更改为222.
3.session C
请求id=2的数据50秒后显示等待锁超时
执行 SELECT * FROM information_schema.INNODB_TRX;
可发现有资源一直未释放,具体到测试数据中就是id=2的资源一直被锁定,线程一直被挂起.
总结:通过实验基本可以确定是业务资源交叉导致死锁之后资源没释放造成的持续阻塞,
二.验证innodb_rollback_on_timeout=on
修改配置后将验证innodb_rollback_on_timeout=off的步骤再走一遍
发现锁等待只能在业务层面尽量避免
on/off的区别在于session C进入时不会持续阻塞,session B异常后全部回滚
查看mysql日志,查看是什么原因导致数据库宕机。然后根据原因分析问题。
排查思路..... 我都是第一时间去看日志
弄个监控程序 监控一切可以监控的信息 最好能图形化的
然后观察出问题的点到底发生了什么
如果程序是你写的 也可以在程序里加标记 追踪程序
总之 就是收集信息 发现异常
另外
可以分成几块 系统 网络 mysql 你的某程序 改变一个变量 察看是否正常 正常了就是那个变量的问题了
解决方法一:
打开“服务”项目,选择mysql服务,在右键中选择其“恢复”选项,它负责服务失败时计算机的反应。每一次失败时,你可以选择(1)不操作;(2)重新启动服务;(3)运行一个程序;(4)重启服务器。您可以在第一次和第二次失败时选择重新启动服务,第三次失败就重启服务器,这样可以在无人值守的情况下达到自稳。但遗憾的是windows的这项内置服务工作时并不尽如人意。
解决方法二:
定期优化MySQL,这可以通过Mysql administrator来执行,也可以使用mysql的维护工具mysqlcheck,使用方法为:进入Mysql的Bin目录:C:\Program Files\MySQL\MySQL Server 4.1\bin 运行:mysqlcheck -A -o -r -uroot -p123456(注意,将123456改成你自己的root用户密码, 如无请留空 ),有时可以起到一定的作用。
解决方法三:
建立一个php+mysql的简单网站,在服务器监控王的网站监视设置中,让服务器监控王软件定期去访问这个网站(如60秒一次),如果不能访问,说明数据库存在问题,将故障回报至您的邮箱或手机中,让您在第一时间内得知网站访问情况。如果连续几次都不能访问,您可以选择自动重启服务器,从而达到无人值守的状态。
解决方法四:
设定服务器监控王的SQL监视,定期对mysql是否运行进行定期监视,如有问题立即重启或回报。
解决方法五:
对于上面问题中提到某台服务器准时在挂掉,如凌晨5点,产生这样的原因分析可能与当前流行的discuz论坛的自动定时备份有关,因为很多客户定时在凌晨时段自动备份mysql数据库,导致mysql工作忙碌(如有很多的mysql用户),可以建立一个计划任务,定时如早上6时将mysql重启一下。
解决方法六:
更换为非windows主机,运行更少的mysql+PHP网站,当然对于从事虚拟主机业务的运营商来说是一项损失。
如果你的mysql也出现以上这种提示,
建议你逐个字看完我这篇文章再按以下方法来尝试解决问题.
这是mysql数据库很多时候出现的问题, 网上流传很多解决办法. 有人按照那些方法, 还真可以把问题解决了; 但也有很多人按那些方法解决不了问题!
而这个中原因, 就是没有对症下药!!!
网上的那些方法, 很多都没有明确指出是什么版本的mysql, 所以导致问题者不能对症下药.
出现这个问题, 通过停止/重启 mysql 服务, 是可以解决的, 这个是最简单的办法! 对于不懂得什么叫做"停止/重启mysql服务"的人来说,
这个最简单的办法就是把服务器主机进行重新启动(就是把你的电脑进行重新启动).
以上是方法A! (这个方法适合任何版本的mysql)
以下是方法B:(方法仅适用于MySQL4.0.26 版本!!! (我估计,
4.0的其他版本应该也可以的))
网上也有说, 就是对root进行重改密码. 对于网上流传的改密码方法, 也是可行的. 请参考以下:
DOS下修改ROOT密码:当然后面安装PHPMYADMIN后修改密码也可以通过PHPMYADMIN修改
格式:mysqladmin -u用户名 -p旧密码 password
新密码
例:给root加个密码ideacmblog
首先在进入CMD命令行,转到MYSQL目录下的bin目录,然后键入以下命令
mysqladmin
-uroot password ideacmblog
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
D:\php\MySQL\binmysqladmin -uroot password
ideacmblog回车后ROOT密码就设置为ideacmblog了
但是, 请注意了, 以上方法仅适用于MySQL4.0.26
版本!!! (我估计, 4.0的其他版本应该也可以的)
方法C:
好了, 扯了那么多, 以上的两个方法都不是我本人测试过的, 本人不对真实性负责!
而现在我说一下本人亲自试过的方法, 以供参考:
话说今天, 我的服务器所有php及使用了mysql数据库的网站, 均挂掉了! 无法打开,
并有以下提示:
错误代码 1045
Access denied for
user 'root'@'localhost' (using password:YES)
一开始我也是不断搜索google(我本人不喜欢百度!),
去找寻解决的办法. 看了很多, 也参照执行了, 事实上也是解决不了问题. 后来我想到了是版本的问题, 不同的mysql版本,
解决办法是不一定一样的!!记住...
我的mysql版本是: 5.0.22
(mysql-essential-5.0.22-win32)
今天一整天, 那些php网站均罢工. 到今晚才有时间上去服务器继续寻找方法, 但仍然解决不了.
最后, 我决定把mysql卸掉重新安装!
卸载很快, 而且不需要重新启动计算机.
于是, 继续进行安装.
第一步:
打开这个mysql-essential-5.0.22-win32.exe文件;
第二步: 见到窗口弹出, 并点击 Next
进入下一步;
第三步: 选择 Custom 项, 并点击
Next 进入下一步;
第四步: 到这一步要注意了, 点击
Change... 选择你原安装mysql的目录; 选择后, 继续点击Next 进入下一步;
第五步: 点击 Install
进行安装...
安装至下一步, 会提示你进行注册, 选择最后一项, 即跳过注册,
进入下一步正式完成安装.
安装完成后, 继续弹出一个窗口, 提示你是不是立刻进行配置,
选择 Next
选择Standard Configuration.继续点击
Next 进入下一步
这一步里, 把上面那行的勾去掉, 只在 Include
....PATH 那行打勾, 继续点击 Next 进入下一步
在这一步, 点击中间的"Ex****"那顶,
接着配置完毕!
这时候, 你去看看你的mysql正常了没有??
!!
这样就ok了!!!