mysql备份和还原(一)

【学习笔记】

为什么要备份?
灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景

备份注意要点

  • 能容忍最多丢失多少数据
  • 恢复数据需要在多长时间内完成
  • 需要恢复哪些数据

备份类型:
    完全备份:整个数据集
    部分备份:只备份数据子集,如部分库或表
 

完全备份、增量备份、差异备份
增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
注意:二进制日志文件不应该与数据文件放在同一磁盘
 

 

冷、温、热备份

  • 冷备:读写操作均不可进行
  • 温备:读操作可执行;但写操作不可执行
  • 热备:读写操作均可执行

MyISAM:温备,不支持热备
InnoDB:都支持
 

物理和逻辑备份

  •  物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
  •  逻辑备份:从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度
     

备份时需要考虑的因素

  • 温备的持锁多久
  • 备份产生的负载
  • 备份过程的时长
  • 恢复过程的时长
     

备份什么

  • 数据
  • 二进制日志、 InnoDB的事务日志
  • 程序代码(存储过程、函数、触发器、事件调度器)
  • 服务器的配置文件

备份工具
 

  1. cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份
  2. LVM的快照:先加锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
  3. mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
  4. xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份
  5. MariaDB Backup: 从MariaDB 10.1.26开始集成,基于PerconaXtraBackup 2.3.8实现
  6. mysqlbackup:热备份, MySQL Enterprise Edition组件
  7. mysqlhotcopy: PERL 语言实现, 几乎冷备,仅适用于MyISAM存储引擎,
  8. 使用LOCK TABLES、 FLUSH TABLES和cp或scp来快速备份数据库
     

冷备份:(使用两台主机模拟,其中一台(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 开放用户访问

你可能感兴趣的:(mysql备份和还原(一))