介绍
数据库随着时间的推移而增长,有时超过了文件系统的空间。当它们与操作系统的其他部分相同分区时,您也可以进入 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)可以帮助您通过配置设置明确更改位置的指南。
前提条件
要完成本指南,您将需要:
- 具有`sudo'权限的非根用户的Ubuntu 16.04服务器 。 您可以在 [Ubuntu 16. 04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04] 指南中更多地了解如何设置具有这些权限的用户 。 *A MySQL服务器 . 如果您还没有设置一个, [如何在 Ubuntu 16. 04 上安装 MySQL] (https://andsky.com/tech/tutorials/how-to-install-mysql-on-ubuntu-16-04 ) 指南可以帮助您 。
- 数据库的备份 。 除非您正在使用 MySQL 的新安装, 您应该确保您的数据备份 。 指南 [如何在 Ubuntu VPS (https://andsky.com/tech/tutorials/how-to-backup-mysql-databases-on-an-ubuntu-vps ) 上备份 MySQL 数据库可以帮助您 。 .
在本示例中,我们将数据移动到安装在 `/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.
从systemctl
和journalctl
的输出中得出以下结论:
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可以帮助您。