如何使用LVM快照将MySQL数据库备份到腾讯云COS

介绍

定期数据库备份是防止意外数据丢失事件的关键步骤。设计有效的备份和恢复策略通常需要通过恢复速度,数据完整性和备份覆盖来权衡性能影响,实施成本和数据存储成本。最佳解决方案取决于您的恢复点和时间目标以及数据库规模和体系结构。在本教程中,我们将演示如何使用LVM快照对正在运行的MySQL数据库执行实时(或“hot”)物理备份。然后,我们将数据压缩并存储在腾讯云存储中。

本教程中介绍的过程非常适合大型MySQL数据库,使用混合存储引擎(如InnoDB,TokuDB和MyISAM)的数据库,以及使用LVM管理多个块存储卷的数据库服务器。

我们首先要确保我们的Ubuntu 16.04服务器可以获取并安装LVM快照。接下来,我们将获取包含MySQL数据目录的逻辑卷的LVM快照。然后,我们将安装此快照卷(冻结的逻辑卷),并将MySQL数据目录压缩并发送到腾讯云存储进行存储。最后,我们将简要介绍一个示例恢复方案。

准备

要使用本教程,您需要具备以下准备:

完成所有这些设置后,您就可以开始使用本教程了。

第一步 - 调查MySQL和LVM配置

首先,我们将找到我们的MySQL数据目录,并记下有关LVM配置的详细信息。

找到MySQL 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配置

请务必注意,本节中描述的命令的输出将根据服务器的硬件和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 / SizeFree 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_datavg1mysql_data卷组的名称)。

总而言之,在本教程使用的Ubuntu 16.04服务器上,我们有一个500GB的物理卷(/dev/sda)用于支持一个卷组(vg1),我们从中创建了一个475GB逻辑卷(mysql_data)。这在卷组中留下了25GB的可用空间,可用于创建更多逻辑卷(和快照)。

您的硬件和LVM配置可能会有所不同; 您可能连接了多个块存储设备,汇集为单个或多个卷组。给指定的逻辑卷拍摄快照的过程仍然是相同的。

使用本节中介绍的一系列命令,您现在应该对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快照

警告: LVM快照处于活动状态时,写入磁盘时性能会有所下降。您应首先使用具有模拟负载的非生产数据库测试此过程,以验证此方法是否适用于您的生产部署。

我们现在将使用lvcreate创建mysql_data逻辑卷的快照。在我们这样做之前,我们需要使用FLUSH TABLES WITH READ LOCK冻结对数据库的写入,以便我们可以保证数据的一致性。这些表只需要被锁定,直到我们运行lvcreate,此时它们可以被解锁。如果编写这一系列命令的脚本,总锁定时间应该非常小,具体时间将取决于当前正在执行的写入查询。

读锁定MySQL数据库

让我们从刷新表开始吧。从数据库服务器上的终端,用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

要将此备份上传到我们的腾讯云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快照与服务器快照结合使用。


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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏漏斗社区

你与敬业福还差一个yxcms app漏洞的距离

0x00 背景 之前有挖了yxcms app的一些漏洞,基本是后台的,打后台的知识也就发现了前台的存储XSS,然后前几天看到先知上有师傅发了前台的存储XSS...

39550
来自专栏芋道源码1024

分布式事务 TCC-Transaction 源码分析 —— 事务恢复

1. 概述 本文分享 TCC 恢复。主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover Rec...

41830
来自专栏YG小书屋

ElasticSearch 介绍

69930
来自专栏飞雪无情的博客

一个简单的Golang实现的HTTP Proxy

最近因为换了Mac,以前的Linux基本上不再使用了,但是我的SS代理还得用。SS代理大家都了解,一个很NB的Socket代理工具,但是就是因为他是Socket...

24230
来自专栏极客猴

Python定时任务(下)

上篇文章,我们了解到有三种办法能实现定时任务,但是都无法做到循环执行定时任务。因此,需要一个能够担当此重任的库。它就是 APScheduler。

34630
来自专栏java一日一条

Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文主要介绍...

11510
来自专栏玄魂工作室

Python黑客编程3网络数据监听和过滤

课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7.9 • 涉及到的主要pytho...

1.3K30
来自专栏ionic3+

【Weex一瞥笔记】

安装结束后你可以直接使用 weex 命令验证是否安装成功,它会显示 weex 命令行工具各参数:

11630
来自专栏吴伟祥

Linux 文件与目录管理 转

pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令。

13640
来自专栏xx_Cc的学习总结专栏

iOS-网络编程(一)HTTP协议

33790

扫码关注云+社区

领取腾讯云代金券