背景
日常实施中可能会出现在部署MySQL时未更改数据默认存储路径(默认:/var/lib/mysql),然而一般分配服务器的人只会给系统分区分配50G的空间,这导致后续空间不够用的情况,也就出现了需要迁移数据的问题。
当前测试环境
╰─$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
╰─$ mysqladmin --version
mysqladmin Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)
╰─$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
迁移步骤
mysql默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/data/app/下需要进行以下几步:
1、创建目录
mkdir -p /data/app
2、停止mysql服务
systemctl stop mysqld.service
3、移动数据默认文件夹到新位置
cp -rf /var/lib/mysql /data/app/
4、修改my.cnf配置文件
编辑/etc/my.cnf文件,如果不存在改配置文件,到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中后再修改。命令如下:
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
在/etc/my.cnf文件中找到以下两行并将等号后的/var/lib/路径修改为新路径/data/app/
#socket=/var/lib/mysql/mysql.sock
socket=/data/app/mysql/mysql.sock
#datadir=/var/lib/mysql
datadir=/data/app/mysql/
5、更改新目录的文件属主
chown -R mysql:mysql /data/app/mysql
6、启动mysql服务
systemctl start mysqld.service
问题
mysqld: File './binlog.index' not found (OS errno 13 - Permission denied)
大概是因为SELinux的限制,可以将SELinux关掉。但是Every time you run setenforce 0, you make Dan Walsh weep. Dan is a nice guy and he certainly doesn't deserve that.,Seriously, stop disabling SELinux. Learn how to use it before you shut it off. 😂😂😂
可以尝试了解一下Red Hat Chapter 3. SELinux Contexts
我通过以下步骤,在保证SELinux开启的状态下,解决了这个问题。
1、设置文件安全上下文
To set mysql selinux on a directory you can:
semanage fcontext -a -t mysqld_db_t "/data/app/mysql(/.*)?"
2、修改目录安全上下文
restorecon -Rv /data/app/mysql
ls -lZ
3、设置文件所属人和组
Set permissions if needed:
chown -R mysql:mysql /data/app/mysql
参考: