mysql - Windows 中的 Ubuntu Linux 18.04 WSL:MariaDB 服务启动失败
问题描述
在我的 Linux WSL for Windows 中首次安装 MariaDB 存储库配置工具后(如MariaDB 下载页面中所述),我执行mysql
了但出现了套接字错误。netstat -apn | grep mysql
什么都不显示,表示mysql服务已停止;sudo apt list | grep *mysql-server*
说明我已经安装成功了mysql-server
。
但是,正如我尝试sudo service mysql start
的那样,命令行给出:
* Starting MariaDB database server mysqld [fail]
我尝试了以下方法,但都失败了并得到了相同的答案:
- 使用
/etc/init.d/mysql start
- 删除
/var/lib/mysql/ib_logfile0
和/var/lib/mysql/ib_logfile1
- 升级使用
/var/lib/mysql
权限chmod -R 777 /var/lib/mysql
- 删除一切
/var/lib/mysql/
port=1112
使用in更改端口设置/etc/my.cnf
(因为我在 Windows 端有另一个 mysql)- 填写附加信息
/etc/my.cnf
(我的配置文件安装后最初是空的,我填写了basedir
,datadir
,socket
,log_error
, 和pid-file
属性) - 尝试
systemctl
代替service
(这失败了,因为 Linux WSL 使用sysvinit
代替systemd
)
如何启动我的 MariaDB 服务?谢谢
解决方案
我能够在 WSL1 上重现您的问题(或看起来非常相似的问题)。你能确认你使用的是 WSL1 吗?
我启动了 Ubuntu 20.04 的两个克隆实例(wsl --import
一个干净的备份)——一个在 WSL1 上,另一个在 WSL2 上。不幸的是,我没有一个方便的 18.04 可以使用,但我希望问题是一样的。
在 WSL2 上,一切正常。在安装步骤之后(几乎是您在评论中添加的那些,但对于 20.04),我能够:
sudo service mariadb start
然后sudo mysql -u root
成功。
然而,在 WSL1 上,MariaDB 安装似乎以一种奇怪的方式失败。它不会创建/etc/mysql/mariadb.cnf
,这会导致您看到空的/etc/mysql/my.cnf
,因为它是指向 的符号链接mariadb.cnf
。
所以我手动创建了 mariadb.cnf:
sudo vi /etc/mysql/mariadb.cnf
内容:
# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 0. "/etc/mysql/my.cnf" symlinks to this file, reason why all the rest is read.
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# If you are new to MariaDB, check out https://mariadb.com/kb/en/basic-mariadb-articles/
#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]
# Port or socket location where to connect
# port = 3306
socket = /run/mysqld/mysqld.sock
# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/
这只是mariadb.cnf
WSL2 上安装正确创建的默认值。
尝试启动服务然后给出了一个关于缺失的错误/etc/mysql/debian-start
,所以我重复了复制它的相同步骤:
sudo vi /etc/mysql/debian-start
与内容:
#!/bin/bash
#
# This script is executed by "/etc/init.d/mariadb" on every (re)start.
#
# Changes to this file will be preserved when updating the Debian package.
#
# NOTE: This file is read only by the traditional SysV init script, not systemd.
#
source /usr/share/mysql/debian-start.inc.sh
# Read default/mysql first and then default/mariadb just like the init.d file does
if [ -f /etc/default/mysql ]; then
. /etc/default/mysql
fi
if [ -f /etc/default/mariadb ]; then
. /etc/default/mariadb
fi
MYSQL="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf"
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
# Don't run full mysql_upgrade on every server restart, use --version-check to do it only once
MYUPGRADE="/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --version-check"
MYCHECK="/usr/bin/mysqlcheck --defaults-file=/etc/mysql/debian.cnf"
MYCHECK_SUBJECT="WARNING: mysqlcheck has found corrupt tables"
MYCHECK_PARAMS="--all-databases --fast --silent"
MYCHECK_RCPT="${MYCHECK_RCPT:-root}"
## Checking for corrupt, not cleanly closed (only for MyISAM and Aria engines) and upgrade needing tables.
# The following commands should be run when the server is up but in background
# where they do not block the server start and in one shell instance so that
# they run sequentially. They are supposed not to echo anything to stdout.
# If you want to disable the check for crashed tables comment
# "check_for_crashed_tables" out.
# (There may be no output to stdout inside the background process!)
# Need to ignore SIGHUP, as otherwise a SIGHUP can sometimes abort the upgrade
# process in the middle.
trap "" SIGHUP
(
upgrade_system_tables_if_necessary;
check_root_accounts;
check_for_crashed_tables;
) >&2 &
exit 0
接着chmod 755 /etc/mysql/debian-start
之后,瞧:
sudo service mariadb restart
sudo mysql -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.5.8-MariaDB-1:10.5.8+maria~focal mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
鉴于您迄今为止尝试过的步骤,我建议您将几乎所有这些都吹走以尝试“干净”重新开始:
sudo apt remove mariadb-server
sudo apt autoremove
sudo rm -rf /etc/mysql
sudo rm -rf /var/lib/mysql
sudo rm -rf /usr/lib/mysql
然后重新安装 mariadb-server 并按照上述步骤创建正确的文件。
推荐阅读
- react-native - 使用 useCallback 测试 react-native
- python - 无法理解错误消息(Python 中的回归)
- android-studio - Android Studio 腐败怪异:打开完全错误的文件
- python - 隐藏从自定义 CLI 应用程序生成的 json 文件格式数据?
- javascript - 如何增加动物区的价值?使用 javascript 和服务器端函数
- javascript - 将数据追加到一个数组中,而不是使用多嵌套数组
- npm - 如何在不依赖 bower 的情况下运行 web-component-tester 来测试 vanilla web-component
- excel - 如何修复此代码中的“Error438:对象不支持此属性或方法”?
- xcode - Xcode 默认 gcc (mis) 配置为为 iOS 而不是 macOS 编译
- swift - 在 ARKit 中转换 SIMD2 位置和标记