zoukankan      html  css  js  c++  java
  • Percona XtraBackup 完全及增量备份与恢复的方法

    安装及备份、恢复实现

    安装:其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得。本文基于CentOS6.x的系统,因此,直接下载相应版本的rpm包安装即可,这里不再演示其过程。

    1 yum -y install percona-toolkit-2.2.4-1.noarch.rpm percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm

    完全备份及删除数据目录实现恢复:

    mysql>set session_sql_log_bin=0; #导入数据时让其不记录二进制日志
    mysql>source /root/hellodb.sql #导入数据
    mysql>set session_sql_log_bin=1; #开启二进制日志
    [root@centos6]#innobackupex --user=root /mybackups/ #全量备份
    [root@centos6]#service mysqld stop #停止数据库,删除数据目录
    [root@centos6]#rm -rf /mydata/data/*
    [root@centos6]#innobackupex --apply-log /mybackups/2016-11-22_15-39-09/ #准备完全备份
    [root@centos6]#innobackupex --copy-back /mybackups/2016-11-22_15-39-09/ #从完全备份中恢复数据
    [root@centos6 data]# ll #数据已然恢复成功
    总用量 28688
    drwxr-xr-x. 2 root root 4096 11月 22 15:43 hellodb
    -rw-r--r--. 1 root root 18874368 11月 22 15:43 ibdata1
    -rw-r--r--. 1 root root 5242880 11月 22 15:43 ib_logfile0
    -rw-r--r--. 1 root root 5242880 11月 22 15:43 ib_logfile1
    drwxr-xr-x. 2 root root 4096 11月 22 15:43 mysql
    drwxr-xr-x. 2 root root 4096 11月 22 15:43 performance_schema
    drwxr-xr-x. 2 root root 4096 11月 22 15:43 test
    [root@centos6 data]# chown -R mysql.mysql ./* #改变属组和属组
    [root@centos6 data]# ll
    总用量 28688
    drwxr-xr-x. 2 mysql mysql
    4096 11月 22 15:43 hellodb
    -rw-r--r--. 1 mysql mysql 18874368 11月 22 15:43 ibdata1
    -rw-r--r--. 1 mysql mysql 5242880 11月 22 15:43 ib_logfile0
    -rw-r--r--. 1 mysql mysql 5242880 11月 22 15:43 ib_logfile1
    drwxr-xr-x. 2 mysql mysql 4096 11月 22 15:43 mysql
    drwxr-xr-x. 2 mysql mysql 4096 11月 22 15:43 performance_schema
    drwxr-xr-x. 2 mysql mysql 4096 11月 22 15:43 test
    [root@centos6 data]#service mysqld start #启动数据库,在恢复数据库时数据库无需启动

    从安全角度考虑,如果要使用一个最小权限的用户进行备份,可创建此用户进行完全备份

    mysql>create user 'bkuser'@'localhost' identified by 'passw ord'
    mysql>revoke all privileges,grant option from 'bkuser'; 
    mysql>grant reload,lock tables,replication clinet on *.* to 'bkuser'@'localhost' 
    mysql>flush privileges;

    xtrabackup备份文件说明:

    使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

    [root@centos6 2016-11-22_19-06-45]# ll
    总用量 18472
    -rw-r--r--. 1 root root 260 11月 22 19:06 backup-my.cnf
    drwx------. 2 root root 4096 11月 22 19:06 hellodb
    -rw-r-----. 1 root root 18874368 11月 22 19:06 ibdata1
    drwx------. 2 root root 4096 11月 22 19:06 mydb
    drwxr-xr-x. 2 root root 4096 11月 22 19:06 mysql
    drwxr-xr-x. 2 root root 4096 11月 22 19:06 performance_schema
    drwxr-xr-x. 2 root root 4096 11月 22 19:06 test
    -rw-r--r--. 1 root root 13 11月 22 19:06 xtrabackup_binary
    -rw-r--r--. 1 root root 24 11月 22 19:06 xtrabackup_binlog_info
    -rw-r-----. 1 root root 89 11月 22 19:06 xtrabackup_checkpoints
    -rw-r-----. 1 root root 2560 11月 22 19:06 xtrabackup_logfile
    [root@centos6 2016-11-22_19-06-45]# cat xtrabackup_checkpoints
    backup_type = full-backuped #备份类型,例如完全备份、增量备份等
    from_lsn = 0 #日志序列号从0开始
    to_lsn = 1649842 #日志序列号到哪
    last_lsn = 1649842 #日志序列号到哪结束
    compact = 0
    [root@centos6 2016-11-22_19-06-45]# cat xtrabackup_binlog_info #当前正使用的二进制日志文件及其二进制位置
    master-bin.000005 245
    [root@centos6 2016-11-22_19-06-45]# cat xtrabackup_binary #备份中用到的xtrabackup的可执行文件
    xtrabackup_55
    [root@centos6 2016-11-22_19-06-45]# cat backup-my.cnf #备份命令中用到的配置选项信息
    # This MySQL options file was generated by innobackupex.
    # The MySQL server
    [mysqld]
    innodb_data_file_path=ibdata1:10M:autoextend
    innodb_log_files_in_group=2
    innodb_log_file_size=5242880
    innodb_fast_checksum=0
    innodb_page_size=16384
    innodb_log_block_size=512
    [root@centos6 2016-11-22_19-06-45]#

    使用innobackupex进行增量备份及数据恢复:

    每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

    要实现第一次增量备份,可以使用下面的命令进行:

    # innobackupex --incremental /backup --incremental-basedir=BASEDIR

    其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。

    需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

    “准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

    (1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

    (2)基于所有的备份将未提交的事务进行“回滚”。

    于是,操作就变成了:

    # innobackupex --apply-log --redo-only BASE-DIR

    接着执行:

    # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

    而后是第二个增量:

    # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

    innobackupex --copy-back /path/to/BACKUP-DIR #最起始的数据

    其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作

    实例说明:本次实战练习增量数据的备份和恢复,在实验过程中经历过两次增量,并对相应的数据库做出了修改,增量完成后,停止mysql数据库,删除数据目录,进行数据恢复操作。

    实现代码如下:

    innobackupex --user=root /mybackups/ #第一次完全备份
    innobackupex --incremental /mybackups/ --incremental-basedir=/mybackups/2016-11-22_19-24-37/ #第一次增量备份,向hellodb数据库中插入了表及其删除了表t1 
    innobackupex --incremental /mybackups/ --incremental-basedir=/mybackups/2016-11-22_19-27-55/ #第二次增量备份,此时修改了数据库mydbs,创建了表和插入了数据
    innobackupex --apply-log --redo-only /mybackups/2016-11-22_19-24-37/ #将已近提交的事务重放
    innobackupex --apply-log --redo-only /mybackups/2016-11-22_19-24-37/ --incremental-dir=/mybackups/2016-11-22_19-27-55/ #重放之后,所有的备份数据合并到完全备份中
    innobackupex --apply-log --redo-only /mybackups/2016-11-22_19-24-37/ --incremental-dir=/mybackups/2016-11-22_19-29-57/ #重放之后,所有的备份数据合并到完全备份中
    innobackupex --copy-back /mybackups/2016-11-22_19-24-37/ #此时数据已经和最后一次增量同步,使用此数据进行恢复
    [root@centos6 data]# cd /mybackups/2016-11-22_19-24-37/
    [root@centos6 2016-11-22_19-24-37]# cat xtrabackup_checkpoints
    backup_type = full-prepared #第一次完全备份,重放后将和最后一次增量备份中的序列号信息一致
    from_lsn = 0
    to_lsn = 1708653
    last_lsn = 1708653
    compact = 0
    [root@centos6 2016-11-22_19-24-37]# cat ../2016-11-22_19-29-57/xtrabackup_checkpoints
    backup_type = incremental
    from_lsn = 1703868
    to_lsn = 1708653
    last_lsn = 1708653
    compact = 0
    [root@centos6 2016-11-22_19-24-37]# cat xtrabackup_binlog_info
    master-bin.000006 8434
    [root@centos6 2016-11-22_19-24-37]# cat ../2016-11-22_19-29-57/xtrabackup_binlog_info
    master-bin.000006 8434
    [root@centos6 2016-11-22_19-24-37]#
    [root@centos6 data]# ll
    总用量 18456
    drwxr-xr-x. 2 root root 4096 11月 22 19:37 hellodb
    -rw-r--r--. 1 root root 18874368 11月 22 19:37 ibdata1
    drwxr-xr-x. 2 root root 4096 11月 22 19:37 mydb
    drwxr-xr-x. 2 root root 4096 11月 22 19:37 mydbs
    drwxr-xr-x. 2 root root 4096 11月 22 19:37 mysql
    drwxr-xr-x. 2 root root 4096 11月 22 19:37 performance_schema
    drwxr-xr-x. 2 root root 4096 11月 22 19:37 test
    [root@centos6 data]# chown -R mysql.mysql ./* 
    [root@centos6 data]# cd ../binlogs/
    [root@centos6 binlogs]# mysqlbinlog --start-position=245 master-bin.000007
    /*!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
    #161122 19:31:08 server id 1 end_log_pos 245 Start: binlog v 4, server v 5.5.32-MariaDB-log created 161122 19:31:08
    # Warning: this binlog is either in use or was not closed properly.
    BINLOG '
    fCw0WA8BAAAA8QAAAPUAAAABAAQANS41LjMyLU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAA+1uD6g==
    '/*!*/;
    # at 245
    #161122 19:31:49 server id 1 end_log_pos 355 Querythread_id=9exec_time=0error_code=0
    use `mydbs`/*!*/;
    SET TIMESTAMP=1479814309/*!*/;
    SET @@session.pseudo_thread_id=9/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=0/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    create table students(id int,name varchar(20))
    /*!*/;
    # at 355
    #161122 19:32:26 server id 1 end_log_pos 424 Querythread_id=9exec_time=0error_code=0
    SET TIMESTAMP=1479814346/*!*/;
    BEGIN
    /*!*/;
    # at 424
    #161122 19:32:26 server id 1 end_log_pos 537 Querythread_id=9exec_time=0error_code=0
    SET TIMESTAMP=1479814346/*!*/;
    insert into students values (1,'tom'),(2,'jerry')
    /*!*/;
    # at 537
    #161122 19:32:26 server id 1 end_log_pos 564 Xid = 155
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    [root@centos6 binlogs]# mysqlbinlog --start-position=245 master-bin.000007>/root/incr.sql
    [root@centos6 ~]# mysql
    Welcome to the MariaDB monitor. Commands end with ; or g.
    Your MariaDB connection id is 3
    Server version: 5.5.32-MariaDB-log MariaDB Server
    Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    MariaDB [(none)]>set sql_log_bin=0; 
    MariaDB [hellodb]>source /root/incr.sql
    MariaDB [hellodb]>set sql_log_bin=1;
    MariaDB [hellodb]>use mydbs;
    MariaDB [mydbs]> show tables;
    +-----------------+
    | Tables_in_mydbs |
    +-----------------+
    | students |
    | t1 |
    +-----------------+
    2 rows in set (0.00 sec)
    MariaDB [mydbs]> select * from studnets;
    ERROR 1146 (42S02): Table 'mydbs.studnets' doesn't exist
    MariaDB [mydbs]> select * from students;
    +------+-------+
    | id | name |
    +------+-------+
    | 1 | tom |
    | 2 | jerry |
    +------+-------+
    2 rows in set (0.00 sec)
    MariaDB [mydbs]> use hellodb;
    Database changed
    MariaDB [hellodb]> show tables;
    +-------------------+
    | Tables_in_hellodb |
    +-------------------+
    | classes |
    | coc |
    | courses |
    | scores |
    | students |
    | tbl |
    | teachers |
    | toc |
    +-------------------+
    8 rows in set (0.00 sec)
    MariaDB [hellodb]>

    经过查看数据和删除数据目录前进行对比,如数据一致则代表数据恢复成功,xtrabackup+二进制日志可实现数据的完全备份、增量备份、完全备份恢复和增量数据恢复,同时在使用此款备份工具时,不会影响客户的正常访问,达到提高用户体验。

    更多XtraBackup相关教程见以下内容:

    MySQL管理之使用XtraBackup进行热备 http://www.linuxidc.com/Linux/2014-04/99671.htm

    使用Xtrabackup进行MySQL备份 http://www.codesec.net/Linux/2016-11/137734.htm

    MySQL开源备份工具Xtrabackup备份部署 http://www.codesec.net/Linux/2013-06/85627.htm

    MySQL Xtrabackup备份和恢复 http://www.codesec.net/Linux/2011-12/50275.htm

    Percona Xtrabackup 安装 http://www.codesec.net/Linux/2016-11/137735.htm

  • 相关阅读:
    idea 快捷键
    上传代码
    maven 打包
    mysql 通过测试'for update',深入了解行锁、表锁、索引
    mysql中,手动提交事务
    java 发送邮件
    zk脑裂
    malloc,free和new,delete之间的区别
    sizeof和strlen区别
    字符串常量问题
  • 原文地址:https://www.cnblogs.com/2881064178dinfeng/p/6165016.html
Copyright © 2011-2022 走看看