MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情
况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优
化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。
优化有风险,涉足需谨慎!
1. 优化可能带来的问题
- 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统。
- 优化手段本来就有很大的风险,只不过你没能力意识到和预见到!
- 任何的技术可以解决一个问题,但必然存在带来一个问题的风险!
- 对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果。
- 保持现状或出现更差的情况都是失败!
2. 优化的需求
- 稳定性和业务可持续性,通常比性能更重要!
- 优化不可避免涉及到变更,变更就有风险!
- 优化使性能变好,维持和变差是等概率事件!
- 切记优化,应该是各部门协同,共同参与的工作,任何单一部门都不能对数据库进行优化!
- 所以优化工作,是由业务需要驱使的!!!
3. 优化由谁参与
在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。
优化思路
1. 在数据库优化上有两个主要方面:即安全与性能。
- 安全 —> 数据可持续性
- 性能 —> 数据的高性能访问
2. 优化的范围有哪些
存储、主机和操作系统方面:
- 主机架构稳定性
- I/O规划及配置
- Swap交换分区
- OS内核参数和网络问题
应用程序方面:
- 应用程序稳定性
- SQL语句性能
- 串行访问资源
- 性能欠佳会话管理
- 这个应用适不适合用MySQL
数据库优化方面:
- 内存
- 数据库结构(物理&逻辑)
- 实例配置
说明:不管是在,设计系统,定位问题还是优化,都可以按照这个顺序执行。
3. 优化维度
数据库优化维度有四个:
硬件、系统配置、数据库表结构、SQL及索引。
优化选择:
- 优化成本:硬件>系统配置>数据库表结构>SQL及索引
- 优化效果:硬件<系统配置<数据库表结构<SQL及索引
优化工具
1. 数据库层面
检查问题常用工具:
msyqladmin # mysql客户端,可进行管理操作
mysqlshow # 功能强大的查看shell命令
show [SESSION | GLOBAL] variables # 查看数据库参数信息
SHOW [SESSION | GLOBAL] STATUS # 查看数据库的状态信息
information_schema # 获取元数据的方法s
SHOW ENGINE INNODB STATUS Innodb # 引擎的所有状态
SHOW PROCESSLIST # 查看当前所有连接session状态
explain # 获取查询语句的执行计划s
how index # 查看表的索引信息
slow-log # 记录慢查询语句
mysqldumpslow # 分析showlog文件的
不常用但好用的工具
zabbix #监控主机,系统,数据库(部署zabbix监控平台)
pt-query-digest # 分析慢日志
mysqlslap # 分析慢日志
sysbench # 压力测试工具
mysql profiling # 统计数据整体状态工具
Performance Schema mysql # 性能状态统计的数据
workbench # 管理,备份,监控,分析,优化工具(比较费资源)
2. 数据库层面问题解决思路
一般应急调优的思路:
针对突然的业务办理卡顿,无法进行正常的业务处理!需要立马解决的场景!
连接mysql,输入如下:
- 1、show processlist
- 2、示例:
explain select id ,name from 测试的指定表 where name=‘clsn’; # ALL id name age sex
select id,name from stu where id=2-1 函数 结果集>30;
show index from table; - 3、通过执行计划判断,索引问题(有没有、合不合理)或者语句本身问题
- 4、show status like ‘%lock%’; # 查询锁状态
kill SESSION_ID; # 杀掉有问题的session
常规调优思路:
针对业务周期性的卡顿,例如在每天10-11点业务特别慢,但是还能够使用,过了这段时间就好了。
- 1、查看slowlog,分析slowlog,分析出查询慢的语句。
- 2、按照一定优先级,进行一个一个的排查所有慢语句。
- 3、分析top sql,进行explain调试,查看语句执行时间。
- 4、调整索引或语句本身。
3. 系统层面
cpu方面: vmstat、sar top、htop、nmon、mpstat
内存: free 、ps -aux
IO设备(磁盘、网络): iostat 、 ss 、 netstat 、 iptraf、iftop、lsof
vmstat 命令说明:
- Procs : r 显示有多少进程正在等待CPU 时间。b 显示处于不可中断的休眠的进程数量。在等待I/O。
- Memory:swpd显示被交换到磁盘的数据块的数量。未被使用的数据块,用户缓冲数据块,用于操作系统的数据块的数量。
- Swap:操作系统每秒从磁盘上交换到内存和从内存交换到磁盘的数据块的数量。s1和s0最好是0。
- Io:每秒从设备中读入b1的写入到设备b0的数据块的数量。反映了磁盘I/O。
- System:显示了每秒发生中断的数量(in)和上下文交换(cs)的数量。
- Cpu:显示用于运行用户代码,系统代码,空闲,等待I/O的CPU时间。
iostat命令说明
实例命令: iostat -dk 1 5
iostat -d -k -x 5 (查看设备使用率(%util)和响应时间(await))
- tps:该设备每秒的传输次数。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。
- iops :硬件出厂的时候,厂家定义的一个每秒最大的IO次数,"一次传输"请求的大小是未知的。
- kB_read/s:每秒从设备(drive expressed)读取的数据量。
- KB_wrtn/s:每秒向设备(drive expressed)写入的数据量。
- kB_read:读取的总数据量。
- kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
4. 系统层面问题解决办法
你认为到底负载高好,还是低好呢?
在实际的生产中,一般认为 cpu只要不超过90%都没什么问题 。
当然不排除下面这些特殊情况:
问题一:cpu负载高,IO负载低
- 内存不够
- 磁盘性能差
- SQL问题 ------>去数据库层,进一步排查sql问题
- IO出问题了(磁盘到临界了、raid设计不好、raid降级、锁、在单位时间内tps过高)
- tps过高: 大量的小数据IO、大量的全表扫描
问题二:IO负载高,cpu负载低
- 大量小的IO 写操作:
- autocommit ,产生大量小IO
- IO/PS,磁盘的一个定值,硬件出厂的时候,厂家定义的一个每秒最大的IO次数。
- 大量大的IO 写操作
- SQL问题的几率比较大
问题三:IO和cpu负载都很高
硬件不够了或sql存在问题
基础优化
1. 优化思路
定位问题点:
硬件 --> 系统 --> 应用 --> 数据库 --> 架构(高可用、读写分离、分库分表)
处理方向:
明确优化目标、性能和安全的折中、防患未然
2. 硬件优化
主机方面:
- 根据数据库类型,主机CPU选择、内存容量选择、磁盘选择
- 平衡内存和磁盘资源
- 随机的I/O和顺序的I/O
- 主机 RAID卡的BBU(Battery Backup Unit)关闭
cpu的选择:
- cpu的两个关键因素:核数、主频
- 根据不同的业务类型进行选择:
- cpu密集型:计算比较多,OLTP 主频很高的cpu、核数还要多
- IO密集型:查询比较,OLAP 核数要多,主频不一定高的
内存的选择:
- OLAP类型数据库,需要更多内存,和数据获取量级有关。
- OLTP类型数据一般内存是cpu核心数量的2倍到4倍,没有最佳实践
存储方面:
- 根据存储数据种类的不同,选择不同的存储设备
- 配置合理的RAID级别(raid5、raid10、热备盘)
- 对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd、sas 、sata)
raid卡:主机raid卡选择:
- 实现操作系统磁盘的冗余(raid1)
- 平衡内存和磁盘资源
- 随机的I/O和顺序的I/O
- 主机 RAID卡的BBU(Battery Backup Unit)要关闭
网络设备方面:
使用流量支持更高的网络设备(交换机、路由器、网线、网卡、HBA卡)
注意:以上这些规划应该在初始设计系统时就应该考虑好。
3. 服务器硬件优化
- 1、物理状态灯:
- 2、自带管理设备:远程控制卡(FENCE设备:ipmi ilo idarc),开关机、硬件监控。
- 3、第三方的监控软件、设备(snmp、agent)对物理设施进行监控
- 4、存储设备:自带的监控平台。EMC2(hp收购了), 日立(hds),IBM低端OEM hds,高端存储是自己技术,华为存储
4. 系统优化
Cpu:
基本不需要调整,在硬件选择方面下功夫即可。
内存:
基本不需要调整,在硬件选择方面下功夫即可。
SWAP:
MySQL尽量避免使用swap,阿里云的服务器中默认swap为0。
IO :
-
raid、no lvm、 ext4或xfs、ssd、IO调度策略
-
Swap调整(不使用swap分区)
/proc/sys/vm/swappiness的内容改成0(临时)
/etc/sysctl.conf上添加vm.swappiness=0(永久)
这个参数决定了Linux是倾向于使用swap,还是倾向于释放文件系统cache。在内存紧张的情况下,数值越低越倾向于释放文件系统cache。当然,这个参数只能减少使用swap的概率,并不能避免Linux使用swap。
修改MySQL 的配置参数innodb_flush_method , 开启O_DIRECT 模式。
这种情况下, InnoDB 的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log依旧会使用文件系统cache。值得注意的是,Redo log是覆写模式的,即使使用了文件系统的cache,也不会占用太多。
IO调度策略:
#echo deadline>/sys/block/sda/queue/scheduler # 临时修改为dealine
永久修改如下:
vi /boot/grub/grub.conf
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
5. 系统参数调整
Linux系统内核参数优化:
vim /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535 # 用户端口范围
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
fs.file-max=65535 # 系统最大文件句柄,控制的是能打开文件最大数量
用户限制参数(mysql可以不设置以下配置):
vim /etc/security/limits.conf
- soft nproc 65535
- hard nproc 65535
- soft nofile 65535
- hard nofile 65535
6. 应用优化
业务应用和数据库应用独立,防火墙:iptables、selinux等其他无用服务(关闭)[chkconfig适用于原生Linux,Linux发行版本有的需要自主安装]:
chkconfig --level 23456 acpid off
chkconfig --level 23456 anacron off
chkconfig --level 23456 autofs off
chkconfig --level 23456 avahi-daemon off
chkconfig --level 23456 bluetooth off
chkconfig --level 23456 cups off
chkconfig --level 23456 firstboot off
chkconfig --level 23456 haldaemon off
chkconfig --level 23456 hplip off
chkconfig --level 23456 ip6tables off
chkconfig --level 23456 isdn off
chkconfig --level 23456 sendmail off
chkconfig --level 23456 yum-updatesd off
安装图形界面的服务器不要启动图形界面 runlevel 3
另外, 思考将来我们的业务是否真的需要MySQL,还是使用其他种类的数据库。用数据库的最高境界就是不用数据库。
数据库优化
SQL优化方向:
执行计划、索引、SQL改写
架构优化方向:
高可用架构、高性能架构、分库分表
1. 数据库参数优化
调整:实例整体(高级优化,扩展)
thread_concurrency # 并发线程数量个数
sort_buffer_size # 排序缓存
read_buffer_size # 顺序读取缓存
read_rnd_buffer_size # 随机读取缓存
key_buffer_size # 索引缓存
thread_cache_size # 线程缓存(1G->8,2G->16,3G->32,>3G->64)
连接层(基础优化)
设置合理的连接客户和连接方式
max_connections # 最大连接数,看交易笔数设置
max_connect_errors # 最大错误连接数,能大则达
connect_timeout # 连接超时
max_user_connections # 最大用户连接数
skip-name-resolve # 跳过域名解析
wait_timeout # 等待超时
back_log # 可以在堆栈中的连接数量
SQL层(基础优化)
- query_cache_size: 查询缓存
- OLAP类型数据库,需要重点加大此内存缓存.
- 但是一般不会超过GB.
- 对于经常被修改的数据,缓存会立马失效。
- 我们可以实用内存数据库(redis、memecache),替代他的功能。
2. 存储引擎层(innodb基础优化参数)
default-storage-engine
# 没有固定大小,50%测试值,看看情况再微调。
# 但是尽量设置不要超过物理内存70% innodb_file_per_table=(1,0)
innodb_buffer_pool_size
innodb_flush_log_at_trx_commit=(0, 1, 2) # 1是最安全的,0是性能最高的,2折中
binlog_sync
Innodb_flush_method=(ODIRECT, fdatasync)
innodb_log_buffer_size # 100%以下
innodb_log_file_size # 100%以下
innodb_log_files_in_groug # 5个成员以下,一般2-3个够用(iblogfile0-N)
innodb_max_dirty_pages_pct #达到百分之75的时候刷写 内存脏页到磁盘。log_bin
max_binlog_cache_size # 可以不设置
max_binlog_size # 可以不设置
innodb_additional_mem_pool_size # 小于2G内存的机器, 推荐值是20M。32G以上100M
MySQL配置文件mysqld.cnf中文版[/etc/mysql/mysql.conf.d/mysqld.cnf]
mysql配置文件加载顺序
mysql --verbose --help | grep -A 1 'Default options'
Default options are read from the following files in the given order:
加载顺序:/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数。
my.ini分为两块:Client Section和Server Section。
Client Section用来配置MySQL客户端参数。
要查看配置参数可以用下面的命令:
show variables like '%innodb%'; # 查看innodb相关配置参数
show status like '%innodb%'; # 查看innodb相关的运行时参数(比如当前正在打开的表的数量,当前已经打开的表的数量)
show global status like 'open%tables'; # 查看全局的运行时参数,加上global是对当前mysql服务器中运行的所有数据库实例进行统计。不加global则只对当前数据库实例进行统计。
1. Client Section
[client]
port = 3306 # 设置mysql客户端连接服务端时默认使用的端口
[mysql]
default-character-set=utf8 # 设置mysql客户端默认字符集
2. Server Section
[mysqld]
port=3306 # mysql服务端默认监听(listen on)的TCP/IP端口
basedir="C:/Program Files/MySQL/MySQL Server 5.5/" # 基准路径,其他路径都相对于这个路径
datadir="C:/Program Files/MySQL/MySQL Server 5.5/Data" # mysql数据库文件所在目录
character-set-server=latin1 # 服务端使用的字符集默认为8比特编码的latin1字符集
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" # SQL模式为strict模式
max_connections=100 # mysql服务器支持的最大并发连接数(用户数)。但总会预留其中的一个连接给管理员使用超级权限登录,即使连接数目达到最大限制。如果设置得过小而用户比较多,会经常出现“Too many connections”错误。
query_cache_size=0 # 查询缓存大小,用于缓存SELECT查询结果。如果有许多返回相同查询结果的SELECT查询,并且很少改变表,可以设置query_cache_size大于0,可以极大改善查询效率。而如果表数据频繁变化,就不要使用这个,会适得其反
table_cache=256 # 这个参数在5.1.3之后的版本中叫做table_open_cache,用于设置table高速缓存的数量。由于每个客户端连接都会至少访问一个表,因此此参数的值与 max_connections有关。当某一连接访问一个表时,MySQL会检查当前已缓存表的数量。如果该表已经在缓存中打开,则会直接访问缓存中的表已加快查询速度;如果该表未被缓存,则会将当前的表添加进缓存并进行查询。在执行缓存操作之前,table_cache用于限制缓存表的最大数目:如果当前已经缓存的表未达到table_cache,则会将新表添加进来;若已经达到此值,MySQL将根据缓存表的最后查询时间、查询率等规则释放之前的缓存。
tmp_table_size=34M # 内存中的每个临时表允许的最大大小。如果临时表大小超过该值,临时表将自动转为基于磁盘的表(Disk Based Table)。
thread_cache_size=8 # 缓存的最大线程数。当客户端连接断开时,如果客户端总连接数小于该值,则处理客户端任务的线程放回缓存。在高并发情况下,如果该值设置得太小,就会有很多线程频繁创建,线程创建的开销会变大,查询效率也会下降。一般来说如果在应用端有良好的多线程处理,这个参数对性能不会有太大的提高。
# MyISAM相关参数
myisam_max_sort_file_size=100G # mysql重建索引时允许使用的临时文件最大大小
myisam_sort_buffer_size=68M
key_buffer_size=54M # Key Buffer大小,用于缓存MyISAM表的索引块。决定数据库索引处理的速度(尤其是索引读)
read_buffer_size=64K # 用于对MyISAM表全表扫描时使用的缓冲区大小。针对每个线程进行分配(前提是进行了全表扫描)。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。
read_rnd_buffer_size=256K
sort_buffer_size=256K # connection级参数(为每个线程配置),500个线程将消耗500*256K的sort_buffer_size。
InnoDB相关参数
innodb_additional_mem_pool_size=3M # InnoDB用于存储元数据信息的内存池大小,一般不需修改
innodb_flush_log_at_trx_commit =1 # 事务相关参数,如果值为1,则InnoDB在每次commit都会将事务日志写入磁盘(磁盘IO消耗较大),这样保证了完全的ACID特性。而如果设置为0,则表示事务日志写入内存log和内存log写入磁盘的频率都为1次/秒。如果设为2则表示事务日志在每次commit都写入内存log,但内存log写入磁盘的频率为1次/秒。
innodb_log_buffer_size=2M # InnoDB日志数据缓冲大小,如果缓冲满了,就会将缓冲中的日志数据写入磁盘(flush)。由于一般至少都1秒钟会写一次磁盘,所以没必要设置过大,即使是长事务。
innodb_buffer_pool_size=105M # InnoDB使用缓冲池来缓存索引和行数据。该值设置的越大,则磁盘IO越少。一般将该值设为物理内存的80%。
innodb_log_file_size=53M # 每一个InnoDB事务日志的大小。一般设为innodb_buffer_pool_size的25%到100%
innodb_thread_concurrency=9 # InnoDB内核最大并发线程数
basedir = path
使用给定目录作为根目录(安装目录)。 | |
---|---|
character-sets-dir = path | 给出存放着字符集的目录。 |
datadir = path | 从给定目录读取数据库文件。 |
pid-file = filename | 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。 |
socket = filename | 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下,如果MySQL客户与服务器是通过命名管道进行通信 的,–sock选项给出的将是该命名管道的名字(默认设置是MySQL)。 |
lower_case_table_name = 1/0 | 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。 |
mysqld程序:语言设置
character-sets-server = name | 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容,这个字符集也可以用–default-character-set选项给出; 但这个选项已经显得有点过时了。 |
---|---|
collation-server = name | 新数据库或数据表的默认排序方式。 |
lanuage = name | 用指定的语言显示出错信息。 |
mysqld程序:通信、网络、信息安全
enable-named-pipes | 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL,但可以用–socket选项来改变。 |
---|---|
local-infile [=0] | 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。 |
myisam-recover [=opt1, opt2, …] | 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。 |
old-passwords | 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。 |
port = n | 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。 |
safe-user-create | 只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。 |
shared-memory | 允许使用内存(shared memory)进行通信(仅适用于Windows)。 |
shared-memory-base-name = name | 给共享内存块起一个名字(默认的名字是MySQL)。 |
skip-grant-tables | 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。 |
skip-host-cache | 不使用高速缓存区来存放主机名和IP地址的对应关系。 |
skip-name-resovle | 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。 |
skip-networking | 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接,不允许ICP/IP连接; 这提高了安全性,但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。 |
user = name | mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用–user=mysql选项来启动mysqld程序。 |
mysqld程序:内存管理、优化、查询缓存区
bulk_insert_buffer_size = n | 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。 |
---|---|
key_buffer_size = n | 用来存放索引区块的RMA值(默认设置是8M)。 |
join_buffer_size = n | 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。 |
max_heap_table_size = n | HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。 |
max_connections = n | MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。 |
query_cache_limit = n | 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。 |
query_cache_size = n | 查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。 |
query_cache_type = 0/1/2 | 查询缓存区的工作模式:0, 禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,”按需分配”模式,只响应SELECT SQL_CACHE命令。 |
read_buffer_size = n | 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。 |
read_rnd_buffer_size = n | 类似于read_buffer_size选项,但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。 |
sore_buffer = n | 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小,则必须创建一个临时文件来进行排序。 |
table_cache = n | 同时打开的数据表的数量(默认设置是64)。 |
tmp_table_size = n | 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。 |
mysqld程序:日志
log [= file] | 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。 |
---|---|
log-slow-queries [= file] | 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机 名)。 |
long_query_time = n | 慢查询的执行用时上限(默认设置是10s)。 |
long_queries_not_using_indexs | 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同–log-slow-queries选项)。 |
log-bin [= filename] | 把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志,binary update log)。这种日志的文件名是filename.n或默认的hostname.n,其中n是一个6位数字的整数(日志文件按顺序编号)。 |
log-bin-index = filename | 二进制日志功能的索引文件名。在默认情况下,这个索引文件与二进制日志文件的名字相同,但后缀名是.index而不是.nnnnnn。 |
max_binlog_size = n | 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前,MySQL服务器会自动提供一个新的二进制日志文件接续上。 |
binlog-do-db = dbname | 只把给定数 据库里的变化情况记入二进制日志文件,其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况,就必须在配置文件使用多个本选项来设置,每个数据库一行。 |
binlog-ignore-db = dbname | 不把给定数据库里的变化情况记入二进制日志文件。 |
sync_binlog = n | 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0,意思是由操作系统来负责二进制日志文件的同步工作。 |
log-update [= file] | 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数,MySQL会使用hostname.err作为种日志文件的名字。 |
mysqld程序:镜像(主控镜像服务器)
server-id = n | 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。 |
---|---|
log-bin = name | 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n,其中的n是一个6位数字的整数(日志文件顺序编号)。 |
binlog-do/ignore-db = dbname | 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。 |
mysqld程序:镜像(从属镜像服务器)
server-id = n | 给服务器分配一个唯一的ID编号 |
---|---|
log-slave-updates | 启用从属服务器上的日志功能,使这台计算机可以用来构成一个镜像链(A->B->C)。 |
master-host = hostname | 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件),它将忽略此选项。 |
master-user = replicusername | 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件,它将忽略此选项。 |
master-password = passwd | 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件,它将忽略此选项。 |
master-port = n | 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。 |
master-connect-retry = n | 如果与主控服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件,它将忽略此选项。 |
master-ssl-xxx = xxx | 对主、从服务器之间的SSL通信进行配置。 |
read-only = 0/1 | 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。 |
read-log-purge = 0/1 | 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。 |
replicate-do-table = dbname.tablename | 与–replicate-do-table选项的含义和用法相同,但数据库和数据库表名字里允许出现通配符”%” (例如: test%.%–对名字以”test”开头的所有数据库里的所以数据库表进行镜像处理)。 |
replicate-do-db = name | 只对这个数据库进行镜像处理。 |
replicate-ignore-table = dbname.tablename | 不对这个数据表进行镜像处理。 |
replicate-wild-ignore-table = dbn.tablen | 不对这些数据表进行镜像处理。 |
replicate-ignore-db = dbname | 不对这个数据库进行镜像处理。 |
replicate-rewrite-db = db1name > db2name | 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。 |
report-host = hostname | 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关–主控服务器可以用这条命令生成一份从属服务器的名单。 |
slave-compressed-protocol = 1 | 主、从服务器使用压缩格式进行通信–如果它们都支持这么做的话。 |
slave-skip-errors = n1, n2, …或all | 即使发生出错代码为n1、n2等的错误,镜像处理工作也继续进行(即不管发生什么错误,镜像处理工作也继续进行)。如果配置得当,从属服务器不应 该在执行 SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用slave-skip-errors选项,从属服务器上的镜像工作就可能因为发生错误而中断,中断后需要有人工参与才能继续进行。 |
mysqld–InnoDB:基本设置、表空间文件
skip-innodb | 不加载InnoDB数据表驱动程序–如果用不着InnoDB数据表,可以用这个选项节省一些内存。 |
---|---|
innodb-file-per-table | 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。 |
innodb-open-file = n | InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多数据表的话,这个数字很可能需要加大。 |
innodb_data_home_dir = p | InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。 |
innodb_data_file_path = ts | 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但允许它扩充到2GB。除文件名外,还可以用硬盘分区的设置名来定义表 空间,此时必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置、是ibdata1:10M:autoextend。 |
innodb_autoextend_increment = n | 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件,那些文件的增大速度相对是比较小的。 |
innodb_lock_wait_timeout = n | 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。 |
innodb_fast_shutdown 0/1 | 是否以最快的速度关闭InnoDB,默认设置是1,意思是不把缓存在INSERT缓存区的数据写入数据表,那些数据将在MySQL服务器下次启动 时再写入 (这么做没有什么风险,因为INSERT缓存区是表空间的一个组成部分,数据不会丢失)。把这个选项设置为0反面危险,因为在计算机关闭时,InnoDB 驱动程序很可能没有足够的时间完成它的数据同步工作,操作系统也许会在它完成数据同步工作之前强行结束InnoDB,而这会导致数据不完整。 |
mysqld程序:InnoDB–日志
innodb_log_group_home_dir = p | 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。 |
---|---|
innodb_log_files_in_group = n | 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后,之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单 位进行设置。 |
innodb_flush_log_at_trx_commit = 0/1/2 | 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。 |
innodb_flush_method = x | InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync,用fsync()函数进行同步; O_DSYNC,用O_SYNC()函数进行同步。 |
innodb_log_archive = 1 | 启用InnoDB驱动程序的archive(档案)日志功能,把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与 MySQL一起使用时没有多大意义(启用MySQL服务器的二进制日志功能就足够用了)。 |
mysqld程序–InnoDB:缓存区的设置和优化
innodb_log_buffer_pool_size = n | 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响,如果计算机上只运行有 MySQL/InnoDB数据库服务器,就应该把全部内存的80%用于这个用途。 |
---|---|
innodb_log_buffer_size = n | 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。 |
innodb_additional_men_pool_size = n | 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。 |
innodb_file_io_threads = n | I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。 |
innodb_thread_concurrency = n | InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。 |
mysqld程序:其它选项
bind-address = ipaddr | MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址,这个选项将非常重要。 |
---|---|
default-storage-engine = type | 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。 |
default-timezone = name | 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。 |
ft_min_word_len = n | 全文索引的最小单词长度工。这个选项的默认设置是4,意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。 |
Max-allowed-packet = n | 客户与服务器之间交换的数据包的最大长度,这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。 |
Sql-mode = model1, mode2, … | MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括ansi、db2、 oracle、no_zero_date、pipes_as_concat。 |