故障分析 | 配置文件添加参数后数据库起不来了?


挑灯看剑
挑灯看剑 2023-11-01 16:44:33 50551
分类专栏: 资讯

1背景信息

客户要将数据库数据迁移到 DMP[1] 平台上,需要根据源库的配置修改相应参数(例:lower_case_table_names=0),但发现在配置文件添加好参数后数据库起不来了。

mysql-error.log

...........
2023-08-23T15:22:01.554471+08:00 0 [Note] Plugin 'FEDERATED' is disabled.
2023-08-23T15:22:01.557909+08:00 0 [Note] Semi-sync replication initialized for transactions.
2023-08-23T15:22:01.557926+08:00 0 [Note] Semi-sync replication enabled on the master.
2023-08-23T15:22:01.557976+08:00 0 [ERROR] unknown variable 'lower_case_table_names<C2>= 0'
2023-08-23T15:22:01.557982+08:00 0 [Note] Starting ack receiver thread
2023-08-23T15:22:01.557987+08:00 0 [ERROR] Aborting
 
2023-08-23T15:22:01.558028+08:00 0 [Note] Binlog end
............

分析

因为查看 MySQL 的 error log 中显示参数问题,于是就将添加的参数注释掉,发现注释后可以正常启动数据库,于是就定位到参数上。

因为该参数是从文档上直接粘贴出来的,于是又手打出了相同的参数,发现可以正常重启。

确定了是由于粘贴的参数出现了问题。

[root@b 4444]# cat  /opt/mysql/etc/4444/my.cnf |tail -n 3
#lower_case_table_names = 0
 
lower_case_table_names = 0
[root@b 4444]# systemctl restart mysqld_4444.service

2本地复现

将参数粘贴到配置文件中后重启数据库。

[root@b ~]# cat  /opt/mysql/etc/4444/my.cnf |tail -n 2
lower_case_table_names = 0
 
[root@b ~]# systemctl restart mysqld_4444.service
Job for mysqld_4444.service failed because the control process exited with error code. See "systemctl status mysqld_4444.service" and "journalctl -xe" for details.

#mysql-error.log
......
2023-08-23T16:03:15.775792+08:00 0 [Note] Plugin 'FEDERATED' is disabled.
2023-08-23T16:03:15.778066+08:00 0 [Note] Semi-sync replication initialized for transactions.
2023-08-23T16:03:15.778082+08:00 0 [Note] Semi-sync replication enabled on the master.
2023-08-23T16:03:15.778119+08:00 0 [ERROR] unknown variable 'lower_case_table_names<C2>= 0'
2023-08-23T16:03:15.778125+08:00 0 [ERROR] Aborting
 
2023-08-23T16:03:15.778120+08:00 0 [Note] Starting ack receiver thread
2023-08-23T16:03:15.778143+08:00 0 [Note] Binlog end
......

在配置文件中手打该参数并重启数据库。

[root@b ~]# cat  /opt/mysql/etc/4444/my.cnf |tail -n 2
#lower_case_table_names = 0
lower_case_table_names = 0
[root@b ~]# systemctl restart mysqld_4444.service
[root@b ~]# ps -ef |grep mysqld
actiont+ 20393     1  3 16:07 ?        00:00:00 /opt/mysql/base/5.7.25/bin/mysqld --defaults-file=/opt/mysql/etc/4444/my.cnf --daemonize --pid-file=/opt/mysql/data/4444/mysqld.pid --user=actiontech-mysql --socket=/opt/mysql/data/4444/mysqld.sock --port=4444
root     23821  2821  0 16:07 pts/0    00:00:00 grep --color=auto mysqld

可得出确实是粘贴的参数格式有问题,来看一下是由于什么问题引起的。

方法 1:hexdump

hexdump 是 Linux 下的一个二进制文件查看工具,它可以将二进制文件转换为 ASCII、八进制、十进制、十六进制格式进行查看。默认显示方式是十六进制。

通过对比可以知道是前一个参数“=”前后的空格为特殊字符。

302 240:为文档或网页中的不间断空格,是 UTF-8 的字符不与 ASCII 兼容,所以执行参数出现报错。

不间断空格和普通空格的区别是:页面展示涉及到换行的时候,普通空格位置会截断换行,而这个特殊空格则不会截断。

方法 2:od

od 用于将指定文件内容以八进制、十进制、十六进制、浮点格式或 ASCII 编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。od 默认显示方式是八进制。

同样通过对比可以知道是前一个参数“=”前后的空格为特殊字符。

302 240:同上。

方法 3:编辑器

这里以 Sublime Text 为例。将添加参数粘贴到 Sublime Text 编辑器上,使用 UTF-8 编码打开,显示粘贴的参数确实有特殊字符。

通过 <0xa0> 也可知该符号为 Unicode 字符中的不间断空格。

3总结

在日常运维中,如果需要在配置文件中添加参数,最好不要直接从文档或网页上粘贴参数。建议通过 DMP 等运维平台修改参数或者通过手打来添加或修改参数。

如果需要粘贴大量参数,最好重启前检查一下粘贴参数的编码中是否包含特殊字符。

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=27999
赞同 1
评论 0 条
挑灯看剑L0
粉丝 0 发表 9 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2944
【软件正版化】软件正版化工作要点  2863
统信UOS试玩黑神话:悟空  2823
信刻光盘安全隔离与信息交换系统  2718
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1251
grub引导程序无法找到指定设备和分区  1217
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  163
点击报名 | 京东2025校招进校行程预告  162
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  160
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  157
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!