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