理解show engine innodb status之LOG
2016-11-23 14:30
495 查看
mysql版本:Ver 5.6.34-debug for Linux on x86_64 (Source distribution)
---
LOG
---
Log sequence number 1626037
Log flushed up to 1626037
Pages flushed up to 1626037
Last checkpoint at 1626037
0 pending log writes, 0 pending chkp writes
8 log i/o's done, 0.18 log i/o's/second
这里涉及到4个lsn的概念,先查看下该信息打印的函数
fprintf(file,
"Log sequence number " LSN_PF "\n"
"Log flushed up to " LSN_PF "\n"
"Pages flushed up to " LSN_PF "\n"
"Last checkpoint at " LSN_PF "\n",
log_sys->lsn,
log_sys->flushed_to_disk_lsn,
log_buf_pool_get_oldest_modification(),
log_sys->last_checkpoint_lsn);
由上述代码结合log_sys的数据结构注释可大概猜测到
Log sequence number表示的是redo log buffer中的lsn,表示事务写到redo log buffer中的字节总量,我为假设为A;
Log flushed up to表示的是redo log file中的lsn,表示事务写入到redo log file中字节总量,假设为B;
Pages flushed up to表示的缓冲池最旧脏页的lsn,由函数log_buf_pool_get_oldest_modification获取,假设为C;
lsn信息还会记录到每个redo的物理页中,在每个页的头部有个fil_page_lsn的变量存放当前页的lsn,表示该页最后刷新时的lsn号;下图中的Last checkpoint at 指的就是最近一个物理页刷新到磁盘时,它的fil_page_lsn的变量值,假设为D
0 pending log writes, 0 pending chkp writes
8 log i/o's done, 0.18 log i/o's/second
这里的时间间隔计算方式:上一次执行show engine innodb status到本次执行时所花的时间。
current_time = time(NULL);
time_elapsed = difftime(current_time,
log_sys->last_printout_time);
数值的显示方法:
fprintf(file,
"%lu pending log writes, %lu pending chkp writes\n"
"%lu log i/o's done, %.2f log i/o's/second\n",
(ulong) log_sys->n_pending_writes,
(ulong) log_sys->n_pending_checkpoint_writes,
(ulong) log_sys->n_log_ios,
((double)(log_sys->n_log_ios - log_sys->n_log_ios_old)
/ time_elapsed));
log_sys->n_log_ios_old = log_sys->n_log_ios;
log_sys->last_printout_time = current_time;
这里的log_sys是个全局变量,它的数据类型就是redo log buffer,涉及到这里显示部分,它的部分成员变量如下
n_pending_writes:当前正在异步写入当前redo log file组的数量
n_pending_checkpoint_writes:当前正在异步写入检查点值的数量
n_log_ios:db启动以来,redo log产生的IO次数
n_log_ios_old:db启动以来,直到上次执行show engine时的redo log产生的IO次数
大部分数值显示都是取自于log_sys全局变量的成员值(太复杂了,不会)
log_buf_pool_get_oldest_modification()实际调用了buf_pool_get_oldest_modification(void),大概的计算方式应该是轮询一次每个缓冲池的innodb_buffer_pool_instances所有instances,找出每个instance中最旧的脏页的lsn,返回所有中最小的lsn值,这个值也就是缓冲池中最旧的lsn
for (i = 0; i < srv_buf_pool_instances; i++) {
buf_pool_t* buf_pool;
buf_pool = buf_pool_from_array(i);
buf_flush_list_mutex_enter(buf_pool);
bpage = UT_LIST_GET_LAST(buf_pool->flush_list);
if (bpage != NULL) {
ut_ad(bpage->in_flush_list);
lsn = bpage->oldest_modification;
}
buf_flush_list_mutex_exit(buf_pool);
if (!oldest_lsn || oldest_lsn > lsn) {
oldest_lsn = lsn;
}
}
return(oldest_lsn);
---
LOG
---
Log sequence number 1626037
Log flushed up to 1626037
Pages flushed up to 1626037
Last checkpoint at 1626037
0 pending log writes, 0 pending chkp writes
8 log i/o's done, 0.18 log i/o's/second
这里涉及到4个lsn的概念,先查看下该信息打印的函数
fprintf(file,
"Log sequence number " LSN_PF "\n"
"Log flushed up to " LSN_PF "\n"
"Pages flushed up to " LSN_PF "\n"
"Last checkpoint at " LSN_PF "\n",
log_sys->lsn,
log_sys->flushed_to_disk_lsn,
log_buf_pool_get_oldest_modification(),
log_sys->last_checkpoint_lsn);
由上述代码结合log_sys的数据结构注释可大概猜测到
Log sequence number表示的是redo log buffer中的lsn,表示事务写到redo log buffer中的字节总量,我为假设为A;
Log flushed up to表示的是redo log file中的lsn,表示事务写入到redo log file中字节总量,假设为B;
Pages flushed up to表示的缓冲池最旧脏页的lsn,由函数log_buf_pool_get_oldest_modification获取,假设为C;
lsn信息还会记录到每个redo的物理页中,在每个页的头部有个fil_page_lsn的变量存放当前页的lsn,表示该页最后刷新时的lsn号;下图中的Last checkpoint at 指的就是最近一个物理页刷新到磁盘时,它的fil_page_lsn的变量值,假设为D
0 pending log writes, 0 pending chkp writes
8 log i/o's done, 0.18 log i/o's/second
这里的时间间隔计算方式:上一次执行show engine innodb status到本次执行时所花的时间。
current_time = time(NULL);
time_elapsed = difftime(current_time,
log_sys->last_printout_time);
数值的显示方法:
fprintf(file,
"%lu pending log writes, %lu pending chkp writes\n"
"%lu log i/o's done, %.2f log i/o's/second\n",
(ulong) log_sys->n_pending_writes,
(ulong) log_sys->n_pending_checkpoint_writes,
(ulong) log_sys->n_log_ios,
((double)(log_sys->n_log_ios - log_sys->n_log_ios_old)
/ time_elapsed));
log_sys->n_log_ios_old = log_sys->n_log_ios;
log_sys->last_printout_time = current_time;
这里的log_sys是个全局变量,它的数据类型就是redo log buffer,涉及到这里显示部分,它的部分成员变量如下
n_pending_writes:当前正在异步写入当前redo log file组的数量
n_pending_checkpoint_writes:当前正在异步写入检查点值的数量
n_log_ios:db启动以来,redo log产生的IO次数
n_log_ios_old:db启动以来,直到上次执行show engine时的redo log产生的IO次数
大部分数值显示都是取自于log_sys全局变量的成员值(太复杂了,不会)
log_buf_pool_get_oldest_modification()实际调用了buf_pool_get_oldest_modification(void),大概的计算方式应该是轮询一次每个缓冲池的innodb_buffer_pool_instances所有instances,找出每个instance中最旧的脏页的lsn,返回所有中最小的lsn值,这个值也就是缓冲池中最旧的lsn
for (i = 0; i < srv_buf_pool_instances; i++) {
buf_pool_t* buf_pool;
buf_pool = buf_pool_from_array(i);
buf_flush_list_mutex_enter(buf_pool);
bpage = UT_LIST_GET_LAST(buf_pool->flush_list);
if (bpage != NULL) {
ut_ad(bpage->in_flush_list);
lsn = bpage->oldest_modification;
}
buf_flush_list_mutex_exit(buf_pool);
if (!oldest_lsn || oldest_lsn > lsn) {
oldest_lsn = lsn;
}
}
return(oldest_lsn);
相关文章推荐
- show engine innodb status 详解
- [MySQL FAQ]系列 -- show engine innodb status显示信息不全?
- show engine innodb status 详解
- MySQL show engine innodb status 信息汇总
- 结合源码分析show engine innodb status输出内容(一)
- show engine innodb status\G
- mysql-5.7 show engine innodb status 详解
- show engine innodb status解读
- show engine innodb status 详解
- show engine innodb status分析
- show engine innodb status显示信息不全如何解决
- show engine innodb status\G
- show engine innodb status解读
- mysql之show engine innodb status解读(转)
- show engine innodb status发现deadlock
- show engine innodb status 详解
- show engine innodb status 解读
- mysql之show engine innodb status解读
- SHOWENGINE INNODB STATUS详细介绍
- show engine innodb status显示信息不全?