Ubuntu 22.04 默认用 auth_socket 插件限制 root 密码登录,需执行 ALTER USER 切换为 mysql_native_password 并 FLUSH PRIVILEGES;必须运行 mysql_secure_installation(VALIDATE PASSWORD 可选关闭);远程访问需改 bind-address、放行 3306 端口、创建 % 用户授权。

Ubuntu 22.04 上用 apt 装 MySQL 8.0 是最稳妥的路径,但装完不能直接连 root 密码登录——默认用了 auth_socket 插件,必须手动切到 mysql_native_password 才能用密码连。
为什么 mysql -u root -p 会报错 Access denied?
这是 Ubuntu 22.04 + MySQL 8.0 的默认行为,不是安装失败。系统创建的 root@localhost 用户被绑定了 auth_socket 认证插件,只允许通过 sudo mysql(即 Unix socket + 系统用户权限)登录,不认密码。
- 验证方式:执行
sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user='root';",看到plugin列是auth_socket就对了 - 修复操作:先
sudo mysql进去,再执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码';,然后FLUSH PRIVILEGES; - 别跳过
FLUSH PRIVILEGES,否则改完不生效
mysql_secure_installation 必须跑,但 VALIDATE PASSWORD 组件建议关
这个脚本不是可选项,它会删掉匿名用户、测试库、禁用远程 root 登录——跳过等于留后门。但其中的密码强度校验组件(VALIDATE PASSWORD)在小项目或 CI 环境里反而碍事:
- 启用后,
root密码必须含大小写字母+数字+特殊字符,且不能是常见词;而很多自动化部署脚本传的密码是固定字符串,容易卡在这一步 - 如果你确认环境可控(比如本地开发机、内网测试服务器),在提示
Would you like to setup VALIDATE PASSWORD component?时直接输n - 如果已启用又想关,进 MySQL 后执行
UNINSTALL COMPONENT 'file://component_validate_password';
远程访问连不上?先查三处配置
装完默认只能本地连,要让外部程序(比如 Python 应用、Navicat)连上,得动三处:
-
网络绑定:编辑
/etc/mysql/mysql.conf.d/mysqld.cnf,把bind-address = 127.0.0.1改成bind-address = 0.0.0.0或注释掉这行 -
防火墙放行:运行
sudo ufw allow 3306(如果开了 ufw);云服务器还要检查安全组是否放开 3306 端口 -
用户权限:不能只改
root@localhost,得新建用户并授权远程主机,例如:CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Pass123!'; GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'appuser'@'%'; FLUSH PRIVILEGES;
字符集和排序规则不用调,但得知道默认值
MySQL 8.0 在 Ubuntu 22.04 源里默认就是 utf8mb4 字符集 + utf8mb4_0900_ai_ci 排序规则,建库建表都不用额外指定,中文、emoji、生僻字全支持。
- 验证方式:连进去后执行
SHOW VARIABLES LIKE 'character_set%';和SHOW VARIABLES LIKE 'collation%'; - 唯一要注意的是老应用迁移:如果原来用的是
utf8(实际是utf8mb3),建表语句里显式写了CHARACTER SET utf8,得手动改成utf8mb4,否则插入 emoji 会截断 - 别碰
my.cnf里加default-character-set—— 这个参数在 8.0 已废弃,加了会导致 mysqld 启动失败
真正麻烦的从来不是装,而是装完那几处“默认不让你连”的设计:认证插件、本地绑定、权限范围。盯住这三点,比背一百条命令都管用。


















