介绍
MySQL安装部署时,经常会关注一些参数是否合理。其实这些参数分为两类型。环境中调整的绝大部分是引擎层方面的。服务层参数,就是mysqld服务启动时的参数,如:datadir,port,socket之类的的,这些是基本常用的服务参数。
正好之前碰到一个server层的事务提交问题,进一步更多了解服务层参数。除此之外,服务层参数还要分Windows,Linux系统。有些也可以设置在mysqld配置里。
目前服务层参数支持5种方面:
- 影响安全性;
- ssl相关选项;
- Binary Log;
- Replication相关;
- 特定存储引擎的选项;
可通过verbose help 进行查看:
shell> mysqld --verbose --help
服务层参数
tc-heuristic-recover
如下错误说明是2阶段提交服务端出现问题,还没有到达引擎层。
[ERROR] Found 8 prepared transactions! It means that mysqld was not shut down properly last time
and critical recovery information (last binlog or tc.log file) was manually deleted after a crash.
You have to start mysqld with --tc-heuristic-recover
switch to commit or rollback pending transactions.
代码实现上的备注信息:
ER_XA_NO_MULTI_2PC_HEURISTIC_RECOVER
eng "--tc-heuristic-recover rollback strategy is not safe on systems with
more than one 2-phase-commit-capable storage engine. Aborting crash recovery."
mysqld启动时添加
–tc-heuristic-recover=COMMIT或者–tc-heuristic-recover=ROLLBACK
执行完成后,去掉该参数再启动一次即可。
如:启动是还有问题,还可以配合innodb_force_recovery 进行修复操作。
memlock
将mysqld进程锁定在内存中,占有的内存,可以避免交换,但是也可能带来危险:如果没有足够的可锁定内存,mysql尝试分配更多内存时会崩溃。这也可能导致锁定的内存太多而没有足够的内存留给操作系统。所以必须要足够的内存分配给操作系统和MySQL服务。
如使用memlock参数,必须验证下是否支持mlockall(),应该命令的输出中看到如下内容:
shell# grep mlockall /usr/include/sys/mman.h
extern int mlockall (int __flags) __THROW;
- 使用此选项可能需要以root身份运行服务器,出于安全原因,可以通过更改limits.conf文件来避免以root身份运行服务器;
- memlock建议跟和large_pages 大页配合使用;
- 不能在不支持mlockall()系统调用的系统上使用此选项;
upgrade
对于版本升级一般包含两个步骤。
Step 1: Data dictionary upgrade.
Step 2: Server upgrade.(按照数据量情况而定,因为数据要扫描,可能时间有点长)
MySQL8.0之后用新版本软件启动,就会自动升级。因为这个参数upgrade,默认值是AUTO。可以按照实际需求合理使用。
备注:从MySQL 8.0.16开始,no-dd-upgrade已弃用。它被——upgrade选项所取代。这也是
MySQL服务器启动过程中防止自动升级数据字典表。
core-file
如果mysqld突然宕机,普遍情况下都会写一个core核心文件。核心文件体现mysqld进程的状态和内存映像。在Linux中coredump功能是当应用程序异常时,内核默认的一种异常信号处理机制,内核会把异常信息与进程内存转储成coredump文件,程序员通过gdb工具可以离线分析应用程序异常时的情况。
当然需要配合innodb_buffer_pool_in_core_file使用,innodb引擎缓冲区信息输出。
mysqld --core-file --innodb-buffer-pool-in-core-file=ON
备注:
MADV_DONTDUMP是核心转储,指的是在进程发生错误时,将进程地址空及其一些特定状态数据保存到磁盘文件中,以供调试使用。
skip-grant-tables
跳过授权表会导致服务器不读取mysql系统模式中的授权表,从而启动时根本不使用特权系统。当忘记root密码的时候,是常用的最有效的手段。
虽然skip-grant-tables启动服务器会禁用身份验证检查,但应用用户还是可以正常访问,所以在这种情况下,还会通过skip_networking禁用远程连接,配合使用。
flush
在每个SQL语句之后将所有更改刷新(同步)到磁盘。比双1设置(sync_binlog和innodb_flush_log_at_trx_commit) 更严谨。
port-open-timeout
在某些系统上,当服务器停止时,TCP/IP端口可能不会立即变得可用。如果服务器随后快速重新启动,则重新打开端口的尝试可能会失败。此选项表示如果无法打开TCP/IP端口,服务器应该等待多长秒才能使其空闲。默认为不等待。
transaction-read-only
设置事务访问模式,有效的组织事务性引擎的写操作。可以一些特定情况下使用。跟账号级别的read_only模式效果相似。
validate-config
验证服务启动配置文件my.cnf . 如果没有发现错误,则服务器终止,退出码为0。如果发现错误,服务器将显示一条诊断消息,并以退出码1终止。
是验证配置文件有效的手段。
slow-start-timeout
(仅限Windows),此选项控制Windows服务控制管理器的服务启动超时。该值是服务控制管理器在启动期间试图终止windows服务之前等待的最大毫秒数(默认 15秒)。如果MySQL服务启动时间过长,可能需要增加这个值。值为0表示没有超时。
no-monitor
(仅限Windows)。该选项抑制了用于实现RESTART语句的fork: fork使一个进程充当另一个进程的监视器,而另一个进程充当服务器。对于使用此选项启动的服务器,RESTART只是退出而不重新启动。mysql8.0 简便命令RESTART,这个参数完全,可以应用于所有平台,防止一些误启动。
allow-suspicious-udfs
此选项控制是否可以加载主函数只有xxx符号的可加载函数。默认情况下,该选项处于关闭状态,只能加载具有至少一个辅助符号的可加载函数;这可以防止从包含合法函数的共享对象文件加载函数。
默认情况下,该选项处于禁用状态,以防止从共享库文件加载函数,而不是从包含合法可加载函数的共享库文件中加载函数。
属于安全参数。用户自定义函数就需要注意下。
defaults-extra-file
启动服务时,通过defaults-file可以指定my.cnf文件。extra是my.cnf之外,一些额外配置的配置内容。
mysqld --defaults-file=/etc/my.cnf --defaults-extra-file=/etc/my01.cnf --user=mysql &
除此之外 ,使使用–defaults文件,mysqld也会读取data目录下的mysqld-auto.cnf文件
external-locking
外部锁定是使用文件系统锁定来管理多个进程对MyISAM数据库表的争用。外部锁定用于不能假设MySQL服务器等单个进程是唯一需要访问表的进程的情况。如果在lockd无法完全工作的系统(如Linux)上使用此选项,则mysqld很容易死锁。
- 环境下使用禁用外部锁定 --skip-external-locking。
- 外部锁定仅影响MyISAM表访问。
总结
从mysqld help上还有诸多参数,可了解。有些在SHOW VARIABLES并不存在,只能在启动时配置。 在实际环境中这些参数使用率,还是比较低的。但以防万一,出现不可预测的问题,这些参数还是有一定的作用,解决问题。
参考
https://dev.mysql.com/doc/refman/8.0/en/server-options.html