数据库存储空间随着时间的推移而增长,有时会超出你系统的空间。当它们与操作系统位于同一分区时,您也可能遇到I/O高并发。无论您是要添加更多空间,评估优化性能的方法,还是希望利用其他存储功能,本教程都将指导您重新迁移MySQL的数据目录。
要完成本教程,您需要:
Mysql
的Ubuntu 18.04的服务器,并且有一个可以使用sudo
命令的非root
用户。没有服务器的同学可以在这个页面购买,或免费试用腾讯云开发者实验室体验 Ubuntu 系统 CVM 。 在这个例子中,我们将数据移动到安装在的存储设备/mnt/volume-nyc1-01
上。
无论您使用什么底层存储,本教程都可以帮助您将数据目录移动到新位置。
要移动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
现在我们已经准备好将注意力转向配置。
MySQL有几种方法可以覆盖配置值。默认情况下,在/etc/mysql/mysql.conf.d/mysqld.cnf
已经将datadir
设置为/var/lib/mysql
。编辑此文件以更新新数据目录:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到以datadir=
开头的行并更改后面的路径以更新新位置。
在我们的例子中,更新的文件输出如下:
. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .
我们成功完成之前还有一件事需要配置。
我们需要通过在默认目录和新位置之间创建别名来告诉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配置步骤,则会遇到以下错误消息:
Output
Job for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.
结尾是:
Output
Jul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]:
mysql.service: Main process exited, code=exited, status=1/FAILURE
由于消息不会在AppArmor和数据目录之间建立显式连接,因此此错误可能需要一些时间才能确定。
下一步是启动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 ACL以适应调整。虽然我们使用的是块存储设备,但此处的说明适用于重新定义数据目录的位置,而不管底层技术如何。我还是建议您使用腾讯云提供云数据库 MySQL(TencentDB for MySQL)让用户可以轻松在云端部署、使用 MySQL 数据库,欢迎使用。
有关管理MySQL数据目录的更多信息,请参阅官方MySQL文档中的以下部分:
参考文献:《How To Move a MySQL Data Directory to a New Location on Ubuntu 18.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。