mysql默认的数据目录在根目录, 重新系统或者系统更新容易丢失数据, 数据量大时, 会占用太多系统空间, 在生产环境, 这是非常危险的.通常的作法是挂载数据盘, 用于数据存储, 定期快照备份;
修改前准备
- 备份数据(非常重要) /var/lib/mysql, /etc/mysql…等
- 挂载一块数据盘到系统, 本文是: /mnt/www, 并修改/etc/fstab自动挂载
编辑配置
- 先停止mysql服务
sudo systemctl stop mysql
- 复制mysql原数据目录的数据到新目录
# 创建目录
sudo mkdir /mnt/www
# 授权
sudo chmod 777 /mnt/www
# 自动挂载数据盘
sudo vim fstab
# 追加
/dev/sdb1 /mnt/www ext4 defaults 0 0
# a: 保持所有属性, v: 表示打印一些信息, z: 在传输过程中压缩
sudo rsync -avz /var/lib/mysql/ /mnt/www/data/mysql/data
# 检查复制结果
sudo ls -la /mnt/www/data/mysql/data
- 修改datadir
sudo vim /etc/mysql/mysql.cnf
[mysqld]
bind-address = 0.0.0.0
datadir=/mnt/www/data/mysql/data
- 修改 AppArmor配置
sudo vim /etc/apparmor.d/tunables/alias
# 在默认目录和新位置之间创建别名来告诉AppArmor让MySQL写入新目录
alias /var/lib/mysql/ -> /mnt/www/data/mysql/,
sudo vim /etc/apparmor.d/usr.sbin.mysqld
#追加
/www/data/mysql/ r,
/www/data/mysql/** rwk,
# remove mysql apparmor Profile
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
# parse mysql apparmor Profile
sudo apparmor_parser /etc/apparmor.d/usr.sbin.mysqld
# 重启apparmor
sudo systemctl restart apparmor
# 重启mysql
sudo systemctl start mysql
# 登录mysql, 验证
select @@datadir
异常情况
-
mysqld: Can’t change dir to ‘/www/data/mysql’ (Errcode: 13 - Permission denied)
检查/mnt/www, /mnt/www/data/目录是否具有写入权限, 也就是mysql数据目录的上级目录需要写入权限, 自己mkdir出的目录通常有此问题sudo chmod 777 /mnt/www sudo chmod 777 /mnt/www/data/
-
Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock
检查/var/run/mysqld/是否存在, 是否是mysql:mysql用户组 -
apparmor DENIED , AppArmor 阻止了 MySQL 服务启动
方法1: 检查AppArmor配置
方法2: 改变 AppArmor 的默认工作模式,由强制模式改为抱怨模式sudo apt-get install apparmor-utils sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld sudo systemctl reload apparmor
方法3: 禁用AppArmor的的某个配置
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld sudo systemctl reload apparmor