现在的位置: 首页 > 数据库 > MySQL > 正文
使用LVM快照进行数据库备份
2013年10月02日 MySQL ⁄ 共 6320字 暂无评论 ⁄ 被围观 4,764 views+

使用mysqldump备份时,如果存储引擎为MyISAM,则只能实现温备份,并需使用选项--lock-all-tables锁定所有表。如果存储引擎为InnoDB,则加上--single-transaction选项,可以实现热备。

使用mysqldump进行逻辑备份,还存在如下问题:

  • 浮点数据丢失精度;
  • 备份出的数据更占用空间;不过可压缩后以大大节省空间
  • 不适合对大数据库(如一个库超过10G)做完全备份
  • 另外对InnoDB而言,需要使用mysql> FLUSH TABLES WITH READ LOCK;刷新并锁定表时,可能需要花大量的时间
  • 对InnoDB而言,即使锁定了,也不一定以为着没有数据的写入,此时事务日志可能还在同步到永久存储

一、备份单表数据另一个手段:

1.1 基本语法:

备份:

SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];

还原:

LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;

1.2 示例:

备份表:

mysql> SELECT * INTO OUTFILE '/tmp/tutors.txt' FROM tutors;
Query OK, 8 rows affected (0.31 sec)

[root@localhost ~]# cat /tmp/tutors.txt
2    HuangYaoshi    M    63
3    Miejueshitai    F    72
4    OuYangfeng    M    76
6    YuCanghai    M    56
7    Jinlunfawang    M    67
8    HuYidao    M    42
9    NingZhongze    F    49
14    HuFei    M    31

注意:导出的仅仅是数据,表结构并不会被导出。

创建用于恢复数据的空表:

mysql> CREATE TABLE test_tb LIKE tutors;
Query OK, 0 rows affected (1.28 sec)

还原数据到新表:

mysql> LOAD DATA INFILE '/tmp/tutors.txt' INTO TABLE test_tb;
Query OK, 8 rows affected (0.17 sec)
Records: 8  Deleted: 0  Skipped: 0  Warnings: 0

mysql还原

二、使用LVM快照进行数据库备份

结合LVM快照功能对数据库进行备份,能够实现几乎热备(snapshot)的功能。

2.1 使用lvm快照进行mysql的备份时,需要满足如下条件:

  • 数据文件要在逻辑卷上(LV);
  • 此逻辑卷(LV)所在卷组必须有足够空间使用快照卷;
  • 数据文件和事务日志要在同一个逻辑卷上;
  • 2.2 实现过程:

2.2.1 打开会话,施加读锁,锁定所有表;

mysql> FLUSH TABLES WITH READ LOCK;
mysql> FLUSH LOGS;

mysql_锁表

2.2.2 通过另一个终端,保存二进制日志文件及相关位置信息;

$ mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master-`date +%F`.info

mysql_导出日志点

2.2.3 创建快照卷

# lvcreate -L # -s -p r -n LV_NAME /path/to/source_lv

实例:

查看mysql数据目录的vg信息:

[root@localhost ~]# df
文件系统             1K-块      已用      可用 已用% 挂载点
/dev/mapper/VolGroup-lv_root
                      19134332   4151016  14011336  23% /
tmpfs                   247204         0    247204   0% /dev/shm
/dev/sda1               495844     53354    416890  12% /boot
/dev/mapper/VolGroup-data
                       3096336    192984   2746068   7% /data

[root@localhost ~]# vgdisplay VolGroup
  --- Volume group ---
  VG Name               VolGroup
  System ID            
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               24.50 GiB
  PE Size               4.00 MiB
  Total PE              6273
  Alloc PE / Size       5762 / 22.51 GiB
  Free  PE / Size       511 / 2.00 GiB
  VG UUID               jbfFM4-hChV-QUzt-yPwV-d15b-tyGj-NeAPed

还有剩余PE,可以直接创建lv,如果没有剩余PE,则需要先扩展VG。

创建快照卷:

[root@localhost ~]# lvcreate -L 1024M -s -p r -n data_snap /dev/mapper/VolGroup-data
  Logical volume "data_snap" created

2.2.4 释放锁

mysql> UNLOCK TABLES;

2.2.5 挂载快照卷,备份

挂载快照卷:

[root@localhost ~]# mkdir /mnt/data_snap
[root@localhost ~]# mount /dev/mapper/VolGroup-data_snap /mnt/data_snap
mount: block device /dev/mapper/VolGroup-data_snap is write-protected, mounting read-only
[root@localhost ~]# cd /mnt/data_snap
[root@localhost data_snap]# ls
backup  lost+found  mysql

备份快照卷数据:

[root@localhost data_snap]# mkdir /data/backup/full-bak-`date +%F`

[root@localhost data_snap]# cp -R  mysql /data/backup/full-bak-`date +%F`

[root@localhost data_snap]# ll /data/backup/full-bak-`date +%F`/mysql
总用量 115688
-rw-r-----. 1 root root       56 9月  23 01:23 auto.cnf
-rw-r-----. 1 root root 12582912 9月  23 01:23 ibdata1
-rw-r-----. 1 root root 50331648 9月  23 01:23 ib_logfile0
-rw-r-----. 1 root root 50331648 9月  23 01:23 ib_logfile1
drwx------. 2 root root     4096 9月  23 01:23 jiaowu
-rw-r-----. 1 root root    13193 9月  23 01:23 localhost.localdomain.err
-rw-r-----. 1 root root        5 9月  23 01:23 localhost.localdomain.pid
drwx------. 2 root root     4096 9月  23 01:23 MYDB
drwx------. 2 root root     4096 9月  23 01:23 mysql
-rw-r-----. 1 root root    69370 9月  23 01:23 mysqld-binlog.000001
-rw-r-----. 1 root root  1211196 9月  23 01:23 mysqld-binlog.000002
-rw-r-----. 1 root root  3726432 9月  23 01:23 mysqld-binlog.000003
-rw-r-----. 1 root root      143 9月  23 01:23 mysqld-binlog.000004
-rw-r-----. 1 root root      171 9月  23 01:23 mysqld-binlog.000005
-rw-r-----. 1 root root      120 9月  23 01:23 mysqld-binlog.000006
-rw-r-----. 1 root root      198 9月  23 01:23 mysqld-binlog.index
drwx------. 2 root root     4096 9月  23 01:23 performance_schema
drwx------. 2 root root     4096 9月  23 01:23 test
drwx------. 2 root root     4096 9月  23 01:23 testdb
drwx------. 2 root root     4096 9月  23 01:23 testdb2
drwx------. 2 root root     4096 9月  23 01:23 uu151631

2.2.6 删除快照卷和无用数据

删除快照卷:

[root@localhost data_snap]# cd
[root@localhost ~]# umount /mnt/data_snap/
[root@localhost ~]# lvremove --force /dev/mapper/VolGroup-data_snap
  Logical volume "data_snap" successfully removed

由于这里备份的日志文件是无用的,因此可以删除:

[root@localhost ~]# rm -f /data/backup/full-bak-`date +%F`/mysql/mysqld-binlog.*

2.2.7 增量备份二进制日志

先在现在的mysql中做一些写操作:

mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.09 sec)

mysql> use jiaowu;

Database changed
mysql> INSERT INTO tutors (Tname) VALUES ('Sam');
Query OK, 1 row affected (0.15 sec)

mysql> INSERT INTO tutors (Tname) VALUES ('TOM');
Query OK, 1 row affected (0.01 sec)

恢复前数据

查看当前日志:

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysqld-binlog.000007 |      650 |              |                  |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

备份增量日志:需要注意的是,由于我使用了[FLUSH LOGS]滚动日志,因此理论上使用lvm快照卷备份后有两个日志的增量数据需要备份,即:mysqld-binlog.000006和mysqld-binlog.000007

查看备份开始时的日志位置:

[root@localhost ~]# cat /data/backup/master-2013-09-23.info
*************************** 1. row ***************************
             File: mysqld-binlog.000006
         Position: 120
     Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:

导出日志:

[root@localhost ~]# mysqlbinlog --start-position=120 /data/mysql/mysqld-binlog.000006 >/data/backup/06.sql

[root@localhost ~]# mysqlbinlog /data/mysql/mysqld-binlog.000007 >/data/backup/07.sql

2.3 恢复测试:

2.3.1 模拟损坏:

我这里还是采用直接删除数据文件目录:

mysql模拟损坏

此时已经无法正常停止mysqld了:

[root@localhost data]# service mysqld stop
ERROR! MySQL server PID file could not be found!

[root@localhost data]# killall mysqld

2.3.2 恢复完全备份:直接cp

[root@localhost data]# cp -R  /data/backup/full-bak-2013-09-23/mysql /data/
cp:是否覆盖"/data/mysql/localhost.localdomain.err"? yes

[root@localhost mysql]# chown mysql.mysql -R /data/mysql

2.3.3 启动服务器:

[root@localhost data]# service mysqld start
Starting MySQL SUCCESS!

2.3.4 导入增量备份:

[root@localhost ~]# mysql -uroot -p </data/backup/06.sql

[root@localhost ~]# mysql -uroot -p </data/backup/07.sql

2.3.5 使用LVM快照卷备份注意事项:如果需要备份单一库,则InnoDB需设置为独立表空间

设置每个表独立使用一个表空间
[root@localhost ~]# echo "innodb_file_per_table = 1" >>/etc/my.cnf
重启生效:
[root@localhost ~]# service mysqld restart

给我留言

留言无头像?


×