介绍
数据库随时间增长,有时会超过文件系统上的空间。 当它们位于与操作系统的其余部分相同的分区上时,也可能遇到I / O争用。 RAID,网络块存储和其他设备可以提供冗余和其他期望的特征。 无论是添加更多空间,评估优化性能的方法,还是希望利用其他存储功能,本教程将指导您重新定位MySQL的数据目录。
先决条件
要完成本指南,您需要:一个Ubuntu 16.04服务器与非root用户sudo权限 。 您可以了解更多有关如何设置这些权限的用户在我们与Ubuntu 16.04的初始服务器安装指南。
在这个例子中,我们将数据移动到安装在块存储设备/mnt/volume-nyc1-01 。
无论您使用什么底层存储,本指南都可以帮助您将数据目录移动到新位置。
第1步 - 移动MySQL数据目录
要准备移动MySQL的数据目录,让我们通过使用管理凭据启动交互式MySQL会话来验证当前位置。mysql -u root -p
出现提示时,提供MySQL root密码。 然后从MySQL提示符中选择数据目录:select @@datadir;Output+-----------------+
| @@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
如果输出的最后一行告诉您服务器已停止,您可以确定它已关闭:Output. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.
现在,服务器关闭,我们将现有的数据库目录复制到新的位置用rsync 。 使用-a标志保留的权限和其他目录属性,而-v提供详细输出,以便能够按照进度。
注意:确保没有对目录没有尾随斜线,如果你使用制表符完成可以加入。 当有一个结尾的斜线, rsync将转储目录复制到安装点,而不是转移成一个包含内容mysql目录:sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
一旦rsync完成,用.bak扩展名重命名当前文件夹中保存,直到我们确认,此举是成功的。 通过重命名它,我们将避免可能由于新的和旧的位置中的文件引起的混乱:sudo mv /var/lib/mysql /var/lib/mysql.bak
现在我们准备把注意力转向配置。
第2步 - 指向新数据位置
MySQL有几种方法来覆盖配置值。 默认情况下, datadir被设置为/var/lib/mysql在/etc/mysql/mysql.conf.d/mysqld.cnf文件。 编辑此文件以反映新的数据目录:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
查找开头的行datadir= ,改变它遵循以反映新的位置的路径。
在我们的示例中,更新的文件看起来像下面的输出:
/etc/mysql/mysql.conf.d/mysqld.cnf. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .
这似乎是正确的时机再次提出MySQL,但还有一件事要配置,我们才能成功。
第3步 - 配置AppArmor访问控制规则
我们需要告诉AppArmor通过在默认目录和新位置之间创建一个别名,让MySQL写入新目录。 要做到这一点,编辑AppArmor的alias文件:sudo nano /etc/apparmor.d/tunables/alias
在文件底部,添加以下别名规则:
/etc/apparmor.d/tunables/alias. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .
要使更改生效,请重新启动AppArmor:sudo systemctl restart apparmor
注意:如果你跳过了AppArmor的配置步骤中,您会遇到以下错误信息:OutputJob for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.
从两个输出systemctl和journalctl的结尾是:OutputJul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]:
mysql.service: Main process exited, code=exited, status=1/FAILURE
由于消息不会在AppArmor和数据目录之间建立明确的连接,因此此错误需要一些时间才能找出。
第4步 - 重新启动MySQL
下一步是启动MySQL,但如果你这样做,你会遇到另一个错误。 这一次,而不是AppArmor的问题,会发生错误,因为脚本mysql-systemd-start了一个目录,存在检查-d或符号链接, -L ,匹配两个默认路径。 如果找不到,它会失败:
/ usr / share / mysql / mysql-systemd-start. . .
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
再次查看数据目录的值:Output+----------------------------+
| @@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 ACL以适应调整。 虽然我们使用块存储设备,但这里的说明应该适合重新定义数据目录的位置,而不考虑底层技术。
有关管理MySQL数据目录的更多信息,请参见官方MySQL文档中的以下部分:
本文介绍如何将MySQL数据目录从默认位置迁移到其他存储位置,并更新AppArmor ACL以适应变动。
1431

被折叠的 条评论
为什么被折叠?



