一、lvm快照原理:

当一个snapshot创建时,仅拷贝原卷中数据的元数据,创建时并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原卷上有写操作执行时,snapshot跟踪原卷块的改变,这时原卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制。在写操作写入块之前,将原始数据移动到snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果读取数据块是没有修改过的,那会将读操作直接重定向到原卷上,如果要读取已经修改过的块,那就读取拷贝到snapshot中的块。创建snapshot的大小并不需要和原卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦snapshot记录原卷块变换的信息空间满了,那这个snapshot立刻被释放,无法使用,从而导致这个snapshot无效。


二、基于lvm2快照执行备份恢复:

1、演示环境:

IP

操作系统

数据库版本

安装方式

数据目录

默认存储引擎

角色

192.168.1.145

CentOS   7.6 x86_64

MariaDB-10.3.15

yum

/data/mariadb

InnoDB

备份

192.168.1.146

CentOS   7.6 x86_64

MariaDB-10.3.15

yum

/var/lib/mysql

InnoDB

恢复

2、192.168.1.145主机新增一块20G硬盘,创建两个分区/dev/sdb1/dev/sdb2

# fdisk /dev/sdb --> n --> p --> 1 --> 回车 --> +10G --> t --> 8e --> p --> w --> # partx -a /dev/sdb

# fdisk /dev/sdb --> n --> p --> 2 --> 回车 --> 回车 --> t --> 2 --> 8e --> p --> w --> # partx -a /dev/sdb

192.168.1.145主机查看分区情况:# fdisk -l /dev/sdb

image.png

3、192.168.1.145主机分别创建用于存放数据文件、事务日志和二进制日志的逻辑卷:

(1)创建pv# pvcreate /dev/sdb1 /dev/sdb2  # pvs

(2)创建vg# vgcreate myvg /dev/sdb1 /dev/sdb2  # vgs

(3)创建用于存放数据文件和事务日志的lv# lvcreate -L 8G -n mariadb_data myvg  # lvs

(4)创建用于存放二进制日志的lv# lvcreate -L 2G -n mariadb_binlogs myvg  # lvs

(5)创建文件系统:# mke2fs -t ext4 /dev/myvg/mariadb_data  # mke2fs -t ext4 /dev/myvg/mariadb_binlogs

(6)创建挂载目录:# mkdir -pv /data/{mariadb,binlogs}

(7)开机自动挂载:# vim /etc/fstab

/dev/myvg/mariadb_data /data/mariadb ext4 defaults 0 0

/dev/myvg/mariadb_binlogs /data/binlogs ext4 defaults 0 0

(8)挂载分区:# mount -a  # mount | grep mariadb

image.png

(9)查看硬盘使用情况:# df -Th | grep mariadb

image.png

4、两个节点的服务器时间同步

5、192.168.1.145主机的server.cnf配置文件如下所示:

# cat /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/data/mariadb

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

log_bin=/data/binlogs/mysql-bin

binlog_format=mixed

sync_binlog=1

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

6、192.168.1.146主机的server.cnf配置文件如下所示:

# cat /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

log_bin=mysql-bin

binlog_format=mixed

sync_binlog=1

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

7、查看相关目录中的文件:

# ls -lh /data/mariadb

image.png

# ls -lh /data/binlogs

image.png

8、查看192.168.1.145主机的初始二进制日志信息:

MariaDB [(none)]> show binary logs;

image.png

MariaDB [(none)]> show master status;

image.png

9、192.168.1.145主机创建测试数据库和表:

MariaDB [(none)]> create database db;

MariaDB [(none)]> use db;

MariaDB [db]> create table tb(id int,name varchar(10));

MariaDB [db]> insert into tb values(1,'张三'),(2,'李四'),(3,'王五'),(4,'赵六');

MariaDB [db]> select * from tb;

image.png

MariaDB [db]> show master status;

image.png

备注:创建测试数据库和表的操作已记入二进制日志中

10、192.168.1.145主机请求在所有表中施加读锁,MariaDB数据库只能读不能写:

MariaDB [db]> flush tables with read lock;

11、192.168.1.145主机滚动二进制日志文件,并记录二进制日志文件及其事件位置:

MariaDB [db]> flush logs;

MariaDB [db]> \! mkdir -pv /backup

新开一个Xshell窗口,执行如下命令:

# mysql -uroot -p -e 'show master status;' > /backup/pos_`date +%F`.txt

# cat /backup/pos_2019-05-21.txt

image.png

12、查看数据目录大小:# du -sh /data/mariadb --> 122M

13、为逻辑卷创建快照卷:# lvcreate -L 200M -s -p r -n mariadb-snap /dev/myvg/mariadb_data

备注:二进制日志所在的逻辑卷无需创建快照卷

14、释放全局读锁:

MariaDB [db]> unlock tables;

15、挂载快照卷,复制数据至192.168.1.146主机进行备份:

# mount -r /dev/myvg/mariadb-snap /mnt

# ls /mnt

# scp -rp /mnt/* 192.168.1.146:/var/lib/mysql/

16、192.168.1.146主机修改/var/lib/mysql中子目录的属主属组,并重启mariadb服务:

# chown -R mysql.mysql /var/lib/mysql

# systemctl restart mariadb.service

17、备份完成后,192.168.1.145主机删除快照卷:

# umount /mnt

# lvremove /dev/myvg/mariadb-snap

# lvs

18、192.168.1.145主机在全量备份后执行如下修改操作:

MariaDB [db]> insert into tb values(5,'jack'),(6,'mary');

MariaDB [db]> delete from tb where id=3;

MariaDB [db]> update tb set name='keyso' where id=2;

MariaDB [db]> select * from tb;

image.png

MariaDB [db]> show binary logs;

image.png

MariaDB [db]> show master status;

image.png

19、192.168.1.145主机进行增量备份前先滚动二进制日志,生成一个新文件:

# mysqladmin -uroot -p flush-binary-log

MariaDB [db]> show binary logs;

image.png

MariaDB [db]> show master status;

image.png

20、192.168.1.145主机通过mysqlbinlog导出sql语句,进行增量备份:

# mysqlbinlog -uroot -p /data/binlogs/`cat /backup/pos_2019-05-21.txt | grep mysql-bin | awk '{print $1}'` | less

# mysqlbinlog -uroot -p /data/binlogs/`cat /backup/pos_2019-05-21.txt | grep mysql-bin | awk '{print $1}'` > /backup/incre_`date +%F`.sql

21、192.168.1.145主机/backup目录中的incre_2019-05-21.sql复制至192.168.1.146主机/backup目录中:

# scp /backup/incre_2019-05-21.sql root@192.168.1.146:/backup

22、192.168.1.146主机查看db数据库中tb表数据:

# mysql -uroot -p

MariaDB [(none)]> select * from db.tb;

image.png

23、查看192.168.1.146主机的初始二进制日志信息:

MariaDB [(none)]> show binary logs;

image.png

MariaDB [(none)]> show master status;

image.png

24、192.168.1.146主机关闭会话级别二进制日志:

MariaDB [(none)]> show variables like 'sql_log_bin';

image.png

MariaDB [(none)]> set sql_log_bin=0;

MariaDB [(none)]> show variables like 'sql_log_bin';

image.png

25、192.168.1.146主机导入增量备份incre_2019-05-21.sql,根据二进制日志进行时间点恢复,将全量备份之后的修改操作进行重放,全部导入操作执行成功后开启会话级别二进制日志:

MariaDB [(none)]> source /backup/incre_2019-05-21.sql

MariaDB [db]> select * from tb;

image.png

MariaDB [db]> show master status;

image.png

备注:二进制日志中事件位置没有发生变化,说明导入操作没有记入二进制日志中

MariaDB [db]> set sql_log_bin=1;

MariaDB [db]> show variables like 'sql_log_bin';

image.png

备注:从快照卷中备份数据,从原卷中读取二进制日志