通过LVM快照在线备份MySQL

RHEL 6.6

mysql-5.5.28     

   

文件系统快照是一种非常好用的在线备份方法,特别是我们再升级过程中遇到问题需要回退的状况下。我们可以事先创建一个镜像,如果升级失败,只要回滚就可以了。


使用LVM快照备份原因:

1>几乎可以实现热备,无须关闭服务。

2>支持所有的mysql存储引擎,如InnoDB,MYISAM等。

3>备份速度快,只需拷贝二进制日志文件即可

金无赤足,人无完人,它也存在一些缺点,如:

1>数据文件必须在逻辑卷上

2>数据文件和事务日志要在同一逻辑卷


LVM快照工作原理

        LVM使用写时复制来创建快照,只简单标记创建快照的时间点,读数据的时候是从原始卷上读,当原始卷数据有变化时,LVM在有写入操作时,复制受到影响的块到创建快照预留区域中。利用快照,我们可以使用很少的物理存储空间对一个非常大的卷做快照,但我们一定要预估可能发生改变的数据量,并分配足够的空间。假如分配空间不够,又需要写入数据,那么设备就变得不可用。


基本操作步骤:

1>施加读锁,锁定所有表;

2>打开另一终端,保存二进制日志文件和相关位置信息;

3>创建快照卷

4>释放锁并挂载快照卷,然后备份

5>可以删除快照卷,并进行增量备份二进制日志文件

6>恢复


所有数据文件已经准备好,mysql数据文件存放在逻辑卷上,并挂载到/mydata目录,数据文件在/mydata/data。每表一个表空间文件,既 innodb-file-per-table在on的状态。

此例中有一个名为school的数据库,并含有一个student表。为实验方便,开启三个终端,简记为终端1,终端2,终端3。

[root@localhost ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda2              20G  3.7G   15G  20% /

tmpfs                 202M     0  202M   0% /dev/shm

/dev/sda1             477M   24M  428M   6% /boot

/dev/mapper/myvg-mydata

                      9.9G  181M  9.2G   2% /mydata


mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| school             |

+--------------------+



mysql> SHOW TABLES;

+------------------+

| Tables_in_school |

+------------------+

| student          |

+------------------+


mysql> SELECT * FROM student;

+----+----------+-----+

| ID | Name     | Age |

+----+----------+-----+

|  1 | xiaoming |  20 |

|  2 | xiaohong |  22 |

|  3 | xiaohei  |  66 |

|  4 | xiaobai  |  77 |


打开终端一,施加读锁。

mysql> START TRANSACTION;

mysql> FLUSH TABLES WITH READ LOCK;


打开终端2,在student表插入数据,模拟备份过程中有人写入数据。因为已施加读锁,插入会卡那,等待读锁释放才能插入成功。

mysql> INSERT INTO student (Name) VALUES ('xiaoming1');


打开终端一,更新日志文件

mysql> FLUSH LOGS;

mysql> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002 |      107 |              |                  |

+------------------+----------+--------------+------------------+



打开终端三,保存二进制日志文件备份信息,并创建快照卷。

[root@localhost ~]# mkdir /backup

[root@localhost ~]# mysql -p -e 'SHOW MASTER STATUS\G' > /backup/BINARY_LOG.INFO

[root@localhost ~]# lvcreate -L 50M -s -p r -n mydata-snap /dev/myvg/mydata

[root@localhost ~]# lvs

  LV          VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

  mydata      myvg owi-aos--- 10.00g                                                    

  mydata-snap myvg sri-a-s--- 52.00m      mydata 0.02


打开终端一,解锁。

mysql> UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)


打开终端二,可以看到数据已插入成功。

mysql> INSERT INTO student (Name) VALUES ('xiaoming1');

Query OK, 1 row affected, 1 warning (11 min 37.47 sec)


打开终端一,提交事务,将二进制事件立即写入。

commit;


打开终端三,以只读方式挂载,并做备份。

[root@localhost ~]# mount /dev/myvg/mydata-snap /mnt -o ro

[root@localhost ~]# cd /mnt/data

[root@localhost data]# mkdir -p /backup/full_backup

[root@localhost data]#  cp -a ./* /backup/full_backup

[root@localhost ~]# umount /mnt

[root@localhost ~]# lvremove --force /dev/myvg/mydata-snap

[root@localhost ~]# cd /backup/full_backup/

[root@localhost full_backup]# rm mysql-bin.* -f   二进制日志文件不用备份


[root@localhost full_backup]# cd /mydata/data/   做增量备份

[root@localhost data]# mysqlbinlog --start-position=107 mysql-bin.000002 > /backup/increment_backup.sql


模拟服务器故障,删除数据目录。

[root@localhost data]# rm -rf /mydata/data/*


[root@localhost data]# cp -a /backup/full_backup/* /mydata/data

[root@localhost data]# service mysqld start

Starting MySQL SUCCESS! 

mysql> use school

mysql> SELECT * FROM student;   没有小明1;

+----+-----------+-----+

| ID | Name      | Age |

+----+-----------+-----+

|  1 | xiaoming  |  20 |

|  2 | xiaohong  |  22 |

|  3 | xiaohei   |  66 |

|  4 | xiaobai   |  77 |

+----+-----------+-----+


mysql> set sql_log_bin=0 关闭二进制日志文件

mysql> source /backup/increment_backup.sql  导入增量备份

mysql> SELECT * FROM student;    可看到xiaoming1

+----+-----------+-----+

| ID | Name      | Age |

+----+-----------+-----+

|  1 | xiaoming  |  20 |

|  2 | xiaohong  |  22 |

|  3 | xiaohei   |  66 |

|  4 | xiaobai   |  77 |

|  5 | xiaoming1 |   0 |

+----+-----------+-----+


mysql> set sql_log_bin=1;开启二进制日志



至此,备份恢复都完成了。




www.mingxiao.info

一个不错的论坛:http://www.aminglinux.com/bbs/forum.php

你可能感兴趣的:(mysql,备份,快照,lvm)