文章目录
- 0 背景
- 1 备份现有数据库数据
- 2 停止 MySQL 服务
- 3 复制现有的 MySQL 数据到新目录
- 4 修改 MySQL 配置文件
- 5 更新 AppArmor 或 SELinux 配置(如有启用)
- 6. 修改 MySQL 系统文件中的 datadir
- 7. 启动 MySQL 服务
- 8. 验证更改
- 参考资料
0 背景
在原先划分ubuntu磁盘分区的时候,给/
分区划分的空间很少,但是其他的分区还有很多的空间。
故想把 mysql 数据库的数据迁移到另外的磁盘分区中。
1 备份现有数据库数据
更改 datadir 前,建议备份现有的 MySQL 数据,以防数据丢失。使用以下命令导出所有数据库:
mysqldump --all-databases > all-databases-backup.sql
2 停止 MySQL 服务
- 查看 mysql 当前状态
service mysql status
或者systemctl status mysql
stop mysql
sudo systemctl stop mysql
再次查看 mysql 的状态
3 复制现有的 MySQL 数据到新目录
复制当前的 MySQL 数据目录内容到新位置:
在 mysql 的命令中,运行下述指令,即可查看到数据文件的地址。
show global variables like "%datadir%";
我电脑的原始的 mysql 数据文件保存路径为:/var/lib/mysql/
数据迁移:
sudo cp -R /var/lib/mysql /home/soft/mysql_datadir/
sudo chown -R mysql:mysql /home/soft/mysql_datadir/mysql
sudo chmod 755 /home/soft/mysql_datadir/mysql
【注意】:
我最初选择放在我的家目录下,程序一直报错,没有权限访问该文件夹。
原来路径:/home/jie/soft/mysql_data/mysql
报错
新路径是 :/home/soft/mysql_data/mysql
正常使用
mysql 的数据存储,放在某个用户的家目录下,确实也不合适。因为可能会导致其他用户没有权限访问。
4 修改 MySQL 配置文件
我的电脑的 mysql 系统目录是: /etc/mysql/
,找到 MySQL 的配置文件并更新 datadir:
根据自己的 mysql 选择下述两个文件的其中一个文件进行编辑:
sudo vim /etc/mysql/my.cnf
或者, (我用的是这个)
在修改前,可先备份。
针对配置文件进行修改:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
找到 datadir 这一行并更改为新的目录,更新 socket 位置为新的 socket:
#
# The MySQL database server configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
[mysqld]
#
# * Basic Settings
#
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
#socket = /var/lib/mysql/mysql.sock
socket = /home/soft/mysql_data/mysql/mysql.sock
#port = 3306
datadir = /home/soft/mysql_data/mysql
5 更新 AppArmor 或 SELinux 配置(如有启用)
我只更新了 AppArmor 没有更新 SELinux
如果你的系统启用了 AppArmor 或 SELinux,可能需要更新其配置以允许 MySQL 访问新的 datadir。
AppArmor: 编辑 AppArmor 配置文件
sudo vim /etc/apparmor.d/usr.sbin.mysqld
添加新的 datadir 路径:
/home/soft/mysql_datadir/mysql/ r,
/home/soft/mysql_datadir/mysql/** rwk,
usr.sbin.mysqld
文件内容:
# Allow data dir access
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/home/soft/mysql_data/mysql/ r,
/home/soft/mysql_data/mysql/** rwk,
保存后,重新加载 AppArmor 配置:
sudo systemctl restart apparmor
SELinux:如果使用 SELinux,你需要更新文件的安全上下文(我没有用到这个):
sudo semanage fcontext -a -t mysqld_db_t "/home/jie/soft/mysql_datadir(/.*)?"
sudo restorecon -Rv /home/jie/soft/mysql_datadir
6. 修改 MySQL 系统文件中的 datadir
编辑 MySQL 系统文件 /lib/systemd/system/mysql.service:
sudo vim /lib/systemd/system/mysql.service
找到以下部分:
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
在这一行的下方添加:
ExecStartPre=/bin/mkdir -p /home/jie/soft/mysql_datadir/mysql
ExecStartPre=/bin/chown -R mysql:mysql /home/jie/soft/mysql_datadir/mysql
效果如下图所示:
保存后,刷新 systemd 配置:
sudo systemctl daemon-reload
7. 启动 MySQL 服务
重新启动 MySQL 服务:
sudo systemctl start mysql
然后检查 MySQL 状态:
sudo systemctl status mysql
8. 验证更改
验证 MySQL 是否使用了新的 datadir:
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
或者
mysql -h 127.0.0.1 -P 3306 -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
如下图所示,返回新的 datadir 路径 /home/soft/mysql_datadir/mysql
。
如果一切正常,MySQL 将会在新的 datadir 下运行。如果遇到任何问题,可以通过日志文件 /home/soft/mysql_datadir/mysql/error.log 检查更多细节。
参考资料
- MySQL更换数据存储路径的方法
- chatgpt 4o