MySQL 案例整理一个空格引发的MySQL 8.0初始化失败血案

2023年 12月 18日 66.5k 0

一、前言

最近在翻看公司WIKI上自己写过的文章时,看到了一篇MySQL的文章。回想了下,这是公司前段时间考虑到CentOS即将结束技术支持,寻求CentOS可替代操作系统,选择了Rocky和ALma分别进行验证测试。
于是选择在Rocky 8上进行了Oracle和MySQL等数据库的验证测试。

二、问题描述

我因为平时不是主要负责MySQL方向,对MySQL很多知识不是特别的了解,尤其是MySQL 8.0的相关知识。
本次我尝试在Rocky 8来安装部署MySQL 8.0。
首先我选择下载MySQL 8.0.26二进制压缩包到/usr/local下解压。并设置了/etc/my.cnf内容如下:

[client]
socket = /data/mysql/3306/data/mysql.sock

[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
user = mysql
port = 3306
socket = /data/mysql/3306/data/mysql.sock
log-error = /data/mysql/3306/data/mysqld.err
log_timestamps = system

然后分别创建了datadir目录并设置了权限和属组。
以上操作结束,我使用root用户在执行初始化时,执行了如下命令:

[root@opensource-db local]# /usr/local/mysql/bin/mysqld --defaults-file= /etc/my.cnf --initialize

在执行命令前,又检查了下这命令,感觉这命令没什么问题,于是手指敲击Enter键发送了命令。
结果初始化命令执行失败,查看了失败的信息,内容如下:

[root@opensource-db local]# /usr/local/mysql/bin/mysqld --defaults-file= /etc/my.cnf --initialize
2023-04-18T05:21:01.200878Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 28961
2023-04-18T05:21:01.223101Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-04-18T05:21:04.517732Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-04-18T05:21:11.400336Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2023-04-18T05:21:11.401015Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2023-04-18T05:21:11.817137Z 0 [ERROR] [MY-010147] [Server] Too many arguments (first extra is '/etc/my.cnf').
2023-04-18T05:21:11.818465Z 0 [ERROR] [MY-013455] [Server] The newly created data directory /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64/data/ by --initialize is unusable. You can remove it.
2023-04-18T05:21:11.819638Z 0 [ERROR] [MY-010119] [Server] Aborting
2023-04-18T05:21:17.631263Z 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.26) MySQL Community Server - GPL.

三、问题处理

根据报错内容, [ERROR] [MY-010147] [Server] Too many arguments (first extra is ‘/etc/my.cnf’). 提示我是我输入的参数太多,我又好好检查了下我的/etc/my.cnf文件,并和网上的相关资料进行了比对,也请教了从事MySQL数据库的同事,都是没问题的。那问题出在哪呢?百思不得其解。
于是,我又重新对那段命令进行了查看,感觉有些异样的是 /etc/my.cnf前多了一个空格,显得有些不大协调。
那如果将/etc/my.cnf前空格去掉,是否没问题呢?于是,我将初始化的命令进行了修改,修改后的命令如下:

[root@opensource-db local]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize

在执行该命令前,我先将上次初始化报错在有些目录里产生的文件删除。
于是重新执行了该命令,嘿嘿,这次没有执行报错,成功初始化了数据库。执行命令后不输出任何信息表示初始化成功,因为no news is good news。

最后我也就该问题咨询了大名鼎鼎的陈臣老师确实在初始化时不能在/etc/my.cnf前有空格,执行初始化时在–defaults-file= 后面跟了一个空格,空格后是/etc/my.cnf文件,导致未能初始化到指定目录,而是初始化到了 /usr/local/mysql-8.0.26-linux-glibc2.12-x86_64/data/目录下。
解决办法就是初始化时,不能在–defaults-file= 后面保留空格,并且要保证在有多个初始化参数时,要将–defaults-file=/etc/my.cnf放在最前面。
真的细节决定成败啊,有时技术和人生何其相似,问题解决,真的挺开心,又学到一招。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论