- 浏览: 89512 次
- 性别:
- 来自: 杭州
最新评论
文章列表
最近了解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
最近遇到一台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的几种方式和区别
- 博客分类:
- mysql
关闭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
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前对 ...
mysql 数字类型
- 博客分类:
- mysql知识汇总
最近看myssql的浮点类型,对mysql数据类型中的的数字类型做个小结:
tinyint/int/bigint,整型的最容易理解和使用,实际使用的时候整型用的也是最多的。知道有符号/无符号,tinyint 1个字节,int 4个字节,bigint 8个字 ...
mysql use db 后很卡
- 博客分类:
- mysql
平时自己使用的一台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表空间的浪费
- 博客分类:
- innodb
innodb表空间的浪费
http://bugs.mysql.com/bug.php?id=68023
http://bugs.mysql.com/bug.php?id=67963
mysql kill不生效?
- 博客分类:
- mysql
生产环境出现过多次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),于是便找了一个 ...