1、lvm快照原理:mysql
当一个snapshot建立时,仅拷贝原卷中数据的元数据,建立时并不会有数据的物理拷贝,所以snapshot的建立几乎是实时的,当原卷上有写操做执行时,snapshot跟踪原卷块的改变,这时原卷上将要改变的数据在改变以前被拷贝到snapshot预留的空间里,所以这个原理的实现叫作写时复制。在写操做写入块以前,将原始数据移动到snapshot空间里,这样就保证了全部的数据在snapshot建立时保持一致。而对于snapshot的读操做,若是读取数据块是没有修改过的,那会将读操做直接重定向到原卷上,若是要读取已经修改过的块,那就读取拷贝到snapshot中的块。建立snapshot的大小并不须要和原卷同样大,其大小仅仅只须要考虑两个方面:从shapshot建立到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦snapshot记录原卷块变换的信息空间满了,那这个snapshot马上被释放,没法使用,从而致使这个snapshot无效。sql
2、基于lvm2快照执行备份恢复:shell
一、演示环境:数据库
IPvim |
操做系统服务器 |
数据库版本less |
安装方式socket |
数据目录ide |
默认存储引擎测试 |
角色 |
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 |
恢复 |
二、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
三、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
(9)查看硬盘使用状况:# df -Th | grep mariadb
四、两个节点的服务器时间同步
五、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
六、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
七、查看相关目录中的文件:
# ls -lh /data/mariadb
# ls -lh /data/binlogs
八、查看192.168.1.145主机的初始二进制日志信息:
MariaDB [(none)]> show binary logs;
MariaDB [(none)]> show master status;
九、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;
MariaDB [db]> show master status;
备注:建立测试数据库和表的操做已记入二进制日志中
十、192.168.1.145主机请求在全部表中施加读锁,MariaDB数据库只能读不能写:
MariaDB [db]> flush tables with read lock;
十一、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
十二、查看数据目录大小:# du -sh /data/mariadb --> 122M
1三、为逻辑卷建立快照卷:# lvcreate -L 200M -s -p r -n mariadb-snap /dev/myvg/mariadb_data
备注:二进制日志所在的逻辑卷无需建立快照卷
1四、释放全局读锁:
MariaDB [db]> unlock tables;
1五、挂载快照卷,复制数据至192.168.1.146主机进行备份:
# mount -r /dev/myvg/mariadb-snap /mnt
# ls /mnt
# scp -rp /mnt/* 192.168.1.146:/var/lib/mysql/
1六、192.168.1.146主机修改/var/lib/mysql中子目录的属主属组,并重启mariadb服务:
# chown -R mysql.mysql /var/lib/mysql
# systemctl restart mariadb.service
1七、备份完成后,192.168.1.145主机删除快照卷:
# umount /mnt
# lvremove /dev/myvg/mariadb-snap
# lvs
1八、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;
MariaDB [db]> show binary logs;
MariaDB [db]> show master status;
1九、192.168.1.145主机进行增量备份前先滚动二进制日志,生成一个新文件:
# mysqladmin -uroot -p flush-binary-log
MariaDB [db]> show binary logs;
MariaDB [db]> show master status;
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
2一、将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
2二、192.168.1.146主机查看db数据库中tb表数据:
# mysql -uroot -p
MariaDB [(none)]> select * from db.tb;
2三、查看192.168.1.146主机的初始二进制日志信息:
MariaDB [(none)]> show binary logs;
MariaDB [(none)]> show master status;
2四、192.168.1.146主机关闭会话级别二进制日志:
MariaDB [(none)]> show variables like 'sql_log_bin';
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> show variables like 'sql_log_bin';
2五、192.168.1.146主机导入增量备份incre_2019-05-21.sql,根据二进制日志进行时间点恢复,将全量备份以后的修改操做进行重放,所有导入操做执行成功后开启会话级别二进制日志:
MariaDB [(none)]> source /backup/incre_2019-05-21.sql
MariaDB [db]> select * from tb;
MariaDB [db]> show master status;
备注:二进制日志中事件位置没有发生变化,说明导入操做没有记入二进制日志中
MariaDB [db]> set sql_log_bin=1;
MariaDB [db]> show variables like 'sql_log_bin';
备注:从快照卷中备份数据,从原卷中读取二进制日志