Mysql有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同。因此mysql提供两组命令,分别查看系统设置和运行状态。

1、系统设置:

SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] 

SHOW VARIABLES shows the values of MySQL system variables.


2、运行状态:

SHOW [GLOBAL | SESSION] STATUS [like_or_where] 

SHOW STATUS provides server status information.



备注:SHOW XXX 可能会显示很多内容,类似Linux下内容太多了,往往需要grep来过滤,那么mysql也考虑到了这点,使用LIKE字句可以过滤。


以“二进制日志缓冲大小”系统参数:binlog_cache_size为例,说说如何综合使用上面两个命令。

我们知道InnoDB存储引擎是支持事务的,实现事务需要依赖于日志技术,为了性能,日志编码采用二进制格式。那么,我们如何记日志呢?有日志的时候,就直接写磁盘?可是磁盘的效率是很低的,如果你用过Nginx,一般Nginx输出access log都是要缓冲输出的。因此,记录二进制日志的时候,我们是否也需要考虑Cache呢?答案是肯定的,但是Cache不是直接持久化,于是面临安全性的问题——因为系统宕机时,Cache中可能有残余的数据没来得及写入磁盘。因此,Cache要权衡,要恰到好处:既减少磁盘I/O,满足性能要求;又保证Cache无残留,及时持久化,满足安全要求。

参数:binlog_cache_size 就是满足以上两点的:一个事务,在没有提交(uncommitted)的时候,产生的日志,记录到Cache中;等到事务提交(committed)需要提交的时候,则把日志持久化到磁盘。

接着,binlog_cache_size设置多大呢?答案是:也需要权衡!
设置太大的话,会比较消耗内存资源(Cache本质就是内存),更加需要注意的是:binlog_cache是不是全局的,是按SESSION为单位独享分配的,也就是说当一个线程开始一个事务的时候,Mysql就会为这个SESSION分配一个binlog_cache (备注:我想之所以以SESSION为单位分配binlog_cache是有道理的,因为不同的mysql请求,产生的binlog数量不一样的,批量插入数据必然产生大量的binlog,而简单注册一个用户,产生的binlog有限,那么JDBC连接上能否设置binlog_cache_size呢?)。
设置太小的话,如果用户提交一个“长事务(long_transaction)”,比如:批量导入数据。那么该事务必然会产生很多binlog,这样cache可能不够用(默认binlog_cache_size是32K),不够用的时候mysql会把uncommitted的部分写入临时文件(临时文件cache的效率必然没有内存cache高),等到committed的时候才会写入正式的持久化日志文件。

怎么判断我们当前的binlog_cache_size设置的没问题呢?
查看生产服务器binlog_cache_size大小设置:64M,系统默认才32K

mysql> show session variables like 'binlog_cache%'; 

+-------------------+----------+ 

| Variable_name | Value | 

+-------------------+----------+ 

| binlog_cache_size | 67108864 | 

+-------------------+----------+ 

1 row in set (0.00 sec) 


mysql> show global variables like 'binlog_cache%'; 

+-------------------+----------+ 

| Variable_name | Value | 

+-------------------+----------+ 

| binlog_cache_size | 67108864 | 

+-------------------+----------+ 

1 row in set (0.00 sec)



我们看看配置文件:

[@hostname ~]# grep 'binlog' /data/mydata/my3306/my3306.cnf 

binlog_cache_size = 64M (管理员配置的的确是64M) 

binlog_format = mixed 

max_binlog_cache_size = 128M 

max_binlog_size = 200M 

sync_binlog = 0 

[@hostname ~]#


我们看看配置64M是否够用?查看下运行情况:

mysql> show status like 'binlog_%'; 

+-----------------------+-----------+ 

| Variable_name | Value | 

+-----------------------+-----------+ 

| Binlog_cache_disk_use | 0 | 

| Binlog_cache_use | 120402264 | 

+-----------------------+-----------+ 

2 rows in set (0.00 sec)


运行情况Binlog_cache_use 表示binlog_cache内存方式被用上了多少次,Binlog_cache_disk_use表示binlog_cache临时文件方式被用上了多少次。Binlog_cache_disk_use现在等于0,表示内存cache是够用的,从来不需要使用到临时文件。如果没有long_transaction的话,我觉得64M是偏大的。