在Ubuntu 16.04上如何将MySQL数据目录移动到新位置

白如意i 2024-10-25 16:37:22 阅读 92

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

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

先决条件

要完成本指南,您需要:

一个具有<code>sudo特权的非根用户的 Ubuntu 16.04 服务器。您可以在我们的《在 Ubuntu 16.04 上进行初始服务器设置》指南中了解如何设置具有这些特权的用户。

一个 MySQL 服务器。如果您尚未安装 MySQL,可以参考《在 Ubuntu 16.04 上安装 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以退出监视器。

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

sudo systemctl stop mysql

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

sudo systemctl status mysql

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

. . .

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/mysql/mysql.conf.d/mysqld.cnf文件中设置为/var/lib/mysql。编辑此文件以反映新的数据目录:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到以datadir=开头的行,并更改其后的路径以反映新位置。

在我们的情况下,更新后的文件如下所示:

. . .

datadir=/mnt/volume-nyc1-01/mysql

. . .

现在似乎是重新启动 MySQL 的合适时机,但在成功执行此操作之前,还有一件事要配置。

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

我们需要告诉 AppArmor 允许 MySQL 写入新目录,方法是在默认目录和新位置之间创建别名。为此,编辑 AppArmor alias 文件:

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

在文件底部添加以下别名规则:

. . .

alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,

. . .

要使更改生效,请重新启动 AppArmor:

sudo systemctl restart apparmor

步骤 4 — 重启 MySQL

下一步是启动 MySQL,但如果这样做,你会遇到另一个错误。这一次,与 AppArmor 问题不同,错误是因为脚本 mysql-systemd-start 检查两个默认路径是否存在一个目录 -d 或一个符号链接 -L。如果它们不存在,脚本将失败:

. . .

if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then

echo "MySQL data dir not found at /var/lib/mysql. Please create one."

exit 1

fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then

echo "MySQL system database not found. Please run mysql_install_db tool."

exit 1

fi

. . .

由于我们需要这些来启动服务器,我们将创建最小的目录结构以通过脚本的环境检查。

sudo mkdir /var/lib/mysql/mysql -p

现在我们准备好启动 MySQL。

sudo systemctl start mysql

sudo systemctl status mysql

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

mysql -u root -p

再次查看数据目录的值:

+----------------------------+

| @@datadir |

+----------------------------+

| /mnt/volume-nyc1-01/mysql/ |

+----------------------------+

1 row in set (0.01 sec)

现在,您已经重新启动了 MySQL 并确认它正在使用新位置,抓住机会确保您的数据库完全可用。一旦验证了任何现有数据的完整性,您可以删除备份数据目录:

sudo rm -Rf /var/lib/mysql.bak

最后再次重启 MySQL 以确保它按预期工作:

sudo systemctl restart mysql

sudo systemctl status mysql

结论

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

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

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。