Ubuntu 20.04下替换MySQL 5.7.41为MariaDB 10.3.38后服务启动异常求助
嗨,Markus,我来帮你梳理下这个问题的根源和解决办法:
首先,虽然systemctl status mariadb显示服务是active (running)的,但报错来自/etc/mysql/debian-start脚本——这个脚本是MariaDB在Debian/Ubuntu系统里自带的启动后维护脚本,会自动执行数据库升级检查、初始化等操作。它尝试以无密码的方式用root@localhost登录,但你的MariaDB root用户目前仅设置了密码认证,所以触发了ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的错误。
解决步骤
登录MariaDB:用你目前能正常访问的命令登录:
mariadb -u root -p<password>为root用户添加Unix Socket认证方式:执行以下SQL语句,这样既保留你现有的密码登录方式,又允许本地系统root用户通过Unix Socket无密码登录(debian-start脚本会用这个方式):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket OR mysql_native_password USING '*9FA783C4FXXXXXX1ED0640ACBFDF68A2B354E18A'; FLUSH PRIVILEGES;注意:
USING后面的哈希值要保留你现有SHOW GRANTS结果里的那个密码哈希,不要替换成明文密码。重启MariaDB服务并验证:
sudo systemctl restart mariadb sudo systemctl status mariadb查看日志部分,应该不会再出现那个
Access denied的错误了,debian-start脚本也能正常完成后续的维护操作。
补充说明
这个问题的本质是MySQL 5.7和MariaDB在Debian/Ubuntu环境下的默认认证逻辑差异:MySQL 5.7默认给root用户设置密码认证,而MariaDB的系统维护脚本默认依赖Unix Socket认证(允许本地系统root用户无需密码直接登录数据库root)。替换后你沿用了MySQL的密码认证方式,但没配置Socket认证,导致维护脚本登录失败。
备注:内容来源于stack exchange,提问作者Clueless

