一、tar工具的使用
1、备份
(1)停止服务,3306端口关闭
(2)看下配置文件有没有关键日志存放于其它目录的,检查/etc/my.cnf,再检查下/etc/my.cnf.d/下有没有配置文件放置其他地方,有的话也需要一起拷贝归档
(3)建立备份目录,归档
(4)开启服务,备份完成
2、还原
(1)这里有个不小心输入删重要mysql库的命令,开始还原
(2)关闭服务,systemctl stop mariadb
(3)一定要注意配置文件和备份前的配置是否一样,拷贝刚才归档文件并解压至库里
(4)解压后文件注意权限,务必确保mysql.mysql权限
(4)开启服务,systemctl start mariadb
(5)进入数据库,查看数据库,mysql又回来了
二、LVM逻辑卷快照实现几乎热备(实质还是冷备):将数据库内容在很短时间用逻辑卷快照备份下,之后先将数据库推上线,再处理快照中的内容,结合二进制日志还原
1、备份
(1)新加硬盘并建立逻辑卷分区
开机添加硬盘扫描下,echo '- - -' > /sys/class/scsi_host/host0/scan,记得有每个host都需要扫描下
分区,分区时候记得更改硬盘分区文件系统,代码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
(3)数据迁移,需要更改配置文件,开启二进制日志功能,确保权限正确
注:如果重启服务后提示错误无法迁移,将原数据库内mysql库复制到新库中重启即可
附:清除二进制日志指令:reset master
(4)基于快照备份
lvcreate -p -r -s -n snap_dbbak -L 2G /dev/vgdb/lvdb,设置了只读属性
(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')
相比之前已经作出很多修改
POS点变化,说明从328往后的数据点都是在变化
(6)做完逻辑卷快照后,对数据的更改会影响服务器性能能,也就是说旧的内容会添加到逻辑卷快照中,因此我们需要把快照里的数据导出来,对逻辑卷快照挂载
直接挂载mount /dev/vgdb/snap_dbbak /mnt会报错,因为快照snap_dbbak的逻辑卷uuid和lvdb逻辑卷uuid一样,所以挂载输入指令mount -o nouuid,norecovery /dev/vgdb/snap_dbbak /mnt
(7)为确保数据安全性,可以挂载完成后将挂载目录里的数据存放至其它设备中,因为实验环境,依旧在本机上操作
cp -a /mnt/* /backups,此处用cp -a,保留权限,此时相当于备份完成
(8)备份完成后,删除快照
lvremove /dev/vgdb/snap_dbbak
(9)模拟损坏,删库,之后跑路,不过被抓了回来需要负责到底
(10)还原开始,停止服务,拷贝原数据库内容到数据库存放目录,再开放数据库
systemctl stop mariadb;cp -av /backups/* mysql/
(11)此时发现只有逻辑卷快照时的备份,后面的增删改没有了,所以这里需要引入二进制日志。在利用二进制还原时候,要避免其他用户连接数据库产生数据变更,此处需要使用防火墙或者其它策略确保数据库只有自己一个人操作
引用之前的图片,此时利用二进制日志工具可以还原
mysqlbinlog --start-position=328 mysql-bin.000001,可以查看到内容
往下翻
mysqlbinlog --start-position=328 mysql-bin.000001 > bl.sql
mysqlbinlog mysql-bin.000002 >> bl.sql
导入后再打开二进制日志功能,发现数据回来了
(12)还原后记得之前设置的防火墙或者其它拒绝访问策略再取消掉,完成
注意:如果删库用的是drop,不像实验中rm指令删除的,mybinlog BINLOG > *.sql,编辑该sql文件,将drop命令那行注释掉,再mysql < *.sql
3、mysqldump的备份和误删除操作后的还原
(1)准备环境,条件允许情况下,将二进制日志文件和数据库存放目录放到不同的磁盘中,而且二进制日志文件最好单独放在一个分区中
(2)加个数据库作为准备环境
做点修改,二进制日志产生变化
(3)开始备份
mysqldump -A -F --single-transacation --master-data=2 | gzip > /backupsq/db.sql.gz
(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');
最后表
(5)开始还原,还原过程中利用防火墙不允许其他人访问数据库
进入数据库,先暂时关闭临时会话的二进制日志,避免二进制日志重复记录导入过程
mysql > set sql_log_bin=off;
source /backups/db.sql;
此时完成完全备份的还原
(6)开始还原修改的数据,less /backups/db.sql,查看CHANGE MASTER TO信息
(7)利用工具将该日志导成sql数据库文件,并查找删除关键表的指令
mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql
完成后,如果后续还有其它二进制日志,将其它二进制日志也追加到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这一步就够了
(8)导入数据,不过导入之前需要关闭临时会话中的sql_log_bin,避免出现二进制日志重复记录的现象
set sql_log_bin=off;
source /data/incr.sql
这下我们的teachers表回来了,修改的students表也还原了
(9)关闭之前的拒绝用户访问策略,完成
转载于:https://blog.51cto.com/13873498/2300180