如何使用 Symlink 将 MySQL 数据目录更改为新位置

介绍

数据库随着时间的推移而增长,有时超过了文件系统的空间。当它们与操作系统的其他部分相同分区时,您也可以进入 I/O 争议。RAID、网络块存储和其他设备可以提供冗余和其他可取的功能. 无论您是添加更多的空间、评估优化性能的方法,还是寻求利用其他存储功能,本教程将引导您迁移 MySQL 数据目录。

如果您有多个实例,该指南(How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04)(https://andsky.com/tech/tutorials/how-to-move-a-mysql-data-directory-to-a-new-location-on-ubuntu-16-04)可以帮助您通过配置设置明确更改位置的指南。

前提条件

要完成本指南,您将需要:

在本示例中,我们将数据移动到安装在 `/mnt/volume-nyc1-01 的区块存储设备中,您可以在 如何在 DigitalOcean 上使用区块存储 指南中学习如何设置一个。

无论您使用什么基础存储,本指南可以帮助您将数据目录移动到一个新的位置。

第1步:移动MySQL数据目录

为了确保数据的完整性,我们将关闭MySQL:

1sudo systemctl stop mysql

「systemctl」不會顯示所有服務管理指令的結果,所以如果您想確定成功,請使用下列指令:

1sudo systemctl status mysql

如果输出的最后一行告诉你服务器已停止,你可以确定它已关闭:

1[secondary_label Output]
2. . .
3Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

当服务器关闭时,我们会将现有数据库目录移动到新的位置:

1sudo mv /var/lib/mysql /mnt/volume-nyc1-01/mysql

接下来,我们将创建象征链接:

1sudo ln -s /mnt/volume-nyc1-01/mysql /var/lib/mysql

有了simlink,这似乎是重新提出MySQL的合适时机,但在我们能够成功做到这一点之前,还需要配置一件事。

步骤 2 — 配置 AppArmor 访问控制规则

当您将MySQL目录移动到与MySQL服务器不同的文件系统时,您需要创建一个AppArmor名称。

若要添加名称,请编辑 AppArmor alias 文件:

1sudo nano /etc/apparmor.d/tunables/alias

在文件的底部,添加以下代码规则:

1. . .
2[label /etc/apparmor.d/tunables/alias]
3alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
4. . .

若要變更生效,請重新啟動 AppArmor:

1sudo systemctl restart apparmor

注意: 如果您跳过AppArmor配置步骤并尝试启动mysql,则会遇到以下错误消息:

1[secondary_label Output]
2Job for mysql.service failed because the control process 
3exited with error code. See "systemctl status mysql.service" 
4and "journalctl -xe" for details.

systemctljournalctl的输出中得出以下结论:

1[secondary_label Output]
2Jul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]: 
3mysql.service: Main process exited, code=exited, status=1/FAILURE

由于邮件不会在AppArmor和数据目录之间建立明确的连接,所以这个错误可能需要一段时间才能弄清楚。

1sudo tail /var/log/syslog
1[secondary_label Output]
2Nov 24 00:03:40 digitalocean kernel: 
3[  437.735748] audit: type=1400 audit(1479945820.037:20): 
4apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" 
5name="/mnt/volume-nyc1-01/mysql/mysql.lower-test" pid=4228 
6comm="mysqld" requested_mask="c" denied_mask="c" fsuid=112 ouid=112

美元

现在,我们已经准备好开始MySQL了。

1sudo systemctl start mysql
2sudo systemctl status mysql

一旦您重新启动MySQL,请利用这个机会确保您的数据顺序,并且MySQL按预期运作。

结论

在本教程中,我们已经移动了MySQL的数据,并使用了simlink来使MySQL意识到新的位置。我们还更新了Ubuntu的AppArmor ACL,以适应调整。

如果您需要支持在单个服务器上运行的多个MySQL实例, How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04可以帮助您。

Published At
Categories with 技术
comments powered by Disqus