如何使用符号链接将MySQL数据目录更改为新位置
介绍
数据库随着时间的推移而增长,有时会超过文件系统上的空间。 当它们与操作系统的其余部分位于同一分区时,您也可能会遇到 I/O 争用。 RAID、网络块存储和其他设备可以提供冗余和其他理想的功能。 无论您是要添加更多空间、评估优化性能的方法,还是希望利用其他存储功能,本教程都将指导您重新定位 MySQL 的数据目录。
此处的说明适用于运行单个 MySQL 实例的服务器。 如果您有多个实例,指南 How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04 可以帮助您通过配置设置显式更改位置。
先决条件
要完成本指南,您需要:
- 具有非 root 用户且具有 sudo 权限的 Ubuntu 16.04 服务器。 您可以在我们的 Initial Server Setup with Ubuntu 16.04 指南中了解有关如何设置具有这些权限的用户的更多信息。
- MySQL 服务器。 如果您还没有设置,如何在 Ubuntu 16.04 上安装 MySQL 指南可以为您提供帮助。
- 您的数据库备份。 除非您使用全新安装的 MySQL,否则应确保备份数据。 指南 How To Backup MySQL Databases on an Ubuntu VPS 可以帮助您。
在此示例中,我们将数据移动到安装在 /mnt/volume-nyc1-01
上的块存储设备。 您可以在 如何在 DigitalOcean 上使用块存储指南中了解如何设置。
无论您使用什么底层存储,本指南都可以帮助您将数据目录移动到新位置。
第 1 步 — 移动 MySQL 数据目录
为了确保数据的完整性,我们将关闭 MySQL:
sudo systemctl stop mysql
systemctl
不会显示所有服务管理命令的结果,所以如果你想确保你已经成功,使用以下命令:
sudo systemctl status mysql
如果输出的最后一行告诉您服务器已停止,您可以确定它已关闭:
Output. . . Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.
随着服务器关闭,我们将现有的数据库目录移动到新位置:
sudo mv /var/lib/mysql /mnt/volume-nyc1-01/mysql
接下来,我们将创建符号链接:
sudo ln -s /mnt/volume-nyc1-01/mysql /var/lib/mysql
有了符号链接,这似乎是再次启动 MySQL 的合适时机,但是在我们成功完成之前还需要配置一件事。
第 2 步 — 配置 AppArmor 访问控制规则
当您将 MySQL 目录移动到与 MySQL 服务器不同的文件系统时,您将需要创建一个 AppArmor 别名。
要添加别名,请编辑 AppArmor alias
文件:
sudo nano /etc/apparmor.d/tunables/alias
在文件的底部,添加以下别名规则:
. . . [label /etc/apparmor.d/tunables/alias] alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/, . . .
要使更改生效,请重新启动 AppArmor:
sudo systemctl restart apparmor
注意: 如果您跳过 AppArmor 配置步骤并尝试启动 mysql
,您将遇到以下错误消息:
OutputJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
systemctl
和 journalctl
的输出都以:
OutputJul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE
由于这些消息没有在 AppArmor 和数据目录之间建立明确的联系,因此可能需要一些时间才能弄清楚这个错误。 但是,查看 syslog
将显示问题:
sudo tail /var/log/syslog
OutputNov 24 00:03:40 digitalocean kernel: [ 437.735748] audit: type=1400 audit(1479945820.037:20): apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/volume-nyc1-01/mysql/mysql.lower-test" pid=4228 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=112 ouid=112
现在我们准备好启动MySQL了。
sudo systemctl start mysql sudo systemctl status mysql
重新启动 MySQL 后,请借此机会确保您的数据井井有条并且 MySQL 按预期运行。
结论
在本教程中,我们移动了 MySQL 的数据并使用符号链接让 MySQL 知道新位置。 我们还更新了 Ubuntu 的 AppArmor ACL 以适应调整。 尽管我们使用的是块存储设备,但此处的说明应该适用于重新定义数据目录的位置,而不管底层技术如何。
这种方法仅适用于运行单个 MySQL 实例的情况。 如果您需要支持在单个服务器上运行多个 MySQL 实例,How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04 可以为您提供帮助。