第二部分:从入门到精通 | MySQL知识整理(中)
三、基本配置
配置选项
在生成RPM包时指定的选项;
在源码安装时指定的选项;
可以在启动服务器(mysqld)时在命令行上指定启动选项;
默认情况下,服务器在运行时使用其配置变量的预编译值;但是,如果默认值不适合环境,则可添加运行时选项,让服务器使用其他值来执行以下操作:
指定重要的目录和文件的位置;
控制服务器写入的日志文件;
覆盖服务器与性能相关的变量的内置值(即,控制最大同时连接数以及缓冲区和高速缓存的大小);
在服务器启动时启用或禁用预编译的存储引擎通过使用命令行选项或选项文件,或者使用两者的组合,可以指定服务器启动时的运行时选项(以更改其配置和行为);
命令行选项优先于选项文件中的任何设置
使用选项文件的原因
选项文件组
编写选项文件
使用长选项格式(像命令行上使用的那样),但省略前导短划线;
如果某个选项取值,则允许在等号两则加空格( = );此规则不适用于在命令行上指定的选项,eg:指定默认选项文件;
[client]:此组中的选项适用于所有标准客户机;
host:指定服务器主机名;
compress:指示客户机/服务器协议对通过网络发送的通信使用压缩;
[mysql]:此组中的选项仅适用于mysql客户机;
show-warnings:指示MySQL在每条语句后显示任何当前警告;
mysql客户机同时使用[client]和[mysql]组中的选项,因此将使用显示的全部三个选项;
选项文件位置
(1)./etc/my.cnf;
(2)./etc/mysql/my.cnf;
(3)./usr/local/mysql/etc/my.cnf;
(4).~/.my.cnf;
(5).如果设置了MYSQL_HOME环境变量,则将搜索$MYSQL_HOME/my.cnf文件;
(1).C:\目录下的my.ini和my.cnf;
(2).C:\Windows(或C:\WinNT)目录;
(3).C:\Program Files\MySQL\MySQL Server 目录;
选项文件中的启动选项
(1).general_log # 常规查询日志;
(2).log-bin # 二进制日志;
(3).slow_query_log # 慢速查询日志;
(1).max_connections=200 # 增加允许的最大连接数;
(2).innodb_buffer_pool_instances=4 # 增加InnoDB缓冲池数的默认值;
样例选项文件
对于RPM安装,样例选项文件在/usr/share/mysql中;
对于TAR文件安装,样例文件在MySQL安装目录下的share目录中;
(1).–defaults-file=:使用指定位置的选项文件;
(2).–defaults-extra-file=:使用指定位置的其他选项文件;
(3).–no-defaults:忽略所有选项文件;
显示选项文件中的选项
1.# my_print_defaults –defaults-file=/usr/local/mysql/my.cnf client mysql mysqld;
2.# mysql –print-defaults:貌似打印不出来;
遮蔽验证选项
登录路径
mysql_config_editor set –login-path=admin –host=localhost –user=root –password;
如果调用mysql_config_editor时不使用–login-path选项,则将使用[client]登录路径;默认情况下,所有标准客户机都使用此登录路径;
(1).查看生成的文件:ll ~/.mylogin.cnf;
(2).登录:mysql –login-path=admin;
mysql_config_editor print –login-path=admin;
mysql_config_editor print –all;
mysql_config_editor remove –login-path=admin;
服务器系统变量
mysqld –verbose –help;
mysqld –no-defaults –verbose –help;
SHOW GLOBAL VARIABLES;
动态系统变量
GLOBAL变量影响服务器的整体操作;
SESSION变量影响其对单个客户机连接的操作;
变量存在于任一作用域中,也可同时存在于两个作用域中;
(1).仅全局:key_buffer_size,query_cache_size;
(2).全局和会话:sort_buffer_size,max_join_size;
(3).仅会话:timestamp,error_count;
设置会话变量不需要任何特殊特权,但客户机只能更改自己的会话变量,不能更改其他任何客户机的会话变量;
LOCAL和@@local是SESSION和@@session的同义词;
如果不指定GLOBAL或SESSION,则当会话变量存在时,SET将更改会话变量;会话变量不存在时,将产生错误;
显示动态系统变量
(1).key_buffer_size;
(2).key_cache_block_size;
(3).key_cache_division_limit;
(4).key_cache_age_threshold;
instance_name.component_name;
http://dev.mysql.com/doc/refman/5.6/en/structured-system-variables.html。
服务器状态变量
SQL模式
设置SQL模式
使用SELECT语句检查当前的sql_mode设置:SELECT @@sql_mode;
查看系统变量:
SHOW VARIABLES LIKE ‘sql_mode’;
SET sql_mode = ANSI_QUOTES; SET sql_mode = ‘TRADITIONAL’;
SET sql_mode = ‘IGNORE_SPACE,ANSI_QUOTES,NO_ENGINE_SUBSTITUTION’;
常用SQL模式
1.STRICT_TRANS_TABLES,STRICT_ALL_TABLES:
没有这些模式,MySQL将接受缺少,超出范围或格式不正确的值;
启用 STRICT_TRANS_TABLES时将为事务表设置“严格模式”;
也可在默认的my.cnf文件中启用;启用STRICT_ALL_TABLES时将为所有表设置严格模式;
2.TRADITIONAL:
启用此SQL模式可对输入数据值施加类似于其他数据库服务器的限制;
在此模式下,使用GRANT语句可创建要求指定口令的用户;
3.IGNORE_SPACE:
默认情况下,必须调用函数名称与后接括号间没有空格的函数;
启用此模式后,允许存在此类空格,并使函数名称成为保留字;
4.ERROR_FOR_DIVISION_BY_ZERO:
默认情况下,除数为零时将产生结果NULL,
在启用此模式的情况下插入数据时,除数为零将导致出现警告,在严格模式下将出现错误;
(这个模式之后会被废弃掉)
5.ANSI:
使用此组合模式将使MySQL服务器变得更加“类似于ANSI”;
即,此模式支持的行为更像标准SQL,如ANSI_QUOTES和PIPES_AS_CONCAT;
6.NO_ENGINE_SUBSTITUTION:
如果在创建或更改表时指定了不可用的存储引擎,
除非启用了此模式,否则MySQL 将替换默认存储引擎;这是默认的SQL模式;
日志文件
记录MySQL启动,关闭和运行时产生的重大的错误的信息;
如果mysqld警告一个表需要自动的检查或者修复,也会记录一个错误日志;
可以使用–log-error=file_name选项来指定错误日志文件,如果没有指定,则系统默认在data目录下生产一个hostname.err的文件;也可以在配置文件中配置log_error变量;
主要是由mysqld_safe脚本可创建错误日志,并在启动服务器时将其输出重定向到该错误日志;
查询log_error的位置:
>show variables like ‘log_error’;
常规查询日志记录服务器运行期间收到的所有语句.
当客户端连接或者断开的时候服务器会记录信息到日志中,并记录所有从客户端接收到的sql语句,它对于在客户端中排错和查看是哪个客户端发送的命令很有帮助;
mysqld是按照接收到命令的方式记录语句的,这可能跟它们执行的顺序不同(这与二进制日志是有区别的,二进制日志是执行后记录)
使用–general_log=[0|OFF|1|ON]来控制是否打开常规查询日志和–general_log_file=file_name来指定生成的常规查询日志文件
(在mysql5.1.6中可以使用–log选项启动和使用–log-output选项指定日志输出的位置),
也可以输出到”Server Log Tables”表中;如果没有指定file_name,默认是在data目录下生产一个hostname.log文件;
服务器重新启动和log flush不会产生一个新的文件;
默认此功能关闭,通过show variables like ‘general_log%’来查看;
设置打开一般查询日志:set global general_log=1;set global general_log_file=file_name(两个变量会同时打开关闭,打开之后立即生效);
.可以在启动的时候指定–general-file选项或者在配置文件中指定general_log=1,general_file_log=/path;
一般不打开此日志功能,数据量太大,如果打开可以放到单独的磁盘中.
log_output变量值:
FILE:保存到文件中;
TABLE:保存到表中;SET GLOBAL log_output = ‘TABLE’;
清空日志表:TRUNCATE mysql.general_log;
备份切换一般日志文件:
先备份:>mv hostname.log hostname.log.bak
切换日志组:mysqladmin flush-logs;
调优时使用,记录超出指定时间的sql语句;
慢查询日志主要记录执行时间超过long_query_time变量指定时间的sql语句,这个时间不包括获得锁的时间,只包含执行时间,系统默认时间是1s(long_query_time=1.0000);
使用–slow-query-log=0|1选项和–slow_query_log_file=file_name选项指定(在mysql5.1.6版本可以指定mysqld的–long-slow-queries=file_name选项启动);
命令行参数:–log-slow-queries=file_name;指定慢查询日志文件
系统变量:
slow_query_log:开启慢查询功能,
set global slow_query_log = [0|OFF|1|ON];
slow_query_log_file:指定慢查询日志文件,系统默认是在data目录下的hostname-slow.log文件;
long_query_time:指定查询的最大时间,
set global long_query_time=n;
log_queries_not_using_indexes:不用索引的慢查询,默认是功能关闭的;
查看某个表是否有索引:> show index from t;
打开此功能:>set global log_queries_not_using_indexes =1;
查看变量:>show variables like ‘log_queries_not_using_indexes’;
log_output变量值:
①.FILE:保存到文件中;
②.TABLE:保存到表中;SET GLOBAL log_output = ‘TABLE’;
③.清空日志表:TRUNCATE mysql.slow_log;
分析慢日志文件的工具:mysqldumpslow,查看具体的帮助是用mysqldumpslow –help;
记录所有对数据库更新和潜在的更新语句(一个delete语句,但是没有影响的行),语句以事件(event)的方式存储,同时也包含了更新语句执行的时间信息;
它不记录那些不修改任何数据的语句,如果想要记录所有的语句,可以使用query log;
它主要的目的是在做还原操作时尽可能全的更新数据库,因为它包含在一次备份后的所有更新操作.它同样被用在master replication server中作为一个记录发送给slave servers;
打开二进制日志会损失1%的性能,但是它带来的好处远远超过这些;
(查看二进制日志是否打开,需要查看log_bin参数是否是ON:
>show variables like ‘log_bin’;
命令行参数
①.–log-bin=filename:记录二进制日志文件的位置,尽量指定路径名,如果不指定的话则保存在数据目录;
②.–log-bin-index=file:记录二进制日志文件索引的位置,保存了日志文件名;
③.–max_binlog_size:单个文件最大多少;
④.–binlog-do-db=db_name:哪个数据库使用,只有这个数据库使用;
⑤.–binlog-ignore-db=db_name:哪个数据库不使用,只有这个数据库不使用;
系统变量
①.log_bin:日志的位置;
②.binlog_cache_size:二进制日志缓存大小,是每一个连接进来的线程分配的大小,不是整个服务器的大小;
③.max_binlog_cache_size:最大缓存大小;
④.max_binlog_size:单个文件最大大小,超过此大小则再分配一个文件,但是一个事务必须在一个文件中,所以可能会稍大点;
⑤.binlog_cache_use:当前连接使用的binlog缓存的事务的数量,使用show status like ‘binlog_cache_use’查看(show status命令显示了所有连接到mysql服务器的状态值);
⑥.binlog_cache_disk_use:如果binlog_cache_use不够用,则在磁盘上缓存,应该尽量避免;
⑦.binlog_do_db:设置master-slave时使用;
⑧.binlog-ignore-db:设置哪个数据库不记录日志;
⑨.sync_binlog:缓存与硬盘的同步频率(commit多少下同步一次,0表示服务器自动控制);
⑩.binlog_format:二进制日志的格式;
查看当前二进制文件的名称和大小,show binary/master logs;
如果不指定二进制日志文件的位置,默认存放在data文件夹下,日志文件是:mysql-bin.xxxxxx,索引文件是mysql-bin.index;
如果要切换日志的话,执行flush logs命令;
初始化二进制日志系统,从新生成:reset master命令;
删除某个日志文件:
purge binary logs [before ‘datetime’ to ‘log_name’] 删除指定日期之前的和删除指定文件之前的日志文件;
设置日志文件的失效期:
参数为–expire_logs_days,set global expire_log_days=n,N天前的日志自动删除;
二进制日志的格式
①.查看格式:show [global] variables like ‘binlog_format’;
②.设置日志格式:set [global] binlog_format = statement|row|mixed;
③.查看binlog中的事件:show binlog events in ‘mysql-bin.000002’ from 0;
④.使用mysqlbinlog程序打开;
用于记录企业版基于策略的审计信息;审计日志是作为企业版插件提供的;
由–audit-log选项和audit_log_file选项来控制;
审计过程会不断写入审计日志,直到将该插件删除,或者通过audit_log_policy=NONE 选项设置关闭审计;
在服务器启动时使用audit_log=FORCE_PLUS_PERMANENT作为选项,可以防止删除该插件;
与innodb数据引擎相关;
用来实现灾难恢复(crash recovery),突然断电会导致innodb表空间中的数据没有写到磁盘上,通过执行redo log能够重新执行这些操作来恢复数据;
提升innodb的i/o性能,innodb引擎把数据和索引都载入到内存中的缓冲池中,如果每次休息数据和索引都需要更新到磁盘,必定会增加i/o请求,而且因为每次更新的位置都是随机的,磁头需要频繁的定位导致效率很低,所以innodb每处理完一个事务后只添加一条日志log,另外有一个线程负责智能的读取日志文件并批量更新到磁盘上,实现最高效的磁盘写入;
系统变量:
①.innodb_log_buffer_size:日志缓冲区的大小;
②.innodb_log_file_size:日志文件的大小;
③.innodb_log_files_in_group:一组日志中有几个文件:
- 文件名为ib_logfileX(X从0开始一次增加);
- 先关闭数据库服务:>mysqladmin shutdown(mysql.server stop);
- 把data目录下的ib_logfile文件移动走:>mv ib_logfile tmp;
- 在配置文件中添加innodb_log_files_in_group=n的参数;
- 启动数据库服务:>mysqld –defaults-file=./my.cnf –user=mysql(mysql.server start);
- 可以查看error log文件观察启动过程;
④.innodb_log_group_home_dir:日志存放的性对路径(相对于$MYSQL_HOME/mysql/data目录,即datadir目录);
- 关闭服务器;- 在配置文件中添加此参数,并指定路径;
- 启动服务器;
innodb_flush_log_at_trx_commit:根据不同的数据安全级别去设定.
0:日志缓冲每秒一次的被写入到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何修改;
1:每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新;
2:每个事务提交后,日志缓冲被写到日志文件,但不对日志文件做到磁盘操作刷新,对日志文件每秒刷新一次;
查看此变量:>show variables like ‘innodb_flush_log_at_trx_commit’;
innodb_os_log_written:写入到文件日志的数据量,使用show status查询;
innodb_os_log_fsyncs:写入到磁盘的次数,使用show status查询;
日志文件用法列表
二进制日志记录
重新启动MySQL服务器;
达到允许的最大大小(max_binlog_size);
发出了FLUSH LOGS SQL命令;
二进制日志记录格式
包含实际SQL语句
包括DDL(CREATE,DROP等)和DML(UPDATE,DELETE等)语句;
相对较小的文件保存磁盘空间和网络带宽;
并非所有复制的语句都会在远程计算机上正确重放;
要求主系统和从系统上复制的表和列完全相同(或者符合多个限制条件);
指示对单个表行的影响情况;
正确重放所有语句,即使对于在使用基于语句的日志记录时未正确复制的功能导致的更改也是如此;
SET [GLOBAL|SESSION] BINLOG_FORMAT=[row|statement|mixed|default];
列出二进制日志文件
1.SHOW BINARY LOGS语句可以列出当前日志文件和文件大小;
2.SHOW MASTER STATUS语句可以显示下一个事件的主状态;需要SUPER或REPLICATION CLIENT特权;
查看二进制日志内容
1.方式1:show binlog events in ‘mysql-bin.000002’ from 0;
2.方法2:mysqlbinlog mysql-bin.xxxxxx;
删除二进制日志
要在二进制日志轮转过程中自动删除存在时间多于指定天数的任何二进制日志,可使用expire_logs_days设置;
也可以在选项文件中配置expire_logs_days:
[mysqld]
expire_logs_days=7
PURGE BINARY LOGS BEFORE now() – INTERVAL 3 day;
PURGE BINARY LOGS TO ‘mysql-bin.000010’;
配置企业审计
(1).方法1:使用INSTALL PLUGIN语法:INSTALL PLUGIN audit_log SONAME ‘audit_log.so’;
(2).方法2:在服务器启动时设置plugin-load选项:
[mysqld]
plugin-load=audit_log.so
audit-log=FORCE_PLUS_PERMANENT;
要平衡遵从性和性能,可使用audit_log_strategy选项在SYNCHRONOUS,ASYNCHRONOUS,SEMISYNCHRONOUS和 PERFORMANCE之间进行选择;
审计日志文件
mysqlauditgrep –users=root –query-type=SELECT –status=0 /var/lib/mysql/audit.log