`
文章列表
       最近了解mysql MDL的设计。发现mysql "set global read_only=on/off"操作也依赖metadata lock(5.6.16, 推测是从5.5引入metadata lock后就这样了,没有查看更早版本的代码确认)。下面是set global read_only=on/off的实现。       调用路径 ...

mysql flush logs

        最近遇到一台mysql机器,空间不足,查看后发现是slow log文件占了大量空间(ext4),果断rm掉,然后再flush logs。flush logs的时候发现mysql会hang住。翻了一下flush logs的逻辑,执行flush logs的时候,mysql会执行reopen_file操作,reopen_file()先closeslow log file,再open,而这个过程是持有LOCK_log锁。目前mysql server层日志(slow/general/binary log)的写操作是都需要持有这个锁的。        这样,问题就来了。前面执行rm操作 ...
      关闭mysql的方式大致有下面几种:       kill `pidof mysqld`       kill -9 `pidof mysqld`       mysqladmin -uroot shutdown       其中kill `pidof mysqld`是通过信号量SIGTERM(15),结束进程,这个同mysqladmin -uroot shutdown的方式一样 -- mysqladmin关闭mysqld也是通过SIGTERM信号量结束mysqld的。通过这2种方式关闭mysql,mysql的error日志显示的都是normal shutdown;而ki ...
    在mysql的备库的监控中有一项很重要的指标:Seconds_Behind_Master,这个值是怎么得到的呢?下面从5.1.58的代码中分析一下:     mysql的replication中有2个比较重要的class:Master_info(rpl_mi.h), Relay_log_info(rpl_rli.h),他们分别对应于master,info文件和slave.info文件;很显然,Master_info是io_thread需要的,Relay_log_info是sql_thread需要的。Master_info中有一个变量 clock_diff_with_master,这 ...
       mysql主备复制是通过binlog完成的。在开启binlog的情况下,expire_logs_days参数可以让mysql自动清理若干天前的binlog。那么expire_logs_days是在什么时候生效的呢?初步猜想实在每次产生一个新的binlog的时候去判断一次。查了一下具体的实现,确实是这样的:(5.1.58, log.cc) int MYSQL_BIN_LOG::rotate_and_purge(uint flags) { ... if (!error && check_purge && expire_logs_days) ...
       mysql的配置文件my.cnf里是由一个个的option组成的([***])。各个部分的作用大致如下: [client] -- 这部分的配置是mysql自带的client回去读取的部分,可以配置port/password/socket等 port=3306 socket=/tmp/mysql.sock [mysql] -- 这部分配置mysql command tool会读取的部分 no-auto-rehash [mysqld]--这部分是mysql server使用到的,比如这个页面里面的参数以及存储引擎自己的参数。 max_connections=100 ...

mysql compound in 查询

 
        mysql可以使用row constructor来做compound in 查询:select * from t where (col1,col2) in ((colt1,colt2),(colt11,colt22)).这种查询在批量查询的时候就会显得比较方便:业务上可以批量操作,提高效率。但是explain之后却发现,这种sql却使用了全表扫描。         首先看一下mysql是怎么处理in查询的:mysql处理 in(value list)查询时会对value list做一次quick-sort,但是如果value list里的元素是tuple就无法进行排序(按哪 ...
       粗略了解mysql create table的过程: create table的调用路径如下(5.1.58): do_command(sql_parse.cc) ->dispatch_command(sql_parse.cc) ->mysql_parse(sql_parse.cc) ->mysql_execute_command(sql_parse.cc) ->mysql_create_table(sql_table.cc) ->mysql_create_table_nolo ...
        一直好奇innodb main thread的thread state。最近偶然发现没有ddl操作的时候,show engine innodb status时,main thread处于"doing background drop tables",就顺便了解了一下有关 innodb main thread状态的一些处理逻辑。主要的处理逻辑在srv/srv0srv.c文件里。         main thread的初始状态(srv_main_thread_op_info)为"";srv_master_thread开始后就设置main ...
       最近做drop table操作,24G的sas机器,ibd文件17G,大约需要14S,在此期间mysql(5.1.48)基本hang住。详细了解了一下mysql drop table过程,发现是mysql drop table的逻辑引起,主要有2方面的原因:drop table过程会持有buffer pool mutex,做2次遍历--对于大内存的mysql服务器,会导致mysql hang住;rm ibd文件的过程,会持有LOCK_open mutex,对于大表,也会导致mysql hang住。对于第二个问题,bug#41158提到一个解决办法:对磁盘做碎片整理;drop前对 ...
      最近看myssql的浮点类型,对mysql数据类型中的的数字类型做个小结:       tinyint/int/bigint,整型的最容易理解和使用,实际使用的时候整型用的也是最多的。知道有符号/无符号,tinyint 1个字节,int 4个字节,bigint 8个字 ...

mysql use db 后很卡

    平时自己使用的一台mysql,use db之后,总是感觉很卡,按完回车要快1s才能返回。觉得有什么蹊跷,就打开了general log,发现简单的use test,mysql实际执行了很多内容: 130603 16:02:11 2 Query SELECT DATABASE() 2 Init DB test 2 Query show databases 2 Query show tables ...
innodb表空间的浪费 http://bugs.mysql.com/bug.php?id=68023 http://bugs.mysql.com/bug.php?id=67963

mysql kill不生效?

       生产环境出现过多次mysql hang住,写操作的sql堵住的情况,这个时候使用kill来kill所有的连接,但是大部分时候连接kill 后处于freeing item状态,kill在这种场景下基本无效。        查看官方文档(以下大致翻译):(http://dev.mysql.com/doc/refman/5.5/en/kill.html)        kill执行后,一个线程特定的kill flag会被设置(THD::killed)。大多数情况下,线程消亡可能是需要花一点时间的,因为kill flag是以特定的间隔被检查的: 1、对于select,group ...
      遇到一个需求,已有的一个表,需要把已有的一个普通索引变成唯一索引,表数据量大约在百万级别,duplicate的量大约在几K左右。想到了使用alter ignore table (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html),于是便找了一个 ...
Global site tag (gtag.js) - Google Analytics