0


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

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

简介

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

先决条件

要完成本指南,您需要:

  • 一个具有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 数据目录
  • 设置多个数据目录
标签: ubuntu mysql linux

本文转载自: https://blog.csdn.net/rubys007/article/details/142794641
版权归原作者 白如意i 所有, 如有侵权,请联系我们删除。

“在Ubuntu 16.04上如何将MySQL数据目录移动到新位置”的评论:

还没有评论