License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
如果你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