1、数据库高负载的排查和解决办法。检查操作系统查看整体负载,使用命令w或者sar -q 1
判断瓶颈在哪个子系统,使用命令w
判断磁盘IO是否较大,使用命令:sar -d 1
判断具体哪个进程消耗的磁盘IO最多,使用命令:iotop检查MySQL层查看当前的MySQL查询语句,使用命令:mysqladmin pr|grep -v Sleep
分析slow log
分析慢查询语句
2、简要说明一下double write的工作机制。
用系统表空间的一块连续磁盘空间(100个连续数据页,大小为2MB)作为doublewrite buffer,当进行脏页刷新时,首先将脏页的副本写到系统表空间的doublewrite buffer 中,之后通过doublewrite buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后调用fsync()刷新操作系统IO缓存,最后innodb后台IO线程将脏页刷新到磁盘数据文件。因为doublewrite 页是连续的,因此这个过程是顺序写的,开销并不是很大。
3、半同步复制与异步复制的区别,在5.7做了哪些增强?异步复制:主库执行完commit提交操作后,在主库写入binlog日志后即可成功返回客户端,无需等待binlog日志传送给从库。
MySQL5.7之前的半同步复制:主库在每次事物成功提交时,并不及时反馈给前端应用用户,而是等待其中一个从库也接收到binlog事务并成功写入中继日志后(不等待从库应用这部分日志),主库才返回commit操作成功给客户端。
MySQL5.7半同步复制增强:主库将事务写入binlog,传递到从库并写入从库的relay log,主库等待从库反馈接受到relay log的ack之后,再提交事务并且返回commit ok结果给客户端。
4、简单说一下 MySQL5.7有哪些新特性。从MySQL 5.7开始,root用户的密码不再是空,而是随机产生一个密码
支持JSON
MySQL5.7.6支持使用 generated columns(p1875),这一列由其他列计算而得
sys schema
可以知道哪些语句使用了临时表,哪个用户请求了最多的io,哪个线程占用了最多的内存
索引利用率和冗余索引统计冗余索引
支持将临时表设置为innodb存储引擎
支持虚拟列
5、如何识别表中的重复索引?方法一
使用pt-duplicate-key-checker工具
使用方法:pt-duplicate-key-checker --user='root' --password='xxx' --databases=db_name--tables=idx_test --socket=/tmp/mysql.sock方法二
select * from sys.schema_redundant_indexes
6、MHA在线切换需要满足的条件1、所有slave的IO和SQL线程都在运行
2、所有Seconds_Behind_Master参数小于或者等于running_updates_limit秒。running_updates_limit默认为1
3、通过show processlist输出,没有一个更新花费的时间大于running_updates_limit秒
7、MySQL常见监控项。操作系统层面CPU
内存
IO
网卡MySQL层MySQL是否运行
连接数
qps
tps
慢查询数
打开表数
当前脏页数
锁情况
主从同步状态(包括Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master等)
8、MySQL备份策略。配置从库
每天一次全备,开启binlog,实时将主库binlog同步到远程服务器上。
务必进行恢复性测试
9、双一的意义。
innodb_flush_log_at_trx_commit=1
每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去
sync_binlog=1
MySQL 在每写 1次 binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去
保证了数据的安全性,
10、PXC执行SQL的原理。
节点接收sql请求后,在commit之前,有wsrep API调用galera库进行集群内广播,所有其它节点验证成功后事务在集群所有节点进行提交,反之roll back