MySQL完全备份、增量备份与恢复实例

场景:每周日执行一次完全备份,每天下午1点执行增量备份

[ 配置 ]

执行增量备份的前提条件是MySQL打开log-bin 日志开关,例如在my.ini或my.cnf中

加入

log-bin=/opt/data/mysql-bin

“log-bin=”后的字符串为日志记载目录,一般建议放在不同于mysql数据目录的磁盘上。

[ 完全备份]

假定星期日下午1点执行完全备份,适用于MyISAM存储引擎。
mysqldump –lock-all-tables –flush-logs –master-data=2 -u root -p test > backup_sunday_1_PM.sql

对于InnoDB 将–lock-all-tables替换为–single-transaction
–flush-logs 为结束当前日志,生成新日志文件
–master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称,
用于日后恢复时参考,例如输出的备份SQL文件中含有:
– CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000002′, MASTER_LOG_POS=106;
--master-data[=value]
          Write the binary log filename and position to the output. This option requires the RELOAD privilege and the binary log must be
          enabled. If the option value is equal to 1, the position and filename are written to the dump output in the form of a CHANGE MASTER
          statement. If the dump is from a master server and you use it to set up a slave server, the CHANGE MASTER statement causes the
          slave to start from the correct position in the masters binary logs. If the option value is equal to 2, the CHANGE MASTER
          statement is written as an SQL comment. (This is the default action if value is omitted.)
其他说明:

如果 mysqldump加上–delete-master-logs 则清除以前的日志,以释放空间。但是如果服务器配置为镜像的复制主服务器,用mysqldump –delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容。在这种情况下,使用 PURGE MASTER LOGS更为安全。

[ 增量备份 ]

每日定时使用 mysqladmin flush-logs来创建新日志,并结束前一日志写入过程。并
把前一日志备份,例如上例中开始保存数据目录下的日志文件 mysql-bin.000002 , …

[ 从备份中恢复 ]
* 恢复完全备份

mysql -u root -p < backup_sunday_1_PM.sql

* 恢复增量备份
mysqlbinlog mysql-bin.000002 … | mysql -u root -p
注意此次恢复过程亦会写入日志文件,如果数据量很大,建议先关闭日志功能

 

binlog增量备份需要注意

1. 用到临时表时,恢复binlog需要注意,只能在一个session里恢复所有binlog文件的数据。因为临时表只存在于单个session时间

--- 如果用到临时表的事务数据跨了多个binlog文件,就得用一个session恢复此多个binlog文件

2. 针对5.0版本的,一定要注意statement binlog模式对create table b select * from a; 只能记录语句而不是数据。如果表a删除了,恢复表b的数据就麻烦了

--- 如果是statement based binlog,这样种情况你就得先恢复a表再恢复b表

看我一个公司的实例

1. 用到临时表时,恢复binlog需要注意,只能在一个session里恢复所有binlog文件的数据。因为临时表只存在于单个session时间

2. 针对5.0版本的,一定要注意statement binlog模式对create table b select * from a; 只能记录语句而不是数据。如果表a删除了,恢复表b的数据就麻烦了

###刚开始binlog_format为row
create table tbl_a (a int)
/*!*/;
# at 195
#100422 23:23:20 server id 1  end_log_pos 263   Query   thread_id=1     exec_tim
e=0     error_code=0
SET TIMESTAMP=1271949800/*!*/;
BEGIN
/*!*/;
# at 263
# at 307
#100422 23:23:20 server id 1  end_log_pos 307   Table_map: `test`.`tbl_a` mapped
to number 135
#100422 23:23:20 server id 1  end_log_pos 351   Write_rows: table id 135 flags:
STMT_END_F

BINLOG '
6GnQSxMBAAAALAAAADMBAAAAAIcAAAAAAAAABHRlc3QABXRibF9hAAEDAAE=
6GnQSxcBAAAALAAAAF8BAAAQAIcAAAAAAAEAAf/+AQAAAP4CAAAA/gMAAAA=
'/*!*/;
# at 351
#100422 23:23:20 server id 1  end_log_pos 420   Query   thread_id=1     exec_tim
e=0     error_code=0
SET TIMESTAMP=1271949800/*!*/;
COMMIT
/*!*/;
# at 420
#100422 23:24:43 server id 1  end_log_pos 488   Query   thread_id=1     exec_tim
e=0     error_code=0
SET TIMESTAMP=1271949883/*!*/;
BEGIN
/*!*/;
# at 488

###binlog_format没变,通过create table select from来创建表。在row_based mode下。创建的语句,变成先创建表再插入值
#100422 23:24:43 server id 1  end_log_pos 602   Query   thread_id=1     exec_tim
e=0     error_code=0
SET TIMESTAMP=1271949883/*!*/;
CREATE TABLE `tbl_b` (
  `a` int(11) DEFAULT NULL
)
/*!*/;
# at 602
# at 646
#100422 23:24:43 server id 1  end_log_pos 646   Table_map: `test`.`tbl_b` mapped
to number 136
#100422 23:24:43 server id 1  end_log_pos 690   Write_rows: table id 136 flags:
STMT_END_F

BINLOG '
O2rQSxMBAAAALAAAAIYCAAAAAIgAAAAAAAAABHRlc3QABXRibF9iAAEDAAE=
O2rQSxcBAAAALAAAALICAAAQAIgAAAAAAAEAAf/+AQAAAP4CAAAA/gMAAAA=
'/*!*/;
# at 690
#100422 23:24:43 server id 1  end_log_pos 759   Query   thread_id=1     exec_tim
e=0     error_code=0
SET TIMESTAMP=1271949883/*!*/;
COMMIT
/*!*/;

###接着把session的binlog_format设置成statement,通过create table select from来创建表。对create table b select * from a; 只能记录语句而不是数据
# at 759
#100422 23:27:57 server id 1  end_log_pos 860   Query   thread_id=1     exec_tim
e=1     error_code=0
SET TIMESTAMP=1271950077/*!*/;
create table tbl_c select * from tbl_a
/*!*/;

###最后把session的binlog_format设置成mixed,通过create table select from来创建表。对create table b select * from a; 只能记录语句而不是数据
# at 860
#100422 23:30:04 server id 1  end_log_pos 961   Query   thread_id=1     exec_tim
e=0     error_code=0
SET TIMESTAMP=1271950204/*!*/;
create table tbl_d select * from tbl_a
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

时间: 2024-07-29 14:26:27

MySQL完全备份、增量备份与恢复实例的相关文章

MySQL增量备份与恢复实例

小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份.增量备份的原理就是使用了mysql的binlog日志. 本次操作的MySQL版本为5.5.40 for Linux (x86_64). 增量备份要确保打开了二进制日志,参考mysql的日志系统: mysql> show variables like '%log_bin%'; 首先对pak数据库做一个完整备份: $ mysqldump -h localhost -

php实现mysql数据库备份类_php实例

1.实例化DbBak需要告诉它两件事:数据服务器在哪里($connectid).备份到哪个目录($backupDir):  require_once('DbBak.php');     require_once('TableBak.php');     $connectid = mysql_connect('localhost','root','123456');     $backupDir = 'data';     $DbBak = new DbBak($connectid,$backup

php MYSQL 数据备份类_php实例

功能上有: ­ require_once("backdata.class.php"); $link = @mysql_connect("localhost","数据库名","密码") or die ('Could not connect to server.'); mysql_query("use cms",$link); mysql_query("set names utf8",$li

mysql 利用binlog增量备份,还原实例

mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/MySQL/mysql-bin.log,如果是这样的话log-bin

php实现MySQL数据库备份与还原类实例_php技巧

本文实例讲述了php实现MySQL数据库备份与还原类.分享给大家供大家参考.具体分析如下: 这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的在dbmange中配置好连接地址用户名与数据库即可,下面我们一起来看这个例子,代码如下: 复制代码 代码如下: <?php   /**   * 创建时间: 2012年5月21日   *   * 说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql)   * 功能:实现mysql数据库分卷备份,选

mysql数据库完美增量备份脚本

是否因为mysql太大,来回备份浪费资源带宽而发愁,如果想解决这个麻烦就需要增量备份,下面是张小三资源网修改的一份mysql的增量备份脚本,我已做了相关注释,大家自行修改下就可以用了. vi /etc/my.cnf开启日志及定期清理日志 log-bin=mysql-bin binlog_format=mixed //二进制日志自动删除的天数.默认值为0,表示"没有自动删除" expire_logs_days = 5 全备份脚本: #!/bin/bash # Name:qbk全备份脚本

MySQL数据库备份总结

一个企业的正常运行,数据的完整性是最关键的:所以我们需要在工作中要很熟练的掌握数据的备份与恢复方法:下面是对Mysql数据库备份的三种方法总结,希望对大家会有所帮助 备份开始前的工作环境准备: 1.创建用于保存二进制日志文件的目录 # mkdir /mybinlog # chown mysql.mysql /mybinlog 2.修改配置文件 # vim /etc/my.cnf log-bin=/mybinlog/mysql-bin   二进制日志目录及文件前缀 innodb_file_per_

云数据库RDS中的MySQL数据库备份

背景 RDS使用mysqldump对 MySQL 数据库进行逻辑全量备份,使用开源软件Xtrabackup进行物理全量备份,是实例级别的备份.本文主要从原理的角度来介绍MySQL数据库的备份和恢复,让用户更加了解RDS的备份恢复机制. 一.使用Mysqldump进行逻辑备份  mysqldump作为重要的MySQL备份工具,功能相当强大.备份参数.恢复策略,需要仔细研究. 备份数据库: 备份单个数据库或单个数据库中的指定表: mysqldump [OPTIONS] database [tb1]

Linux下实现MySQL数据备份和恢复的命令使用全攻略_Mysql

为了保障数据的安全,需要定期对数据进行备份.备份的方式有很多种,效果也不一样.一旦数据库中的数据出现了错误,就需要使用备份好的数据进行还原恢复.从而将损失降到最低.下面我们来了解一下MySQL常见的有三种备份恢复方式: 1.利用Mysqldump+二进制日志实现备份 2.利用LVM快照+二进制日志实现备份 3.使用Xtrabackup备份 一:实验环境介绍: 系统介绍:CentOS6.4_X64 数据库版本:mysql-5.5.33 二:基于Mysqldump命令实现备份恢复 2.1.思路概念