前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
数据库会随着时间的推移而不断增长,有时会超出文件系统的空间。当它们位于与操作系统的其余部分相同的分区上时,您还可能遇到 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 数据目录
- 设置多个数据目录
版权归原作者 白如意i 所有, 如有侵权,请联系我们删除。