1、MySQL获取配置信息路径
(1) 命令行参数
mysqld_safe --datadir= /data/sql_data
(2) 配置文件
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
2、MySQL配置参数的作用域
(1) 全局参数(只对可动态调整的参数才有效)
set global 参数名 = 参数值;
set @@global.参数名 := 参数值;
有些全局设置只对设置后的mysql服务有效,之前前的mysql服务依然保持原来的参数设置。
打开一个新的连接:
(2) 会话参数(只对可动态调整的参数才有效)
set [session] 参数名 = 参数值;
set @@session.参数名 := 参数值;
3、内存配置相关参数
(1) 确定可以使用的内存的上限
(2) 确定MySQL的每个连接使用的内存
a. sort_buffer_size
需要排序会话的缓存大小,针对每个线程分配。这个值不是越大越好,默认大小是256kb,过大的配置会消耗更多的内存。
b. join_buffer_size
连接缓冲区的内存大小,针对每个线程分配。如果一个查询中关联了多张表,那么就会为每个关联分配一个连接缓存,所以每个查询可能会有多个连接缓存。
c. read_buffer_size
为需要全表扫描的MYISAM数据表线程指定缓存,针对每个线程分配。一定要是4k的倍数。
d. read_rnd_buffer_size
索引缓冲区的大小,针对每个线程分配。该变量可以被任何存储引擎使用,当从一个已经排序的键值表中读取行时,会先从该缓冲区中获取而不再从磁盘上获取。默认为256K。
(3) 确定需要为操作系统保留多少内存
(4) 如何为缓存池分配内存
a. Innodb_buffer_pool_size
Innodb存储引擎不仅要缓存索引,同时还要缓存数据。
Innodb缓存池大小 = 总内存 - (每个线程所需要的内存 * 连接数) - 系统保留内存
b. key_buffer_size
主要针对MYISAM存储引擎。MYISAM存储引擎只缓存索引,数据则依赖操作系统的缓存。
select sum(index_length) from information_schema.tables where engine=''myisam;
4、IO相关配置参数
(1) Innodb I/O相关配置
Innodb是事物型的存储引擎。为了减少提交事务时所产生的I/O开销,Inndb使用了异写日志的方式,也就是在事务提交的时候,会先写入事务日志中,而不是每次都把变更后的数据刷新到数据文件中。
a. Innodb_log_file_size(单个事务日志的大小)
b. Innodb_log_files_in_group(事务日志文件的个数)
c. 事务日志总大小 = Innodb_log_files_in_group * Innodb_log_file_size
d. Innodb_log_buffer_size(事务日志缓冲区的大小)
e. Innodb_flush_log_at_trx_commit(事务日志刷新的频繁程度)
值为0:log buffer将每秒一次地写入log file中,并且l写入log file和并且flush log到磁盘(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
值为1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush log到磁盘(刷到磁盘中去),该模式为系统默认。
值为2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush log到磁盘(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
注意事项:
当设置为0,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。
当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
f. Innodb_flush_metfod = O_DIRECT(Innodb刷新的方式)
决定了Innodb数据文件和日志文件如何跟系统文件如何交互。
g. Innodb_file_per_table = 1
控制Innodb如何使用表空间。如果设置了这个参数,Innodb会为每个表建立一个独立的表空间,否则就会将Innodb表数据存储在系统表空间中。
h. Innodb_doublewrite = 1
控制Innodb是否使用双写缓存。双写缓存的主要作用是避免页没有写完整而造成的数据损坏。Innodb的一个页默认大小是16k,当系统奔溃或者程序bug造成一个磁盘写操作不能完整的完成,这时不完整的页写入就有可能发生,会造成16k数据不完整的写入到数据文件中,这时数据文件就会损坏。
(2) MyISAM I/O相关配置
a. delay_key_write
delay_key_write是指在表关闭之前,将对表的update操作只更新数据到磁盘,而不更新索引到磁盘,把对索引的更改记录在内存。(这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有数据之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行)
这样MyISAM表可以使索引更新更快。在关闭表的时候一起更新索引到磁盘。
值OFF:每次写操作后刷新键缓冲中的脏块到磁盘
值ON:只对在建表指定了delay_key_write选项的表使用延迟刷新
值ALL:对所有MYISAM表都使用延迟键写入
5、安全相关配置参数
(1) expire_logs_days 指定自动清理binlog的天数
(2) max_allowed_packet 控制MySQL可以接收的表的大小
(3) skip_name_resolve 禁用DNS查找
(4) sysdate_is_now 确保syadate()返回确定性日期
(5) read_only 禁止非super权限的用户写权限
(6) skip_slave_start 禁用Slave自动恢复
(7) sql_mode 设置MySQL所使用的SQL模式
a. strict_trans_tables
如果给定的数据不能插入到事务型存储引擎中,则会中断当前操作;对非事物型存储引擎则没有任何影响。
b. no_engine_subtitution
当在create table语句指定的存储引擎不可用的情况下,不会使用默认的存储引擎来建立表,保证了我们在建表时可以使用我们想要的存储引擎。
c. no_zero_date
在严格的SQL模式下,不能将0年0月0日这样的日期写入到表中的日期字段上。
no_zero_date 支持 1000-00-00 0000-01-00 0000-00-01(年月日中任何一个不为0)。
要控制0000-00-00这样的数据插入必须同时设置no_zero_date,no_zero_in_date。
d. no_zero_in_date
在严格的SQL模式下,不接受部分日期为0写入到表中的日期字段上。
no_zero_in_date 支持 0000-00-00 0000-01-01 (年月日都为0,月日不为0)。
要控制0000-00-00这样的数据插入必须同时设置no_zero_date,no_zero_in_date。
e. only_full_group_by
如果only_full_group_by启用了 SQL模式(默认情况下),MySQL会拒绝那些select列表,HAVING条件或 ORDER BY列表所引用的查询,这些查询既不是在GROUP BY子句中命名的,也不是在功能上依赖于它们的非聚合列。
6、其他常用配置参数
(1) sync_binlog 控制MySQL如何向磁盘刷新binlog
默认值为0。主从复制表中建议将其设置为1。
(2) tmp_table_size和max_heap_table_size 控制内存临时表大小
(3) max_connections 控制允许的最大连接数