资讯专栏INFORMATION COLUMN

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

IT那活儿 / 2756人阅读
基于Mysql数据库零数据丢失恢复探索

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

备份概述

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

场景介


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


MYSQLDUMP每天全备+binlog备份方案

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

1. 前提条件

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

2. 数据准备

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

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

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

#!/bin/bash

MYSQLDBUSERNAME=root

MYSQLDBPASSWORD=Ora#01555

#MYSQBASEDIR=/usr/local/mysql

#MYSQL=$MYSQBASEDIR/bin/mysql

MYSQL=/usr/bin/mysql

#MYSQLDUMP=$MYSQBASEDIR/bin/mysqldump

MYSQLDUMP=/usr/bin/mysqldump

BACKDIR=/app/backup/logic

DATEFORMATTYPE1=$(date +%Y-%m-%d)

DATEFORMATTYPE2=$(date +%Y%m%d%H%M%S)

#DBHOME=/msdata/db_mysql

#SOCK=${DBHOME}/mysql.sock

SOCK=/var/lib/mysql/mysql.sock

DATABASES=(

"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 5

done

find /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 ywdbnew

create 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那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129724.html

相关文章

  • TiDB at 丰巢:尝鲜分布式数据

    摘要:为此,一款高性能的分布式数据库,日渐成为刚需。基于如上的原因,我们选择了,作为丰巢的核心系统的分布式数据库,来取代和。 作者:丰巢技术团队 随着丰巢业务系统快速增长,其核心系统的数据量,早就跨越了亿级别,而且每年增量仍然在飞速发展。整个核心系统随着数据量的压力增长,不但系统架构复杂度急剧增长,数据架构更加复杂,传统的单节点数据库,已经日渐不能满足丰巢的需求,当单表数量上亿的时候,Ora...

    sixgo 评论0 收藏0
  • 单排学Redis【白银】

    摘要:对于数据结构哈希表我们在上一篇也已经详细说了。键空间示意图的数据库就是使用字典哈希表来作为底层实现的,对数据库的增删改查都是构建在字典哈希表的操作之上的。 前言 只有光头才能变强 今天继续来学习Redis,上一篇从零单排学Redis【青铜】已经将Redis常用的数据结构过了一遍了。如果还没看的同学可以先去看一遍再回来~ 这篇主要讲的内容有: Redis服务器的数据库 Redis对过期...

    denson 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<