暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Mysql数据库零数据丢失恢复探索

IT那活儿 2021-12-09
1796

点击上方“IT那活儿”,关注后了解更多精彩内容!!!

备份概述

1. 物理备份<->逻辑备份;
2. 物理备份:基本为I/O操作,效果较高;
3. 逻辑备份:涉及逻辑转换,效率较低;
4. 联机备份<->脱机备份;
5. 联机备份:备份时不影响运行;
6. 脱机备份:备份时需要停库操作;复制文件的冷备最为典型;
7. 本地备份<->远程备份;
8. 本地备份:备份集只能存在本地;mysqldump较为典型;
9. 远程备份:备份集能存在远端;outfile/infile方式较为典型;
10. 全量备份<->增量备份;
11. 全量备份:备份数据库的全量数据;
12. 增量备份:备份数据库的后续修改。
  • 逻辑备份工具:mysqldump \ mydumper,load data方式。
  • 物理备份工具:  rsync或scp冷备, meb\xtracback全量及增量备份。

场景介


我们在维护数据库的时候,可能会存在某些删库跑路的或某些手抖误操作,在执行的时候发出了drop database, truncate ,drop table等危险操作,或 rm 删除某个数据目录的的情况,为保证在这种极端情况下,我们至少要有一份数据备份,特对这些场景做了几个恢复测试,备份我们通常使用mysqldump 逻辑备份, 远程binlog使用mysqlbinlog备份, 而物理备份则是通过xtraback或meb进行物理备份。


MYSQLDUMP每天全备+binlog备份方案

下面是对二种备份恢复测试的一个介绍

1. 前提条件

数据库开启binlog,并实时进行远程备份BINLOG。

2. 数据准备

  • 创建数据库YWDB,同时建表student并进行数据插10行,使用存储过程方式。

  • 模拟事务操作,对表进行删除即可。

  • 使用mysqldump进行数据库全备,可每日定义任务计划进行操作。

#!/bin/bashMYSQLDBUSERNAME=rootMYSQLDBPASSWORD=Ora#01555#MYSQBASEDIR=/usr/local/mysql#MYSQL=$MYSQBASEDIR/bin/mysqlMYSQL=/usr/bin/mysql#MYSQLDUMP=$MYSQBASEDIR/bin/mysqldumpMYSQLDUMP=/usr/bin/mysqldumpBACKDIR=/app/backup/logicDATEFORMATTYPE1=$(date +%Y-%m-%d)DATEFORMATTYPE2=$(date +%Y%m%d%H%M%S)#DBHOME=/msdata/db_mysql#SOCK=${DBHOME}/mysql.sockSOCK=/var/lib/mysql/mysql.sockDATABASES=("ywdb")[ -x $MYSQL ] || MYSQL=mysql[ -x $MYSQLDUMP ] || MYSQLDUMP=mysqldump[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}[ -d ${BACKDIR}/${DATEFORMATTYPE1} ] || mkdir ${BACKDIR}/${DATEFORMATTYPE1}for DBNAME in ${DATABASES[@]};do ${MYSQLDUMP} --user=${MYSQLDBUSERNAME} --password=${MYSQLDBPASSWORD} -S${SOCK} --routines --events --triggers --master-data=2 --single-transaction --flush-logs --databases ${DBNAME} | gzip > ${BACKDIR}/${DATEFORMATTYPE1}/${DBNAME}-backup-${DATEFORMATTYPE2}.sql.gz[ $? -eq 0 ] && echo "${DBNAME} has been backuped successful" || echo "${DBNAME} has been backuped failed"/bin/sleep 5donefind /app/backup/logic -type d -name `date +"%Y-%m-%d" -d "-7 day"`| xargs rm -rf
复制


  • 模拟某人误删除表,并同时操作多个事务进行,尽量模拟生产。

delete from  student;

  • 此时业务无法找到student记录,急急忙忙寻找救援。

3. 创建YWDBNEW库进行数据恢复

create database ywdbnew DEFAULT CHARACTER SET utf8mb4 ;use ywdbnewcreate table student(id int(4) primary key not null auto_increment,name varchar(32) not null,sex varchar(2) not null,phone varchar(32) not null unique,brithplace varchar(32) not null,grade int(1) not null);
复制

4. 全备恢复到YWDBNEW库

5. Mysqlbinlog进行恢复

  • 全备的binlog及pos地址

[root@node1 2021-11-08]# cat ywdb-backup-20211108165900.sql |grep -i mast-- CHANGE MASTER TO MASTER_LOG_FILE='on.000009', MASTER_LOG_POS=154;
复制
  • Truncate的POS地址

  • YWDBNEW中恢复了所需的数据

source /tmp/truncatebefore.sql

  • 再插入到企业DB YWDB

Insert into ywdb.student select * from ywdbnew.student;Select count(*) from ywdb.student;
复制


6. 注意事项

  • 备份时,由于不同的企业使用不同的方案,在恢复时要注意恢复到另一个库时,要看原先是否已备份DB,有可能原先的脚本会有USE选项。

  • Mysqlbinlog恢复时需要重写到新的DB,使用参数--rewrite-db='ywdb->ywdbnew',否则会写入到错误的库中。

本篇先介绍到此,下篇将结合xtraback进行和大家分享。

更多精彩干货分享

点击下方名片关注

IT那活儿

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论