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

介绍

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

准备

要完成本指南,您需要:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 一个MySQL服务器。自建服务器难免会遇到这样的问题,配置SSL很麻烦,虽然对一部分人来说这也是一种乐趣,但是如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。

在这个例子中,我们将数据移动到安装在的块存储设备上/mnt/volume-nyc1-01

无论您使用什么底层存储,本指南都可以帮助您将数据目录移动到新位置。

第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提供详细输出,以便您可以跟踪进度。

注意:确保目录上没有尾部斜杠,如果使用制表符完成,则可以添加斜杠。当有斜杠时,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有几种方法可以覆盖配置值。默认情况下,在/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
. . .

这似乎是重新启动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

注意:如果您跳过AppArmor配置步骤,则会遇到以下错误消息:

Job for mysql.service failed because the control process 
exited with error code. See "systemctl status mysql.service" 
and "journalctl -xe" for details.

从两者的输出systemctljournalctl结尾是:

Jul 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。如果找不到它会失败:

. . .
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数据目录的更多信息,请参阅官方MySQL文档中的以下部分:

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

Captcha插件后门分析和修复

0×00 前言 近日看到网上爆出wordpress官方插件captcha出现后门,大惊,本人当初千辛万苦找验证码插件,在十几个插件中选了这款,感觉还挺好用,竟然...

2636
来自专栏咸鱼不闲

jsp与数据库的面对面交流

前言:要完成数据的交互的一种方式就是jsp+jsp+数据库。下面就来演示一个用jsp展示数据库内的图片的小例子。

1153
来自专栏沃趣科技

MySQL 8.0 首个自适应参数横空出世

MySQL8.0推出一个号称可以自适应服务器的参数,保证在各种不同的服务器、虚拟机、容器下自动适配服务器资源,让我们一起来看看到底它能做到什么地步。

1853
来自专栏从流域到海域

《笨办法学Python》 第46课手记

《笨办法学Python》 第46课手记 这节课制作了一个Python的项目骨架,花了我一个晚上和一个早上的时间,原因是我下载的pdf里面只有OX S的命令行,而...

2326
来自专栏云飞学编程

大神说你学会这个爬虫高级技巧,各种网站随便你爬!

1631
来自专栏我是攻城师

ElasticSearch入门介绍之会当凌绝顶(一)

3625
来自专栏数据和云

【MySQL】磁盘写满之后,数据库show status受到阻塞的原因

编辑手记:前两天同事讨论到一个问题,当mysql从库磁盘满之后,show status及show slave status会被卡住,但其他select操作不受影...

3756
来自专栏杨建荣的学习笔记

使用pt工具检测MySQL主从延迟(r12笔记第7天)

今天翻看了下《高性能MySQL》,真是让人拍手称绝,里面的很多实战思路非常不错,各种问题分析如数家珍,如果是有一定基础的同学,看起来会非常不错。 当然里...

4546
来自专栏快乐八哥

PHP+MySQL代码部署在Linux(Ubuntu)上注意事项

最近帮同学做一个网站,同学买的是阿里云服务器,Linux发行版是Ubuntu12.04。我在本地把程序写好,都调试好了。然后他让我自己发布和部署。之前在大学里上...

40910
来自专栏IT技术精选文摘

不丢数据的Mysql集群方案设计

方案一、多主同步复制PXC方案 PXC即Percona Xtradb Cluster,它采用Galera引擎,可以实现多个节点间的数据同步复制以及读写并且可保障...

71910

扫码关注云+社区

领取腾讯云代金券