浅谈mysql备份

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈mysql备份相关的知识,希望对你有一定的参考价值。

mysql备份就哪些场景需要备份呢?这样的备份有什么作用呢?切记备份的目的是为了恢复。



场景一:

开发同学要求dba update或者delete一些数据,此时你觉得有必要备份改变前或者删除前的数据么。如果有必要你会怎么做呢?

处理方法:

mysqldump --login-path=xxxx --single-transaction -t dbname tablename -w ‘xxx=xxx‘ > /tmp/xxxx`date +%F_%T`_tmp.sql

有了这样一个保障,你就算出现问题删错或修改错误也比保留了原始数据。可能你就不用在binlog里面去找相关数据了。

介绍下mysqldump 接的几个参数:

--login-path这个是5.6的新特性,其目的可以不用明文把密码显示出来,后续我会出一章介绍这个特性。

--single-transaction 其作用是不会锁表

-t 只备份数据不备份表结构

-w 指定需要备份的数据的条件,举个栗子 -w ‘modify_time <=2016-05-31 23:59:59‘也就是说只备份根据modfiy_time2016年6月之前的数据。


场景二:

在主从结构中如何备份?首先我们要了解什么情况需要恢复。

故障产生原因1:程序里面update少了个where语句或delete少了个语句。

解决方法无非就是拿上次的备份结合binlog找出破坏语句的那个pos点拿到测试机器去做相关还原,还可能要停一下业务,这样的时间会不叫长。

当然也可以写根据主键写闪回脚本逆向转换binlog,但是这样也不一定是没有风险的。

如果你做了数据库的延时同步可以根据程序update的条件将数据取出倒回原表,这个不是一件开心的事情吗?

这样做需要在从库上多加一个实例或者用台机器单独来做延时同步,具体延时多久呢?我的做法是延时2小时,如果2小时还没发现,那也是蛮悲剧的,当然你也可以根据业务来做这个同步时间的设定。


如果怕数据因为主节点的宕机数据未同步到从节点,建议把binlog日志备份到其他机器上去,5.6新特性可以去解决这一问题。


做主从的相关参数:

change master to master_host = ‘xxx,

master_user = ‘xxxxx‘

master_password = ‘xxxx‘

master_port = xxxx,

master_log_file = ‘mysql_bin.000xxxxx‘

master_log_pos =452480390,

master_delay=7200;

start slave;

show slave status \G;


场景三:物理备份

物理备份也就是innobackupex,这个特点是速度快,很方便做主从,恢复也快,锁表时间也很短。但是他只能备份本地机器以及占用空间也比较大。压缩后和mysqldump压缩后相差很大。

可以用nfs等网络技术挂磁盘去做相关备份,解决无法备份到异服务器的问题。

本人提供一个增量备份脚本供参考:周日全备份,周一到周6增量备份。

#!/bin/bash
case `date "+zhou%w"` in
zhou0)
$innobackupex   --user=innobackup --password=123456 --no-timestamp  $backup_path/`date +%F_full` ;;
zhou1)
$innobackupex   --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_full -d "-1 day"`   $backup_path/`date +%F_incremental1` ;;
zhou2)
$innobackupex   --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental1 -d "-1 day"`   $backup_path/`date +%F_incremental2`;;
zhou3)
$innobackupex   --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental2 -d "-1 day"`   $backup_path/`date +%F_incremental3`;;
zhou4)
$innobackupex   --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental3 -d "-1 day"`   $backup_path/`date +%F_incremental4`;;
zhou5)
$innobackupex   --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental4 -d "-1 day"`   $backup_path/`date +%F_incremental5`;;
zhou6)
$innobackupex   --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental5 -d "-1 day"`   $backup_path/`date +%F_incremental6`;;
  *)  exit 1;;
esac


场景四:逻辑备份

逻辑备份即mysqldump工具去做备份,对于一些重要的表定期备份。

mysqldump --login-path=xxx --single-transaction -t dbname tablename > xxx.sql

如果表比较多可以写个for循环来处理。

#!/bin/bash
TABNAME=`/usr/local/mysql/bin/mysql --login-path=xxxxxx  -e "use dbname;show tables"`
for tabname in $TABNAME
do
/usr/local/mysql/bin/mysqldump --login-path=xxxxxx  -t --single-transaction   dbname $tabname > /xxxxxx/dbname.$tabname.sql
done



本文出自 “11767337” 博客,请务必保留此出处http://11777337.blog.51cto.com/11767337/1795997

以上是关于浅谈mysql备份的主要内容,如果未能解决你的问题,请参考以下文章

萌新浅谈LINUX下数据库 表记录增删改查 WHERE条件应用 数据备份与恢复

Xcode 4.6 的备份代码片段

浅谈oracle逻辑备份数据泵备份及冷备份

浅谈Mybatis

浅谈AngularJS中的$parse和$eval

浅谈HSRP(热备份路由选择协议)