【学习笔记】
为什么要备份?
灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景
备份注意要点
备份类型:
完全备份:整个数据集
部分备份:只备份数据子集,如部分库或表
完全备份、增量备份、差异备份
增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
注意:二进制日志文件不应该与数据文件放在同一磁盘
冷、温、热备份
MyISAM:温备,不支持热备
InnoDB:都支持
物理和逻辑备份
备份时需要考虑的因素
备份什么
冷备份:(使用两台主机模拟,其中一台(A)充当工作主机对其数据进行备份,将备份数据恢复到另一台主机(B)上)
1.停止mysql服务
2.将整个数据库目录压缩打包
数据库数据文件默认存放在/var/lib/mysql/下
tar Jcvf /data/mysql.bak.tar.xz /var/lib/mysql/
3.将该压缩包复制到另一台主机(B)
scp mysql.bak.tar.xz 192.168.36.27:/data/
4.在主机B上解压文件到/var/lib/mysql/下即可,之后启动数据库。
基于LVM备份
(1) 请求锁定所有表
mysql> FLUSH TABLES WITH READ LOCK;
(2) 记录二进制日志文件及事件位置
mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
mysql -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE
(3) 创建快照
lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME
(4) 释放锁
mysql> UNLOCK TABLES;
(5) 挂载快照卷,执行数据备份
(6) 备份完成后,删除快照卷
(7) 制定好策略,通过原卷备份二进制日志
实验:完全备份,并还原至最新状态
1 准备
vim /etc/my.cnf
[mysqld]
log-bin=/data/binlog/mysql-bin
datadir=/var/lib/mysql
2 备份
mysqldump -A -F --single-transaction --master-data=2 | gzip > /data/all.sql.gz
继续修改数据
3 模拟破坏
systemctl stop mariadb
rm -rf /var/lib/mysql/*
还原时禁止用户访问数据库
iptables
4 还原到备份时状态
systemctl start mariadb
gzip -d /data/all.sql.gz
mysql
> set sql_log_bin=off;
> source /data/all.sql;
5 还原到最新状态
grep "CHANGE MASTER" /data/all.sql 查看position mysql-bin.000002 245
cd /data/binlog/
mysqlbin --start-position=245 mysql-bin.000002 > /data/incr.sql
mysqlbin mysql-bin.000003 >> /data/incr.sql
mysqlbin mysql-bin.000004 >> /data/incr.sql
mysql
> set sql_log_bin=off;
> source /data/incr.sql;
> set sql_log_bin=on;
6 开放用户访问数据库
实验:恢复误删除的表
1 准备,二进制日志功能启用
2 完全备份
mysqldump -A -F --single-transaction --master-data=2 |gzip > /data/all.sql.gz
3 修改数据库
4 删除表10:00
drop table testlog
5 修改数据库10:10
6 flush tables with read lock
禁止用户访问用户数
7 还原到备份时状态
systemctl stop mariadb
rm -rf /var/lib/mysql/*
systemctl start mariadb
gzip -d /data/all.sql.gz
mysql
> set sql_log_bin=off;
> source /data/all.sql;
8 分析二进制日志,找到drop table 指令
grep -i "change master" /data/all.sql 245 mysql-bin.000002
mysqlbinlog --start-position=245 mysql-bin.000002 > /data/incr.sql
vim /data/incr.sql
找到drop table 指令,注释此指令
mysqlbinlog mysql-bin.000003 >> /data/incr.sql
mysqlbinlog mysql-bin.000004 >> /data/incr.sql
9 还原到最新状态
mysql
> set sql_log_bin=off;
> source /data/incr.sql;
> set sql_log_bin=on;
10 复查数据完整
11 开放用户访问