简介

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

先决条件

要完成本指南,您需要:

  • 安装了MySQL的CentOS 7服务器,并拥有具有sudo特权的非root用户。您可以在我们的CentOS 7服务器初始化设置指南中了解如何设置具有这些特权的用户。如果您尚未安装MySQL,可以参考我们的CentOS 7上安装MySQL的指南。

在本示例中,我们将数据移动到挂载在/mnt/volume-nyc1-01的块存储设备上。您可以在DigitalOcean指南中了解如何设置这样的设备。

无论您使用什么底层存储,本指南都可以帮助您将数据目录移动到新位置。

步骤1 — 移动MySQL数据目录

为了准备移动MySQL的数据目录,让我们通过使用管理凭据启动交互式MySQL会话来验证当前位置。

mysql -u root -p

在提示时,提供MySQL root密码。然后从MySQL提示符中,选择数据目录:

)">select @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

此输出确认了MySQL配置为使用默认数据目录/var/lib/mysql/,因此这就是我们需要移动的目录。确认后,键入exit并按“ENTER”离开监视器:

)">exit

为了确保数据的完整性,在实际更改数据目录之前,我们将关闭MySQL:

sudo systemctl stop mysqld

systemctl不会显示所有服务管理命令的结果,因此如果您想确保已成功关闭,请使用以下命令:

sudo systemctl status mysqld

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

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

现在服务器已关闭,我们将使用rsync将现有数据库目录复制到新位置。使用-a标志保留权限和其他目录属性,而-v提供详细输出,以便您可以跟踪进度。

sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

rsync完成后,将当前文件夹重命名为.bak扩展名,并保留它,直到我们确认移动成功为止。通过重新命名它,我们将避免由于新位置和旧位置的文件而可能产生的混淆:

sudo mv /var/lib/mysql /var/lib/mysql.bak

现在我们准备转向配置。

步骤2 — 指向新的数据位置

MySQL有几种方法可以覆盖配置值。默认情况下,datadir/etc/my.cnf文件中设置为/var/lib/mysql。编辑此文件以反映新的数据目录:

sudo vi /etc/my.cnf

找到以datadir=开头的[mysqld]块中的行,该行与多个注释分隔开。更改后面的路径以反映新位置。此外,由于套接字先前位于数据目录中,我们需要将其更新到新位置:

[mysqld]
. . .
datadir=/mnt/volume-nyc1-01/mysql
socket=/mnt/volume-nyc1-01/mysql/mysql.sock
. . .

更新现有行后,我们需要为mysql客户端添加配置。在文件底部插入以下设置,以便它不会分割[mysqld]块中的指令:

[client]
port=3306
socket=/mnt/volume-nyc1-01/mysql/mysql.sock

完成后,按ESCAPE键,然后键入:wq!以保存并退出文件。

步骤 3 — 重启 MySQL

现在我们已经更新了配置以使用新的位置,我们可以开始启动 MySQL 并验证我们的工作。

sudo systemctl start mysqld
sudo systemctl status mysqld

为了确保新的数据目录确实在使用中,启动 MySQL 监视器。

mysql -u root -p

再次查看数据目录的值:

select @@datadir;
+----------------------------+
| @@datadir                  |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)

现在,您已经重新启动了 MySQL 并确认它正在使用新位置,可以利用这个机会确保您的数据库完全可用。一旦验证了任何现有数据的完整性,您可以使用 sudo rm -Rf /var/lib/mysql.bak 删除备份数据目录。

结论

在本教程中,我们将 MySQL 的数据目录移动到了新位置,并更新了 SELinux 以适应这一调整。虽然我们使用的是块存储设备,但这里的说明应该适用于重新定义数据目录的位置,而不管底层技术如何。

有关管理 MySQL 数据目录的更多信息,请参阅官方 MySQL 文档中的以下部分:

  • MySQL 数据目录
  • 设置多个数据目录