从零开始学mysql - 系统参数和配置(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 从零开始学mysql - 系统参数和配置(上)

前言


本节我们来讲述关于MYSQL的系统启动命令相关内容,也是比较基础但是可能有些人会很模糊的内容,本节的核心也是讲述配置有关的内容


思维导图


导图地址:www.mubucm.com/doc/7DDOY0C…


网络异常,图片无法展示
|


概述


下面是对于本文的简单提要:

  1. ,命令行的命令格式
  1. 单划线和双划线
  1. 配置文件
  1. 配置文件读取顺序
  1. window,mac,Linux的配置读取顺序对比
  1. 配置文件的内容
  2. 特定版本配置
  3. 配置文件优先级
  1. 多配置文件和单文件配置的读书特性:总是以最后为准
  1. 自定义配置读取:通常为命令行指定读取
  1. 系统变量的配置
  1. 查看系统变量
  2. 设置系统变量
  3. 运行时的系统变量
  1. 作用范围:全局变量和会话变量
  2. 全局变量和会话变量设置
  3. 查看系统变量的范围
  1. 系统变量的注意事项
  2. 启动选项和系统变量的区别
  3. 状态变量的补充
  1. 如何查看状态变量


命令行命格式



单划线和双划线命令格式


命令行命令就是我们通常连接mysql使用的命令,命令行的命令一般分为两种,首先是双划线的命令,比如使用mysqld --skip-networing 就可以禁止客户端连接,这种命令也被称之为长命令,使用命令的时候需要使用--两个短划线进行拼接,另一种是更为常用的命令-h-p等命令, 这样的命令只需要一个短划线即可(为--host,--port的命令简称)。

命令的另一种写法是使用下划线进行替代,--skip_networing。

单划线命令效果如下,服务端开启禁止客户端登陆之后使用客户端连接就不允许了:


mysql -h127.0.0.1 -uroot -p
    Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)


另外一个案例是服务端启动的默认创建表引擎,比如我们需要改为InnoDB引擎在使用命令的时候加上--default-storage-engine=InnoDB选项,最后只要在任意的数据库下创建一张表,在末尾可以发现表的的存储引擎变了,当然默认的存储引擎看不到效果,可以使用MyISAM进行验证:


ENGINE=MyISAM DEFAULT CHARSET=utf8


mysql的默认安装之后启动会自动附加一些参数,比如下面的命令,这里有个命令的重要使用规则是不要把变量声明的习惯带进来,在命令的=(等号)两边增加空格是不被允许的


/usr/local/mysql/bin/mysqld --user=_mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/mysqld.local.err --pid-file=/usr/local/mysql/data/mysqld.local.pid --keyring-file-data=/usr/local/mysql/keyring/keyring --early-plugin-load=keyring_file=keyring_file.so


最后如果不清楚如何使用命令,直接使用--help,不过只有一个mysqld的比较特殊,他需要使用--verbose --help才行,记不住也没关系,在--help的命令最后mysql会给我们进行提示,还是比较贴心的(不过我觉得大多数人还是会使用度娘查命令,哈哈。)


For more help options (several pages), use mysqld --verbose --help.


配置文件



虽然命令的方式十分的方便,在启动的时候也有较高的自由度,但是这种方式用的其实并不是很多,实际工作使用配置文件的形式会更多,配件文件的形式是更为常用的也是更容易记忆的方式,但是在了解配置文件之前,我们需要大致了解配置文件的读取顺序。当然不需要牢固的记忆,只要作为了解即可。


配置文件的读取顺序



Window的配置文件读取顺序


Windows不是使用MySQL的重点,但是作为自我练习的时候还是需要了解的,他的配置读取顺序如下。

  1. %WINDIR%\my.ini %windir\my.cnf% (echo %WINDIR%获取)
  2. C:\my.ini C:\my.cnf
  3. Basdir\my.ini basdir\my.cnf(based it指的是默认的安装路径)
  4. Defaults-extra-file 命令行制定的额外配置文件路径
  5. %appdata%\MySQL\ .mylogin.cnf 登陆路径选项(客户端指定,通过echo %APPDATA%可以获取)

上面第一条出现.ini.cnf意味着支持多种后缀文件格式,%windir% 表示为windows的目录位置,通常是C:\windows。另外最后两个配置有点特别,第四个指的是可以利用命令参数:—defaults-extra-file=C:\xxxx\xxx\xxx.txt这样的方式指定要读取的配置文件,而最后一个%appdata%指的是windows对应应用程序目录值,另外这个.mylogin.cnf(注意前面的小数点) 这个文件不是和前面一样类似的纯文本,而是使用mysql_config_editor 使用程序的加密文件,文件也只能固定为mysql规定的一些配置信息。(这些配置这里借用官网查看一下)

Mysql_config_editor 这个编辑器是mysql官方开发的一个可执行的文件。具体的参数配置可以参考官方的配置进行处理。


类Unix的配置读取


废话不多说,我们来看下类Unix的系统读取配置,这个配置不同于window需要仔细对待,当然最好能时常回顾,因为Linux上使用mysql的场景会比较多。

  1. /etc/MySQL/my.inf
  2. SYSCONFIGDIR/my.cnf (MySQL的系统安装目录)
  3. %MYSQL_HOME%/my.cnf 仅限服务器的选项
  4. Defaults_extra-file 同样为命令行指定读取
  5. ~/.my.cnf (注意前面的逗号)
  6. ~/.mylogin.cnf 需要mysql_config_editor 的支持并不是纯文本文件

SYSCONFDIR 表示在使用 CMake 构建 MySQL 时使用SYSCONFDIR 选项指定的目录,默认的情况下为/etc的下面。

mysql_home 相信了解环境变量这个概念的都比较熟悉,可以自由选择设置还是不设置,我们可以在配置的环境变量下放置一个my.cnf,但是如果放置之后,内容就不能乱写了,只能放置关于启动服务器程序的相关选项(意味着客户端和服务端端配置可以共存),这里再次强调和.mylogin.cnf文件还是有差别,他的限制更加严格(再次啰嗦注意前面的小数点)。


补充:Mysql.server 会间接调用mysqld_safe 这个命令,而mysqld_safe 的命令会使用mysqld命令,最后mysqld 安装规则当然也会按照规则配置文件,说了这么多结果就是:mysql.server如果发现环境变量配置了my.cnf文件也会进行配置文件的应用

~是属于类unix系统的特殊符号,代表 当前用户登陆的根路径,比如mac下面通常为/User/用户名,通常可以使用home的环境变量查看,由于是每一个用户都存在一个目录,所以最后两个配置的读取顺序其实都是根据不同登陆用户判断的,所以可以在这个目录下面构建这两个“专属”文件。

Defaults-extra-file 指定为:—defaults-extra-file=C:\xxxx\xxx\xxx.txt这样的方式指定要读取的配置文件,和windows的方式一致,因为

.mylogin.cnf 含义和window中也是一样的,需要mysql_config_editor 的支持并不是纯文本文件,也不能随意的更改。


mac系统配置读取


mac系统的配置读取需要一定的获取技巧,可以使用mysql -verbose --help | grep my.cnf 这个命令来获取,可以看到下面的路径和上面讲述的路径大致逻辑是一致的。


./mysql --verbose --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf


但是个人实际寻找的时候发现 没有任何的配置文件,根据网上的资料发现需要去/usr/local/supporting-file下面有一个配置文件的模版,但是个人实际操作之后发现这个文件还是不存在的,最后不得已只能去官网拷贝一份配置文件然后按照上面的打印的规则放到指定的目录去了.....


配置文件内容


了解完配置文件的基本读取顺序之后,下面我们来了解配置文件的内容,这里说一下小插曲,mac的配置文件在/usr/local/mysql中无法发现配置文件,所以这里只好拿官方的样例文件进行解释,为了防止篇幅过长,这里放到了文章的最后部分,从配置文件中首先我们可以看到很多的配置分组,比如如下的形式:


[server] (具体的启动选项...)
[mysqld] (具体的启动选项...)
[mysqld_safe] (具体的启动选项...)
[client] (具体的启动选项...)
[mysql] (具体的启动选项...)
[mysqladmin] (具体的启动选项...)


通过这样的分组之后,可以在不同的分组下可以配置,根据分组的配置项我们又可以分为两种,一种是:选项另一种是选项=选项值,需要注意的是在配置文件中不能编写h=127.0.0.1短链接形式而是全部只能使用 长形式的配置方式,同时配置文件和命令行不同的是允许中间加入空格的,比如slow_query_log    = 0,另外我们可以使用#符号进行注释,比如#xxxx,最后我们再来看下一下命令行的形式:--option--option=optionvalue

分组的意义在于可以将客户端的命令和服务端的命令进行区分,比如下面的不同分组我们可以清晰配置变量的作用范围,也可能更好的规划我们的服务器启动参数或者客户端的连接参数。


[server] 组下边的启动选项将作用于所有的服务器程序。 
[client] 组下边的启动选项将作用于所有的客户端程序


需要注意的是mysql_safemysql.server基本都会间接调用mysqld命令,从命令的读取范围我们也可以了解到为什么建议使用mysql.server或者mysql.safe这两个命令,同时也可以发现mysql的客户端命令只能读取mysql下面的命令以及client下面的命令,通过下面的图表可以发现我们基本上只需要学习两个比较常用的命令mysqld_safemysql.server的读取范围即可。


网络异常,图片无法展示
|


Mysql.server 命令本身就是设计为针对配置文件使用,所以他最终支持的命令行的命令仅仅为 startstop


特定版本的配置


mysql的配置文件支持根据版本号的方式读取配置,比如8.0我们可以配置**[mysqld-8.0],而5.7我们就可以使用[mysqld-5.7]**,他们本身的作用是一致的,但是会根据当前的mysql版本匹配进行生效。


配置文件的优先级



总结起来就是两句话,如下记忆即可:

  • 多个文件s以文件的读取顺序中最后的读取的为最终结果
  • 单文件重复分组按照最后一个组中出现的配置为主


多配置文件的读取


通常情况下除非我们在mysql连接的时候使用指定的配置文件读取路径,否则我们通常使用上面介绍过的配置文件的读取顺序进行读取,这时候有可能出现一种情况就是多个配置文件下出现相同的配置到底应该应用哪一个配置?这里只要记住一条铁律就是最后的读取的为最终结果


单文件重复配置读取


单文件读取的优先级使用的是,按照 最后一个组中出现的配置为主,比如说出现过下面的参数配置,会按照MyISAM的配置进行读取。


[server]
    default-storage-engine=InnoDB
    [mysqld]
    default-storage-engine=MyISAM


自定义指定配置读取


如果你不想记忆那些默认的搜索规则,或者为了保证配置按照自己的想法进行读取,可以使用mysqld --defaults-file=/tmp/myconfig.txt的命令方式指定你需要读取的配置文件路径,但是需要注意--defaults-filedefaults-extra-file 这两个命令是有区别的,defaults-extra-file 可以指定额外的路径而--defaults-file 只能指定一个配置路径。

补充:如果遇到配置文件和命令行出现相同的配置,最后无论配置文件如何进行配置, 一切按照命令行的配置为主


系统变量配置



默认情况下如果我们没有进行任何配置,mysql会默认给我们分配一个配置,比如最大连接数,错误连接次数,或者查询的缓存大小等等变量的配置等,如果我们想要了解当前的配置变量,我们可以使用如下的命令进行查看。


查看系统变量


SHOW VARIABLES [LIKE 匹配的模式];


比如我们按照下面的命令进行运行查看,可以看到数量有几百条,一个个看是看不过来的,所以我们进行系统变量配置的时候会使用某一个大分类下的具体配置进行查看(下面使用了通配符的写法):


mysql> show variables like '%%';
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name                                            | Value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| activate_all_roles_on_login                              | OFF                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| admin_address                                            |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| admin_port                                               | 33062                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| admin_ssl_ca                                             |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| admin_ssl_capath                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| admin_ssl_cert                                           |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| admin_ssl_cipher                                         |          
....
| windowing_use_high_precision                             | ON                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
638 rows in set (0.01 sec)


比如我们想查看当前mysqld服务的默认存储引擎可以使用如下的命令,这时候就会只显示一条数据,感兴趣的读者也可以试一试在连接mysql服务之后执行SHOW VARIABLES like 'max_connections';命令查看效果:


mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)


另外在mysql中想要模糊的查看某一个项目的配置,可以使用百分号%进行通配符搜索,比如下面这样:


mysql> show variables like 'mysql%';
+---------------------------------------------+----------------------------------------+
| Variable_name                               | Value                                  |
+---------------------------------------------+----------------------------------------+
| mysql_native_password_proxy_users           | OFF                                    |
| mysqlx_bind_address                         | *                                      |
| mysqlx_compression_algorithms               | DEFLATE_STREAM,LZ4_MESSAGE,ZSTD_STREAM |
| mysqlx_connect_timeout                      | 30                                     |
| mysqlx_deflate_default_compression_level    | 3                                      |
| mysqlx_deflate_max_client_compression_level | 5                                      |
| mysqlx_document_id_unique_prefix            | 0                                      |
| mysqlx_enable_hello_notice                  | ON                                     |
| mysqlx_idle_worker_thread_timeout           | 60                                     |
| mysqlx_interactive_timeout                  | 28800                                  |
| mysqlx_lz4_default_compression_level        | 2                                      |
| mysqlx_lz4_max_client_compression_level     | 8                                      |
| mysqlx_max_allowed_packet                   | 67108864                               |
| mysqlx_max_connections                      | 100                                    |
| mysqlx_min_worker_threads                   | 2                                      |
| mysqlx_port                                 | 33060                                  |
| mysqlx_port_open_timeout                    | 0                                      |
| mysqlx_read_timeout                         | 30                                     |
| mysqlx_socket                               | /tmp/mysqlx.sock                       |
| mysqlx_ssl_ca                               |                                        |
| mysqlx_ssl_capath                           |                                        |
| mysqlx_ssl_cert                             |                                        |
| mysqlx_ssl_cipher                           |                                        |
| mysqlx_ssl_crl                              |                                        |
| mysqlx_ssl_crlpath                          |                                        |
| mysqlx_ssl_key                              |                                        |
| mysqlx_wait_timeout                         | 28800                                  |
| mysqlx_write_timeout                        | 60                                     |
| mysqlx_zstd_default_compression_level       | 3                                      |
| mysqlx_zstd_max_client_compression_level    | 11                                     |
+---------------------------------------------+----------------------------------------+
30 rows in set (0.00 sec)


设置系统变量


我们了解了如何查看系统变量之后,下面我们来学习如何进行系统变量的设置,其实我们在之前已经讲述过如何设置系统变量,比如我们在读取配置文件的时候使用--default-file=xxx的方式自定义读取配置文件的位置,又或者在配置文件里面制定配置然后在启动mysqld服务器进行读取相关的配置,比如上面提到的default-storage-engine=MyISAM,所以配置选项有下面的两种:


  • 通过命令行启动选项
  • 通过配置文件启动选项

所以设置系统变量也没有什么特别的,无非就是这两种方式罢了。

补充:对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线 - 或者下划线 _ 连接起来都可 以,但是对应的系统变量之间必须使用下划线 _ 连接起来

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
存储 缓存 监控
MySQL服务器配置优化:my.cnf参数调优指南
本文深入解析了MySQL核心配置参数及性能优化技巧,涵盖内存结构、调优原则、存储引擎优化、查询性能优化等内容,通过实战案例帮助读者构建高性能MySQL服务器配置,解决常见的性能瓶颈问题。
|
2月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
406 7
|
7月前
|
消息中间件 缓存 弹性计算
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
305 11
|
2月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
354 11
|
8月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
6月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
510 17
|
7月前
|
Ubuntu 关系型数据库 MySQL
在Ubuntu 22.04上配置和安装MySQL
以上就是在Ubuntu 22.04上配置和安装MySQL的步骤。这个过程可能看起来有点复杂,但只要按照步骤一步步来,你会发现其实并不难。记住,任何时候都不要急于求成,耐心是解决问题的关键。
790 30
|
6月前
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
460 11
|
7月前
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
1820 26

推荐镜像

更多