今天,在测试我前面写的脚本的时候,在解析MySQL配置文件的时候遇到了问题;
如下:

上面的报错可以得出两个信息:

  1. 脚本中的配置文件:/etc/my.cnf,没有错;
  2. 对配置文件的读取,也没有问题

将上面返回的JSON数据放到校验工具(Bejson.com)中比对JSON格式的正确性:

看到了问题,有一个错误的解析【[mysql]=ENABLE】

去检查下配置文件:

[root@mysql2 etc]# cat /etc/my.cnf | grep "^\["
[client]
[mysql]
[mysql]
[mysqld]
[root@mysql2 etc]# 

因此,问题定位了:MySQL的配置文件中,多了一个组([mysql])的定义。

因此,对于我目前的Python脚本来说,配置文件中不应该存在重名的组。
注释其中重名的组的一个,则脚本执行的问题就可以解决。


下面,来看看关于配置文件的重名组的问题;

一:
这算不算一种配置文件的错误呢?
并不算;

因为,你的配置文件中,即使有重名组,MySQL的服务的启动依旧没有问题;
而你的配置文件中,如果配置了不存在的参数项,则启动MySQL服务的时候,会立即报错,服务无法启动;

二:
既然重名组不算错误,那么第二个问题就来了,对于重名的组,MySQL以哪个为准?
配置文件是顺序执行的,因此,后面的配置会覆盖前面的配置;
因此,对于重名组,MySQL会以,写在后面的配置为主。

具体验证,可以看看下面的过程:

首先,看看我的配置文件:

[root@mysql2 etc]# cat /etc/my.cnf
# Percona Server template configuration
#
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

server-id=2

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqld]
server-id=4
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@mysql2 etc]# 

可以看到,上面配置文件中有,一个和mysqld同名的组配置;
为了验证,因此,其中不同的地方是server-id,一个是3,一个是4;

看看当前,我的MySQL的server-id的配置:

[root@mysql2 etc]# mysql --login-path=mysql_login_as_root -e "show variables like '%server%id%'"
+----------------+--------------------------------------+
| Variable_name  | Value                                |
+----------------+--------------------------------------+
| server_id      | 2                                    |
| server_id_bits | 32                                   |
| server_uuid    | 454cd912-8768-11e9-8346-000c29aa8a98 |
+----------------+--------------------------------------+
[root@mysql2 etc]# 

然后,重启数据库服务:

[root@mysql2 etc]# service mysql stop
Redirecting to /bin/systemctl stop mysql.service
[root@mysql2 etc]# 
[root@mysql2 etc]# service mysql start
Redirecting to /bin/systemctl start mysql.service
[root@mysql2 etc]# 

然后,再看看server-id的变化:

[root@mysql2 etc]# mysql --login-path=mysql_login_as_root -e "show variables like '%server%id%'"
+----------------+--------------------------------------+
| Variable_name  | Value                                |
+----------------+--------------------------------------+
| server_id      | 4                                    |
| server_id_bits | 32                                   |
| server_uuid    | 454cd912-8768-11e9-8346-000c29aa8a98 |
+----------------+--------------------------------------+
[root@mysql2 etc]# 

可以看到,server-id被修改成了4;

至此,关于MySQL配置文件中的重名组以哪一个为准的疑虑,就解决了。


说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒