搭建环境:
centos7
关闭SELinux: setenforce 0
关闭防火墙: systemctl stop firewalld
搭建步骤:
创建逻辑卷
# pvcreate /dev/sda6
# vgcreate vg0 /dev/sda6
# lvcreate -L 5G -n lv_mysql vg0
# lvcreate -L 3G -n lv_binlog vg0
# mkfs.xfs /dev/vg0/lv_mysql
# mkfs.xfs /dev/vg0/lv_binlog
# mkdir -pv /data/{mysql,backup} 创建挂载点
# vim /etc/fstab 永久挂载
UUID="25f718e7-d795-41f7-a3ac-19288360ec0e" /data/mysql/ xfs defaults 0 0
UUID="1848fe51-9b42-45fe-a66f-02ebc2694a52" /data/binlog/ xfs defaults 0 0
# mount -a 重新挂载/etc/fstab文件中的设备
# chown -R mysql.mysql /data 修改文件所属关系使mysql用户具有写权限
修改mysql配置文件并创建快照
# vim /etc/my.cnf 修改mysql的配置文件
[mysqld]
datadir=/data/mysql
log_bin=/data/binlog/mysql-bin mysql-bin为二进制日志文件的前缀
# systemctl restart mariadb
# mysql< hellodb_innodb.sql 导入数据库,用于后期的验证
说明:生产环境中为了保证快照创建成功,需要保证足够大的快照空间
mysql> flush tables with read lock; 为数据库加锁避免执行快照期间数据修改
mysql> flush logs; 滚动日志,使用新的二进制日志
mysql> show master logs; 查看二进制日志列表信息,用于二进制恢复使用
# lvcreate -L 1G -n lv_mysql_snap -s -p r /dev/vg0/lv_mysql 创建快照(-s选项,-p选项指定为只读)
mysql> unlock tables; 解锁
mysql> create database db1; 解锁后用户创建了新的数据(此部分的修改需要使用二进制日志来恢复)
# mount -o nouuid, norecovery /dev/vg0/lv_mysql/snap /mnt 注意指定nouuid和norecovery,否则报错,
因为快照的UUID与原UUID相同,只限于xfs文件系统使用
# cp -a /mnt/* /backup/ 将挂载至/mnt下的快照文件备份至/backup路径下保存
# umount /mnt 卸载快照挂载,否则数据库的更新操作的同时要写入快照影响数据库写入效率
# lvremove /dev/vg0/lv_mysql_snap 移除快照
说明: 模拟数据库崩溃场景
mysql> create database db2; 崩溃前执行了创建库的操作
mysql> use db2
mysql> drop table teachers; 崩溃前执行了删除表的操作
# rm -rf /data/mysql/* 删除数据文件模拟数据库崩溃
# systemctl stop mariadb
还原数据库
# cp -av /backup/* /data/mysql/* 将快照备份拷贝至数据文件夹
# systemctl start mariadb
mysql> flush tables with read lock; 为数据库加锁,防止恢复过程中有数据修改
# mysqlbinlog --start-position=245 mysql-bin.000004 > /backup/bin.sql 位置245和mysql-bin.000004是崩溃前使用 show master logs 记录的
# mysqlbinlog mysql-bin.000005 >> /backup/bin.sql 以上两步骤均是导出二进制日志用于恢复
说明:为了保证在恢复二进制日志时用户不能修改数据库需要关闭网络监听
# vim /etc/my.cnf
skip_networking
# systemctl restart mariadb
# mysql < /backup/bin.sql 使用二进制日志来恢复快照备份之后数据
删除配置文件中的skip_networking 并重启服务,验证数据库是否恢复正常