MySQL 配置文件添加参数后服务起不来了
如何正确地向数据库添加配置参数。
作者:王雅蓉,DBA,负责 MySQL 日常问题处理和 DMP 产品维护。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 1000 字,预计阅读需要 3 分钟。
背景信息
客户要将数据库数据迁移到 DMP 平台上,需要根据源库的配置修改相应参数(例: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
本地复现
将参数粘贴到配置文件中后重启数据库。
[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 字符中的不间断空格。
总结
在日常运维中,如果需要在配置文件中添加参数,最好不要直接从文档或网页上粘贴参数。建议通过 DMP 等运维平台修改参数或者通过手打来添加或修改参数。
如果需要粘贴大量参数,最好重启前检查一下粘贴参数的编码中是否包含特殊字符。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
SQLE 获取

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SaaS 出海,如何搭建国际化服务体系?(二)
防噎指南:这可能是你看到的干货含量最高的 SaaS 出海经验分享,请准备好水杯,放肆食用(XD。 当越来越多中国 SaaS 企业选择开启「国际化」副本,出海便俨然成为国内 SaaS 的新·角斗场。 LigaAI 观察到,出海浪潮助生了许多「Day One 就做国际化」的产品和团队,而出海大军中也不乏在国内已经完成 PMF 的熟悉面孔。一个主要由中国人构成的团队在推进海外产品落地的过程中,可能会遇到哪些困难?是否能以行之有效的「避雷方案」,加快行军速度,一路披荆斩棘? 为解答心中的疑惑, #Liga妙谈#第九期特别邀请 Aftership 全球客户成功副总裁刘徽(Sean)一起探讨中国 SaaS 企业出海的「路与行」,并为大家献上可复制、可实践、可落地的出海实操技巧。 全系列内容共分为三篇,本篇为第二篇:关于国际化服务体系搭建的两种模式的探讨。 中国 SaaS 企业出海会遇到哪些常见难题? 哪些 SaaS 产品或团队更适合发展出海业务? 大/中/小型企业如何落地国际化服务体系? 异步团队如何开展更高效的跨时区协作? 03 国际化服务体系搭建的两种模式 LigaAI:出海的 SaaS 企业...
- 下一篇
OpenNJet 支持维护 Proxy_protocol V2
NGINX 向云原生演进,All in OpenNJet proxy_protocol_V2功能 背景 proxy_protocol 介绍: 代理协议(Proxy protocol),是HAProxy的作者Willy Tarreau于2010年开发和设计的一个Internet协议,通过为tcp添加一个很小的包头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络情况复杂又需要获取用户真实IP时非常有用。 代理协议分为V1和V2两个版本,V1是人类易读的,V2是二进制格式的,并且支持tlv 功能。 v1介绍 : Proxy protocol V1的格式如下: PROXY 协议栈 源IP 目的IP 源端口 目的端口 rn 例如: PROXY TCP4 192.168.0.1 192.168.0.11 56324 443\r\n GET / HTTP/1.1\r\n Host: 192.168.0.11\r\n \r\n v2 介绍 : 相比V1,v2利用二进制格式以实现更高的解析效率,并可以增加特定的扩展属性(TLV) 在标准的地址信息后,如果有额外的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路