21:简单解释一下 sharp checkpoint ,fuzzy checkpoint 同时解释一下 fuzzy checkpoint的工作过程,重点。
Checkpoint(检查点)的作用:
1.减少数据库恢复时间
2.缓冲池内存不够时,刷新脏页到磁盘
3.重做日志不可用时,刷新脏页
Sharp checkpoint:数据库关闭时会将所有的脏页都刷新回磁盘,由innodb_fast_shutdown参数控制,默认为1。
Fuzzy checkpoint:在数据库运行时采用,只刷新一部分脏页,并不是全部刷新。
概括一下fuzzycheckpoint的几种情况及其工作过程:
Maser thread checkpoint
Master thread实现的checkpoint就是指其本身的工作,它会以每秒和每十秒的速度刷新缓冲池中一部分的脏页,具体的数量要看Master thread的状态和参数的设置,这个过程是异步的。
FLUSH_LRU_LIST checkpoint
从名字就可以看出这个刷新时根据LRU列表得来的,我们在进行DML操作时,要保证缓冲池中有可用的页,假设Free列表中没有可用的页,我们就得移除LRU尾端的页,如果这些页里含有脏页,那么就需要进行checkpoint。
Async/Sync Flush checkpoint
这个是指重做日志不够用的情况,刷新的是脏页列表上的页。当已经记录到重做日志中单还没有刷新到磁盘的页过多的时候,就会导致重做日志写满且不可用的情况。它会定义一个比较规则,设定两个阈值,阈值的设定为重做日志大小的75%和90%,一旦大于这两个值,就会触发Async和Sync操作,使得从Flush列表中刷新足够多的页,使重做日志的大小小于第一个阈值。
Dirty Page too much Checkpoint
这种情况从名字就很容易理解,就是缓冲池中脏页的数量过多,导致innodb引擎进行强制的checkpoint,它和FLUSH_LRU_LIST checkpoint一样都是为了缓冲池中有足够可用的页。这个阈值由innodb_max_dirty_pages_pct控制,默认为75,表示缓冲池中脏页的数量占据了75%时会进行checkpoint。
22:通过 show engine innodb status 解释一下日志相关的四行数据含义,同时对下面四个需求做成解决方案
1. 我们的日志生成速度?
2. 日志的写入速度?
3. 脏页的写入速度
4. 数据库启动时间是多少?
1.生成的速率可以看Log equence number增长的速率
2.日志的写入速度可以看Log flushed up增长的速度
3.脏页的写入速度可以看Pages checkpoint增长的速度
4.数据库启动的时间可以通过最新LSN和LAST LSN做对比除以生成速度
23:详细解释触发写入操作的四种情况,也就是四种检查点的触发因素
如何对每一种写入操作进行控制,避免某些写入动作的发生,特别是阻塞用户
线程的写入操作。
最新的LSN由数据库的具体操作触发,具体表现为数据库的写入量
日志的写入由redo的刷新机制和master thread触发
脏页的刷新由checkpoint触发控制
最后的LSN记录由IO线程控制
24:调整系统关闭的参数,说明每一个参数的意义。
Innodb_fast_shutdown 在关闭时,该参数影响着innodb存储引擎的行为,该参数可取值为0、1、2,默认为1。
0表示在MySQL数据库关闭时,它需要完成所有的fullpurge和merge insertbuffer,并且将所有的脏页刷新回磁盘,如果innodb在升级时,必须调整成0。
1表示不需要完成上述的fill purge 和merge insert buffer操作,但是在缓冲池中还是会有部分数据脏页刷新回磁盘。
2表示不完成full purge和 merge insert buffer操作,也不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事务的丢失,但是下次MySQL启动时,会进行恢复操作。
25:调整系统启动恢复的参数,说明每一个参数的意义。
Innodb_force_recovery 参数控制着innodb存储引擎的恢复状况,该参数可取值为0~6,默认为0,但是除0之后的时候不允许数据库执行DML操作。
0:进行所有的恢复操作;
1(SRV _FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页;
2.(SRV FORCE_ NO_ BACKGROUND):阻止Master Thread线程的运行,如Master Thread线程需要进行 full purge操作,而这会导致crash(宕机);
3 (SRV _FORCE_NO_TRX_UNDO):不进行事务的回滚操作;
4(SRV FORCE_ NO_ IBUF MERGE):不进行插入缓冲的合并操作;
5(SRV FORCE_ NO_ UNDO_ LOG_ SCAN):不查看撤销日志(undo log),innodb存储引擎会将未提交的事务视为已提交;
6 SRV FORCE_NO_LOG_REDO:不进行前滚的操作。
26:如果系统因为执行了一个非常大的 dml,ddl 操作,我们想断掉这个操作,怎么办,要求速度快一点;
1. kill thread 需要 rollback 时间可能很长;
2. kill process 重新启动服务,只需要前滚时间短;
27:如何确认系统写入操作是大了还是小了(多个角度)如何调整,调整后如何确认是否合适。
通过iostat命令查询系统IO状态
查看IO线程工作状态,调整IO线程数量
通过double write 写入页数和次数比值得出写入压力
日志生成速度、日志写入速度、脏页刷新速度已经三者之间的差值比较
脏页所占缓冲池中的比例
通过实际情况调整innodb_io_capacity
调整innodb_lru_scan_depth LRU列表可用空间
可进行压力测试
28:如何对数据库进行性能监控,列举常见的一些监控参数的查找方式
Show global status; 查看全局变量
Show engine innodb status; 查看innodb情况
Show full processlist;
show status like ‘%%’;
show variables like ‘%%’;
29:使用 tpcc 进行压力测试.
1.下载安装包;
2.cd scr ; make;
3.mysqladmin create tpcc1000;#建库
4.mysql tpcc1000 < create_table.sql;#建表
5.mysql tpcc1000 < add_fkey_idx.sql;#建索引
6.tpcc_load -h127.0.0.1 -d tpcc1000 -u root-p "" -w 1000; #导数据
7.tpcc_start -h127.0.0.1 -P3306 -dtpcc1000-uroot -w1000 -c32 -r10 -l10800;压力测试(-h 主机;P 端口;d 数据库;u 账号;p 密码;w 仓库数;c 并发线程数;r 数据库预热时长;l 压测时长;f 输出报告日志文件)
30:描述一下压力测试都包括哪些方法和工具;
mysqlslap:MySQL官方提供的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况。
super-smack:支持MySQL和PostgreSQL,可以测试连接数及时间、查询数量及时间和处理的请求数等相关值。
tpcc:用来测试典型的复杂OLTP系统的性能,其虚拟实现了一家仓库销售供应公司进行数据库测试。
sysbench:这是一个模块化、跨平台的多线程测试工具,支持测试CPU性能,磁盘IO性能、数据库OLTP等相关测试。