使用Xtrabackup来实现数据库备份

  • 关于二进制日志的选项
  • innodb_support_xa={TRUE|FALSE}:用于表示InnoDB是否支持分布式事务;存储引擎事务在存储引擎内部被赋予了ACID权限,分布式(XA)事务是一种高层次的事务,它利用”准备”, 然后 “提交”,两段式的方式将ACID扩展属性扩展到存储引擎外部,甚至是数据库外部,然而,”准备阶段”会导致额外的磁盘刷写操作,XA需要事务协调员,它会通知所有的参与者准备提交事务,当协调员从参与者那里得到就绪的消息时,它会只是所有的参与者进行真正的提交操作;这个变量正式用于定义InnoDB是否支持两段式提交的分布式事务,默认为启用,事实上,所有的启用了二进制日志的,并且支持多个线程同时向二进制日志写入数据的MySQL服务器都需要启用分布式事务,否则,多个线程对于二进制日志的写入操作,可能会以与原始次序不同的方式完成,这将会在基于二进制日志的恢复中或者是从从服务器上面创建出不同原始数据的结果,因此除了仅仅有一个线程用于改变数据以外的其他应用场景都不应该禁用此功能,而在仅有一个线程可以修改数据的应用中,禁用次功能是安全的,并且可以提高InnoDB的性能,作用范围是全局和会话级别;
  • sync_binlog = 1:用于保证在备份的时候不会存在正在写入的事务,可以用于防止二进制日志文件损坏;

  • ibbackup:用于实现对于InnoDB存储引擎是现在线的安全备份,用于实现在线的物理备份;

  • mylvmbackup(perl scripts):可以实现对于逻辑卷上面的进行备份;

  • Xtrabackup:实现对于xtradb(是对于InnoDB的增强版本),Xtradbpercona官方提供的存储引擎,可以下载,并且放在InnoDB源代码目录,并且进行编译安装,并且需要更改名称为InnoDB;支持的备份类型包括:完全备份,增量备份,并且可以自动保存信息文件;percona提供了innodb的改进版xtradb, 支持完全备份和增量备份,

  • 使用Xtrabackup进行完全备份

  • 首先下载Xtrabackup-2.0.1.rpm这里可以选择对应平台的rpm软件包进行下载
  • 然后进行安装,这个有点麻烦的是,会自动安装MySQL,并且会检查gpgcheck,使用一下选项避免
[root@server60 mnt]# yum install percona-xtrabackup-2.0.1-446.rhel5.x86_64.rpm -y --nogpgcheck
  • 查看安装生成的文件,主要的就是下面几个;
    使用Xtrabackup来实现数据库备份_第1张图片
  • 尝试进行一次完全备份
[root@server60 mnt]# innobackupex --user=root ~/backup

//输出关于软件的版本信息以及参数的配置信息
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

180513 04:52:32  innobackupex: Starting mysql with options:  --user='root' --unbuffered --
180513 04:52:32  innobackupex: Connected to database with mysql child process (pid=25619)
180513 04:52:38  innobackupex: Connection to database server closed
IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".
//根据时间创建了数据备份目录
innobackupex: Created backup directory /root/backup/2018-05-13_04-52-3
//首先进行的是一些文件的扫描
>> log scanned up to (1672262)
[01] Copying ./ibdata1 to /root/backup/2018-05-13_04-52-38/ibdata1
[01]        ...done
[01] Copying ./dbdata/dbdata.ibd to /root/backup/2018-05-13_04-52-38/./dbdata/dbdata.ibd
[01]        ...done
[01] Copying ./jiaowu/students.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/students.ibd
[01]        ...done
[01] Copying ./jiaowu/tutors.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/tutors.ibd
[01]        ...done
[01] Copying ./jiaowu/scores.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/scores.ibd
[01]        ...done
[01] Copying ./jiaowu/courses.ibd to /root/backup/2018-05-13_04-52-38/./jiaowu/courses.ibd
[01]        ...done
[01] Copying ./cactidb/testdb.ibd to /root/backup/2018-05-13_04-52-38/./cactidb/testdb.ibd
[01]        ...done
//开始进行锁表,并且刷新表空间
180513 04:52:42  innobackupex: Starting mysql with options:  --user='root' --unbuffered --
180513 04:52:42  innobackupex: Connected to database with mysql child process (pid=25663)
180513 04:52:44  innobackupex: Starting to lock all tables...
>> log scanned up to (1672262)
>> log scanned up to (1672262)
180513 04:52:54  innobackupex: All tables locked and flushed to disk
//表示备份信息已经完成
innobackupex: Backup created in directory '/root/backup/2018-05-13_04-52-38'
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 107
180513 04:52:57  innobackupex: completed OK!
  • 查看备份文件的内容
[root@server60 2018-05-13_04-52-38]# ll
total 18548
-rw-r--r-- 1 root root      260 05-13 04:52 backup-my.cnf
drwx------ 2 root root     4096 05-13 04:52 cactidb
drwx------ 2 root root     4096 05-13 04:52 dbdata
-rw-r----- 1 root root 18874368 05-13 04:52 ibdata1
drwx------ 2 root root     4096 05-13 04:52 jiaowu
drwxr-xr-x 2 root root     4096 05-13 04:52 lost+found
drwxr-xr-x 2 root root     4096 05-13 04:52 mysql
drwxr-xr-x 2 root root     4096 05-13 04:52 performance_schema
-rw-r--r-- 1 root root       13 05-13 04:52 xtrabackup_binary
-rw-r--r-- 1 root root       23 05-13 04:52 xtrabackup_binlog_info
-rw-r----- 1 root root       77 05-13 04:52 xtrabackup_checkpoints
-rw-r----- 1 root root     2560 05-13 04:52 xtrabackup_logfile
  • 说明几个文件的内容:
  • backup-my.cnf:配置文件备份;
  • xtrabackup_binlog_info:二进制文件信息文件名称以及position;
    这里写图片描述
  • xtrabackup_binary:备份使用哪个命令执行的;
    这里写图片描述
  • xtrabackup_logfile:数据文件;
    这里写图片描述
  • xtrabackup_checkpoints:备份类型的等数据;
    这里写图片描述
    • backup_type = full-backuped:表示备份类型;
    • from_lsn = 0:0 :表示从哪个逻辑号码进行的备份;
    • to_lsn = 0:54664:
    • last_lsn = 0:54664:
  • lsn:表示每一个InnoDB存储日志的信息都包含一个日志序列号,InnoDB存储引擎会自己维护日志信息的序列号,如果这个信息发生改变,号码就会往前走一个,可以根据这个号码来进行增量备份;如果进行增量备份只需要从last_lsn开始就可以了;
  • 上面的这些信息是不能够直接用来恢复数据的,需要进行一些准备工作:
    • 1.用于实现将已经提交的事务,进行事务日志信息的向数据文件的同步;
    • 2.将没有提交的事务日志的事务,进行回滚操作;
    • 使用选项--apply-log:用于实现上述功能,在执行完成之后,就是一个干净的,可以直接用于恢复的数据文件;
  • 执行准备操作:
[root@server60 backup]# innobackupex --apply-log ~/backup/2018-05-13_04-52-38/

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

180513 05:13:45  innobackupex: Starting ibbackup with command: xtrabackup_55  --defaults-file="/root/backup/2018-05-13_04-52-38/backup-my.cnf"  --defaults-group="mysqld" --prepare --target-dir=/root/backup/2018-05-13_04-52-38

xtrabackup_55 version 2.0.1 for Percona Server 5.5.16 Linux (x86_64) (revision id: 446)
xtrabackup: cd to /root/backup/2018-05-13_04-52-38
xtrabackup: This target seems to be not prepared yet.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1672262)
xtrabackup: Temporary instance for recovery is set as followings.
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 1
xtrabackup:   innodb_log_file_size = 2097152
180513  5:13:45 InnoDB: Using Linux native AIO
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)

[notice (again)]
  If you use binary log and don't use any hack of group commit,
  the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 107, file name ./mysql-bin.000001

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
180513  5:13:51  InnoDB: Starting shutdown...
180513  5:13:56  InnoDB: Shutdown completed; log sequence number 1673740
180513 05:13:56  innobackupex: completed OK!
  • 插入新的数据,来模拟即时点还原
mysql> use jiaowu;
Database changed
mysql> INSERT INTO tutors (Tname) VALUES ('stu00005');
Query OK, 1 row affected (0.12 sec)

mysql> INSERT INTO tutors (Tname) VALUES ('stu00006');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tutors (Tname) VALUES ('stu00007');
Query OK, 1 row affected (0.00 sec)
  • 接下来使用完全备份以及二进制日志实现即时点还原
  • 首先进行日志滚动
mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.10 sec)
  • 将二进制日志文件拷贝到另一个目录里面
[root@server60 backup]# cp /mysql/mydata/mysql-bin.000001 ~/backup/
  • 接下来模拟数据库信息损坏
[root@server60 ~]# service mysqld stop 
Shutting down MySQL.                                       [  OK  ]
  • 删除数据目录里面的信息
[root@server60 ~]# rm -fr /mysql/mydata/*
  • 这里不需要进行数据库的初始化,在备份的时候,需要数据库正常工作,但是在恢复时,是不需要数据库正常工作的;

  • 使用命令直接恢复数据

[root@server60 mysql]# innobackupex --copy-back ~/backup/2018-05-13_04-52-38/

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".

innobackupex: Starting to copy InnoDB system tablespace
innobackupex: in '/root/backup/2018-05-13_04-52-38'
innobackupex: back to original InnoDB data directory '/mysql/mydata'
innobackupex: Copying file '/root/backup/2018-05-13_04-52-38/ibdata1'

innobackupex: Starting to copy InnoDB log files
innobackupex: in '/root/backup/2018-05-13_04-52-38'
innobackupex: back to original InnoDB log directory '/mysql/mydata'
innobackupex: Finished copying back files.

180513 05:31:10  innobackupex: completed OK!
  • 修改恢复过来的文件的属主和属组
[root@server60 ~]# chown -R mysql.mysql /mysql/mydata/
  • 接下来启动MySQL服务
[root@server60 ~]# service mysqld start 
Starting MySQL..                                           [  OK  ]
  • 查看完全备份恢复的数据
    使用Xtrabackup来实现数据库备份_第2张图片
  • 首先关闭二进制日志记录的信息
mysql> SET sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
  • 使用二进制日志进行即时点还原
[root@server60 backup]# mysqlbinlog ~/backup/mysql-bin.000001 > /tmp/abc.sql
mysql> SOURCE /tmp/abc.sql
  • 查看即时点恢复的数据
    使用Xtrabackup来实现数据库备份_第3张图片

  • 接下来还原二进制日志

mysql> SET sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
  • xtrabackup对于InnoDB可以执行增量备份,但是对于MyISAM是完全备份;

  • 接下来进行完全备份,并且进行增量备份

  • 首先进行完全备份
[root@server60 ~]# innobackupex /backup/
  • 连接再次进行数据修改
mysql> INSERT INTO tutors(Tname) VALUES('stu00001');

mysql> INSERT INTO tutors(Tname) VALUES('stu00002');

mysql> INSERT INTO tutors(Tname) VALUES('stu00003');
  • 进行增量备份
[root@server60 ~]# innobackupex --incremental /backup/ --incremental-basedir=/backup/2018-05-14_02-08-33/
  • 增量备份可能出现下面的错误:
180215 18:42:23  innobackupex: Connection to database server closed

180215 18:42:23  innobackupex: Starting ibbackup with command: xtrabackup_55 --backup --suspend-at-end --target-dir=/root/backup/2018-02-15_18-42-21 --incremental-basedir='~/backup/2018-02-15_18-31-11/'
innobackupex: Waiting for ibbackup (pid=13644) to suspend
innobackupex: Suspend file '/root/backup/2018-02-15_18-42-21/xtrabackup_suspended'

xtrabackup: Error: cannot open ~/backup/2018-02-15_18-31-11//xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from ~/backup/2018-02-15_18-31-11//xtrabackup_checkpoints
innobackupex: Error: ibbackup child process has died at /usr/bin/innobackupex line 371.
  • 一定不要在用户的加目录里面创建~/backup这样的目录,否则会出现上面的错误;
[root@server4 backup]# innobackupex --incremental ~/backup/  --incremental-basedir=~/backup/2018-02-15_18-31-11/
  • 执行第二次增量备份
  • 首先插入些许数据
mysql> INSERT INTO tutors(Tname) VALUES('stu00010');

mysql> INSERT INTO tutors(Tname) VALUES('stu00011');

mysql> INSERT INTO tutors(Tname) VALUES('stu00012');
  • 然后修改第二次的base-dir为上一次增量备份的目录
[root@server60 ~]# innobackupex --incremental /backup/ --incremental-basedir=/backup/2018-05-14_02-17-48/
.......
.......
.......
180513 09:07:17  innobackupex: completed OK!
  • 在有增量备份的时候,使用--redo-only操作,只执行redo操作,因为在完全备份和增量备份之间的事务可能存在事务的提交操作;
  • 可能存在在第一次完全备份操作中没有提交的事务可能在第二次增量备份中已经提交过了,如果执行撤销操作,这些事务在增量备份中就不能够提交成功了;
  • 增量备份一次按照增量备份的顺序进行操作;
  • 首先对于完全备份进行redo-only操作
[root@server60 ~]# innobackupex --apply-log --redo-only /backup/2018-05-14_02-08-33/
  • 准备第一次增量备份
[root@server60 ~]# innobackupex --apply-log --redo-only /backup/2018-05-14_02-08-33/ --incremental-dir=/backup/2018-05-14_02-17-48/
  • 准备第二次增量备份
[root@server60 ~]# innobackupex --apply-log --redo-only /backup/2018-05-14_02-08-33/ --incremental-dir=/backup/2018-05-14_02-18-36/
  • 所有的redo操作都已经合并到完全被上面去了
  • 接下来停止MySQL服务器,删除数据目录
[root@server60 ~]# /etc/init.d/mysqld stop 
Shutting down MySQL.                                       [  OK  ]
[root@server60 ~]# rm -fr /mysql/mydata/*
  • 然后使用完全备份进行还原
[root@server60 ~]# innobackupex --copy-back /backup/2018-05-14_02-08-33
  • 修改文件的属主和属组
[root@server60 ~]# chown -R mysql.mysql /mysql/mydata/
  • 启动服务
[root@server60 ~]# /etc/init.d/mysqld start
Starting MySQL..                                           [  OK  ]
  • 查看数据库里面的内容
    使用Xtrabackup来实现数据库备份_第4张图片

  • 默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间移植,即使采用了innodb_file_per_table选项,但是使用xtrabackup可以实现此功能,导出表的服务器需要在创建这张表之前启用innodb_file_pre_table选项,需要导入表的服务器需要启用innodb_file_pre_tableinnodb_expand_import选项;

  • 在执行导出某个表的时候,必须是在完全备份的基础上面进行执行,所以首先需要执行完全备份,xtrabackup会为每张表创建一个使用exp结尾的表文件,复制单个表的exp文件,导入表的服务器需要执行:
    • 1.首先创建一个和原来表结构一致的表;
    • 2.然后需要删除表空间文件;

你可能感兴趣的:(Mysql)