MySQL

  • 也说快速关闭MySQL/InnoDB

    ·

    如果用的引擎是InnoDB,每次敲下mysqladmin -uroot -p shutdown关闭数据库的时候,总是很难预测这个命令会执行多久,实际经验表明,短则五秒,长则三十分钟一小时都有可能。也分享一下我的经验吧。

    1. 为什么InnoDB关闭会慢?

    事实上,并不是每次关闭InnoDB都很慢的。Why?InnoDB较之MyISAM,一个重要特性是InnoDB会在内存中开辟一个Buffer Pool来存储最近访问的数据块/索引块,使得下次再次访问这个块时速度能够很快。当InnoDB对需要修改数据块的时候,会先记录修改日志,然后直接对Buffer_Pool中的数据块的操作。记录日志是顺序写,对数据块的操作是内存操作,这让InnoDB在很多场景下有这很好的速度优势。 (more…)

  • Flashcache配置

    ·

    前面写了两篇文章,分别介绍了Flashcache的基本原理和编译安装,本文介绍一下Flashcache的配置。

    假设现在你已经编译好了Flashcache,已经装好了ssd盘(假设是/dev/sdb)和sas盘(假设需要使用的是分区/dev/sda12,这可能是一个RAID组)。接下来,看看如何使用Flashcache将上面两个设备虚拟成一个带缓存的块设备。

    1. 首次创建Flashcach设备

    注:请备份你的数据先!!!特别是/dev/sdb,这个设备上的数据将会被清空;理论上/dev/sda12上的数据不会有任何丢失。

    首先确保sda12没有被挂载,如果挂载了,使用umount卸载之,然后使用flashcache_create创建设备:

    ./flashcache_create cachedev /dev/sdb /dev/sda12

    如果是sudo帐号可能会遇到如下的报错: (more…)

  • 很多人都讨论了这个问题,参数innodb_thread_concurrency限制了InnoDB内部线程的数量。例如当有query需要InnoDB处理时,InnoDB首先会检查一下当前的内部线程数是不是超过了innodb_thread_concurrency的限制,如果超出则会让当前线程sleep一会儿,再试,如果还是受限,则会进入一个FIFO的队列。如果innodb_thread_concurrency设置成0表示,内部线程数量将不受限制(注:innodb_thread_concurrency值在不同的版本意义略有不同)。

    1. 该参数设置成多少合适?

    我不知道多大合适。我的经验值设置成64就够了,正常情况,应用并发不会超过这个值。

    如果设置成0,会让InnoDB的内部线程不受限制,如果你高并发的IO-bound的应用,很可能在InnoDB内部累计很多的并发等待IO的线程,主机的Load会很高,但是数据库依然会正常运行。

    从5.1.11开始这个值的默认值是8,意味着,InnoDB会限制内部线程数不超过8。如果是高并发的应用,你的MySQL能力可能会受到这个参数的限制。对于很多情况这个值有偏小的,并发量可能会比8大,这时参数innodb_thread_concurrency就会成为InnoDB的瓶颈。对于一个16核的系统,处理的并发很多时候都会大于8,而受cpu核数限制,太多的线程会在CPU切换上消耗过多资源。

    但是如果你系统并发量始终都是小于8的,那么设置成一个大于8的值并没有意义。

    2. 高并发下实验

    通过supersmack模拟了128个线程并发,做了5组对比测试:

    innodb_thread_concurrency

    最后,提一下,没事不要在生产环境动态更改innodb_thread_concurrency,很危险:Bug 40760

    参考:

    1. MySQL Manual

    2. MySQL: innodb_thread_concurrency beast

    3. do we still need innodb_thread_concurrency

    4. Mess with innodb_thread_concurrency

    5. InnoDB线程并发检查机制

    6. MySQL Bugs

  • 如果遇到如下错误:

    Can’t open file: ‘.\test\mytable.frm’ (errno: 24)
    shell> perror 24
    OS error code 24: Too many open files

    这就是MySQL的文件描述不够用了。先说解决办法,再说背后的原因吧。

    1. 如何解决

    第一步:设置OS参数(如果你有权限的话):

    文件/etc/security/limits.conf新增如下行:

    mysql soft nofile 65535
    mysql hard nofile 65535

    上面的配置,是OS限制各个用户能够打开的文件描述符限制(hard soft区别参看man ulimit),新增上面两行,表示mysql用户能够打开65535个文件描述符(可以使用lsof -u mysql|wc -l查看当前打开了多少个文件描述符)。

    第二步:修改MySQL参数:
    在MySQL配置文件my.cnf中新增下面的行

    open_files_limit = 65535
    innodb_open_files=65535

    然后重启你的MySQL一般问题就解决了。

    2. 背后的问题

    (more…)

  • 批量杀死MySQL连接

    ·

    如果你也觉得使用mk-kill比较麻烦的话,那就可以使用下面这个简单而暴力的办法:

    mysqladmin -uroot -p processlist|awk -F “|” ‘{print $2}’|xargs -n 1 mysqladmin -uroot -p kill

    (注:上面的语句不用换行)

    上面的命令会杀死当前全部的MySQL连接,毫不留情。朋友,慎用之。

    如果上面这个命令太暴力,下面这个稍微温柔一点,可以帮你杀死指定用户正在运行的连接

    mysqladmin -uroot -p processlist|awk -F “|” ‘{if($3 == “wordpress”)print $2}’|xargs -n 1 mysqladmin -uroot -p kill

    (上面的命令,可以杀死当前用户wordpress正在运行的连接)

    参考:kill MySQL Connection

  • Flashcace安装 How-to

    ·

    Flashcache的安装在其READMEREADME-CentOS5.4已经有一个很详细的说明了,但是实际操作并不是很顺利,而且有些同事表示在编译过程中仍遇到了一些问题,这里详细的记录一下自己的编译、安装过程。

    1. 环境说明

    使用的是RHEL5.4的系统:

    $cat /etc/issue
    Red Hat Enterprise Linux Server release 5.4 (Tikanga)
    $uname -a
    Linux myhost 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

    (more…)