MySQL基于LVM快照的备份恢复

目录

1、数据库全备份

2、准备LVM卷

3、数据恢复到LVM卷

4、基于LVM快照备份数据

5、数据灾难恢复

6、总结

写在前面:

测试环境中已安装有mysql 5.5.36数据库,但数据目录没有存放在LVM卷,此次要演示基于LVM的数据备份和恢复,所以就把mysql的数据先迁移到LVM上再做快照卷的备份。

如果innodb表基于LVM来做备份,那事务日志文件和数据文件要在同一个LVM的逻辑卷上,因为在同一时刻我们只能对一个逻辑卷做快照,如果事务日志与数据文件不在同一卷上,那做快照后会导致事务日志的事件与真正数据中提交的事务会不一致。

1、数据库全备份

先把现有的数据利用mysqldum工具进行全备份:

[[email protected] ~]# mysqldump -uroot -p123456 --lock-all-tables --flush-logs --events --routines --master-data=2 --all-databases > /backup/data_dir/fulldata-`date +%F` .sql
[[email protected] ~]# ls /backup/data_dir/
fulldata-2015-04-14.sql
[[email protected] ~]# service mysqld stop  #停止mysql

2、准备LVM卷

事先准备好两个卷作为LVM的PV:

[[email protected] ~]# fdisk -l
Disk /dev/sda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000bf287
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      102400   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              13        1926    15360000   83  Linux
/dev/sda3            1926        2056     1048576   82  Linux swap / Solaris
/dev/sda4            2056        6527    35916127+   5  Extended
/dev/sda5            2056        2709     5248011   8e  Linux LVM
/dev/sda6            2710        3363     5253223+  8e  Linux LVM

创建PV:

[[email protected] ~]# pvcreate /dev/sda5 /dev/sda6
  Physical volume "/dev/sda5" successfully created
  Physical volume "/dev/sda6" successfully created

创建VG:

[[email protected] ~]# vgcreate mygroup /dev/sda5 /dev/sda6
  Volume group "mygroup" successfully created

创建LV:

[[email protected] ~]# lvcreate -n mysqldata --size 3G mygroup  #大小设置为3GB
  Logical volume "mysqldata" created

格式化LV并挂载:

[[email protected] ~]# lvdisplay #显示逻辑卷的详细信息
[[email protected] ~]# mke2fs -t ext4 /dev/mygroup/mysqldata #格式化
[[email protected] ~]# blkid /dev/mygroup/mysqldata #获取UUID
/dev/mygroup/mysqldata: UUID="f863e626-e34e-4207-b9cb-7fbb9c5b7f1e" TYPE="ext4"
[[email protected] ~]# mkdir /mnt/mydata #创建挂载目录

在/etc/fstab文件中加入下边一行:

[[email protected] ~]# vim /etc/fstab
UUID=f863e626-e34e-4207-b9cb-7fbb9c5b7f1e /mnt/mydata   ext4   defaults 0 0
[[email protected] ~]# mount -a #重新挂载
[[email protected] ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/mygroup-mysqldata on /mnt/mydata type ext4 (rw)

3、数据恢复到LVM卷

创建数据目录及权限设置:

[[email protected] ~]# mkdir /mnt/mydata/data
[[email protected] ~]# chown -R mysql:mysql /mnt/mydata/data
[[email protected] ~]# vim /etc/my.cnf  #修改数据目录位置
datadir = /mnt/mydata/data
[[email protected] ~]# cd /opt/lamp/mysql55/ #切换到mysql的安装目录

初始化数据库:

[[email protected] mysql55]# scripts/mysql_install_db --user=mysql --datadir=/mnt/mydata/data

修改datadir指向的目录:

[[email protected] mysql55]# vim /etc/rc.d/init.d/mysqld 
datadir=/mnt/mydata/data

启动mysql,很奇怪,在我没有修改mysqld脚本文件中的datadir时也能正常启动:

[[email protected] mysql55]# service mysqld start

接入mysql,修改接入密码导入备份数据:

mysql> SET PASSWORD FOR [email protected]=PASSWORD(‘123456‘);
mysql> FLUSH PRIVILEGES;
mysql> source /backup/data_dir/fulldata-2015-04-14.sql
mysql> show databases;  #数据已恢复
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb1              |
| mydb2              |
| mysql              |
| performance_schema |
| test               |
+--------------------+

4、备份数据库

4.1、准备备份目录

[[email protected] mysql55]# mkdir -pv /backup/`date +%F`/{data,binlog} 
#以日期命令一个目录,在内还创建data和binlog目录,分别用来存放数据和二进制日志信息

4.2、修改变量、请求全表读锁

mysql> SET GLOBAL sync_binlog=1; #设置此变量为1,让每个事件尽可能同步到二进制日志文件里,以消耗IO来尽可能确保数据一致性
mysql> SHOW MASTER STATUS; #查看二进制日志和position,此信息保存在/backup/2015-04-14/binlog的binlog.txt里
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000016 |  1068076 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> FLUSH LOGS; #刷新日志
mysql> FLUSH TABLES WITH READ LOCK; #读锁请求到后不要关闭此mysql交互界面

在innodb表中,即使是请求到了读锁,但InnoDB在后台依然可能会有事务在进行读写操作,可用"mysql> SHOW ENGINE INNODB STATUS;"查看后台进程的状态,等没有写请求后再做备份。

4.2、创建快照

以只读的方式创建一个1GB大小的快照卷data-snap:

[[email protected] mysql55]# lvcreate --snapshot /dev/mygroup/mysqldata -n data-snap --size 1G --permission r

查看快照卷的详情(快照卷也是LV):

[[email protected] mysql55]# lvdisplay

4.3、解除锁定

回到锁定表的mysql交互式界面,解锁:

mysql> UNLOCK TABLES;
mysql> SET GLOBAL sync_binlog=0;  #此参数可以根据服务器磁盘IO的负载来调整

4.4、挂载快照卷并备份数据

[[email protected] ~]# mount /dev/mygroup/data-snap /tmp/  #挂载快照卷
[[email protected] ~]# ls /tmp/data/
ibdata1  ib_logfile0  ib_logfile1  mariadb.pid  mydb1  mydb2  mysql  performance_schema  test
[[email protected] mysql55]# cp -aR /tmp/data /backup/2015-04-14/data/  #备份数据
[[email protected] mysql55]# ls /backup/2015-04-14/data/data/
ibdata1  ib_logfile0  ib_logfile1  mariadb.pid  mydb1  mydb2  mysql  performance_schema  test

4.5、释放快照卷

[[email protected] ~]# umount /tmp/
[[email protected] ~]# lvremove /dev/mygroup/data-snap
Do you really want to remove active logical volume data-snap? [y/n]: y
  Logical volume "data-snap" successfully removed

5、数据灾难恢复

破坏数据,把数据目录下的所有文件都删除:

[[email protected] mysql55]# rm -rf /mnt/mydata/data/*
[[email protected] mysql55]# service mysqld stop   #PID文件也被删掉了,无法正常停止服务
 ERROR! MySQL server PID file could not be found!
[[email protected] mysql55]# killall mysqld

把备份数据copy到数据目录:

[[email protected] mysql55]# cp -Ra /backup/2015-04-14/data/data/* /mnt/mydata/data/
[[email protected] mysql55]# ll /mnt/mydata/data/  #确认各文件的权限是否为mysql
启动服务:
[[email protected] mysql55]# service mysqld start
Starting MySQL SUCCESS!

检查数据是否已恢复:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb1              |
| mydb2              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM mydb1.tb1;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   10 |
|  2 | jack |   20 |
|  3 | zcj  |   18 |
+----+------+------+

6、总结

基于LVM的数据备份方案几乎实现了热备,只是在请求读锁时会影响线上的业务,一旦当读锁请求到,创建快照几乎是瞬间完成,快照卷创建好后就可解除锁定,而备份就像复制或归档文件一样简单。数据恢复时只需要关闭mysql进程,把备份的数据复制到相应的数据目录,确保数据目录权限正确,启用服务即可,由于是直接复制的数据文件,所以索引不用重建。

时间: 2024-08-02 02:50:13

MySQL基于LVM快照的备份恢复的相关文章

mysql之lvm快照方式备份恢复

好像一般大家都不用这个吧,这里也仅是当做记录吧. 其实lvm快照不管是什么存储引擎都可以做到接近热备,看起来也还不错的样子.不过却也需要一些所必须的条件. 如:LVM卷,而且也有足够的空闲空间来做快照,并且事务日志也要与数据文件在一起. 好啦,废话不多说,我们先看看怎么用吧. 大体步骤: 1.全局锁. 2.滚动二进制日志,并做好记录 3.创建lvm快照. 4.释放锁. 5.从快照盘手动复制数据. 6.卸载并移除快照盘. 来吧. 先来看看lvm的情况: [[email protected] bac

Linux-6.5下 MariaDB-10基于LVM快照的备份数据 详解

理解部分: LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性.LVM可以对分区在线扩容,快照,镜像和条带化,功能非常强大.这篇文章的主题就是其中一个功能--快照. 快照(Snapshot)就是关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像.快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品: 其实

lvm-snapshot:基于LVM快照的备份

续 lvm-snapshot:基于LVM快照的备份之准备工作 Attention,Please! 重头戏开始啦 3.基于LVM快照的备份 (1)事务日志跟数据文件必须在同一个卷上: (2)创建快照卷之前,要请求MySQL的全局锁:在快照创建完成之后释放锁: (3)请求全局锁完成之后,做一次日志滚动:做二进制日志文件及位置标记(手动进行): 备份步骤: 3.1 请求全局锁,并滚动日志 MariaDB [hellodb]> FLUSH TABLES WITH READ LOCK; MariaDB [

MySQL基于mysqldump及lvmsnapshot备份恢复

一.备份对象 数据 配置文件 代码:存储过程,存储函数,触发器 跟复制相关的配置 二进制日志文件 二.备份工具 mysqldump:逻辑备份工具 InnoDB热备.MyISAM温备.Aria温备 备份和恢复过程较慢 mysqldumper:多线程的mysqldump 很难实现差异或增量备份 lvm-snapshot: 接近于热备的工具:因为要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁 使用copy.tar等工具进行物理备份 备份和恢复速度较快 很难实现增量备份,并且请求全局锁需要等

lvm-snapshot:基于LVM快照的备份之准备工作

选择lvm逻辑卷存储数据库数据目录的2大理由 (1) 一般来说,我们会将数据库的数据目录放在lvm逻辑卷上,因为数据库的数据增长速度可能会超出我们的预期 ,这样在将来即便是数据增长很快,我们也不必担心,因为lvm可以实现在线扩容 (2) 我们可以对数据目录做基于lvm快照的备份 1.创建用于存储数据目录lvm设备 1.1 创建一个新分区,并修改分区类型 # echo -e 'n\np\n1\n\n+10G\nw\n'|fdisk /dev/sdb # echo -e 't\n8e\np\nw\n

centos mysql 实战 第十二节课 备份恢复 备份方案 备份可以分为几种形式 mysqldump 在不同版本里对性能会不会有影响? mysqldump 的用户需要什么权限 mysqldump 支持Where条件 备份评估

centos mysql 实战 第十二节课  备份恢复  备份方案  备份可以分为几种形式  mysqldump 在不同版本里对性能会不会有影响?   mysqldump 的用户需要什么权限   mysqldump 支持Where条件  备份评估 阿里云Percona-live 2016-4 基于Innodb物理复制 mysql5.7没有线程池,需要用percona版本mysql才有,percona的定位是做免费的企业版mysql mysql5.6的memcached插件只是提供memcache

LVM快照(snapshot)备份

转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv5ZmYL_ERp3Wprd1jVxG-333s6tCJn2LGqCAvFmJ6dXC Logical VolumeManager (LVM)提供了对任意一个LogicalVolume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份. 在某一个状态下做备份的时候,可能

mysql 增查删改,备份恢复,授权等基础常用命令

增 创建库,表 查 查看有哪些表,哪些库 删 删除库,删除表 改 修改表数据 mysql 登录   mysql -uroot -p(跟密码)mysql 命令大部分都是以:结尾 增   create   (da1 库名 ta1 表名) 创建库 create database da1; 创建表 create table ta1 (`id` int(4), `name` char(40)); id/第1个字段名字   int/类型 /整形4位   第2个是name    类型是char  字符串最多4

关于MySQL 事务,视图,索引,数据库备份,恢复

  /*创建数据库*/ CREATE DATABASE `mybank`;/*创建表*/USE mybank;CREATE TABLE `bank`(    `customerName` CHAR(10),        #用户名    `currentMoney` DECIMAL(10,2)         #当前余额);/*插入数据*/INSERT INTO `bank` (`customerName`,`currentMoney`) VALUES ('张三',1000);INSERT IN