有如下类型文件sql
查找参数文件命令数据库
mysql --help | grep my.cnf
查找参数值命令缓存
SELECT * FROM GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'innodb_buffer%'\G; # 推荐使用 SHOW VARIABLES LIKE 'innodb_buffer%'\G;
分为两类服务器
动态参数能够在MYSQL实例运行进行更改,静态参数则是不可更改的。更改动态参数的语法以下:session
SET | [global | session] system_var_name=expr | [@@global. | @@session. | @@] system_var_name = expr
global
:全局的,session
:当前会话。说明参数的做用域是不通的。一些demo架构
# 改变当前会话,不会改变全局 SET read_buffer_size = 524288 # 改变全局会话参数,不会改变当前 SET @@global.read_buffer_size = 1048576; # 查询当前会话参数 SELECT @@session.read_buffer_size\G; # 查询全局会话参数 SELECT @@global.read_buffer_size\G;
可是这种修改,并不最终修改配置文件my.cnf的参数值,因此从新启动后,参数仍是按照配置文件中的加载。并发
记录了全部的错误信息、警告信息。查找错误日志文件位置异步
SHOW VARIABLES LIKE 'log_error'\G;
记录查询慢的SQL,能够帮助优化。能够设置记录的阈值,而且打开开关socket
SHOW VARIABLES LIKE 'long_query_time'\G; SHOW VARIABLES LIKE 'long_slow_queries'\G;
还有一个参数,若是SQL语句没有使用索引,就会加入到慢查询日志文件(slow log)中。
SHOW VARIABLES LIKE 'log_queries_not_using_indeces'\G; # 设置每分钟容许记录到slow log的且未使用因此的SQL语句次数,缺省为0,表示没有限制。 SHOW VARIABLES LIKE 'log_throttle_queries_not_using_indexs'
可是若是数据量比较大的话,很差分析分件的话,可使用MYSQL提供的mysqldumpslow
命令
# 从指定文件读取日志 mysqldumpslow nh122-190-slow.log # 获得执行时间最长的10条SQL语句 mysqldumpslow -s al -n 10 david.log
还能够通过配置,在slow_log中查询慢日志
# 慢日志表名 SHOW CREATE TABLE mysql.show_log\G; # 默认慢查询输出格式是FILE,则能够设为TABLE SHOW VARIABLES LIKE 'log_output'\G; SET GLOBAL log_output='TABLE'; SHOW VARIABLES LIKE 'log_output'\G; # 查询慢日志 SELECT * FROM mysql.slow_log\G;
可是slow_log默认是用的CSV引擎,可以使用MyISAM引擎,提高查询效率(大数据量)
ALTER TABLE mysql.slow_log ENGINE=MyISM; SET GLOBAL slow_query_log=off; ALTER TABLE mysql.slow_log ENGINE=MyISM;
经过额外的参数记录相关信息到慢日志表中
经过参数long_query_io
将超过指定逻辑IO次数的SQL语句记录到slow log
中。默认值是100.
经过参数slow_query_type
表示启动slow log的方式
slow log
slow log
slow log
slow log
记录了全部对MYSQL数据库请求的信息,名字通常为主机名.log
记录了对MYSQL数据库执行更改的全部操做。只要操做使得数据库发生变化,就会写入二进制日志。但操做若果未致使数据库发生变化,也有可能写入二进制日志。例如
UPDATE t SET a = 1 WHERE a = 2;
SHOW MASTER STATUS\G; show binlog events in 'mysqld.000008'\G;
二进制日志主要做用
经过配置惨呼log-bin=[name]能够启动二进制日志。若是不指定name,则默认二进制日志文件名为主机名,后缀名为二进制日志的序列号。
# 查询二进制日志路径 show variablers like 'datadir'; # MYSQL调用LL system ls -lh /user/local/mysql/data/;
bin_log.index
为二进制的索引文件,用来存储过往产生的二进制日志序号。
如下配置文件的参数影响着二进制日志记录的信息和行为。
max_binlog_size
:
指定单个二进制日志文件的最大值。默认为1G
binlog_cache_size
:
当使用事务的表存储引擎(INNODB)时,全部未提交的二进制日志会被记录到一个缓存中去,等待事务提交时直接将缓冲中的二进制日志写入二进制日志文件,而缓冲的大小由binlog_cache_size
决定,默认大小为32K。
值过大,浪费空间;值过小,会把缓冲中的日志写入到一个临时文件中。
# 查询设置的缓存大小 SHOW VARIABLES LIKE 'binlog_cache_size'; # 查看缓冲池状态 SHOW GLOBAL STATUS LIKE 'binlong_cache%';
sync_binlog
:
默认状况下,二进制日志是使用缓冲写的方式,可是数据库宕机时,有可能缺乏一部分数据,给恢复和复制带来问题,因此使用参数sync_binlog=[N]
表示每写缓冲多少次就同步到磁盘。若是N改为1的话,就是同步写磁盘来写二进制日志。可用性和IO性能须要进行取舍。
且当sync_binlog=1
时,假设有事务还没commit,也会将二进制日志当即写入磁盘,可是若是发生宕机,二进制日志已经记录了该事务信息,不能回滚。这个问题能够经过将参数innodb_support_xa
为1来解决。
binlog-do-db
:
表示须要写入哪些库的日志
binlog-ignore-db
:
表示须要忽略写入哪些库的日志
log-slave-update
:
若是须要搭建master->slave->slave架构的复制,须要设置log-slave-update
参数。
binlog_format
:
很是重要,影响记录二进制日志的格式。
STATEMENT:记录的是日志的逻辑SQL语句。
这个对于复制是有必定要求的,若是再主服务器运行rand、uuid等函数,又或者使用触发器等操做,这些均可能会致使主从服务器上表中数据的不一致(not sync)。
另外一个影响是:致使INNODB使用的默认事务隔离级别是REPEATABLE READ
,若是使用READ COMMITTED
的事务隔离界别,会出现相似丢失更新的现象,致使主从数据库上的数据不一致。
ROW:记录表的行更改状况
相似于Oracle的物理Standby,修复了Statement格式下的复制问题,也能够设置INNODB的事务隔离基本为READ COMMITTED
,以获取更好的并发性。
MIXED:默认采用STATEMENT格式进行二进制日志文件的记录,可是在一些状况下会使用ROW格式。
表的存储引擎为NDB
使用了UUID()、USER()、CURRENT_USER()等不肯定函数。
使用了INSERT DELAY语句
使用了用户定义函数(UDF)
使用了临时表(temporary table)
查看二进制日志文件,只能使用MYSQL提供的工具mysqlbinlog
# 查看STATEMENT格式 mysqlbinlog --start-position=203 test.00004 # 查看ROW格式 mysqlbinlog -vv --start-position=203 test.00004
UNIX本地链接MYSQL能够采用UNIX域套接字方式,这种方式须要个套接字文件
MYSQL实例启动时,会将本身的进程ID写入一个文件中——该文件即为pid文件。文件名由参数pid_file控制。
MYSQL数据的存储是根据表进行的,每一个表都会有与之对应的文件。但不论表采用何种存储引擎,MYSQL都有一个以frm为后缀名的文件,这个文件记录了该表的表结构定义。
也能够用来存放视图的定义。frm文件能够直接查看。
innoDB将存储的数据按表空间进行存放。在默认配置下会有一个ibdatal
文件,该文件就是默认的表空间文件。能够经过参数innodb_data_file_path
对其进行设置
innodb_data_file_path=datafile_spec1[;datafile_spec2]... #demo #文件大小都设置为2000MB,其次ibdata2文件使用完2000M以后能够自动增加。 [mysqld] innodb_data_file_path = /db/ibdatal:2000M;/dr2/db/ibdata2:2000M:autoextend
使用两个文件组成表空间,若两个文件位于不一样的磁盘,能够平均磁盘负载,提升数据的总体性能。设置以后全部数据都会存入共享表空间。若是设置参数innodb_filw_per_table
就会给每一个表一个独立的存储空间。
SHOW VARIABLES LIKE 'innodb_file_per_table'\G;
注意,即便开启了上述参数,独立的表空间也只存储对应表的数据、索引和插入缓冲BITMAP等信息。其余信息仍是放在默认的表空间中。
默认状况下,INNODB存储引擎的数据目录下会有两个名为ib_logfile0
和ib_logfile1
的文件。称为重作日志文件,在恢复时相当重要。
每一个INNODB存储引擎至少有一个重作日志文件组,每一个文件组下至少有2个重作日志文件。为了更高的可靠性,用户能够设置多个的镜像日志组,将不一样的文件组放在不一样的磁盘上,提升重作日志的可用性。
在日志组中每一个重作日志文件的大小一致,并以循环写入的方式运行。
下列参数严重影响重作日志文件的属性。
innodb_log_file_size
指定每一个重作日志文件的大小。
设置的过大,在恢复时可能须要不少的时间。设置的太小,一个事务须要屡次切换重作日志文件。还可能致使频繁的async checkpoint
innodb_log_files_in_group
指定日志文件组中重作文件的数量。
innodb_mirrored_log_grooups
指定日志镜像文件组的数量,默认为1.
innodb_log_group_home_dir
指定日志文件组所在路径。默认为./
,表示在数据库的数据目录下
SHOW VARIABLES LIKE 'innodb%log%'\G;
事务日志和二进制日志的区别:
INNODB存储引擎中,对于各类不一样的操做有着不一样的重作日志格式,可是基本格式相同。
1 | 2 | 3 | 4 |
---|---|---|---|
reg_log_type | space | page_no | redo_log_body |
由四个部分组成:
redo_log_type
占用1字节,表示重作日志的类型。space
表示表空间的ID,但采用压缩的方式,所以占用的空间可能小于4字节。page_on
表示页的偏移量,一样采用压缩的方式redo_log_body
表示每一个重作日志的数据部分,恢复时须要调用响应的函数进行解析。 从重作日志缓冲往磁盘写入时,是按512字节(一个扇区)的大小进行写入。因此保障写入一定成功。不须要有doublewrite
。
触发缓冲写入重作日志的条件:
innodb_flush_log_at_trx_commit
控制,表示在commit操做时,处理重作日志的方式
因此,为了保障ACID中的持久性,通常就把这个参数设置为1。