WSL2 Ubuntu18.04 升级mysql8.0卸载安装踩坑全过程

WSL2 Ubuntu18.04 升级mysql8.0卸载安装踩坑全过程

环境

情况

Window11+WSL2+Ubuntu18.04,从mysql5.7升级到8.0后启动服务失败,于是卸载重装。

报错

  • 运行service mysql(d) start,报错unrecognized service
  • 运行mysql,报错Connection error: Can't connect to local MySQL server through ***.sock

搜索说这种情况可以通过:【在安装目录找到mysql.server,更名为mysqld拷贝至/etc/init.d】来解决,但是我在安装目录没找到mysql.server(只有mysql_multi.server),/etc/init.d/mysqld也不存在,显然注册mysqld服务,无法用service mysql(d) 相关的任何命令。

rpm命令查询不到mysql安装记录(可能是因为rpm命令必须搜索包全名/环境友好名称);但是mysql --version可以看到已安装的mysql版本,说明确实已安装。于是决定根据报错逐步解决问题。

如何彻底卸载&安装:参考

如何查询安装目录:参考

查看我的安装目录:

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.09 sec)

解决

如何在mysqld未注册为系统服务时运行mysql

mysqld(mysql deamon)是服务端程序,是mysql提供服务的主要程序,提供服务的还有很多其它的程序,见mysql安装目录的bin目录。其中,可以用以下两个程序来启动/关闭mysql:

$ mysqld_safe --user=mysql &
$ mysqladmin -u[username] -p[password] shutdown

mysqld是用来启动mysql数据库的命令,mysql是打开并执行sql语句的命令。mysql.sock是随每一次 mysql server启动生成的。因此在未启动服务的情况下,直接运行mysql命令,会报错找不到*.sock。

mysqld_safe --user=mysql后加一个’&‘:默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的。

这样即可解决:

$ mysqld_safe --user=root & //启动服务
2022-10-08T08:39:28.523990Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2022-10-08T08:39:28.548207Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
//该命令不结束/进程切换到后台,就说明运行正常
//若命令一直运行,重开一个终端继续执行以下指令

$ sudo mysqld --user=root
//该命令不结束就说明运行正常

$ mysql -uroot -p 


$ mysqladmin -uroot -p[password] shutdown //关闭服务

你可能会遇到的问题:

首先,可以通过以下命令查看报错记录:

$ cat /var/log/mysql/error.log

[ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root

一般情况下,mysql禁止root用户登陆数据库。

解决方法

  1. 在命令行上添加参数--user=root,这样每次都要添加,有点麻烦
  2. 编辑/etc/my.cnf,对对应标签([mysql]/[mysqld])添加user=root的设置

ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO/YES)

禁止访问数据库。

解决方法

  1. 在my.cnf中对[mysqld]添加skip-grant-tables
  2. 注意,输错密码也会产生该报错

mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists.

运行mysqld_safe --user=root &的时候报错,套接字文件不存在。

查看日志:

$ cat /var/log/mysql/error.log

报错:[ERROR] [MY-010273] [Server] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock.

网上搜到的解决方法:这种错误一般都是目录不存在或者权限不足,所以我们直接使用命令 mkdir -p /var/run/mysqld/ 创建该目录即可,然后可以设置目录权限 chown -R mysql:mysql /var/run/mysqld/

但是尝试之后发现,该解决方法重启就无用,因为在run文件夹中,一没权限,二每次重启都会清空该文件夹,所以给干脆在配置my.cnf中改变路径。

[mysqld_safe]
user=root
socket=/var/lib/mysql/mysql.sock

mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

[mysqld_safe]
pid-file=/var/lib/mysql/mysqld.pid

该报错原因与解决方法同上。

Failed to set datadir to ‘/usr/elp/’ (OS errno: 2 - No such file or directory)

在/usr/elp/目录中设置数据仓库失败了,查看了一下发现usr文件夹中不存在elp,所以直接mkdir /usr/elp

/etc/my.cnf

修改后配置文件如下。

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
user=root
skip-grant-tables
[mysql]
user=root
socket=/var/lib/mysql/mysql.sock
[mysqld_safe]
user=root
pid-file=/var/lib/mysql/mysqld.pid
socket=/var/lib/mysql/mysql.sock
[mysqladmin]
user=root
socket=/var/lib/mysql/mysql.sock

找不到/etc/my.cnf怎么办:

可以在mysql --help中查看配置文件的优先路径,或者用该命令查看:

$ [which msyqld的output] --verbose --help |grep -A 1 'Default options'
//我的是:
$ /usr/sbin/mysqld --verbose --help |grep -A 1 'Default options'

一般是/etc/my.cnf, /etc/mysql/my.cnf, ~/*.cnf,可以在/etc中直接sudo vim /etc/my.cnf创建一个。

WSL2开机自启mysql服务

wsl中无法通过rc-local.service来实现开机自启,所以通过在windows中开机自启脚本来实现。

在wsl2中:

$ sudo vim /etc/init.wsl

//在init.wsl中输入
#! /bin/sh
service mysqld_safe
#此处测试过/etc/init.d/mysqld_safe &的写法,不太灵光
# any other scripts

$ chmod +x /etc/init.wsl //给予可执行权限

注意:这里需要先使用which mysqld_safe查看运行路径,为/usr/bin/mysqld_safe,将mysqld_safe拷贝至/etc/init.d,并用chmod命令赋予可执行权限。

$ chmod +x /etc/init.d/mysqld_safe

事实上到这里也可以直接在终端通过service mysqld_safe命令来启动mysql服务了,但是mysqld_safe是没有返回值的,会一直运行,需要再开一个终端。

在windows中:

win+r,输入shell:startup,在启动文件夹中创建自启动脚本LinuxStart.vbs

LinuxStart.vbs

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d [distro] -u [username] /etc/init.wsl",vbHide 

vbHide参数要求静默执行init.wsl中的命令;并隐藏命令行窗口在后台运行,进程名为wsl.exe;如需前台弹窗运行,去掉vbHide参数即可。

distro填对应发行版,这里我使用的发行版是Ubuntu-18.04,替换为对应的发行版即可,可以在windows终端中用wsl -l查看发行版名称。

重启检测,现在终于可以直接使用mysql命令了~~!

参考:

service: no such service mysqld 与MySQL的开启,关闭和重启

你可能感兴趣的:(数据库,mysql,服务器,linux,sqlserver)