以下为自己收集和整理的资料,如有侵权,请及时联系
● “—prefix”:设定安装路径,默认为“/usr/local”;
● “—datadir”:设定MySQL 数据文件存放路径;
● “—with-charset”:设定系统的默认字符集;
● “—with-collation”:系统默认的校验规则;
● “—with-extra-charsets”:出了默认字符集之外需要编译安装的字符集;
● “—with-unix-socket-path”:设定socket 文件地址;
● “—with-tcp-port”:指定特定监听端口,默认为3306;
● “—with-mysqld-user”:指定运行mysqld 的os 用户,默认为mysql;
● “—without-query-cache”:禁用Query Cache 功能;
● “—without-innodb”:禁用Innodb 存储引擎;
● “--with-partition”:在5.1 版本中开启partition 支持特性;
● “--enable-thread-safe-client”:以线程方式编译客户端;
● “—with-pthread”:强制使用pthread 线程库编译;
● “—with-named-thread-libs”:指定使用某个特定的线程库编译;
● “—without-debug”:使用非debug 模式;
● “—with-mysqld-ldflags”:mysqld 的额外link 参数;
● “—with-client-ldflags”:client 的额外link 参数;
Binlog 相关参数及优化策略
我们首先看看Binlog 的相关参数,通过执行如下命令可以获得关于Binlog 的相关参数。当然,其中也显示出了“ innodb_locks_unsafe_for_binlog”这个Innodb 存储引擎特有的与Binlog 相关的参数:
mysql> show variables like '%binlog%';
+--------------------------------+------------+
| Variable_name | Value |
+--------------------------------+------------+
| binlog_cache_size | 1048576 |
| innodb_locks_unsafe_for_binlog | OFF |
| max_binlog_cache_size | 4294967295 |
| max_binlog_size | 1073741824 |
| sync_binlog | 0 |
+--------------------------------+------------+
“binlog_cache_size":在事务过程中容纳二进制日志SQL 语句的缓存大小。二进制日志缓存是服务器支持事务存储引擎并且服务器启用了二进制日志(—log-bin 选项)的前提下为每个客户端分配的内存,注意,是每个Client 都可以分配设置大小的binlog cache 空间。如果读者朋友的系统中经常会出现多语句事务的华,可以尝试增加该值的大小,以获得更有的性能。当然,我们可以通过MySQL 的以下两个状态变量来判断当前的binlog_cache_size 的状况:Binlog_cache_use 和Binlog_cache_disk_use。
“max_binlog_cache_size”:和"binlog_cache_size"相对应,但是所代表的是binlog 能够使用的最大cache 内存大小。当我们执行多语句事务的时候,max_binlog_cache_size 如果不够大的话,系统可能会报出“ Multi-statement transaction required more than 'max_binlog_cache_size' bytes of
storage”的错误。
“max_binlog_size”:Binlog 日志最大值,一般来说设置为512M 或者1G,但不能超过1G。该大小并不能非常严格控制Binlog 大小,尤其是当到达Binlog 比较靠近尾部而又遇到一个较大事务的时候,系统为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL 都记录进入当前日志,直到该事务结束。这一点和Oracle 的Redo 日志有点不一样,因为Oracle 的Redo 日志所记录的是数据文件的物理位置的变化,而且里面同时记录了Redo 和Undo 相关的信息,所以同一个事务是否在一个日志中对Oracle 来说并不关键。而MySQL 在Binlog 中所记录的是数据库逻辑变化信息,MySQL 称之为Event,实际上就是带来数据库变化的DML 之类的Query 语句。
“sync_binlog”:这个参数是对于MySQL 系统来说是至关重要的,他不仅影响到Binlog 对MySQL 所带来的性能损耗,而且还影响到MySQL 中数据的完整性。对于“sync_binlog”参数的各种设置的说明如下:
● sync_binlog=0,当事务提交之后,MySQL 不做fsync 之类的磁盘同步指令刷新binlog_cache 中的信息到磁盘,而让Filesystem 自行决定什么时候来做同步,或者cache 满了之后才同步到磁盘。
● sync_binlog=n,当每进行n 次事务提交之后,MySQL 将进行一次fsync 之类的磁盘同步指令来将binlog_cache 中的数据强制写入磁盘。
在MySQL 中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache 中的所有binlog 信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1 的时候,即使系统Crash,也最多丢失binlog_cache 中未完成的一个事务,对实际数据没有任何实质性影响。从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0 和设置为1 的系统写入性能差距可能高达5 倍甚至更多。
大家都知道,MySQL 的复制(Replication),实际上就是通过将Master 端的Binlog 通过利用IO 线程通过网络复制到Slave 端,然后再通过SQL 线程解析Binlog 中的日志再应用到数据库中来实现的。所以,Binlog 量的大小对IO 线程以及Msater 和Slave 端之间的网络都会产生直接的影响。
MySQL 中Binlog 的产生量是没办法改变的,只要我们的Query 改变了数据库中的数据,那么就必须将该Query 所对应的Event 记录到Binlog 中。那我们是不是就没有办法优化复制了呢?当然不是,在MySQL 复制环境中,实际上是是有8 个参数可以让我们控制需要复制或者需要忽略而不进行复制的DB 或者Table 的,分别为:
● Binlog_Do_DB:设定哪些数据库(Schema)需要记录Binlog;
● Binlog_Ignore_DB:设定哪些数据库(Schema)不要记录Binlog;
● Replicate_Do_DB:设定需要复制的数据库(Schema),多个DB 用逗号(“,”)分隔;
● Replicate_Ignore_DB:设定可以忽略的数据库(Schema);
● Replicate_Do_Table:设定需要复制的Table;
● Replicate_Ignore_Table:设定可以忽略的Table;
● Replicate_Wild_Do_Table:功能同Replicate_Do_Table,但可以带通配符来进行设置;
● Replicate_Wild_Ignore_Table:功能同Replicate_Ignore_Table,可带通配符设置;
通过上面这八个参数,我们就可以非常方便按照实际需求,控制从Master 端到Slave 端的Binlog量尽可能的少,从而减小Master 端到Slave 端的网络流量,减少IO 线程的IO 量,还能减少SQL 线程的解析与应用SQL 的数量,最终达到改善Slave 上的数据延时问题。
实际上,上面这八个参数中的前面两个是设置在Master 端的,而后面六个参数则是设置在Slave 端的。虽然前面两个参数和后面六个参数在功能上并没有非常直接的关系,但是对于优化MySQL 的Replication 来说都可以启到相似的功能。当然也有一定的区别,其主要区别如下:
● 如果在Master 端设置前面两个参数,不仅仅会让Master 端的Binlog 记录所带来的IO 量减少,还会让Master 端的IO 线程就可以减少Binlog 的读取量,传递给Slave 端的IO 线程的Binlog量自然就会较少。这样做的好处是可以减少网络IO,减少Slave 端IO 线程的IO 量,减少Slave端的SQL 线程的工作量,从而最大幅度的优化复制性能。当然,在Master 端设置也存在一定的弊端,因为MySQL 的判断是否需要复制某个Event 不是根据产生该Event 的Query 所更改的数据所在的DB,而是根据执行Query 时刻所在的默认Schema,也就是我们登录时候指定的DB 或者运行“USE DATABASE”中所指定的DB。只有当前默认DB 和配置中所设定的DB 完全吻合的时候IO线程才会将该Event 读取给Slave 的IO 线程。所以如果在系统中出现在默认DB 和设定需要复制的DB 不一样的情况下改变了需要复制的DB 中某个Table 的数据的时候,该Event 是不会被复制到Slave 中去的,这样就会造成Slave 端的数据和Master 的数据不一致的情况出现。同样,如果在默认Schema 下更改了不需要复制的Schema 中的数据,则会被复制到Slave 端,当Slave 端并没有该Schema 的时候,则会造成复制出错而停止;
● 而如果是在Slave 端设置后面的六个参数,在性能优化方面可能比在Master 端要稍微逊色一点,因为不管是需要还是不需要复制的Event 都被会被IO 线程读取到Slave 端,这样不仅仅增加了网络IO 量,也给Slave 端的IO 线程增加了Relay Log 的写入量。但是仍然可以减少Slave的SQL 线程在Slave 端的日志应用量。虽然性能方面稍有逊色,但是在Slave 端设置复制过滤机制,可以保证不会出现因为默认Schema 的问题而造成Slave 和Master 数据不一致或者复制出错的问题。
Slow Query Log 相关参数及使用建议
再来看看Slow Query Log 的相关参数配置。有些时候,我们为了定位系统中效率比较地下的Query语句,则需要打开慢查询日志,也就是Slow Query Log。我们可以如下查看系统慢查询日志的相关设置:
mysql> show variables like 'log_slow%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| log_slow_queries | ON |
+------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'long_query%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 1 |
+-----------------+-------+
1 row in set (0.01 sec)
“ log_slow_queries ” 参数显示了系统是否已经打开Slow Query Log 功能, 而
“long_query_time”参数则告诉我们当前系统设置的Slow Query 记录执行时间超过多长的Query。在MySQL AB 发行的MySQL 版本中Slow Query Log 可以设置的最短慢查询时间为1 秒,这在有些时候可能没办法完全满足我们的要求,如果希望能够进一步缩短慢查询的时间限制,可以使用Percona 提供的microslow-patch(件成为msl Patch)来突破该限制。msl patch 不仅仅能将慢查询时间减小到毫秒级别,同时还能通过一些特定的规则来过滤记录的SQL,如仅记录涉及到某个表的Slow Query 等等附加功能。
打开Slow Query Log 功能对系统性能的整体影响没有Binlog 那么大,毕竟Slow Query Log 的数据量比较小,带来的IO 损耗也就较小,但是,系统需要计算每一条Query 的执行时间,所以消耗总是会有一些的,主要是CPU 方面的消耗。如果大家的系统在CPU 资源足够丰富的时候,可以不必在乎这一点点损耗,毕竟他可能会给我们带来更大性能优化的收获。但如果我们的CPU 资源也比较紧张的时候,也完全可以在大部分时候关闭该功能,而只需要间断性的打开Slow Query Log 功能来定位可能存在的慢查询。
MySQL 的其他日志由于使用很少(Query Log)或者性能影响很少,我们就不在此过多分析了,至于各个存储引擎相关的日志,我们留在后面“常用存储引擎优化”部分再做相应的分析。
相关推荐
### MySQL编译安装参数详解 在进行MySQL服务器的编译安装过程中,正确配置`./configure`脚本中的各项参数对于确保MySQL服务器的功能性和性能至关重要。本文将详细介绍这些参数的意义及应用场景,帮助用户根据自身...
- 编译安装PHP,同样需要先运行./configure来指定安装选项,然后编译(make)和安装(make install),可能会涉及到指定Nginx的路径作为编译参数。 - MySQL的安装可能需要先编译cmake,然后使用cmake来配置MySQL...
在本文中,我们将详细介绍如何在CentOS 6.4系统上编译安装MySQL 5.6.14。这个过程通常比使用预编译的二进制包更加复杂,但允许你自定义配置并确保获得最新的功能。以下是编译安装的步骤: 1. **检查旧版本**: 在...
### CentOS编译安装MYSQL5.6.17 #### 知识点概览 - **环境准备**:包括操作系统版本的选择、依赖包的安装等。 - **编译工具的安装**:如`cmake`的下载与安装。 - **MySQL源码包的获取与解压**。 - **配置与编译...
MySQL编译安装是一个复杂但必要的过程,特别是在你需要特定存储引擎或者自定义配置的情况下。下面将详细解释这个过程。 首先,我们需要准备编译环境。这里提到的是使用`cmake`作为跨平台的编译工具。安装`cmake`的...
相较于二进制包安装,源码编译安装能更好地适应不同的硬件环境,并且可以定制化编译参数来满足特定需求。下面将逐一解析每个步骤。 #### 二、准备工作 1. **安装相关依赖包**: - 使用`yum install numactl gcc-...
MySQL源码安装编译是一个复杂的过程,涉及到许多技术细节,对于想要深入了解MySQL内部工作原理或者定制特定功能的用户来说,这是必要的步骤。本教程将基于网络上的多种资源和实践经验,为您提供一个详尽的MySQL源码...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其安装与卸载过程对于任何希望管理和维护数据库的IT专业人员来说都是至关重要的。以下是关于MySQL 5.0安装与卸载的详细步骤和相关知识点: **安装步骤** 1....
在Red Hat Enterprise Linux Server release 7.6 (RHEL 7.6)上源码编译安装MySQL 8.0.x的过程涉及多个步骤,包括操作系统安装配置、软件安装包下载、以及关键工具如cmake和gcc的升级。下面将详细阐述这些步骤。 ###...
#### 编译安装MySQL 1. **准备安装文件:** - 从MySQL官方网站下载适用于Linux系统的安装包,包括服务端和客户端两个部分。 - 服务端:`MySQL-server-5.14.9-l.glibc23.i386.rpm` - 客户端:`MySQL-client-5.14....
在本文中,我们将深入探讨如何在CentOS 6.5环境下源码编译安装MySQL 5.6.25,并构建主备环境。这个过程包括了一系列的准备工作、依赖软件的安装以及MySQL的编译和配置。 首先,我们需要安装必要的编译工具。在...
总结来说,编译安装MySQL 5.5.34涉及到多个步骤,包括准备环境、下载源码、配置编译参数、编译安装以及初始化数据库。理解这些步骤可以帮助IT专业人员更好地控制MySQL的部署,满足特定的系统需求和性能优化。
在编译安装过程中,可以使用一些参数来指定安装目录、数据目录、配置文件目录等。 添加用户和改变目录所有者 在编译安装完成后,需要添加一个名为mysql的用户和组,然后将安装目录的所有者改为mysql用户。 初始化...
然后,安装必要的依赖包,如`ncurses-devel`和`bison`,它们是MySQL编译过程中不可或缺的库。`ncurses-devel`提供终端交互所需的库,而`bison`是一个解析器生成器,用于处理MySQL的语法。 2. **创建用户与组**: ...
5. **安装**:最后,使用`make install`将编译好的MySQL服务器及其相关组件安装到指定的路径。 在编译过程中,你可能需要调整配置参数以满足特定需求,比如支持特定的存储引擎、优化性能选项或改变日志位置等。此外...
你提到的“mysql编译安装包”,具体是MySQL的源码包,版本号为5.5.53。这个版本发布于2016年,虽然不是最新的,但对于某些需要稳定旧版本环境的用户来说,仍然是一个可靠的选择。下面我们将详细讨论MySQL的编译安装...