一、tar工具的使用

 1、备份

(1)停止服务,3306端口关闭

image.png

(2)看下配置文件有没有关键日志存放于其它目录的,检查/etc/my.cnf,再检查下/etc/my.cnf.d/下有没有配置文件放置其他地方,有的话也需要一起拷贝归档

image.png

(3)建立备份目录,归档

image.png

(4)开启服务,备份完成

2、还原

(1)这里有个不小心输入删重要mysql库的命令,开始还原

image.png

(2)关闭服务,systemctl stop mariadb

(3)一定要注意配置文件和备份前的配置是否一样,拷贝刚才归档文件并解压至库里

image.png

(4)解压后文件注意权限,务必确保mysql.mysql权限

image.png

(4)开启服务,systemctl start mariadb

(5)进入数据库,查看数据库,mysql又回来了

image.png


二、LVM逻辑卷快照实现几乎热备(实质还是冷备):将数据库内容在很短时间用逻辑卷快照备份下,之后先将数据库推上线,再处理快照中的内容,结合二进制日志还原

1、备份

(1)新加硬盘并建立逻辑卷分区

开机添加硬盘扫描下,echo '- - -' > /sys/class/scsi_host/host0/scan,记得有每个host都需要扫描下image.png

分区,分区时候记得更改硬盘分区文件系统,代码8e,Linux LVM

pvcreate /dev/sdb1

vgcreate vgdb /dev/sdb1

lvcreate -n lvdb -L +6G /dev/vgdb ----->建立逻辑卷用来放置数据库数据

lvcreate -n lvdb -L +4G /dev/vgbin ----->建立逻辑卷用来单独放置二进制日志

mkfs.xfg /dev/vgdb/lvdb

mkfs.xfg /dev/vgdb/lvbin

mkdir -pv /data/{mysql,binlog}

mount /dev/vgdb/lvdb /data/mysql

mount /dev/vgdb/lvbin /data/binlog

image.png

(3)数据迁移,需要更改配置文件,开启二进制日志功能,确保权限正确

image.png

注:如果重启服务后提示错误无法迁移,将原数据库内mysql库复制到新库中重启即可

image.png

附:清除二进制日志指令:reset master

(4)基于快照备份

lvcreate -p -r -s -n snap_dbbak -L 2G /dev/vgdb/lvdb,设置了只读属性

image.png

(5)对数据做出修改,产生二进制日志变动

create database chenux

use chenux

create table info (name char(10),age tinyint,job varchar(20))

alter table info add id tinyint primary key first

insert into info values (1,'chenux',24,'driver')

相比之前已经作出很多修改

image.png

POS点变化,说明从328往后的数据点都是在变化

image.png

(6)做完逻辑卷快照后,对数据的更改会影响服务器性能能,也就是说旧的内容会添加到逻辑卷快照中,因此我们需要把快照里的数据导出来,对逻辑卷快照挂载

直接挂载mount /dev/vgdb/snap_dbbak /mnt会报错,因为快照snap_dbbak的逻辑卷uuid和lvdb逻辑卷uuid一样,所以挂载输入指令mount -o nouuid,norecovery /dev/vgdb/snap_dbbak  /mnt

image.png

(7)为确保数据安全性,可以挂载完成后将挂载目录里的数据存放至其它设备中,因为实验环境,依旧在本机上操作

image.png

cp -a /mnt/* /backups,此处用cp -a,保留权限,此时相当于备份完成

(8)备份完成后,删除快照

lvremove /dev/vgdb/snap_dbbak

(9)模拟损坏,删库,之后跑路,不过被抓了回来需要负责到底

(10)还原开始,停止服务,拷贝原数据库内容到数据库存放目录,再开放数据库

systemctl stop mariadb;cp -av /backups/* mysql/

image.png

(11)此时发现只有逻辑卷快照时的备份,后面的增删改没有了,所以这里需要引入二进制日志。在利用二进制还原时候,要避免其他用户连接数据库产生数据变更,此处需要使用防火墙或者其它策略确保数据库只有自己一个人操作

引用之前的图片,此时利用二进制日志工具可以还原

image.png

mysqlbinlog --start-position=328 mysql-bin.000001,可以查看到内容

image.png

往下翻

image.png

mysqlbinlog --start-position=328 mysql-bin.000001 > bl.sql

mysqlbinlog mysql-bin.000002 >> bl.sql

image.png

导入后再打开二进制日志功能,发现数据回来了

image.png

(12)还原后记得之前设置的防火墙或者其它拒绝访问策略再取消掉,完成

注意:如果删库用的是drop,不像实验中rm指令删除的,mybinlog BINLOG > *.sql,编辑该sql文件,将drop命令那行注释掉,再mysql < *.sql


3、mysqldump的备份和误删除操作后的还原

(1)准备环境,条件允许情况下,将二进制日志文件和数据库存放目录放到不同的磁盘中,而且二进制日志文件最好单独放在一个分区中

image.png

(2)加个数据库作为准备环境

image.png

做点修改,二进制日志产生变化

image.png

(3)开始备份

mysqldump -A -F --single-transacation --master-data=2 | gzip > /backupsq/db.sql.gz

image.png

(4)备份完,继续修改点小数据,再删个表之后继续做点修改,此时模仿环境中数据库时时刻刻都有增删改操作,不能说是因为删了某个表就停止了其他增删改

修改:alter table students add job varchar(20);、update students set job='nurse' where stuid=1;

删除:drop tables teachers;

再修改:insert into students values(26,'Yang Guo',28,'M',NULL,NULL,'CEO');

最后表

image.png

(5)开始还原,还原过程中利用防火墙不允许其他人访问数据库

进入数据库,先暂时关闭临时会话的二进制日志,避免二进制日志重复记录导入过程

mysql > set sql_log_bin=off;

      source /backups/db.sql;

此时完成完全备份的还原

image.png

(6)开始还原修改的数据,less /backups/db.sql,查看CHANGE MASTER TO信息

image.png

(7)利用工具将该日志导成sql数据库文件,并查找删除关键表的指令

mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql

image.png

完成后,如果后续还有其它二进制日志,将其它二进制日志也追加到incr.sql:

mysqlbinlog /data/binlog/mysql-bin.000004 >> /data/incr.sql

mysqlbinlog /data/binlog/mysql-bin.000005 >> /data/incr.sql等等

不过我这里由于增删改不多,就mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql这一步就够了

image.png

(8)导入数据,不过导入之前需要关闭临时会话中的sql_log_bin,避免出现二进制日志重复记录的现象

set sql_log_bin=off;

source  /data/incr.sql

这下我们的teachers表回来了,修改的students表也还原了

image.pngimage.png

 (9)关闭之前的拒绝用户访问策略,完成