CentOS 7.6基于lvm2快照备份恢复MariaDB

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

image.png

三、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

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

五、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

image.png

# ls -lh /data/binlogs

image.png

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

MariaDB [(none)]> show binary logs;

image.png

MariaDB [(none)]> show master status;

image.png

九、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

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

十、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

image.png

十二、查看数据目录大小:# 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;

image.png

MariaDB [db]> show binary logs;

image.png

MariaDB [db]> show master status;

image.png

1九、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

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;

image.png

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

MariaDB [(none)]> show binary logs;

image.png

MariaDB [(none)]> show master status;

image.png

2四、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

2五、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

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

相关文章
相关标签/搜索