91:MySQL 对死锁的处理方式。
超时:当事务发生死锁等待时,当其中一个事务等待时间超过设置的阈值时,事务会进行回滚,其他等待的事务就可以继续执行。参数innodb_lock_wait_timeout用来设置超时的时间。
wait-for graph(等待图):通过将锁的信息链和事务等待链构造出一张图,在图中如果出现回路就代表发生了死锁现象,wait-for graph会主动检测是否存在回路,若存在,会将undo量最小的事务进行回滚,采用深度优先的算法实现。
例:当节点1需要等待节点2的资源时,就生成一条有向边指向节点2,最后形成一个有向图。我们只要检测这个有向图是否出现环路即可,出现环路就是死锁!这就是wait-for graph算法。

92:MySQL 处理死锁的时候,回滚依据是什么。
超时处理时,回滚的依据是超时时间,先超过超时阈值的事务会进行回滚。
wait-for graph处理时,回滚的依据是undo数据量,会优先回滚数据量最小的事务。
93:如何避免死锁,业务逻辑需要改变,减少长事务。
事务发生死锁概率的相关因素:
系统中事务的数量,数量越多发生死锁概率越大;
每个事务操作的数量,数量越多发生死锁概率越大;
数据的量级,数据量越小死锁发生概率越大;
如何避免:
细化业务逻辑,缩短事务的逻辑操作处理;
减少长事务,大事务;
以固定的顺序访问表和行;
降低隔离级别,主要是减少gap锁使用;
为表添加合理的索引,不走索引会锁全表,增大死锁概率;
94:MySQL 性能监控参数值,列举一下。
可以利用show global status建立性能监控参数值的表格。
操作系统层面监控 iostat、sar、vmstat、mpstat、top、free、pidstat、/proc
操作系统错误日志监控/var/log/message
MySQL 错误日志监控、慢日志监控
show engine innodb status;show global status;show processlist 综合监控几十个参数
重点监控读写相关状态、负载相关状态、TPS、QPS 相关状态、排序相关状态、binlog相关状态、redo 相关状态、undo 相关状态、慢查询相关状态、全表扫描相关状态等等
趋势化展现状态,观察波动和变化趋势
慢 SQL 处理下钻,表统计、索引信息及列统计、SQL结构分析、执行计划分析、执行统计分析
95:完整描述一下如下流程,从安装——参数调整——性能监控——参数后期调整——监控预期效果——继续调整——不断调整和监控。
要求: SQL 速度足够快;
业务吞吐量足够高:TPS、QPS;
系统负载可控、合理:CPU、IO 负载;
安装:
硬件的选型
a) cpu
b) 内寸
c) 存储:本地盘+raid卡或pcie闪卡
d) raid级别
文件系统选型,文件系统mount选型,IO调度策略
硬件层面参数调整,例如numa、高性能模式、raid卡auto learning调整
os层面参数,例如swappiness、nofile、nproc、一些网络参数、hugepage等
mysql版本选择,5.6、5.7
架构设计:主从、MMM、MHA;NOSQL作为cache层
mysql参数设置
a) 连接相关的参数
b) 用户连接线程内存相关的参数
c) 日志相关的参数,包括redo log、binlog、slow log、errlog、
d) innodb buffer pool相关的参数
e) undo相关的参数
f) 读写线程相关的参数
g) 事务相关的参数
h) 主从相关的参数
i) 并发相关的参数
j) 5.7新特性相关的参数
不断压力测试,进行各个参数的最优值的调整:fileio、tpcc等
参数调整:
参数优化最佳实践原则:充分利用cpu、内存资源,减少io
注意监控,确定系统负载以及资源闲置情况:vmstat、free、mpstat
1. myisam参数基本上不需要调整
2. innodb buffer pool相关参数、包括instance参数
3. 用户线程相关参数
4. change buffer
5. double write
6. redo binlog
7. 写相关参数
8. redo logfile
9. unod
10. 并发
11. 读相关参数
性能监控:
使用zabbix动态展现趋势图
os层面状态监控
a) iostat
b) vmstat
c) sar
d) mpstat
e) free
mysql层面相关状态值的监控
a) 锁等待
b) mutex、latch
c) read、writes
d) 死锁监控
e) redo监控
f) tps、qps
g) 脏页
h) 连接
i) 排序
j) binlog
k) 负载相关监控
l) 慢查询
mysql errlog
/var/log/message
慢查询日志
安全相关日志
后期调整和优化:
1. 通过慢查询或者proxy找到问题SQL
2. 对SQL进行优化
3. 查看执行计划发现问题
4. 参考资料:索引、表、选择性
5. 审核SQL
6. 审核索引
7. 表设计
8. 架构设计
9. 进行analyze table
96:安装一个 MySQL、根据经验进行参数调整、压力测试、性能监控(zabbix)、找到达不到预期的参数或者异常参数,调整参数,继续监控,完成完成这么一个流程。
最基本的要将 TPS、QPS 不断提高,提高到极致。
可以通过95的步骤进行实践操作。
个人操作过程:
# 1.环境
iptables -F 关闭防火墙
setenforce 0
/etc/sysconfig/network-scripts/if cfg-eth0 配置IP 重启服务
mv /etc/yum.repo /bak
mkdir /yum
vim yum.repo
` [yum]`
`name=yum`
`baseurl=file:///yum`
`gpgcheck=0`
`enabled=1`
mount /dev/cdrom /yum
# 2.安装
## cmake
yum install gcc gcc-c++ ncurses-devel
tar xf cmake-2.8.3.tar.gz
cd cmake-2.8.3
./configure ;make;make install
## mysql
#### 编译
tar xf mysql-5.6.26.tar.gz
cmake .;make ;make install
useradd -r mysql
chown -R mysql:mysql /usr/local/mysql
./scripts/mysql_install_db --datadir=./data/
chown -R mysql:mysql ./data/
cp support-files/my-default.cnf /etc/mysla.cnf
vim /etc/mysla.cnf
`[mysqld]`
` basedir = /usr/local/mysql`
` datadir = /usr/local/mysql/data`
`port = 3307`
`server_id = 2`
`socket = /usr/local/mysql/data/mysql.sock`
`pid-file=/usr/local/mysql/data/mysql.pid`
PATH=$PATH:/usr/local/mysql/bin
vim /root/.bash_profile
` #.bash_profile`
`#Get the aliases and functions`
`if [ -f ~/.bashrc ]; then`
` . ~/.bashrc`
`fi`
`#User specific environment and startup programs`
`PATH=$PATH:$HOME/bin:/usr/local/mysql/bin`
`export PATH`
cp /usr/local/mysql/support-files/mysql.server /etc/init.d
chkconfig --add mysql.server
mysqld_safe --defaults-file=/etc/mysla.cnf &
netstat -tnulp|grep 330
#### rpm
tar xf mysql
yum localinstall mysql
vim /etc/my.cnf
(basedir datadir sever_id port)
(skip-grant-tables)
mkdir /usr/local/mysql/data -p
mysql_install_db --defaults=/etc/my.cnf --datadir --basedir
chown -R mysql:mysql /usr/local/mysql
mysqld_safe --defaults=/etc/my.cnf &
mysql -uroot -S /usr/local/mysql/data/mysql.sock
flush privileges
set password
quit
vim /etc/my.cnf 重启服务
## TPCC
* `cd scr ; make`
* `mysqladmin create tpcc1000`
* `mysql tpcc1000 < create_table.sql`
* `mysql tpcc1000 < add_fkey_idx.sql`
* `tpcc_load -h127.0.0.1 -d tpcc1000 -u root -p "" -w 1000`
* `tpcc_start -h127.0.0.1 -P3306 -dtpcc1000 -uroot -w1000 -c32 -r10 -l10800`
## xtrabackup(开启binlog)
`yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bison libtool ncurses-devel libgcrypt-devel libev-devel libcurl-devel vim-common`
`rpm -ivh libev4-4.15-7.1.x86_64.rpm`
`rpm -ivh libev-devel-4.15-21.1.x86_64.rpm`
`cmake -DBUILD_CONFIG=xtrabackup_release -DWITH_MAN_PAGES=OFF && make -j4`
`make install`
PATH=$PATH:/usr/local/xtrabackup/bin
mkdir /backup/
chown -R mysql:mysql /backup
`# innobackupex --user=root --password=rootroot --no-timestamp /backup`
`# innobackupex --apply-log /backup/`
innobackupex --move-back /backup/
或者
innobackupex --move-back /backup/
主库上建立复制用户:
create user 'repl'@'192.168.56.221' IDENTIFIED BY 'rootroot';
`# cat xtrabackup_info`
建立主备库关系
mysqld_safe --defaults-file=/etc/my.cnf --skip-slave-start &
mysql>
change master to
master_host='192.168.56.219',
master_port=3306,
master_user='root',
master_password='rootroot',
master_log_file='mysqlserver.000019',
master_log_pos=120;
启动从库
start slave;
查看备库状态
Last_IO_Error,这个需要为空
show slave status \G
使用show slave status \G和show master status \G,跟踪主库和从库的同步状态
## 参数调优
[mysqld]
log_bin =mysqlserver
log_error=error.log
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 1
socket = /usr/local/mysql/data/mysql.sock
pid-file = /usr/local/mysql/data/mysql.pid
log_slave_updates=1
slow_query_log = 1
long_query_time = 2
innodb_io_capacity = 100
innodb_io_capacity_max=500
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_buffer_pool_size = 1000M
innodb_purge_threads = 4
innodb_max_dirty_pages_pct=90
innodb_log_file_size = 1000M
innodb_log_files_in_group = 5
innodb_flush_neighbors = 0
innodb_lru_scan_depth = 512
innodb_doublewrite=off
sync_binlog=0
innodb_flush_log_at_trx_commit=2
97:描述一下 MySQL 体系结构,内存、线程、磁盘文件、各级缓存、同时将对应变量、参数以及状态参数列举出来。
MySQL体系结构:

MySQL主要分为以下几个组件:
连接池组件
管理服务和工具组件
SQL接口组件
分析器组件
优化器组件
缓冲组件
插件式存储引擎
物理文件
对应的变量参数状态值前面都已经提到过了,这里就不再进行赘述。
98:MySQL 内存分配原则,如何判断内存分配是否过量、是否剩余。
参数:innodb_buffer_pool_size;默认128M,这个参数是非动态的,要修改这个值,需要重启mysqld服务;
作用:这个参数主要作用是MySQL数据库的缓冲池,缓存innodb表的索引,数据等;
专用MySQL服务器设置的大小为 操作系统内存的70%-80%最佳。
该值并不是设置的越大越好。设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而降低SQL查询的效率。
判断方法(利用free命令):
free的剩余空闲空间
swap的使用情况
99:innodb 表以及索引和 myisam 表和索引的缓存情况。
Innodb存储引擎中表和索引允许缓存到innodb _buffer_pool中,不需要系统缓存;
Myisam存储引擎中只有索引会被缓存,表不会被缓存,对于表的访问一定会产生物理读,需要依赖文件缓存;
100:mysql 参数调整依据,对于每一个参数的调整,都需要从两个层面去分析。
硬件配置层面:根据当前服务器主机的CPU、内存和硬盘等等的选型情况去调整参数的最佳推荐值。
实际执行层面:根据我们进行数据库压测的结果,在保障性能提高效率的基础下,按照需求进行二次调整。




