1. 配置MySQL服务器
MySQL的服务器是mysqld,在服务器启动时,可以设置许多命令选项和系统变量,来配置服务器的运行。可以使用下面的命令来查看服务器使用的命令选项和系统变量。
➜ ~ mysqld --verbose --help
这个命令列出了mysqld的所有选项和可配置的系统变量,以及它们的默认值,部分结果如下:
如果要查看当前运行的服务器使用的某个系统变量的值,可以连接到服务器,并使用show variable; 命令:
比如:查看当前运行服务器的统计数据和状态指示,可以使用show status; 命令:
关于命令选项、系统变量、状态变量更详细的介绍,会在后面的文章中介绍。
更详细的监控信息,可以在mysql的
性能模式中查看。
MySQL使用可扩展的算法,所以可以使用较小的内存来启动服务器,当然内存越大,性能会越好。
当要调整MySQL服务器的时候,最需要调整两个配置就是key_buffer_size和table_open_cache,在尝试修改其他配置变量前,应该确保这个变量已经设置了合适的值,后面会具体较少这两个变量的含义;
通常不同的运行配置,需要不同的变量值;
2. 服务器选项和变量参考
该链接中有个表格,列出了mysqld支持的所有选项和变量,部分截图如下:
其中:
Name:选项或变量名;
Cmd-Line:是否支持命令行选项;
Option File:是否可以在配置文件中配置;
System Var:是否是系统变量;
Status Var:是否是状态变量;
Var Scope:变量的作用域global,session,both;
Dynamic:是否是动态的;
3. 服务器命令选项
上文过,可以使提到过,用mysqld --verbose --help可以查看所有的命令选项,其中比较常用的服务器选项,有以下几类:
(1)与安全相关的选项;
(2)SSL相关的选项;
(3)二进制日志控制选项;
(4)复制相关的选项;
(5)加载插件的选项;
(6)针对特定存储引擎的选项;
对于一些控制缓冲区或高速缓存大小的选项,是依赖平台的:有的时候实际分配的值会小于你设定的;有的时候会大于你设置的(比如服务器设置最小为1024,而你设置为0)。所有的数值大小都是以byte为单位,除非指定单位。
对于一些参数值为路径的参数,要注意是绝对路径还是相对路径,如果是相对路径,则是相对于数据库的安装目录;
在服务器启动的时候,还可以把系统变量作为选项使用,形如:--varname=var_value;
如果要在服务器运行期间,限制系统变量的最大值,可以使用SET语句,如:
--maximum-var_name
=value
4. 服务器系统变量
MySQL的系统变量说明了MySQL是如何配置的,每个变量都有默认值,系统变量可以在启动时在命令行设置,也可以在选项文件中设置。大多数系统变量可以在服务器运行时,使用SET语句动态地修改,而不需要重启服务器。设置全局系统变量需要super权限,部分系统变量设置session级别的,也需要super权限。可以在表达式中使用系统变量。
使用示例:
(1)设置最大值,启动选项 --maxmum-var_name=value;
如:--maxmum-query_cache_size=32M;
(2)设置全局变量,在变量名称前加global 或@@global.qualifier,为了使全局变量永久生效,最好写入配置文件;
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> set global max_connections=1000;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1000 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> set @@global.max_connections=2000;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 2000 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>
(2)设置session变量,在变量名称前加session或@@session.qualifier或@@qualifier
mysql> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> set SESSION sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'sql_mode';
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> set @@session.sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.01 sec)
mysql> set @@sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql>
(3)查看某个变量的值,可以使用show variables like 'cha%'
SHOW VARIABLES LIKE 'max_join_size'; SHOW SESSION VARIABLES LIKE 'max_join_size';
(4)对于一个变量,没有指定global或session时,返回session的值;
(5)如果要移除一个和global变量有相同名称的session变量,且这个客户端连接有super权限时,就会把全局变量也改掉;同样地,如果增加了一个和global变量名称一样的session变量,当客户端想要修改全局变量时,也会修改自己的局部变量。