备份恢复
物理备份: 数据库的物理对象主要由数据库的物理数据文件、日志文件以及配置文件等组成。在
MySQL 数据库中,除了 MySQL 系统共有的一些日志文件和系统表的数据文件之外,每一 种存储引擎自己还会有不太一样的物理对象
逻辑备份: 数据库逻辑备份就是备份软件按照我们最初所设计的逻辑关系,以数据库的逻辑 结构对象为单位,将数据库中的数据按照预定义的逻辑关联格式一条一条生成相关的文
本文件件,以达到备份的目的
备份策略:
1、 对于较为核心的在线应用系统,比需要有在线备用主机通过 MySQL 的复制进行相
应的备份,复制线程可以一直开启,恢复线程可以每天恢复一次,尽量让备机的数
据延后主机在一定的时间段之内。这个延后的时间多长合适主要是根据实际需求决
定,一般来说延后一天是一个比较常规的做法。
2、 对于重要级别稍微低一些的应用,恢复时间要求不是太高的话,为了节约硬件成本 ,
不必要使用在线的备份主机来单独运行备用 MySQL,而是通过每一定的时间周期内
进行一次物理全备份,同时每小时(或者其他合适的时间段)内将产生的二进制日
志进行备份。这样虽然没有第一种备份方法恢复快,但是数据的丢失会比较少。恢
复所需要的时间由全备周期长短所决定。
3、 而对于恢复基本没有太多时间要求,但是不希望太多数据丢失的应用场景,则可以
通过每一定时间周期内进行一次逻辑全备份,同时也备份相应的二进制日志。使用
逻辑备份而不使用物理备份的原因是因为逻辑备份实现简单,可以完全在线联机完
成,备份过程不会影响应用提供服务。
逻辑备份工具mysqldump:
mysqldump [options] [db_name [tbl_name ...]]
备份单个库:mysqldump [options] db_name
恢复时:如果目标库不存在,需要事先手动创建
--all-databases: 备份所有库
--databases db1 db2 ...: 备份指定的多个库
--lock-all-tables:请求锁定所有表之后再备份,对MyISAM、InnoDB、Aria做温备
--single-transaction: 能够对InnoDB存储引擎实现热备;
备份代码:
--events: 备份事件调度器代码
--routines: 备份存储过程和存储函数
--triggers:备份触发器
备份时滚动日志:
--flush-logs: 备份前、请求到锁之后滚动日志;
复制时的同步位置标记:
--master-data=[0|1|2]
0: 不记录
1:记录为CHANGE MASTER语句
2:记录为注释的CHANGE MASTER语句
使用mysqldump备份:
请求锁:--lock-all-tables或使用--singe-transaction进行innodb热备;
滚动日志:--flush-logs
选定要备份的库:--databases
记录二进制日志文件及位置:--master-data=
为了数据安全和性能通常二进制日志不可和数据库文件刚在同一磁盘
备份步骤:
1,/usr/local/mysql/bin/mysqldump -uroot -h127.0.0.1 -predhat --all-databases --lock-all-tables --events --routines --triggers --flush-logs --master-data=2 >/backup/`date +%F`.aql
备份完了
查看备份是否正确,保证可用于恢复
# head -30 2014-04-12.sql
恢复
假如删除了所以数据库
1,不要让其他用户连接,连入数据库
关闭二进制日志: set sql_log_bin=off
source 备份的文件:source /backup/mysql-04-11.sql
2,准备二进制日志恢复
mysqlbinlog master-bin-0000007 --start-position=107 >back.sql
source刚准备好的二进制日志
最后打开二进制日志记录:set sql_log_bin=on
如果因为误删除了数据库在恢复的时候可跳过二进制日志中删除数据库的语句
用--start-position=N --stop-position=N,或者在如果二进制日志不大
可用vim打开删除那个语句
删除这几行
然后恢复所以的
备份脚本
#!/bin/sh # passwd=redhat host=127.0.0.1 user=root mysqldump=/usr/local/mysql/bin/mysqldump backdir=~/backup/ date=`date +%F_%H.%M.%S` logs=/root/mysqlbackup.logs name=$date.sql.gz [ -d $backdir ] || mkdir $backdir $mysqldump -u$user -h$host -p$passwd --all-databases --lock-all-tables --events --routines --triggers --flush-logs --master-data=2 |gzip >$backdir$name if [ $? != 0 ];then echo "$date mysql backup fail." >>$logs else echo "$date mysql backup is ok." >>$logs fi
物理备份lvm快照
lvm-snapshot:基于LVM快照的备份
1、事务日志跟数据文件必须在同一个卷上;
2、创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁;
3、请求全局锁完成之后,做一次日志滚动;做二进制日志文件及位置标记(手动进行);
备份步骤:
1、请求全局锁,并滚动日志
mysql> flush tables with read lock;
mysql> flush logs;
2、做二进制日志文件及位置标记(手动进行);
# mysql -e 'show master status' > /path/to/somefile
3、创建快照卷
# lvcreate -L -s -n -p r /path/to/some_lv
4、释放全局锁
mysql> UNLOCK TABLES;
5、挂载快照卷并备份
# mount /dev/myvg/lv1_snap
# cp -a /tmp/lv /backup/mysql/
备份不能和数据放在同一磁盘上
6、备份完成之后,删除快照卷
恢复:
1、二进制日志保存好;
提取备份之后的所有事件至某sql脚本中;
2、还原数据,修改权限及属主属组等,并启动mysql
3、做即时点还原
备份脚本
#!/bin/sh # passwd=redhat host=127.0.0.1 user=root mysql=/usr/local/mysql/bin/mysql backdir=/backup/mysql/ lvm=/dev/myvg/lv1 date=`date +%F_%H.%M.%S` logs=/root/mysqlbackup.logs fail(){ rm -rf $backdir$date.binlog echo "warning $date backup fail...please manual operation " >>$logs echo "fail...please manual operation" &&exit 3 } [ -d $backdir ] || mkdir $backdir #read -p "please flush tables with read lock: " if ! $mysql -u$user -h$host -p$passwd -e "flush logs;show master status;" >$backdir$date.binlog ;then fail fi $mysql -u$user -h$host -p$passwd <<EOF flush tables with read lock; \! sleep 5 \! lvcreate -L 1G -s -n $date -p r $lvm unlock tables; EOF #read -p "plesae unlock tables: " mkdir -p /tmp/$date/ mount -o ro ${lvm%/*}/$date /tmp/$date/ [ $? != 0 ] && fail echo "backup please waiting............" rsync -aq /tmp/$date/ $backdir if [ $? != 0 ] ;then fail else echo "$date mysql backup is ok." >>$logs fi umount /tmp/$date/ [ $? != 0 ]&& echo "please umount /tmp/$date;lvremove ${lvm%/*}/$date ;rm -rf /tmp/$date" >>$logs &&exit rm -rf /tmp/$date lvremove ${lvm%/*}/$date <<! y ! [ $? != 0 ]&& echo "please lvremove ${lvm%/*}/$date ;rm -rf /tmp/$date" >>$logs && exit exit
三,使用Xtrabackup进行MySQL备份
下载地址:http://www.percona.com/software/percona-xtrabackup/
如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:
mysql> create user ’inuser’@’localhost’ identified by ’redhat’;
mysql> revoke all privileges, grant option from ’inuser’;
mysql> grant reload, lock tables, replication client on *.* to ’inuser’@’localhost’;
mysql> flush privileges;
完全备份
# innobackupex --user=root --password=redhat /backup/
/backup/:表示备份到这里
看到ok即备份成功
增量备份
# innobackupex --user=root --password=redhat --incremental /backup --incremental-basedir=/backup/2014-04-16_17-14-45/
--incremental /backup :表示增量备份放在哪
--incremental-basedir=/backup/2014-04-16_17-14-45/:表示上一次的备份目录,也就是相对于这个目录做增量
看到ok即备份成功
恢复
先准备备份文件
先准备完全备份,使用--redo-only不回滚事务,路径要写全后面那个“/”要有
# innobackupex --apply-log --redo-only /backup/2014-04-16_17-14-45/
准备第一次增量备份
# innobackupex --apply-log --redo-only /backup/2014-04-16_17-14-45/ --incremental-dir= /backup/2014-04-16_17-21-04/
恢复
# innobackupex --copy-back /backup/2014-04-16_17-14-45/
恢复过后属主不是mysql,要改成mysql
# cd /users/mysql
# chown mysql:mysql ./* -R
恢复完成
要确定每一步最后都有:120407 09:36:10 innobackupex: completed OK!
恢复的时候关闭mysql
帮助信息:# innobackupex --help
备份脚本:
#!/bin/bash # user=root passwd=redhat backdir=/backup/mysql/ logs=/root/mysqlback.logs nowdate=`date +%F_%H.%M.%S` innobackupex --user=$user --password=$passwd $backdir &>/dev/null if [ $? == 0 ];then echo "$nowdate mysql backup is ok!" >>$logs else echo "warning!!!! $nowdate mysql backup is fail!! " >>$logs fi #cd $backdir #find . -mtime +30 -exec rm -rf {} \;