Fork me on GitHub
Suzf  Blog

How-to Use LVM Snapshot To Backup MySQL

License: Attribution-NonCommercial-ShareAlike 4.0 International

本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。

转载请注明:http://suzf.net/post/1308

如果你Mysql的数据存储在LVM逻辑卷上,那么使用 LVM Snapshot 是对Mysql数据取得一个时间点的完全备份的一个低影响行为的一个方法。唯一的困难是,必须保证数据文件处于`安全`的状态(即所有数据已经写到硬盘文件,而不是仅仅存在于内存中);

为什么基于快照备份Mysql是一个好的选择?

大部分场景接近热备份 您可以在应用程序运行时执行这种类型的备份。无需关闭服务,只需设置只读或是类似的操作。

支持所有本地磁盘存储引擎 它适用于MyISAM和Innodb和BDB,它也适用于Solid,PrimeXT和Falcon存储引擎。

低开销 因为它只是文件副本 因此对服务器的开销是最小的

快速备份

易于对数据进行压缩归档备份 将其备份到磁带,FTP或任何网络备份软件;它很容易,因为你只需要复制文件。

快速恢复 恢复时间与将数据恢复和标准MySQL崩溃恢复一样快,并且可以进一步减少。

免费没有额外的商业工具,Innodb热备份需要执行备份。

不过这里也有些不足之处

显然易见这里需要快照的兼容性

可能会需要 root 权限

很难预测停机时间我提到这个解决方案通常是热备份,但糟糕的是,很难估计它是什么时候,它是不是 - FLUSH TABLES WITH READ LOCK 可能需要相当长的时间在具有长查询的系统上完成。

多个卷上的数据的问题 如果您在单独的设备或仅跨越多个卷的数据库上有日志,则会遇到麻烦,因为您无法在所有数据库中获得一致的快照。 一些系统可能能够对许多卷执行原子快照。

下面是是使用LVM Snapshot备份的基本过程

1. 打开多个终端会话,一个用于登陆Mysql 执行相关命令; 一个用于生成LVM 快照

2. 在终端会话1中,连接Mysql 设置读锁;所以不会再有新的数据写入。但是不要使用 `mysqladmin` 执行操作,并确保您的数据库会话保持打开,否则读取锁将在客户端断开连接时立即删除。

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;    # 重建 Mysql Slave

3. 在另一个终端会话中,创建 Mysql 数据卷的 LVM 快照。在本例中,我们假设 数据目录为 /var/lib/mysql LVM 逻辑卷名称为 /dev/vg0/mysql. 确保快照的空间足够大,以便在执行备份时有足够的空间容纳新数据进入数据库。如果空间给的太小,快照会失效备份也会终止。

lvcreate -L8G -s -n mysql-backup /dev/vg0/mysql

4. 回到之前打开Mysql 连接会话的终端,释放读锁;这样正常的数据操作就恢复了

UNLOCK TABLES;

5. 挂载快照到方便的地方

mkdir -p /mnt/mysql-backup
mount -o nouuid -t xfs /dev/vg0/mysql-backup /mnt/mysql-backup

如果你现在查看 /mnt mysql-backup 的内容,你应该看到一个 /var/lib/mysql 的副本,就像创建快照时的一样。

6. 使用您选择的方法将整个目录复制到您选择的位置。 例如

tar -C /mnt -czf ~/mysql-backup.tar.gz mysql-backup

或者启动一个新的Mysql实例,将数据导出

7. 一旦完成备份, 卸载 并移除快照

umount /mnt/mysql-backup
lvremove -f /dev/vg0/mysql-backup

如上所述,在创建快照时,数据库连接必须保持打开状态,以便保持锁定。编写脚本的唯一方法是使用支持数据库连接的语言。 这里是一个perl的例子。

#!/usr/bin/perl

use DBI;

# Connect to the local database
$dbh = DBI->connect('DBI:mysql:host=localhost;database=mysql', 'root', 'password') || die;

# Flush and lock tables to prepare for LVM snapshot
$dbh->do('FLUSH TABLES WITH READ LOCK;');

# Create LVM snapshot volume
system('lvcreate -L8G -s -n mysqlbackup /dev/vg0/mysql');

# Release table lock
$dbh->do('UNLOCK TABLES;');

# Disconnect from database
$dbh->disconnect();

相关链接

[0] https://dev.mysql.com/doc/refman/5.7/en/backup-methods.html

[1] https://www.percona.com/blog/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

[2] https://www.badllama.com/content/mysql-backups-using-lvm-snapshots

 

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

Suzf Blog

(๑>ڡ<)☆ 谢谢 ~

使用微信扫描二维码完成支付