Innodb monitor介绍
学习oracle的时候,如果想了解一些内部原理和机制,可以使用一些event来生成trace文件,通过分析这些trace文件可以获得很多的信息。而MySQL在这方面比较弱,当然,另一方面来说,MySQL是开源的,可以去直接研究源代码的实现。不过源代码架构庞大,不是每个人都有足够的精力和毅力去解读。InnoDB引擎提供了一个monitor,可以通过monitor一窥其内部的一些统计信息,也可以说是了解InnoDB引擎的一个很好的窗口。
我们最熟悉的,应当就是show innodb status命令,可以直接在客户端输出很多的信息。其实InnoDB monitor一共有四种模式,show innodb status只是其一种模式的直接展现,并且只能交互式开启,无法自动循环捕获信息。另外还有一种适合四种模式的开启方式,则是通过创建一张特殊的innodb表来开启,开启后会按照固定的时间间隔循环,输出信息到log-error参数指定的错误日志文件中,通过drop对应的表,可以停止monitor。
四种monitor分别是:
- innodb_monitor:create table innodb_monitor(x int) engine=innodb;
- innodb_lock_monitor:create table innodb_lock_monitor(x int) engine=innodb;
- innodb_table_monitor:create table innodb_table_monitor(x int) engine=innodb;
- innodb_tablespace_monitor:create table innodb_tablespace_monitor(x int) engine=innodb;
根据我在5.1.36版本中实际观察到的结果,innodb_monitor/innodb_lock_monitor开启后的执行周期是16s(参考手册上说是15s),而innodb_table_monitor/innodb_tablespace_monitor的执行周期是64s。开启monitor后因为是持续周期性的运行的,在不需要的时候一定要记得drop相关表来停止monitor。如果在开启monitor的中间服务器有重启,monitor不会自动重启,并且在下次启动monitor之前,必须先执行停止操作。
其中innodb_monitor/innodb_lock_monitor两种监视器的输出结果基本类似,后者会有更多关于锁的信息,而前一个实际上就是show innodb status。innodb_table_monitor则会将系统中所有innodb的表的一些结构和内部信息输出,而innodb_tablespace_monitor则输出的是tablespace的信息,注意该monitor输出的只是共享表空间的信息,如果使用innodb_file_per_table为每个表使用独立的表空间,则这些表空间的信息是不会包含在输出中的。
以下是一些简单的示例:
innodb_monitor/innodb_lock_monitor:
===================================== 090805 22:24:48 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 19 seconds ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 312921, signal count 308229 Mutex spin waits 0, rounds 18209349, OS waits 111906 RW-shared spins 287775, OS waits 142204; RW-excl spins 175036, OS waits 19318 ------------ TRANSACTIONS ------------ Trx id counter 0 121675664 Purge done for trx's n:o < 0 121675662 undo n:o < 0 0 History list length 10 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 121462143, not started, process no 8452, OS thread id 1160767840 mysql tables in use 1, locked 1 MySQL thread id 8056144, query id 78206864 localhost root ---TRANSACTION 0 137229, not started, process no 8452, OS thread id 1158199648 MySQL thread id 50, query id 377 Has read all relay log; waiting for the slave I/O thread to update it -------- FILE I/O -------- I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (write thread) Pending normal aio reads: 0, aio writes: 0, ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 Pending flushes (fsync) log: 0; buffer pool: 0 34 OS file reads, 80820900 OS file writes, 1263117 OS fsyncs 0.00 reads/s, 0 avg bytes/read, 1.16 writes/s, 0.63 fsyncs/s ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 0, seg size 2, 0 inserts, 0 merged recs, 0 merges Hash table size 8850487, node heap has 233 buffer(s) 0.11 hash searches/s, 0.42 non-hash searches/s --- LOG --- Log sequence number 4 3697502095 Log flushed up to 4 3697502095 Last checkpoint at 4 3697502095 0 pending log writes, 0 pending chkp writes 79595438 log i/o's done, 0.47 log i/o's/second ---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 4851752298; in additional pool allocated 13195520 Dictionary memory allocated 145784 Buffer pool size 262144 Free buffers 193334 Database pages 68577 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages read 70, created 120513, written 2829967 0.00 reads/s, 0.21 creates/s, 0.84 writes/s Buffer pool hit rate 1000 / 1000 -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 1 read views open inside InnoDB Main thread process no. 8452, id 1157658976, state: waiting for server activity Number of rows inserted 12233742, updated 57497659, deleted 1, read 69720050 0.05 inserts/s, 0.05 updates/s, 0.00 deletes/s, 0.05 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT ============================
innodb_table_monitor:
=========================================== 090805 22:26:56 INNODB TABLE MONITOR OUTPUT =========================================== -------------------------------------- TABLE: name SYS_FOREIGN, id 0 11, columns 7, indexes 3, appr.rows 0 COLUMNS: ID: DATA_VARCHAR prtype 1835012 len 0; FOR_NAME: DATA_VARCHAR prtype 1835012 len 0; REF_NAME: DATA_VARCHAR prtype 1835012 len 0; N_COLS: DATA_INT len 4; DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; DB_ROLL_PTR: DATA_SYS prtype 258 len 7; INDEX: name ID_IND, id 0 11, fields 1/6, uniq 1, type 3 root page 46, appr.key vals 0, leaf pages 1, size pages 1 FIELDS: ID DB_TRX_ID DB_ROLL_PTR FOR_NAME REF_NAME N_COLS INDEX: name FOR_IND, id 0 12, fields 1/2, uniq 2, type 0 root page 47, appr.key vals 0, leaf pages 1, size pages 1 FIELDS: FOR_NAME ID INDEX: name REF_IND, id 0 13, fields 1/2, uniq 2, type 0 root page 48, appr.key vals 0, leaf pages 1, size pages 1 FIELDS: REF_NAME ID ...省略若干输出 -------------------------------------- TABLE: name test/test, id 0 81, columns 4, indexes 1, appr.rows 3 COLUMNS: i: DATA_INT DATA_BINARY_TYPE len 4; DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; DB_ROLL_PTR: DATA_SYS prtype 258 len 7; INDEX: name GEN_CLUST_INDEX, id 0 23, fields 0/4, uniq 1, type 1 root page 3, appr.key vals 3, leaf pages 1, size pages 1 FIELDS: DB_ROW_ID DB_TRX_ID DB_ROLL_PTR i ----------------------------------- END OF INNODB TABLE MONITOR OUTPUT ==================================
innodb_tablespace_monitor:
================================================ 090805 22:28:16 INNODB TABLESPACE MONITOR OUTPUT ================================================ FILE SPACE INFO: id 0 size 65536, free limit 6208, free extents 89 not full frag extents 6: used pages 69, full frag extents 0 first seg id not used 0 1067667 SEGMENT id 0 1067666 space 0; page 903; res 1 used 1; full ext 0 fragm pages 1; free extents 0; not full extents 0: pages 0 ...省略若干输出 SEGMENT id 0 144216 space 0; page 1307; res 1 used 1; full ext 0 fragm pages 1; free extents 0; not full extents 0: pages 0 NUMBER of file segments: 37 Validating tablespace Validation ok --------------------------------------- END OF INNODB TABLESPACE MONITOR OUTPUT =======================================
拥抱变化
最近的一些变动比较出于意料之外。
今天晚上将召开半年会,一眨眼2009年已经过去大半年了。回顾一下这半年,应该说,数据库系统的整体稳定性较去年有所提升,这需要归功于团队的一起努力,以及架构和开发人员的倾力协作。当然,还有一些不如人意的地方,如果能在流程和操作方面更加规范一些,有很多事情是可以避免的。不管怎么样,有些责任是需要抗的。
随着应届生的加入,团队补充了不少新鲜血液。年轻人,都比较有活力,希望这股活力能很好的导向,快速的成长。最近很长时间,已经比较少看书,这不是一个好现象,关注细节,把握方向,很重要。
有变化,有风险,也有机遇。拥抱变化,心态最重要。
日全食
2009.7.22 农历六月初一
杭州 生平第一次肉眼观测日全食
9点20走出办公室,铁木真在门口看着大家笑
9点30多,当太阳最后一束光被遮盖,和第一道光从月影中刺出,感叹大自然的神奇
五六分钟内,近日高达40度的气温下降,一阵风过,有些许凉意
并没有想象中的黑,甚至不如雷雨前的漫天乌云
下午,一场瓢泼大雨,彻底凉了下来
天狗远遁,尚有余威?
使用Perl发送邮件
在之前的监控系统中,邮件系统配置为只能本地调用mail命令发送,这样如果要在每台数据库服务上发送邮件就比较麻烦,需要通过ssh远程调用邮件服务器上的发送脚本。如果要发送文件,还要先将文件复制到邮件服务器上。
随着机器数量的增加,这种方式越来越不灵活。因此希望能通过传统的smtp的方式在任何主机上都能发送邮件,于是花了点时间研究了一下sendmail,根据这篇文章很轻松的让sendmail跑了起来:
修改sendmail配置模板/etc/mail/sendmail.mc
define(QUEUE_DIR, `/var/spool/mqueue/q*')dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl DAEMON_OPTIONS(`Port=25, Name=MTA')dnl 第一行是新增,支持多个队列 第二三行去掉注释 第四行加上注释 第五行新增
根据模板生成配置文件
m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
建立多个队列的目录
cd /var/spool/mqueue/ mkdir q1 q2 q3 q4 q5 q6
启动sendmail
/etc/rc.d/init.d/sendmail start
若要随机自启动sendmail,修改一下chkconfig设置即可
chkconfig --level 35 sendmail on
测试了一下发送邮件成功:
mail -s "test mail" NinGoo@test.com < /tmp/test.log
在CPAN上搜索了一下,Mail:Sender模块发送邮件比较方便,支持多附件,语法也比较简单。需要安装如下两个组件:
MIME::Base64 Mail::Sender
发送邮件的perl示例代码如下,为便于查看邮件发送的详细情况,这里开启了debug模式:
#!/usr/bin/perl -w
use Mail::Sender;
open my $DEBUG, ">> /tmp/mail.log" or die "Can't open the debug file: $!\n";
$sender = new Mail::Sender
{smtp => 'smtp_server',
from => 'send@mail.com'};
#发送普通邮件
$sender->MailMsg(
{to => 'NinGoo@test.com',
subject => 'test mail',
msg => 'hello word',
debug => $DEBUG
});
#发送带附件的邮件
$sender->MailFile(
{to => 'NinGoo@test.com',
subject => 'test mail with attached file',
msg => 'hello word',
file => '/tmp/test.txt'
debug => $DEBUG
});
经过测试,在邮件服务器本机发送成功,但在远程主机上则失败了,通过debug的log文件,发现错误如下:
>> 550 5.7.1 < NinGoo@test.com>... Relaying denied. Proper authentication required.
因为是内部监控使用,可以配置远程发送到特定的域的邮件无须认证,修改/etc/mail/relay-domains文件,每行加入一个目标域,如taobao.com。
修改配置后注意重启sendmail
/etc/rc.d/init.d/sendmail restart
发送正常的log如下:
>> 250 2.0.0 n69DbJwt011946 Message accepted for delivery
常用标签: oracle life MySQL Oracle11g blog dba 新特性 oow2009 oow wordpress
最新评论 | Recent comments
- Cassandra Commitlog on Cassandra存储机制: [...] 上一篇:Cassandra存储机制 [......
- bulletming on 遭遇MySQL Replication Fatal Error 1236: 问题原因我一直觉得就是Master死之前,logbin有用os cache或者本身的cache机制...
- isql on dstat:一款简单直观的os实时监控工具: 可以考虑收费了,呵呵...
- foremire on 如何监控MemCached的状态: 的确,web 方式要直观多...
- bwskyer on dstat:一款简单直观的os实时监控工具: 我倒是觉得Process Monitor蛮不错的...
- P.Linux on dstat:一款简单直观的os实时监控工具: 监控工具整合整合就好了,作成一整套监控系统,现在工具都很分散在各个...
- NinGoo on 使用zlib输出gzip格式的文件: @joey 这个工具已经比较长时间没有更新了,最新的一份代码可以通过这个地...
- joey on 使用zlib输出gzip格式的文件: 希望可以见到最新版本的代码,好好学习学...
- NinGoo on tbstat:实时监控数据库统计状态的小工具: 这个可以使用sprintf函...
- P.Linux on tbstat:实时监控数据库统计状态的小工具: 知道怎么刷新了,用Curses,谢谢宁总。 不过又有新问题用Curses要把输出的...
- Marty on PostgreSQL简介: 还是微软安逸,根本就不支持一致读,省得伤脑...
- NinGoo on PostgreSQL简介: 是的,mvcc不管用什么方式实现,update导致的链表肯定是存在的,否则没法...
- 八神 on PostgreSQL简介: oracle的UNDO方式,对于查询的影响也比较严重,总是要根据ITL事务槽,对应...
- 红唇迷恋 on PostgreSQL安装: 我看到你博客调用twitter,你不怕被墙啊。。...
- NinGoo on tbstat:实时监控数据库统计状态的小工具: @P.Linux:这个你可以去参考一些类似的工具,如innotop/mtop...