定期数据库备份是防止意外数据丢失事件的关键步骤。设计有效的备份和恢复策略通常需要通过恢复速度,数据完整性和备份覆盖来权衡性能影响,实施成本和数据存储成本。最佳解决方案取决于您的恢复点和时间目标以及数据库规模和体系结构。在本教程中,我们将演示如何使用LVM快照对正在运行的MySQL数据库执行实时(或“hot”)物理备份。然后,我们将数据压缩并存储在腾讯云存储中。
本教程中介绍的过程非常适合大型MySQL数据库,使用混合存储引擎(如InnoDB,TokuDB和MyISAM)的数据库,以及使用LVM管理多个块存储卷的数据库服务器。
我们首先要确保我们的Ubuntu 16.04服务器可以获取并安装LVM快照。接下来,我们将获取包含MySQL数据目录的逻辑卷的LVM快照。然后,我们将安装此快照卷(冻结的逻辑卷),并将MySQL数据目录压缩并发送到腾讯云存储进行存储。最后,我们将简要介绍一个示例恢复方案。
要使用本教程,您需要具备以下准备:
/var/lib/mysql
位置,您需要了解在Ubuntu上迁移你的MySQL数据库coscmd
工具,如何安装请参考coscmd官方文档完成所有这些设置后,您就可以开始使用本教程了。
首先,我们将找到我们的MySQL数据目录,并记下有关LVM配置的详细信息。
datadir
要查找MySQL数据目录的路径,请运行以下命令:
$ mysqladmin -u root -p variables | grep datadir
出现提示时输入您的MySQL root
密码。 您应该看到类似于以下内容的输出:
| datadir | /data/mysql/
对于本教程中使用的MySQL安装,数据目录是/data/mysql
。
我们现在需要确认/ data / mysql
存在于LVM逻辑卷上。 为了确认这一点,我们将运行lsblk:
$ lsblk
您应该看到类似于以下内容的输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 600G 0 disk
└─vg1-mysql_data 252:0 0 475G 0 lvm /data
vda 253:0 0 160G 0 disk
├─vda1 253:1 0 159.9G 0 part /
├─vda14 253:14 0 4M 0 part
└─vda15 253:15 0 106M 0 part /boot/efi
由此我们观察到/ data
实际上是名为mysql_data
的LVM逻辑卷的挂载点。 它是卷组vg1
的成员。
我们现在需要确保我们的卷组中有足够的可用空间vg1
来获取LVM快照。
请务必注意,本节中描述的命令的输出将根据服务器的硬件和LVM配置而有所不同。让我们快速研究本教程中使用的Ubuntu 16.04服务器的硬件和LVM配置。
首先,让我们看看我们使用pvscan``有
多少物理卷:
$ sudo pvscan
您应该看到类似于以下内容的输出:
PV /dev/sda VG vg1 lvm2 [500.00 GiB / 25.00 GiB free]
Total: 1 [500.00 GiB] / in use: 1 [500.00 GiB] / in no VG: 0 [0 ]
我们观察到我们有一个500GB的物理卷(/dev/sda
),它位于一个卷组(vg1
)中。已将475GB的物理卷分配给逻辑卷,而卷组仍可免费使用25GB。
我们可以通过使用vgdisplay
命令深入了解vg1卷组来确认这一点:
$ sudo vgdisplay
您应该看到类似于以下内容的输出:
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 500.00 GiB
PE Size 4.00 MiB
Total PE 127999
Alloc PE / Size 121600 / 475.00 GiB
Free PE / Size 6399 / 25.00 GiB
VG UUID KEsoDE-zON7-NdyO-ioxb-6FSl-CB4m-S3QCRj
从Alloc PE / Size和Free PE / Size行,我们发现我们已经分配了475GB,并且在vg1
卷组中有25GB空余。Cur PV行显示我们在此卷组中有1个物理卷。 Cur LV行表示我们已使用此卷组中的空间池来创建一个逻辑卷。
现在让我们使用lvdisplay
看一下这个逻辑卷:
$ sudo lvdisplay
您应该看到类似于以下内容的输出:
--- Logical volume ---
LV Path /dev/vg1/mysql_data
LV Name mysql_data
VG Name vg1
LV UUID T98x9c-zvC1-f0Rw-4ipn-Cxo2-duwk-KUwQQc
LV Write Access read/write
LV Creation host, time LVM, 2018-04-18 20:11:48 +0000
LV Status available
# open 1
LV Size 475.00 GiB
Current LE 121600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
从LV Size我们看到我们有一个475GB的逻辑卷mysql_data
,可以找到/dev/vg1/mysql_data
(vg1
是mysql_data
卷组的名称)。
总而言之,在本教程使用的Ubuntu 16.04服务器上,我们有一个500GB的物理卷(/dev/sda
)用于支持一个卷组(vg1
),我们从中创建了一个475GB逻辑卷(mysql_data
)。这在卷组中留下了25GB的可用空间,可用于创建更多逻辑卷(和快照)。
您的硬件和LVM配置可能会有所不同; 您可能连接了多个块存储设备,汇集为单个或多个卷组。给指定的逻辑卷拍摄快照的过程仍然是相同的。
使用本节中介绍的一系列命令,您现在应该对LVM和硬件配置有一般的了解。
在下一步中,我们将为LVM快照准备数据库服务器。
为了确保我们可以安全地获取LVM快照,我们需要提供足够的磁盘空间来覆盖备份和文件传输到Spaces期间可能发生的任何写入或更改。根据数据库的大小,此备份可能需要几个小时才能完成,因此最好在此处谨慎行事。如果快照卷在执行备份时空间不足,则快照卷将变为无效,您将不再具有一致的备份。
在上一步中,我们发现包含主逻辑卷(mysql_data
)的卷组(vg1
)只有25GB可用空间。虽然可能会在备份数据库时将25GB的更改写入磁盘,但理想情况下我们的安全边际至少为100GB。在生产设置中,最佳做法是在计划备份窗口期间测量写入磁盘的平均数据量,并相应地缩放快照卷大小。
要向vg1
卷组添加额外的75GB空间,我们可以附加块存储设备,或者增加当前连接到服务器的卷的大小。在本教程中,我们将扩展已经附加的块存储卷; 要了解有关附加附加块存储卷的更多信息,请前往腾讯云+社区学习
注意:某些区域尚不支持块存储,您可能无法将块存储卷附加到服务器。在这种情况下,合理的解决方法是使用此快照映像快照服务器t并创建新的服务器,然后可以添加块存储。
让我们扩展附加到此服务器的块存储卷。
导航到腾讯云云硬盘的Web控制面板,
在侧边栏中,单击“ 新建”:
然后将其挂载到您CVM的服务器。我们需要运行pvresize
。
登录到您的服务器,然后再次运行pvscan
以扫描物理卷:
$ sudo pvscan
您应该看到与我们的/dev/sda
物理卷相同的输出:
PV /dev/sda VG vg1 lvm2 [500.00 GiB / 25.00 GiB free]
Total: 1 [500.00 GiB] / in use: 1 [500.00 GiB] / in no VG: 0 [0 ]
现在,在卷上运行pvresize
以填充我们刚刚添加的额外空间:
$ sudo pvresize /dev/sda
您应该看到以下输出:
Physical volume "/dev/sda" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
让我们通过运行另一个pvscan
来确认我们的物理卷现在是否增大了100GB :
$ sudo pvscan
我们观察到/dev/sda
物理卷现在是600GB:
PV /dev/sda VG vg1 lvm2 [600.00 GiB / 125.00 GiB free]
Total: 1 [600.00 GiB] / in use: 1 [600.00 GiB] / in no VG: 0 [0 ]
我们现在确认我们的卷组的可用空间也增加了100GB:
$ sudo vgdisplay
然后,您应该看到以下输出:
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 600.00 GiB
PE Size 4.00 MiB
Total PE 153599
Alloc PE / Size 121600 / 475.00 GiB
Free PE / Size 31999 / 125.00 GiB
VG UUID KEsoDE-zON7-NdyO-ioxb-6FSl-CB4m-S3QCRj
这表明我们现在有125GB的可用空间可用来创建我们的快照卷。
出于本教程的目的,在备份和上载过程中,125GB将足以吸收写入和更改,但在生产设置中,快照卷大小应与备份窗口期间预期的磁盘使用量成比例。
现在我们的卷组中有足够的可用空间来覆盖快照和备份期间可能发生的任何写入或更改,我们可以继续创建快照卷。
警告: LVM快照处于活动状态时,写入磁盘时性能会有所下降。您应首先使用具有模拟负载的非生产数据库测试此过程,以验证此方法是否适用于您的生产部署。
我们现在将使用lvcreate
创建mysql_data
逻辑卷的快照。在我们这样做之前,我们需要使用FLUSH TABLES WITH READ LOCK
冻结对数据库的写入,以便我们可以保证数据的一致性。这些表只需要被锁定,直到我们运行lvcreate
,此时它们可以被解锁。如果编写这一系列命令的脚本,总锁定时间应该非常小,具体时间将取决于当前正在执行的写入查询。
让我们从刷新表开始吧。从数据库服务器上的终端,用mysql
登录MySQL数据库:
$ mysql -u root -p
在MySQL shell中,运行FLUSH TABLES
命令以读取数据库锁。
警告:运行以下命令后,将关闭所有打开的表,并使用全局读锁定去锁定所有数据库的所有表。如果在生产数据库上运行此操作,最佳做法是在副本上执行此命令或作为脚本的一部分执行此命令,以最大程度地减少数据库锁定的时间。
mysql> FLUSH TABLES WITH READ LOCK;
您应该看到以下输出:
Query OK, 0 rows affected (0.00 sec)
这表示您的数据库已被读锁定。不要退出MySQL提示符,我们需要保持打开状态。
我们现在将创建并安装用于存放MySQL数据的逻辑卷的LVM快照。
保持MySQL客户端连接打开,从新的终端窗口登录到数据库服务器。
警告:如果关闭此连接,则将丢弃锁定并继续写入,从而使快照不一致。
我们现在可以拍摄mysql_data
逻辑卷的快照。在执行物理备份时,我们将分配100GB的缓冲区空间来吸收写入和其他更改。要创建LVM快照,请运行接下来的lvcreate
命令:
sudo lvcreate -L 100G -s -n mysql_data_snap /dev/vg1/mysql_data
-L
标志指定逻辑卷的大小,在本例中为100GB。-s
表示逻辑卷将是快照,在这种情况下是/dev/vg1/mysql_data
逻辑卷。我们选择命名此快照卷mysql_data_snap
。
您应该看到以下结果:
Logical volume "mysql_data_snap" created.
这表明我们现在有一个mysql_data
逻辑卷的副本,我们可以从中执行备份。
现在我们已经基本上“冻结”了我们的MySQL数据文件,我们可以解锁数据库表并恢复写入。从打开的MySQL连接中,运行以下命令:
mysql> UNLOCK TABLES;
您应该看到以下结果:
Query OK, 0 rows affected (0.00 sec)
表已解锁,现在您可以安全地关闭此连接。
此时,您的数据库仍处于活动状态并接受传入的连接和写入,但我们在运行FLUSH TABLES WITH READ LOCK
时的时间点具有一致的快照(或完全准确,即在FLUSH
完成上次写入查询后的时间点)。
最后一步包括安装此快照,以便我们可以访问这些冻结的数据文件。
首先,我们将创建一个名为/backup_src
的挂载点:
$ sudo mkdir /backup_src
现在,我们将快照卷安装到/backup_src
:
$ sudo mount /dev/vg1/mysql_data_snap /backup_src
我们现在可以访问冻结的数据文件。让我们来看看:
cd /backup_src
ls
你应该看到你的MySQL数据目录:
lost+found mysql
现在我们可以访问数据的一致快照,我们可以将其备份到腾讯云COS。
要将此备份上传到我们的腾讯云COS,我们将使用coscmd
工具。COSCMD 工具在使用前需要进行参数配置。用户可以通过如下命令来配置:
coscmd config -a <secret_id> -s <secret_key> -b <bucket> -r <region> [-m <max_thread>] [-p <parts_size>]
上述示例中使用"<>"的字段为必选参数,使用"[]"的字段为可选参数。其中:
名称 | 描述 | 有效值 |
---|---|---|
secret_id | 必选参数,APPID对应的密钥ID可从COS控制台左侧栏【密钥管理】或云API密钥控制台获取 | 字符串 |
secret_key | 必选参数,APPID对应的密钥Key可从COS控制台左侧栏【密钥管理】或云API密钥控制台获取 | 字符串 |
bucket | 必选参数,指定的存储桶名称,bucket的命名规则为{name}-{appid} ,参考创建存储桶 | 字符串 |
region | 必选参数,存储桶所在地域。参考可用地域 | 字符串 |
max_thread | 可选参数,多线程上传时的最大线程数(默认为5),有效值:1~10 | 数字 |
parts_size | 可选参数,分块上传的单块大小(单位为MB,默认为1 MB),有效值:1~10 | 数 |
那么我的命令是:
coscmd config -a AK***********************La -s B*********************oG -b t*****eb -r ap-chengdu
我们将首先测试我们的coscmd
配置并尝试访问我们的备份空间(在本教程中我们的空间被命名为mysql-backup-demo
):
$ coscmd list -a
您应该看到输出你cos文件列表:
Starting new HTTPS connection (1): q**************.cos.ap-shanghai.myqcloud.com
Kubernetes/ DIR
Tencent-CIS/ DIR
TencentDB/ DIR
此输出表明连接成功,coscmd
可以将对象传输到腾讯云COS。我们现在压缩并将我们的MySQL数据目录上传到mysql-backup-demo
空间:
$ sudo tar -czvf - /backup_src/mysql | coscmd upload mysql_backup_180423.tar.gz /
在这里,我们使用tar
来压缩和存档MySQL数据目录,并将输出传递给coscmd
,我们将其用于将压缩存档传输到腾讯云COS。 我们将压缩归档命名为mysql_backup_180423.tar.gz
。
由于我们在详细模式下使用tar
,您将看到正在压缩的文件列表(隐藏此输出,省略上述命令中的-v
标志)。
输出将以以下文件传输信息结束,coscmd上传成功后将不会返回任何内容,如果有其他输出,请检查你的coscmd设置:
...
Starting new HTTP connection (1): q**************.cos.ap-shanghai.myqcloud.com
传输完成后,我们将通过列出Space内容来验证文件是否已成功传输到我们的腾讯云COS:
$ coscmd list -a
您应该看到备份存档文件:
...
mysql_backup_180423.tar.gz 15 2018-08-10 16:11:17
此时,我们已经成功完成了对腾讯云COS的物理MySQL备份。我们现在将卸载并删除快照卷,将已用空间还原到我们的卷组vg1
。
现在我们的数据已经备份,本教程前面创建的快照卷已经没有太大用处,可以放心地删除它。
要卸载卷,请运行以下命令:
$ sudo umount /backup_src
替换/backup_src
为快照卷的挂载点。
我们现在可以删除快照卷。为此,请运行以下命令:
$ sudo lvremove vg1/mysql_data_snap
此处,vg1
对应于卷组名称和mysql_data_snap
对应于
快照卷名称。
系统将提示您确认删除,对此你应该按Y回应。
您应该看到以下输出:
Logical volume "mysql_data_snap" successfully removed
已成功删除快照卷。您现在已经完成了完整的MySQL物理备份并将其上传到您的腾讯云COS
我们将通过快速运行恢复方案来结束本教程。
要从我们之前上传到腾讯云COS的物理备份恢复我们的MySQL数据库,我们将备份传输到我们的数据库服务器,然后将提取的文件用作我们恢复的MySQL数据目录。
让我们首先将备份从我们的腾讯云COS转移回数据库服务器上的用户主目录:
$ coscmd download /mysql_backup_180423.tar.gz ~/mysql_backup_180423.tar.gz
你应该看到一些文件传输输出:
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 15.0/15.0 [00:00<00:00, 55.1KB/s]
我们现在将停止正在运行的数据库服务器并清除现有数据目录,因为我们要从物理备份文件测试中干净还原。
首先,停止MySQL服务器:
$ sudo service mysql stop
现在,删除MySQL数据目录的内容:
$ sudo rm -rf /data/*
回想一下,在本教程中,非默认的MySQL数据目录路径是/data
。
现在,将物理备份存档解压缩到MySQL数据目录:
$ sudo tar -xzvf ~/mysql_backup_180423.tar.gz -C /data
现在数据文件已经恢复,我们可以重启MySQL数据库并允许它恢复:
$ sudo service mysql start
最后,我们可以登录数据库服务器以验证还原是否成功完成:
$ mysql -u root -p
输入密码后,您应该看到MySQL客户端提示符:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.21-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
从这里,您可以扫描一些表格以验证您的数据是否完好无损。
在本教程中,我们演示了如何利用LVM的快照功能来冻结文件系统并执行完整的物理备份和还原正在运行的MySQL实例。如果使用LVM管理包含MySQL数据的一个或多个存储卷,则此功能提供了备份生产数据库的便捷方法。
在生产设置中,理想情况下,应使用适当的日志记录,监视和警报对此过程进行脚本化和调度。此外,FLUSH TABLES WITH READ LOCK
不应该在主服务器上运行(无论多么简短),而是在最小负载的副本上运行。请注意,只需稍加修改,您还可以调整上述过程以快速启动主物理备份中的副本。
如果您的MySQL实例专门使用腾讯云COS作为其存储引擎,您还可以使用云关系型数据库以类似的方式执行数据库的物理备份。将物理备份文件上载到腾讯云COS的合理替代方法是将LVM快照与服务器快照结合使用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。