介绍
数据库随着时间的推移而增长,有时超过了文件系统的空间。当它们与操作系统的其他部分相同分区时,您也可以进入 I/O 争议。RAID、网络块存储和其他设备可以提供冗余和其他可取的功能. 无论您是添加更多的空间、评估优化性能的方法,还是寻求利用其他存储功能,本教程将引导您迁移 MySQL 数据目录。
前提条件
要完成本指南,您将需要:
- ** 具有
sudo
特权的非根用户的 Ubuntu 16.04 服务器. 您可以在我们的 初始服务器设置与 Ubuntu 16.04 指南中了解更多有关如何设置具有这些特权的用户。
在本示例中,我们将数据移动到安装在 /mnt/volume-nyc1-01
的区块存储设备中,您可以在 如何在 DigitalOcean 上使用区块存储指南中学习如何设置一个。
无论您使用什么基础存储,本指南可以帮助您将数据目录移动到一个新的位置。
步骤 1 – 移动MySQL数据目录
为了准备移动 MySQL 数据目录,让我们通过使用管理凭据启动交互式 MySQL 会话来验证当前位置。
1mysql -u root -p
提示时,输入 MySQL 根密码,然后从 MySQL 提示中选择数据目录:
1select @@datadir;
1[secondary_label Output]
2+-----------------+
3| @@datadir |
4+-----------------+
5| /var/lib/mysql/ |
6+-----------------+
71 row in set (0.00 sec)
此输出确认MySQL已配置为使用默认数据目录, `/var/lib/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.
现在服务器关闭了,我们将现有的数据库目录复制到新的位置,使用rsync
。使用-a
旗帜将保留权限和其他目录属性,而-v
则提供无语音输出,以便您可以跟踪进展。
<$>[注] 注: 请确保目录上没有后续缩减,如果您使用 tab completion 添加,则可能出现后续缩减。
1sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
一旦rsync
完成,将当前文件夹重命名为.bak 扩展,并将其保留,直到我们确认移动成功。
1sudo mv /var/lib/mysql /var/lib/mysql.bak
现在我们已经准备好将注意力转向配置。
步骤 2 – 指向新数据位置
MySQL 有几种方法来翻译配置值. 默认情况下,在 /etc/mysql/mysql.conf.d/mysqld.cnf
文件中, datadir
设置为 `/var/lib/mysql. 编辑此文件以反映新的数据目录:
1sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
查找以datadir=
开头的行,然后更改接下来的路径以反映新位置。
在我们的情况下,更新的文件看起来像下面的输出:
1[label /etc/mysql/mysql.conf.d/mysqld.cnf ]
2. . .
3datadir=/mnt/volume-nyc1-01/mysql
4. . .
这似乎是重新提出MySQL的合适时机,但在我们能够成功做到这一点之前,还需要配置一件事。
步骤 3 – 配置 AppArmor 访问控制规则
我们需要告诉AppArmor让MySQL通过创建默认目录和新位置之间的名称来写入新目录。
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配置步骤,您将遇到以下错误消息:
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 和数据目录之间建立明确的连接,因此这个错误可能需要一段时间才能弄清楚。
第4步:重新启动MySQL
下一步是启动MySQL,但如果你这样做,你会遇到另一个错误。这次,而不是AppArmor问题,错误发生,因为脚本mysql-systemd-start
检查一个目录的存在,-d
或一个符号链接,-L
,这匹配两个默认路径。
1[label /usr/share/mysql/mysql-systemd-start]
2. . .
3if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
4 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
5 exit 1
6fi
7
8if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
9 echo "MySQL system database not found. Please run mysql_install_db tool."
10 exit 1
11fi
12
13. . .
由于我们需要这些来启动服务器,我们将创建最低的目录结构来通过脚本的环境检查。
1sudo mkdir /var/lib/mysql/mysql -p
现在,我们已经准备好开始MySQL了。
1sudo systemctl start mysql
2sudo systemctl status mysql
要确保新数据目录确实在使用,请启动MySQL监视器。
1mysql -u root -p
再次查看数据目录的值:
1[secondary_label Output]
2+----------------------------+
3| @@datadir |
4+----------------------------+
5| /mnt/volume-nyc1-01/mysql/ |
6+----------------------------+
71 row in set (0.01 sec)
现在你重新启动了MySQL并确认它正在使用新的位置,请利用这个机会确保你的数据库完全功能。
1sudo rm -Rf /var/lib/mysql.bak
重启 MySQL 最后一次,以确保它按预期工作:
1sudo systemctl restart mysql
2sudo systemctl status mysql
结论
在本教程中,我们将MySQL的数据目录移动到一个新的位置,并更新了Ubuntu的AppArmorACL,以适应调整。
有关管理 MySQL 数据目录的更多信息,请参阅官方 MySQL 文档中的以下部分: