寻觅生命中的那一片浅草......

文章属于类别 MySQL

mysqldump引起MySQL内存飙升事例一则

最近有台MySQL,在运行一段时间后,res和virt内存都会去到很高,res会占到物理内存的90%,最终导致业务异常

期间做过的尝试:

  • 用tcpcopy来把生产环境的流量导到测试服,但MySQL内存并无异常
  • 将innodbfilepertable=1修改为innodbfilepertable=0,运行1天后,内存飙升还是比较厉害

上面的措施都没有用。

下面这个,不确定有没有试过,也记录下吧

mysqldump -q,就是把数据尽快写到磁盘,而不是存在内存

最后是同事看监控,发现在凌晨,MySQL备份后,内存才飙升,我们最后定位到MySQL内存异常的原因是以下2个:

  • xxx_db下表太多:近2W了,一个区服就一个表来寸配置
  • 由于表太多,下面的指令把整个库的表结构导出来的时候,估计会把整个结构先写入内存,但理论上,这个表结构不会大
mysqldump -d $1 > $1_db_struc.sql

解决办法:

  • 不导整个库的结构,一个表一个表地导(这个也是目前的做法),或者直接就不导结构,因为都是一样的
  • 减少表数量,我们后来把它改为了这种方式,单个表存所有区服的信息

启动MySQL时预热buffer_pool

MySQL5.6加入了一个把buffer_pool dump到磁盘的功能,加快MySQL重启后,数据的预热速度,我们用的Percona Server 5.5也加入了这个功能主要有以下几点:

  • 只dump页表的号码到磁盘,而不是数据 ,所以,即使你buffer_pool很大,实际dump出来的数据很小,文件存放在MySQL的数据目录
  • 可以设置固定时间间隔自动dump
  • 设置关闭时自动dump,开启时自动restore
  • innodb_buffer_pool_restore_at_startup=600,每10分钟保存buffer_pool到磁盘,这个只是保存了磁盘上数据的索引,并不是真正的数据,否则这个文件会非常大
  • innodb_blocking_buffer_pool_restore=1,在MySQL启动时,阻塞启动过程,直到buffer_pool预热后才通知系统已经启动成功
#!/bin/bash

# change online  
mysql -uroot -pxxx <<EOF
set @@global.innodb_buffer_pool_restore_at_startup=600;
select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA_LRU_DUMP*/;
EOF

手动dump和restore

可以在MySQL启动后,select一个表的数据,然后查看buffer pool的page数量,手动把buffer pool dump到磁盘,再重启MySQL,看它是否会restore

一些命令:

# 查看buffer pool的数据大小
show status like 'innodb_buffer_pool_pages_data';
# 手动dump
select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA_LRU_DUMP*/;
#手动restore
select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA

当Django1.5遇上uwsgi-1.0.4:查不到最新数据

最近做的功能,涉及ORM,数据明明已经插入数据库,但在页面上却查不到,一开始以为是cache的问题,但最后google发现是Django和uwsgi直接衔接出了问题:
Using #django 1.5 on #uwsgi ? You’ll want at least 1.3, otherwise DB connections aren’t closed between requests.
解决办法就是升级uwsgi
参考:
https://twitter.com/raphaelbarrois/status/337924659666362368
https://groups.google.com/forum/#!topic/django-users/8OgkXAjuvDM

mysqldump的innodb-optimize-keys参数

英文原文见下面的链接

Improved InnoDB fast index creation

mysqldump导出数据的时候,加入–innodb-optimize-keys可以使导入时间缩短一半(仅适用于把整个库导出为一个sql的情况),原理是在创建表的时候,只创建主键索引,二级索引在load完数据后再创建

mysqldump引起mysql内存飙升事例一则

最近有台MySQL,在运行一段时间后,res和virt内存都会去到很高,res会占到物理内存的90%,
期间做过的尝试:
1、用tcpcopy来把生产环境的流量导到测试服,但MySQL内存并无异常
2、将innodb_file_per_table=1修改为innodb_file_per_table=0,运行1天后,内存飙升还是比较厉害
同事看监控,发现在凌晨,MySQL备份后,内存才飙升

最后查找到MySQL内存异常的原因是以下2个:
1、xxx_db下表太多:近2W了
2、由于表太多,${MYSQLDUMP} -uroot -p${MYSQLPASSWORD} -d $1 > “${BACKUPDIR}/$1_db_struc.sql”这个指令把整个库的表结构导出来的时候,估计会把整个结构先写入内存

解决办法:
1、减少表数量
2、不导整个库的结构,一个表一个表地导(这个也是目前的做法),或者直接就不导结构,因为都是一样的

2024年四月
« 5月    
1234567
891011121314
15161718192021
22232425262728
2930