mariadb是mysql的开源分支,由原开发者为规避oracle闭源风险而创建,完全兼容mysql的api和命令行,但功能更丰富、更新更快、许可证更开放。

确认 MariaDB 正在运行且必须先停掉
Debian 12 默认预装 mariadb-server,服务名是 mariadb,不是 mysql。不先停它,后续安装 MySQL 8.0 会因端口(3306)被占、socket 文件冲突或初始化失败直接报错。
执行以下三步检查并清理:
-
sudo systemctl status mariadb—— 若显示active (running),立刻sudo systemctl stop mariadb -
ps aux | grep -E '(mariadb|mysqld)'—— 若仍有进程残留,用kill -9杀掉 -
sudo ss -tlnp | grep ':3306'—— 确认 3306 端口没被任何进程监听
purge 所有 MariaDB 包(含 mysql-common)
只用 apt remove 不够,mysql-common 这个包常被忽略,但它提供全局配置和符号链接,不 purge 会导致新 MySQL 安装时覆盖失败或 mysql 命令指向旧二进制。
执行:
sudo apt purge mariadb-server mariadb-client mariadb-common mysql-common -ysudo apt autoremove -y && sudo apt autoclean- 再跑一遍
dpkg -l | grep -i mariadb和dpkg -l | grep -i mysql,输出应为空
删干净残留文件和用户
卸载包不会自动删数据目录、配置、socket、日志和系统用户,这些全留着就会让 MySQL 8.0 初始化失败(提示 Can't create test file /var/lib/mysql/... 或 Directory not empty)。
手动清理关键路径:
sudo rm -rf /var/lib/mysql /etc/mysql /var/log/mysql /run/mysqldsudo rm -f /etc/my.cnf /etc/mysql/debian-start /var/run/mysqld/mysqld.sock*-
sudo userdel -r mysql 2>/dev/null(若提示不存在可忽略) - 最后验证:
which mysqld、find / -name "*mysql*" 2>/dev/null | head -5,不应有有效输出
添加 MySQL 官方 APT 仓库并安装 8.0
Debian 12 的默认源里没有 MySQL 8.0,只有 MariaDB;直接 apt install mysql-server 装出来的仍是 MariaDB。必须用 Oracle 官方的 mysql-apt-config 包切换仓库。
操作顺序不能错:
- 下载对应 Debian 12(代号
bookworm)的仓库包:wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb - 安装并交互选择:运行
sudo dpkg -i mysql-apt-config_*.deb→ 用方向键选中mysql-8.0→ Tab 切到Ok→ 回车 - 更新并装服务:
sudo apt update && sudo apt install mysql-server -y - 安装过程会弹出密码设置界面,**不要跳过或留空**;若错过,后续改密码方式和 5.7 不同(要用
ALTER USER ... IDENTIFIED WITH mysql_native_password)
最易被忽略的是:MySQL 8.0 默认启用 caching_sha2_password 认证插件,老客户端连不上时不是服务没启,而是认证方式不兼容——这个坑得提前心里有数。











