介绍
数据库随着时间的推移而增长,有时超过了文件系统的空间。当它们位于与其他操作系统相同的分区时,您也可以遇到输入/输出(I/O)争议。独立磁盘(RAID)、网络块存储和其他设备,可以提供冗余和其他可取的功能。无论您是添加更多的空间、评估优化性能的方法,还是想要利用其他存储功能,本教程将引导您迁移MySQL的数据目录。
前提条件
要完成本指南,您将需要:
- 具有
sudo
特权和启用防火墙的非root用户的Ubuntu 20.04服务器. 您可以在我们的《Ubuntu 20.04初始服务器设置》(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04)指南中了解有关如何设置具有这些特权的用户的更多信息。 - MySQL服务器. 如果您尚未安装MySQL,请参阅我们的指南。
在本教程中,我们将数据移动到安装在 /mnt/volume-nyc1-01
的区块存储设备中,您可以在以下文档中学习如何设置一个(https://docs.digitalocean.com/products/volumes/)。
无论您使用什么基础存储,本指南可以帮助您将数据目录移动到一个新的位置。
步骤 1 – 移动MySQL数据目录
为了准备移动 MySQL 数据目录,让我们通过使用管理凭据启动交互式 MySQL 会话来验证当前位置。
1sudo mysql
<$>[注] 注:如果您已配置您的 root MySQL 用户使用密码进行身份验证,则可以使用以下命令连接到 MySQL 作为该用户:
1mysql -u root -p
美元
当提示时,输入MySQL用户密码,然后从MySQL提示中运行以下SELECT
陈述,这将返回MySQL实例的活跃数据目录,该目录总是记录在MySQL的datadir
变量中:
1SELECT @@datadir;
1[secondary_label Output]
2+-----------------+
3| @@datadir |
4+-----------------+
5| /var/lib/mysql/ |
6+-----------------+
71 row in set (0.00 sec)
此输出确认 MySQL 已配置为使用默认数据目录, /var/lib/mysql/
,所以这就是您需要移动的目录。
1exit
1[secondary_label Output]
2Bye
要确保数据的完整性,请在对数据目录进行更改之前关闭 MySQL:
1sudo systemctl stop mysql
请注意,systemctl
不会显示所有服务管理命令的结果,因此如果您想要检查是否成功,请使用以下命令:
1sudo systemctl status mysql
您可以确认它已关闭,如果输出中的活跃
行表示它是不活跃(死亡)
,如下示例所示:
1[secondary_label Output]
2● mysql.service - MySQL Community Server
3 Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
4 Active: inactive (dead) since Wed 2022-03-23 19:03:49 UTC; 5s ago
5 Process: 3415 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS)
6 Main PID: 3415 (code=exited, status=0/SUCCESS)
7 Status: "Server shutdown complete"
现在,服务器关闭了,您可以将现有的数据库目录, /var/lib/mysql
,复制到新的位置, /mnt/volume-nyc1-01
,使用 rsync
。
<$>[注] 注: 请确保目录上没有后续缩减,如果您使用 tab completion 添加,则可能出现后续缩减。
1sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
一旦rsync
命令完成,请将当前文件夹重命名为.bak
扩展,并将其保留,直到您确认移动成功。
1sudo mv /var/lib/mysql /var/lib/mysql.bak
现在你已经准备好继续下一步,并开始配置。
步骤 2 – 指向新数据位置
MySQL 有几种方法来翻译配置值. 默认情况下,datadir
设置为/var/lib/mysql
在/etc/mysql/mysql.conf.d/mysqld.cnf
文件中。 在您喜爱的文本编辑器中编辑此文件以反映新的数据目录。 在这里,我们将使用nano
:
1sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
查找以 datadir=
开头的行. 通过删除英镑符号 (#
) 并更改路径以反映新位置,以消除该行。
1[label /etc/mysql/mysql.conf.d/mysqld.cnf ]
2. . .
3datadir=/mnt/volume-nyc1-01/mysql
4. . .
一旦您完成了此更新,保存并退出文件. 如果您正在使用nano
,您可以通过按CTRL + X
,然后按Y
和ENTER
来做到这一点。
步骤 3 – 配置 AppArmor 访问控制规则
在此步骤中,您需要告诉AppArmor通过创建默认目录和新位置之间的名称来允许MySQL写入新目录。 _AppArmor_是Linux内核中的安全模块,允许系统管理员通过程序配置文件来限制程序的功能,而不是用户自己。
1sudo nano /etc/apparmor.d/tunables/alias
在文件的底部,不评论下面的行,并添加名称规则:
1[label /etc/apparmor.d/tunables/alias]
2. . .
3alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
4. . .
当你完成时,保存并退出文件。
若要變更生效,請重新啟動 AppArmor:
1sudo systemctl restart apparmor
<$>[注] 注: 如果您跳过了AppArmor配置步骤,您将收到以下错误消息:
1[secondary_label Output]
2Job for mysql.service failed because the control process
3exited with error code. See "systemctl status mysql.service"
4and "journalctl -xe" for details.
由于此消息没有在 AppArmor 和数据目录之间建立明确的连接,因此可能需要一段时间才能找出此错误。
一旦您正确配置了 AppArmor,您可以转到下一步。
第4步:重新启动MySQL
现在是时候启动MySQL了,但是如果你这样做,你会遇到另一个错误,而不是AppArmor问题,这个错误是由mysql-systemd-start
引起的,这是一个支持通过systemd
管理MySQL的脚本。
1nano /usr/share/mysql/mysql-systemd-start
此脚本检查是否存在一个目录, -d
,或一个符号链接, -L
,匹配默认数据目录路径. 如果它找不到这些,脚本将触发错误,并防止MySQL启动:
1[label /usr/share/mysql/mysql-systemd-start]
2. . .
3if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
4 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
5 exit 1
6fi
7
8if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
9 echo "MySQL system database not found. Please run mysql_install_db tool."
10 exit 1
11fi
12
13. . .
检查此文件后,请关闭它,而无需进行任何更改。
由于您需要一个适当的目录或符号链接来启动服务器,您必须创建最低的目录结构来通过脚本的环境检查:
1sudo mkdir /var/lib/mysql/mysql -p
现在你已经准备好开始MySQL了:
1sudo systemctl start mysql
通过检查状态来确认 MySQL 正在运行:
1sudo systemctl status mysql
1[secondary_label Output]
2● mysql.service - MySQL Community Server
3 Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
4 Active: active (running) since Wed 2022-03-23 20:51:18 UTC; 4s ago
5 Process: 17145 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=>
6 Main PID: 17162 (mysqld)
7 Status: "Server is operational"
8 Tasks: 38 (limit: 1132)
9 Memory: 376.7M
10 CGroup: /system.slice/mysql.service
11 └─17162 /usr/sbin/mysqld
要确保新数据目录确实在使用,请启动MySQL监视器:
1mysql -u sammy -p
现在再次查询数据目录的值:
1SELECT @@datadir;
1[secondary_label Output]
2+----------------------------+
3| @@datadir |
4+----------------------------+
5| /mnt/volume-nyc1-01/mysql/ |
6+----------------------------+
71 row in set (0.01 sec)
在您重新启动 MySQL 并确认它正在使用新位置后,请利用这个机会确保您的数据库完全功能。
1exit
1[secondary_label Output]
2Bye
现在您已经验证了任何现有数据的完整性,您可以删除备份数据目录:
1sudo rm -Rf /var/lib/mysql.bak
然后重新启动MySQL最后一次:
1sudo systemctl restart mysql
最后,通过检查状态来确认它按预期工作:
1sudo systemctl status mysql
1[secondary_label Output]
2● mysql.service - MySQL Community Server
3 Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
4 Active: active (running) since Wed 2022-03-23 20:53:03 UTC; 4s ago
5 Process: 17215 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=>
6 Main PID: 17234 (mysqld)
7 Status: "Server is operational"
8 Tasks: 38 (limit: 1132)
9 Memory: 368.9M
10 CGroup: /system.slice/mysql.service
11 └─17234 /usr/sbin/mysqld
如果活跃
行表示活跃(运行)
,这确认MySQL正在工作。
结论
在本教程中,您了解如何将MySQL的数据目录移动到一个新的位置,并更新Ubuntu的AppArmor访问控制列表以适应调整。
有关管理 MySQL 数据目录的更多信息,请参阅官方 MySQL 文档中的以下部分: