当前位置: 首页 > news >正文

mysql常用的数据备份方案

为什么80%的码农都做不了架构师?>>>   hot3.png

1. 冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;
2. 温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;
3. 热备(hot backup):备份的同时,业务不受影响。.

建议的备份和恢复方案:

完全+增量+二进制日志
完全+差异+二进制日志

1. 对单表进行备份。

mysql> use hellodb;     //打开hellodb库 
mysql> select * from students;  查看students的属性 
mysql> select * from students where Age > 30 into outfile ‘/tmp/stud.txt' ;   //将年龄大于三十的同学的信息备份出来 


mysql> load data infile '/tmp/stud.txt' into table students;  //恢复数据

2. 对数据库进行完全备份。(每天晚上12点做一次全备,每隔一小时备份binlog,也就是增量备份)

#!/bin/sh
# mysql data backup script #
# use mysqldump --help,get more detail.
BakDir=/backup/mysql
LogFile=/backup/mysql/mysqlbak.log
DATE=`date +%Y%m%d`
echo " " >> $LogFile
echo " " >> $LogFile
echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
cd $BakDir
DumpFile=$DATE.sql
GZDumpFile=$DATE.sql.tgz
mysqldump --quick --all-databases --flush-logs
--delete-master-logs --lock-all-tables
> $DumpFile
echo "Dump Done" >> $LogFile
tar czvf $GZDumpFile $DumpFile >> $LogFile 2>&1
echo "[$GZDumpFile]Backup Success!" >> $LogFile
rm -f $DumpFile
#delete previous daily backup files:采用增量备份的文件,如果完整备份后,则删除增量备份的文件.
cd $BakDir/daily
rm -f *
cd $BakDir
echo "Backup Done!"
echo "please Check $BakDir Directory!"
echo "copy it to your local disk or ftp to somewhere !!!"
ls -al $BakDir

增量备份

#!/bin/sh
# mysql binlog backup script
/usr/bin/mysqladmin flush-logs
DATADIR=/var/lib/mysql
BAKDIR=/backup/mysql/daily
###如果你做了特殊设置,请修改此处或者修改应用此变量的行:缺省取机器名,mysql缺省也是取机器名
HOSTNAME=`uname -n`
cd $DATADIR
FILELIST=`cat $HOSTNAME-bin.index`
##计算行数,也就是文件数
COUNTER=0
for file in $FILELIST
do
COUNTER=`expr $COUNTER + 1 `
done
NextNum=0
for file in  $FILELIST
do
base=`basename $file`
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $COUNTER ]
then
echo "skip lastest"
else
dest=$BAKDIR/$base
if(test -e $dest)
then
echo "skip exist $base"
else
echo "copying $base"
cp $base $BAKDIR
fi
fi
done
 
echo "backup mysql binlog ok"

增量备份脚本是备份前flush-logs,mysql会自动把内存中的日志放到文件里,然后生成一个新的日志文件,所以我们只需要备份前面的几个即可,也就是不备份最后一个.

因为从上次备份到本次备份也可能会有多个日志文件生成,所以要检测文件,如果已经备份过,就不用备份了.

数据还原:

先还原最近的完全备份数据:

mysql -hhostname -uusername -ppassword databasename < backupfile.sql

再还原binlog :

./mysqlbinlog --start-date="2009-04-10 17:30:05" --stop-date="2009-04-10 17:41:28" /usr/local/mysql/data/mysql-bin.000002 |mysql -u root -p123456

4. 双机热备(利用数据库主从技术)。

http://my.oschina.net/shyl/blog/709981

5. 基于Xtrabackup做备份恢复。

官方站点:www.percona.com

优势:

1、快速可靠的进行完全备份
2、在备份的过程中不会影响到事务
3、支持数据流、网络传输、压缩,所以它可以有效的节约磁盘资源和网络带宽。
4、可以自动备份校验数据的可用性。

安装Xtrabackup

 

复制代码代码如下:


[root@www ~]# rpm -ivh percona-xtrabackup-2.1.4-656.rhel6.i686.rpm 

 

其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得

注意:在备份数据库的时候,我们应该具有权限,但需要注意的是应该给备份数据库时的用户最小的权限,以保证安全性,

4.1前提:

应该确定采用的是单表一个表空间,否则不支持单表的备份与恢复。
在配置文件里边的mysqld段加上

innodb_file_per_table = 1

4.2备份策略
完全备份+增量备份+二进制日志
4.3准备个目录用于存放备份数据

 

复制代码代码如下:


[root@www ~]# makdir /innobackup

 

4.4做完全备份:

 

复制代码代码如下:


[root@www ~]# innobackupex --user=root --password=mypass /innobackup/

 

注:

1、只要在最后一行显示 innobackupex: completed OK!,就说明你的备份是正确的。
2、另外要注意的是每次备份之后,会自动在数据目录下创建一个以当前时间点命名的目录用于存放备份的数据,那我们去看看都有什么

[root@www 2013-09-12_11-03-04]# ls
backup-my.cnf ibdata1 performance_schema xtrabackup_binary xtrabackup_checkpoints
hellodb mysql test xtrabackup_binlog_info xtrabackup_logfile
[root@www 2013-09-12_11-03-04]#
xtrabackup_checkpoints :备份类型、备份状态和LSN(日志序列号)范围信息;
xtrabackup_binlog_info :mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
xtrabackup_logfile :非文本文件,xtrabackup自己的日志文件
xtrabackup_binlog_pos_innodb :二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
backup-my.cnf :备份时数据文件中关于mysqld的配置

4.5回到mysql服务器端对数据进行更新操作

 

复制代码代码如下:


mysql> use hellodb; 
mysql> delete from students where StuID>=24;

 

4.6增量备份

 

复制代码代码如下:


innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/2013-09-12_11-03-04/ 
--incremental  指定备份类型 
--incremental-basedir= 指定这次增量备份是基于哪一次备份的,这里是完全备份文件,这样可以把增量备份的数据合并到完全备份中去

 

4.7第二次增量

先去修改数据

 

复制代码代码如下:


mysql> insert into students (Name,Age,Gender,ClassID,TeacherID) values ('tom',33,'M',2,4); 
innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/ 
 这里只须要把最后的目录改为第一次增量备份的数据目录即可 

 

4.8最后一次对数据更改但是没做增量备份

 

复制代码代码如下:

mysql> delete from coc where id=14;

 

4.9把二进制日志文件备份出来,(因为最后一次修改,没做增量备份,要依赖二进制日志做时间点恢复)

 

复制代码代码如下:

[root@www data]# cp mysql-bin.000003 /tmp/

 

4.10模拟数据库崩溃

 

复制代码代码如下:


[root@www data]# service mysqld stop 
[root@www data]# rm -rf * 

 

恢复前准备

4.11对完全备份做数据同步

 

复制代码代码如下:

[root@www ~]# innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/

 

4.12对第一次增量做数据同步

 

复制代码代码如下:


innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/

 

4.13对第二次增量做数据同步

 

复制代码代码如下:


innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-45-53/ 
--apply-log 的意义在于把备份时没commit的事务撤销,已经commit的但还在事务日志中的应用到数据库

 

注:

对于xtrabackup来讲,它是基于事务日志和数据文件备份的,备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据库文件中的事务,还应该对其做预处理,把已提交的事务同步到数据文件,未提交的事务要回滚。因此其备份的数据库,不能立即拿来恢复。

预处理的过程:

首先对完全备份文件只把已提交的事务同步至数据文件,要注意的是有增量的时候,不能对事务做数据回滚,不然你的增量备份就没有效果了。

然后把第一次的增量备份合并到完全备份文件内,

以此类推,把后几次的增量都合并到前一次合并之后的文件中,这样的话,我们只要拿着完全备份+二进制日志,就可以做时间点恢复。

4.14数据恢复

 

复制代码代码如下:


[root@www ~]# service mysqld stop 
[root@www data]# rm -rf *  模拟数据库崩溃 
[root@www ~]# innobackupex --copy-back /innobackup/2013-09-12_11-03-04/ 
--copy-back数据库恢复,后面跟上备份目录的位置

 

4.15检测:

 

复制代码代码如下:


[root@www ~]# cd /mydata/data/ 
[root@www data]# chown mysql:mysql * 
[root@www data]#service mysqld start

 

检测结果数据正常。

 

转载于:https://my.oschina.net/shyl/blog/709975

相关文章:

  • Bitbucket Pipelines在Atlassian的Bitbucket云上提供持续交付功能
  • 下拉菜单的编辑
  • 【乐畅】工作积累 ---- 后台倒计时 ( 体力恢复功能 )
  • block防止循环引用的技巧
  • 分布式部署lamp,phpmyadmin,wordpress的安装与应用
  • == 和 equals()的区别
  • Java基本语法-----java常量
  • 开发中的对控件大小 颜色等默认状态的意识
  • 面试资料
  • Linux 常用命令(一)
  • [转载] FFMPEG之AVRational TimeBase成员理解
  • 用GNS3制作路由交换网络拓扑图
  • libevent
  • linux下历史命令history使用方法
  • matlab灰度变彩色+白平衡算法实现
  • 【笔记】你不知道的JS读书笔记——Promise
  • 03Go 类型总结
  • CSS 提示工具(Tooltip)
  • ES6简单总结(搭配简单的讲解和小案例)
  • JS基础之数据类型、对象、原型、原型链、继承
  • js作用域和this的理解
  • laravel5.5 视图共享数据
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Terraform入门 - 3. 变更基础设施
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue-cli3搭建项目
  • webpack项目中使用grunt监听文件变动自动打包编译
  • XML已死 ?
  • 翻译:Hystrix - How To Use
  • 反思总结然后整装待发
  • 力扣(LeetCode)965
  • 面试总结JavaScript篇
  • 什么软件可以剪辑音乐?
  • 微信支付JSAPI,实测!终极方案
  • 写给高年级小学生看的《Bash 指南》
  • 译米田引理
  • ​Spring Boot 分片上传文件
  • ​批处理文件中的errorlevel用法
  • # 数论-逆元
  • #HarmonyOS:Web组件的使用
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三分钟)速览传统边缘检测算子
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)关于pipe()的详细解析
  • **PHP分步表单提交思路(分页表单提交)
  • .net core使用ef 6
  • .net wcf memory gates checking failed
  • .net 生成二级域名
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .Net环境下的缓存技术介绍
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET与 java通用的3DES加密解密方法
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429