lvm备份mysql数据库参考
2012-09-21 16:53:10 阿炯

常见的mysql数据库备份方法在停服的情况下,有自带的'mysqldump'及'mysqlhotcopy'工具来实现,且在数据量不多的情况下,一旦数据量过多,这两种方法显得力不从心了。即使在访问量最小的时候备份,也不对业务系统产生不小的影响,这里采用了一种基于'lvm'文件系统分区工具的基础上的备份方式,相信对你提供备份有所帮助。当然,前提是所要备份数据存于此类文件分区之上,当然最好是一个独立专用区。

1、首先登录进服务器进行锁表操作
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

可以查看master状态,可以看到其不再滚动。
mysql>SHOW MASTER STATUS;

注意:锁表的终端会话不能退出,否则锁表会自动取消。

2、创建快照卷
#为分区卷'/dev/vg0/lv0_data'创建一个名为'dbbackup'的快照。
# lvcreate -L18G -s -n dbbackup /dev/vg0/lv0_data
  Volume group "vg0" has insufficient free space (32 extents): 512 required.
#空间不足,需要给lvm释放空间。

# lvcreate -L18G -s -n dbbackup /dev/vg0/lv0_data
  Logical volume "dbbackup" created

Using lvscan again, the new snapshot can be seen.

# lvscan
  ACTIVE            '/dev/vg0/lv0_root' [7.81 GB] inherit
  ACTIVE            '/dev/vg0/lv0_home' [5.06 GB] inherit
  ACTIVE            '/dev/vg0/lv0_swap' [992.00 MB] inherit
  ACTIVE   Original '/dev/vg0/lv0_data' [25.00 GB] inherit
  ACTIVE   Snapshot '/dev/vg0/dbbackup' [18.00 GB] inherit

现对lvm快照进行挂载 (如果分区 '/dev/vg0/var'是 'XFS volume',  可以使用"-o nouuid -t xfs" 来进行挂载)。至此数据库所在的分区已经备份好了,可以进行所挂载的目录进行查看。为了不影响业务,回到锁mysql库表的终端进行解锁操作:
mysql>unlock tables;

3、对快照出来的数据进行操作
mkdir -p /mnt/snapshot
mount /dev/vg0/dbbackup /mnt/snapshot

我们可以'/mnt/snapshot'来开启第二个实例,在开启之前我们要取得一些相关参数:

第一个实例的运行端口
# mysqladmin variables | grep port
| port                            | 3306                        |

第一个实例的套接字
# mysqladmin variables | grep socket
| socket                          | /var/run/mysqld/mysqld.sock |

第一个实例的'--innodb-log-file-size'
# mysqladmin variables | grep innodb_log_file_size
| innodb_log_file_size            | 268435456

知道这些信息后,可以现开启第二个实例:
mysqld_safe --no-defaults --port=3308 --socket=/var/run/mysqld/mysqld-snapshot.sock --datadir=/mnt/snapshot/mysql/var/ --innodb-log-file-size=268435456 &

现可以对第二个mysql实例进行操作了,可以使用'mysqldump‘来连接本地'socket'来进行备份操作。
mysqldump -S /var/run/mysqld/mysql-snapshot.sock | gzip > /path/to/mysql/backup.sql.gz

甚或可以将它做为第一个实例的从辅库,当然要参考上面所得到的主服的位置,同时为本实例编写相应的配置文件,这理就不详述了。

4、清理
使用mysqladmin将第二台mysql服务器停止
mysqladmin -S /var/run/mysqld/mysqld-snapshot.sock shutdown

卸载'snapshot volume'
umount /mnt/snapshot

删除'LVM snapshot'

# lvremove /dev/vg0/dbbackup
Do you really want to remove active logical volume dbbackup? [y/n]: y
  Logical volume "dbbackup" successfully removed
 
至此完成。