如何使用符号链接将MySQL数据目录更改为新位置

来自菜鸟教程
跳转至:导航、​搜索

介绍

数据库随着时间的推移而增长,有时会超过文件系统上的空间。 当它们与操作系统的其余部分位于同一分区时,您也可能会遇到 I/O 争用。 RAID、网络块存储和其他设备可以提供冗余和其他理想的功能。 无论您是要添加更多空间、评估优化性能的方法,还是希望利用其他存储功能,本教程都将指导您重新定位 MySQL 的数据目录。

此处的说明适用于运行单个 MySQL 实例的服务器。 如果您有多个实例,指南 How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04 可以帮助您通过配置设置显式更改位置。

先决条件

要完成本指南,您需要:

在此示例中,我们将数据移动到安装在 /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.

systemctljournalctl 的输出都以:

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 可以为您提供帮助。