Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql增量备份

mysql增量备份及恢复的操作方法

作者:goser

增量备份是在全备或上次增量备份基础上,只备份新增或修改的文件,减少数据量和时间,binlog记录数据库变更,重启时创建新日志文件,增量备份复杂但减轻服务器负担,而binlog帮助精确恢复数据

1 简介

1.1 增量备份简介

        增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。您必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的一个增量,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,因此这就极大地延长了恢复时间。

        假如我们有一个数据库,有20G的数据,每天会增加10M的数据,数据库每天都要全量备份一次,这样的话服务器的压力比较大,因此我们只需要备份增加的这部分数据,这样减少服务器的负担。

1.2 binlog简介

        binlog日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根目录创建两个新文 件XXX-bin.001和xxx-bin.index,若配置选项没有给出文件名,Mysql将使用主机名称命名这两个文件,其中.index文件包含一份全体日志文件的清单。   Mysql会把用户对所有数据库的内容和结构的修改情况记入XXX-bin.n文件,而不会记录 SELECT和没有实际更新的UPDATE语句。
        当MySQL数据库停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的binlog日志文件,文件序号递增,此外,如果日志文件超过max_binlog_size系统变量配置的上限时,也会生成新的日志文件。 

2 binlog日志操作

2.1 开启binlog日志 

    在my.cnf或my.ini中增加

[mysqld] 
log-bin=/data/3306/mysql-bin

 其中:log-bin若不显示指定存储目录,则默认存储在mysql的data目录下

    binlog_format的几种格式:(STATEMENT,ROW和MIXED)

    STATEMENT:基于SQL语句的复制(statement-based replication, SBR)  默认的格式
    ROW:基于行的复制(row-based replication, RBR)
    MIXED:混合模式复制(mixed-based replication, MBR)

   启动后会产生mysql-bin.*这样的文件,每启动一次,就会增加一个或者多个。如果全备的时候加-F参数的话也会增加一个binlog二进制文件或者mysqladmin flush-log也会增加

[root@moremysql ~]# ll /data/3306/
-rw-rw---- 1 mysql mysql    264 Sep 16 15:31 mysql-bin.000001
-rw-rw---- 1 mysql mysql    616 Sep 17 11:38 mysql-bin.index
-rw-rw---- 1 mysql mysql      6 Sep 17 11:29 mysqld.pid
-rw-r----- 1 mysql root   23377 Sep 17 11:29 mysql_oldboy3306.err
srwxrwxrwx 1 mysql mysql      0 Sep 17 11:29 mysql.sock

 查看binlog开启情况和binlog的设置大小

mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
mysql> show variables like 'binlog%';
+-----------------------------------------+-----------+
| Variable_name                           | Value     |
+-----------------------------------------+-----------+
| binlog_cache_size                       | 1048576   |
| binlog_direct_non_transactional_updates | OFF       |
| binlog_format                           | STATEMENT |
| binlog_stmt_cache_size                  | 32768     |
+-----------------------------------------+-----------+

 2.2 查看binlog日志内容

[root@moremysql ~]# mysqlbinlog  /data/3306/mysql-bin.000009
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170917 11:19:55 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.32-log created 170917 11:19:55
BINLOG '
2+m9WQ8BAAAAZwAAAGsAAAAAAAQANS41LjMyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#170917 11:21:29 server id 1  end_log_pos 150   Rotate to mysql-bin.000010  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

  日志内容部分是不可查看的,这是因为binlog二进制日志格式默认是STATEMENT,如果是行级模式ROW就可以查看了,可以用--base64-output=decode-rows -v参数临时用ROW模式来查看

[root@moremysql ~]# mysqlbinlog --base64-output=decode-rows -v /data/3306/data/mysql-bin.000009
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
mysqlbinlog: File '/data/3306/data/mysql-bin.000009' not found (Errcode: 2)
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

    mysqlbinlog命令参数:
  1、作用:解析binlog日志为sql语句
  2、-d 参数根据指定库拆分binlog(单表通过关键字过滤)
  3、位置参数:--start-position=365 --stop-position=456,精确定位去内容
  4、时间参数 --start-datetime='2017-10-16 17:16:15' --stop-datetime='2017-10-16 17:30:15' 模糊取内容,不太精确
  5、-r 将语句导入到指定文件名中,相当于重定向>
  6、解析ROW 级别binlog日志的方法:   mysqlbinlog --base64-output=decode-rows -v mysql-bin.000004

 删除binlog日志文件的方式有:
  mysql>reset master;清空bin-log
  mysql>PURGE MASTERLOGS TO 'mysql-bim.000005' 删除mysql-bim.000005之前的bin-log mysql-bim.000005本身保留

3、mysql数据库备份与恢复

3.1、备份数据库

  全备之前的binlog文件,只有一个binlog文件mysql-bin.000001

[root@moremysql ~]# ll /data/3306/
total 72
drwxr-xr-x 5 mysql mysql  4096 Sep 17 11:29 data
-rw-r--r-- 1 mysql mysql  1982 Sep 17 11:29 my.cnf
-rw-r--r-- 1 root  root   1899 Sep 17 00:22 my.cnf.ori
-rwx------ 1 mysql mysql  1307 Sep 16 15:29 mysql
-rw-rw---- 1 mysql mysql   107 Sep 17 13:01 mysql-bin.000001
-rw-rw---- 1 mysql mysql    28 Sep 17 13:01 mysql-bin.index

  全备

[root@moremysql ~]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B -x -F -R --master-data=2 class |gzip >class_$(date +%F).sql.gz

  全备参数说明:

-B指定数据库
-F刷新日志
-R备份存储过程等
-x锁表
--master-data在备份语句里添加CHANGEMASTER语句以及binlog文件及位置点信息

  全备后的binlog文件,增加了一个mysql-bin.000002,这个增加的binlog二进制文件就是全备的时候-F参数的作用。相当于mysqladmin的参数flush-log或mysql> flush logs;  

[root@moremysql ~]# ll /data/3306/
total 76
drwxr-xr-x 5 mysql mysql  4096 Sep 17 11:29 data
-rw-r--r-- 1 mysql mysql  1982 Sep 17 11:29 my.cnf
-rw-r--r-- 1 root  root   1899 Sep 17 00:22 my.cnf.ori
-rwx------ 1 mysql mysql  1307 Sep 16 15:29 mysql
-rw-rw---- 1 mysql mysql   150 Sep 17 13:04 mysql-bin.000001
-rw-rw---- 1 mysql mysql   107 Sep 17 13:04 mysql-bin.000002

3.2、准备第一份增量数据,向库class的userinfo表中删除、插入、更新数据

mysql> delete from userinfo  where name='hello';
mysql> delete from userinfo  where name='world';
mysql> insert into userinfo  values(12,'test');
mysql> update  userinfo set name='tiantian' where id=6;

  这时候对数据库文件的更改都会记录到mysql-bin.000002中,这是全备后的增量文件,在增量恢复的时候用得到。

3.3、数据恢复

  在数据恢复之前,停止数据库对外服务。如果是在从库上恢复(这个是事先做好的备份主库,开启了binlog),还要关闭slave(因为开启了slave的话,会从主库复制,那么数据恢复就没效果了)

  同时应将增量备份文件复制一份到其他目录或关闭sql_log_bin=off,因为恢复过程中,会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱。

  查看sql_log_bin状态

mysql> show variables like 'sql_log%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | ON    |
| sql_log_off   | OFF   |
+---------------+-------+

  临时关闭sql_log_bin,数据恢复的时候就不会将恢复的数据写入到binlog中,这样binlog文件就会保持很清洁。待完全恢复完成后,再开启sql_log_bin。

mysql> set sql_log_bin=off;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'sql_log%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | OFF   |
| sql_log_off   | OFF   |
+---------------+-------+

  如果是从库(备主库),要关掉slave

mysql> stop slave;
mysql> show slave status\G
             Slave_IO_Running: No
            Slave_SQL_Running: No
        Seconds_Behind_Master: NULL

  现在开始还原全量数据:

[root@moremysql ~]# mysql -uroot -p123456  -S /data/3306/mysql.sock <class_2017-09-17.sql

  全量恢复好后检查是否恢复了全量备份时的数据:

[root@moremysql ~]# mysql -uroot -p123456  -S /data/3306/mysql.sock -e "use class;select * from userinfo;"
+----+----------+
| id | name     |
+----+----------+
|  1 | goser    |
|  3 | hello    |
|  5 | world    |
|  6 | zhangsan |
|  8 | lisi     |
| 10 | wangwu   |
+----+----------+

  全量恢复没问题后再进行增量恢复,恢复被删除的数据,更改的保留

[root@moremysql ~]# cp /data/3306/mysql-bin.000002  /opt/

  将mysqlbinlog -r 生成的文件中的delete语句删掉即可

[root@moremysql ~]# mysqlbinlog /opt/mysql-bin.000002  -r userinfo.sql
[root@moremysql ~]# vim  userinfo.sql
delete from userinfo  where name='hello' ---删掉这行
delete from userinfo  where name='world'---删掉这行

  将修改好的binlog增量文件导入到数据库class中

[root@moremysql ~]# mysql -uroot -p123456  -S /data/3306/mysql.sock class < userinfo.sql

  最后别忘了开启sql_log_bin

mysql> set sql_log_bin=on;

  到此数据恢复全部完成。。。。。

到此这篇关于mysql增量备份及恢复的文章就介绍到这了,更多相关mysql增量备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文