mysql更改数据保存目录

参考:
https://www.cnblogs.com/kerrycode/p/4371938.html
https://www.cnblogs.com/kerrycode/p/12460771.html (潇湘隐者-靠谱)

系统环境 :CentOS Linux release 7.5.1804 (Core) / ubuntu18.04
MySQL版本 : 8.0.18 MySQL Community Server - GPL / mysql5.7
默认情况下, MySQL的数据目录一般位于/var/lib/mysql

1.首先,弄清楚MySQL的相关配置信息

找到MySQL的数据目录,以及配置文件my.cnf、错误日志的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> show variables like 'datadir%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

mysql> show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| log_error | /var/log/mysql/error.log |
+---------------+--------------------------+
1 row in set (0.00 sec)

# 确认MySQL数据库存储目录
[root@DB-Server tmp]# mysqladmin -u root -p variables | grep datadir
Enter password:
| datadir | /var/lib/mysql/
# 查看配置文件位置
whereis mysql

2. 对数据库做一个冷备份,以备不时之需。当然,你以可以用其它方式备份例如mysqldump的方式。

1
2
3
4
# 关闭mysql开始备份数据 / 创建数据备份目录 / 开始备份
systemctl stop mysql
mkdir -p /tmp/coldbackup
cp -rp /var/lib/mysql /tmp/coldbackup

3. 移动数据目录到其它目录

1
2
3
4
5
# 这里假设,我需要将数据库的数据目录迁移到/mysql_data/下。
mkdir /mysql_data/
chown -R mysql:mysql /mysql_data/
cd /var/lib
mv mysql /mysql_data/

注意:这里建议使用mv移动数据库目录,而是不是复制(cp命令),因为执行复制时,SELinux上下文将丢失,并且您稍后必须手动进行设置,如果你使用cp命令复制文件,如果没有使用参数-a,那么要记得修改目录的属主,否则你有可能遇到

“MySQL error: 1017 Can’t find file: (errno: 13)”

这样的错误。

4. 修改配置文件

(1)centos 只需要修改配置文件/etc/my.cnf再重启mysql即可

1
2
3
4
5
6
7
8
# 一般情况下,只需修改datadir和socket等参数,具体根据你实际情况来判断那些参数需要修改 [client]为新增。
[client]
socket=/mysql_data/mysql/mysql.sock
[mysqld]
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
datadir=/mysql_data/mysql
socket=/mysql_data/mysql/mysql.sock

(2). ubuntu修改 /etc/apparmor.d/usr.sbin.mysqld 以及 /etc/mysql/mysql.conf.d/mysqld.cnf

https://www.cnblogs.com/hzw97/p/11589311.html

修改apparmor配置

AppArmor 是内核的一个安全增强模块,对程序存取资源进行限制,如果不修改,启动mysql,在journalctl -xe中会报以下错误

image-20230524150013327

修改 /etc/apparmor.d/usr.sbin.mysqld (AppArmor) 将数据储存目录换为我们需要更换的数据存储目录

1
2
3
4
5
6
7
8
# 原
# Allow data files dir access
/var/lib/mysql-files/ r,
/var/lib/mysql-files/** rwk,
# 修改后
# Allow data files dir access
/mysql_data/mysql/ r,
/mysql_data/mysql/** rwk,

修改mysql配置文件 mysql5.7 版本默认配置文件是 /etc/mysql/mysql.conf.d/mysqld.cnf
修改 /etc/mysql/mysql.conf.d/mysqld.cnf

1
2
3
4
# 修改为需要更换的数据存储目录
[mysqld]
# datadir = /var/lib/mysql
datadir = /mysql_data/mysql

重启mysql验证 必须执行下面3个步骤,否则修改不会生效,单独启动mysql依旧会报错。

1
2
3
4
5
6
7
8
9
10
11
12
# 重启下面三个服务
service apparmor reload
service apparmor restart
service mysql restart
# 验证 此时`ubuntu`数据存储目录更改成功
mysql> show variables like 'datadir%';
+---------------+--------------------+
| Variable_name | Value |
+---------------+--------------------+
| datadir | /mysql_data/mysql/ |
+---------------+--------------------+
1 row in set (0.01 sec)

image-20230524145719099

image-20230524145746501

修改过后,对于CentOSRHEL操作系统而言,你可能需要修改SELinux的设置,而对于UbuntuDebian,你需要修改AppArmor的设置(这篇Ubuntu上更改MySQL数据库数据存储目已经有介绍了,这里就不重复了)。当如,对于CentOSRHEL,如果你禁用了SELinux的话,那么就可以直接忽略这个设置,因为禁用SELinux的话,就会避免很多杂七杂八的问题,但是我们不是要回避问题,而是要弄清楚问题产生的根本原因。

如果是centos首先你要检查,是否开启了SELinux(ubuntu不需要检查ubuntu默认没有selinux)。如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@KerryDB ~]# /usr/sbin/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
[root@KerryDB ~]# getenforce
Enforcing
# 关闭selinux
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && setenforce 0
# 或
setenforce 0 > /dev/null 2>&1 || true
sed -i s/^SELINUX=.*/SELINUX=disabled/g /etc/selinux/config

4. 扩展

centos不指定mysql.sock时将会报下面的解决解决方法是my.conf配置文件指定mysql.sock

1
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock

image-20230524150657502

结语祝好!