浅谈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备份的主要内容,如果未能解决你的问题,请参考以下文章