本文记录了在 Ubuntu 20.04 系统下安装 MySQL 8.0、进行安全配置以及修改数据存储目录时遇到的权限问题与解决方案。

09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版

参考来源: CSDN

1. 安装 MySQL 8.0

使用 apt 包管理器进行快速安装:

1
2
3
sudo apt update
sudo apt upgrade -y
sudo apt install mysql-server -y

2. 安全初始化

安装完成后,执行安全脚本以移除默认的不安全设置(如匿名用户、远程 root 登录等)。

1
sudo mysql_secure_installation

按照提示操作,建议:

  • 启用密码强度验证
  • 移除匿名用户
  • 禁止 root 远程登录
  • 移除测试数据库

3. 修改数据存储目录(避坑重点)

默认情况下,MySQL 的数据存放在 /var/lib/mysql。如果需要迁移到独立的硬盘(例如 /mysql/data),需要修改配置文件。

3.1 修改配置文件

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf (或 /etc/my.cnf):

1
2
3
[mysqld]
# 修改 datadir 为新路径
datadir=/mysql/data

3.2 解决 AppArmor 权限报错

修改目录并重启 MySQL 后,可能会遇到启动失败,查看状态 (systemctl status mysql) 发现报错:Error: 13 (Permission denied)

即使你已经将文件夹权限赋予了 mysql:mysql,依然无法启动。这是因为 Ubuntu 的 AppArmor 安全模块限制了 MySQL 进程对文件系统的访问。

解决方法:

编辑 AppArmor 的 MySQL 配置文件:

1
sudo vi /etc/apparmor.d/usr.sbin.mysqld

找到关于 /var/lib/mysql/ 的规则,将其修改为你的新目录,或者新增规则:

1
2
3
# 允许访问新的数据目录
/mysql/data/ r,
/mysql/data/** rwk,

重启 AppArmor 和 MySQL 服务:

1
2
sudo /etc/init.d/apparmor restart
sudo systemctl restart mysql

或者(不推荐)临时关闭 AppArmor:

1
systemctl stop apparmor

4. 密码重置与初始化 troubleshooting

如果忘记 root 密码,可以通过跳过权限表方式重置。

  1. 编辑配置文件,在 [mysqld] 下添加:
    1
    skip-grant-tables
  2. 重启服务。
  3. 无密码登录 MySQL:
    1
    mysql -u root
  4. 执行重置 SQL:
    1
    2
    3
    4
    5
    flush privileges;
    use mysql;
    -- MySQL 8.0 修改密码语法
    alter user 'root'@'localhost' identified by '你的新密码';
    flush privileges;
  5. 移除 skip-grant-tables 并重启服务。

注意:如果是 Systemd 管理的服务,修改用户或目录后,需确保 /lib/systemd/system/mysql.service 中的 UserGroup 设置正确。