前言
本节我们来讲述关于MYSQL的系统启动命令相关内容,也是比较基础但是可能有些人会很模糊的内容,本节的核心也是讲述配置有关的内容
思维导图
导图地址:www.mubucm.com/doc/7DDOY0C…
概述
下面是对于本文的简单提要:
- ,命令行的命令格式
- 单划线和双划线
- 配置文件
- 配置文件读取顺序
- window,mac,Linux的配置读取顺序对比
- 配置文件的内容
- 特定版本配置
- 配置文件优先级
- 多配置文件和单文件配置的读书特性:总是以最后为准
- 自定义配置读取:通常为命令行指定读取
- 系统变量的配置
- 查看系统变量
- 设置系统变量
- 运行时的系统变量
- 作用范围:全局变量和会话变量
- 全局变量和会话变量设置
- 查看系统变量的范围
- 系统变量的注意事项
- 启动选项和系统变量的区别
- 状态变量的补充
- 如何查看状态变量
命令行命格式
单划线和双划线命令格式
命令行命令就是我们通常连接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的重点,但是作为自我练习的时候还是需要了解的,他的配置读取顺序如下。
- %WINDIR%\my.ini %windir\my.cnf% (echo %WINDIR%获取)
- C:\my.ini C:\my.cnf
- Basdir\my.ini basdir\my.cnf(based it指的是默认的安装路径)
- Defaults-extra-file 命令行制定的额外配置文件路径
- %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的场景会比较多。
- /etc/MySQL/my.inf
- SYSCONFIGDIR/my.cnf (MySQL的系统安装目录)
- %MYSQL_HOME%/my.cnf 仅限服务器的选项
- Defaults_extra-file 同样为命令行指定读取
- ~/.my.cnf (注意前面的逗号)
- ~/.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_safe
和mysql.server
基本都会间接调用mysqld
命令,从命令的读取范围我们也可以了解到为什么建议使用mysql.server或者mysql.safe这两个命令,同时也可以发现mysql的客户端命令只能读取mysql下面的命令以及client下面的命令,通过下面的图表可以发现我们基本上只需要学习两个比较常用的命令mysqld_safe
和mysql.server
的读取范围即可。
Mysql.server 命令本身就是设计为针对配置文件使用,所以他最终支持的命令行的命令仅仅为
start
和stop
特定版本的配置
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-file
和defaults-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
,所以配置选项有下面的两种:
- 通过命令行启动选项
- 通过配置文件启动选项
所以设置系统变量也没有什么特别的,无非就是这两种方式罢了。
补充:对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线 - 或者下划线 _ 连接起来都可 以,但是对应的系统变量之间必须使用下划线 _ 连接起来