zoukankan      html  css  js  c++  java
  • Mysql备份工具Xtrabackup

      Xtrabackup是一个开源的免费的热备工具,在Xtrabackup包中主要有Xtrabackup和innobackupex两个工具。其中Xtrabackup只能备份InnoDB和XtraDB两种引擎; innobackupex则是封装了Xtrabackup,同时增加了备份MyISAM引擎的功能。

      Xtrabackup备份时不能备份表结构、触发器等等,也不能智能区分.idb数据文件。另外innobackupex还不能完全支持增量备份,需要和xtrabackup结合起来实现全备的功能。

    (1).安装xtrbackup

    1)下载安装包

      网址是https://www.percona.com/downloads/,然后网页查找Xtrabackup,下载自己需要的版本,就是下载速度有点慢。我这里使用的是2.4.14版本。

      然后下载依赖包,网址是http://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm

      这两个可以下载好上传到CentOS服务器,也可以使用wget直接在服务器上下载。

    2)解压安装

    [root@youxi1 ~]# ls
    anaconda-ks.cfg              mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar
    libev-4.04-2.el6.x86_64.rpm  Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
    Mysql
    [root@youxi1 ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm 
    警告:libev-4.04-2.el6.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID 66534c2b: NOKEY
    准备中...                          ################################# [100%]
    正在升级/安装...
       1:libev-4.04-2.el6                 ################################# [100%]
    [root@youxi1 ~]# tar -xf Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar 
    [root@youxi1 ~]# ls
    anaconda-ks.cfg                           Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
    libev-4.04-2.el6.x86_64.rpm               percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm
    Mysql                                     percona-xtrabackup-24-debuginfo-2.4.14-1.el7.x86_64.rpm
    mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar  percona-xtrabackup-test-24-2.4.14-1.el7.x86_64.rpm
    [root@youxi1 ~]# yum -y install percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm  //这里用yum安装,因为还有其他的依赖包
    

    3)配置文件

      修改配置文件/etc/my.cnf,保证[mysqld]模块存在参数datadir=/var/lib/mysql(指向数据目录),因为xtrbackup是根据/etc/my.cnf配置文件来获取需要备份的文件。然后重启mysqld。

    (2).xtrbackup的使用

      一般使用的是innobackupex脚本,因为innobackupex是perl脚本对xtrbackup的封装和功能扩展。

    1)用户权限说明

      在备份数据库时会涉及到两个用户:系统用户与数据库内部的用户。

      系统用户需要在datadir(配置文件内设置的目录)上具有读写执行权限(rwx)。而数据库内部用户需要:RELOAD和LOCK TABLES权限,为了执行FLUSH TABLES WITH READ LOCK;REPLICATION CLIENT权限,为了获取binary log(二进制日志文件)位置;CREATE TABLESPACE权限,为了导入表,用户表级别的恢复;SUPER权限,为了在slave环境下备份用来启动和关闭slave线程。

    2)常用命令格式和常用参数

      命令格式:

      innobackupex [参数] [目的地址|源地址]

      常用参数:

    --user=[数据库用户]    以什么用户身份进行操作
    --password=[密码]    数据库用户的密码
    --port=[端口号]    数据库的端口号,默认3306
    --stream=[tar|xbstream]  打包(数据流)
    --defaults-file=[配置文件]  指定默认配置文件,默认读取/etc/my.cnf
    --no-timestamp  不创建时间戳文件,而改用目的地址(可以自动创建)
    --copy-back  备份还原的主要选项
    --incremental  使用增量备份,默认使用的完整备份
    --incremental-basedir=[地址]  与--incremental选项联合使用,该参数指定上一级备份的地址来做增量备份

    3)完整备份和还原

      完整备份

    [root@youxi1 ~]# innobackupex --user=root --password=123456 ./db_backup/  //这个会有大量输出信息
    [root@youxi1 ~]# innobackupex --user=root --password=123456 ./db_backup/ 2>>./db_backup/backup.log  //如果不想要输出信息,可以将输出信息重定向到指定文件或黑洞文件中
    [root@youxi1 ~]# ls ./db_backup/
    2019-06-16_15-49-44  2019-06-16_15-51-23  backup.log
    [root@youxi1 ~]# ls ./db_backup/2019-06-16_15-49-44/
    backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile
    ib_buffer_pool mysql sys xtrabackup_info
    [root@youxi1 ~]# innobackupex --user=root --password=123456 --no-timestamp ./db_backup/test/ 2>>./db_backup/backup.log  //不使用时间戳创建目录,可自动创建目的地址
    [root@youxi1 ~]# ls ./db_backup/
    2019-06-16_15-49-44  2019-06-16_15-51-23  backup.log  test
    [root@youxi1 ~]# ls ./db_backup/test/
    backup-my.cnf   ibdata1  performance_schema  xtrabackup_checkpoints  xtrabackup_logfile
    ib_buffer_pool  mysql    sys                 xtrabackup_info
    

      还原,注意:innobackupex -copy-back不会覆盖已存在的文件。而且还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir

    [root@youxi1 ~]# systemctl stop mysqld
    [root@youxi1 ~]# rm -rf /var/lib/mysql/*  //危险操作,请在测试环境测试
    [root@youxi1 ~]# innobackupex --copy-back ./db_backup/2019-06-16_15-49-44/ 2>>./db_backup/copyback.log
    [root@youxi1 ~]# ll /var/lib/mysql
    总用量 12324
    -rw-r----- 1 root root      292 6月  16 17:08 ib_buffer_pool
    -rw-r----- 1 root root 12582912 6月  16 17:08 ibdata1
    drwxr-x--- 2 root root     4096 6月  16 17:08 mysql
    drwxr-x--- 2 root root     8192 6月  16 17:08 performance_schema
    drwxr-x--- 2 root root     8192 6月  16 17:08 sys
    -rw-r----- 1 root root      423 6月  16 17:08 xtrabackup_info
    [root@youxi1 ~]# chown -R mysql:mysql /var/lib/mysql  //重新授权,否则mysqld无法启动
    [root@youxi1 ~]# systemctl start mysqld
    [root@youxi1 ~]# mysql -uroot -p123456
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 2
    Server version: 5.7.26 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    

    4)增量备份和还原

      增量备份的实现,依赖于innodb页上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。增量备份会复制指定LSN<日志序列号>之后的所有数据页。

      查看完整备份的LSN

    [root@youxi1 ~]# cat ./db_backup/2019-06-16_15-49-44/xtrabackup_checkpoints 
    backup_type = full-backuped  //代表完整备份
    from_lsn = 0
    to_lsn = 2525919
    last_lsn = 2525928
    compact = 0
    recover_binlog_info = 0
    flushed_lsn = 2525928
    

      创建一些数据,然后以2019-06-16_15-49-44时间戳创建第一个增量备份,并查看LSN

    [root@youxi1 ~]# mysql -uroot -p123456
    mysql> create database test_db;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use test_db;
    Database changed
    mysql> create table user_tb(id int,name varchar(20));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into user_tb values(1,'zhangsan');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> exit
    Bye
    [root@youxi1 ~]# innobackupex -uroot -p123456 --incremental --incremental-basedir=./db_backup/2019-06-16_15-49-44/ ./db_backup/ 2>>./db_backup/backup.log
    [root@youxi1 ~]# ls db_backup/
    2019-06-16_15-49-44  2019-06-16_15-51-23  2019-06-16_17-26-54  backup.log  copyback.log  test
    [root@youxi1 ~]# cat db_backup/2019-06-16_17-26-54/xtrabackup_checkpoints 
    backup_type = incremental  //表示增量备份
    from_lsn = 2525919
    to_lsn = 2530689
    last_lsn = 2530698
    compact = 0
    recover_binlog_info = 0
    flushed_lsn = 2530698
    

      再创建一些数据,以上一个增量备份创建新的增量备份,并查看LSN

    [root@youxi1 ~]# mysql -u root -p123456
    mysql> use test_db;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> insert into user_tb values(2,'lisi');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> exit
    Bye
    [root@youxi1 ~]# innobackupex --user=root --password=123456 --incremental --incremental-basedir=db_backup/2019-06-16_17-26-54/ ./db_backup/ 2>>./db_backup/backup.log
    [root@youxi1 ~]# ls db_backup/                        
    2019-06-16_15-49-44  2019-06-16_17-26-54  backup.log    test
    2019-06-16_15-51-23  2019-06-16_17-40-13  copyback.log
    [root@youxi1 ~]# cat db_backup/2019-06-16_17-40-13/xtrabackup_checkpoints 
    backup_type = incremental
    from_lsn = 2530689
    to_lsn = 2530892
    last_lsn = 2530901
    compact = 0
    recover_binlog_info = 0
    flushed_lsn = 2530901
    

      增量备份的还原就比较麻烦了:

        第一步,从完整备份一步步升上来。首先是完整备份,innobackupex --apply-log --redo-only [完整备份的地址]。接着是除了想要还原到的增量备份,都需要innobackupex --apply-log --redo-only [完整备份的地址] --incremental-dir=[第1次到第n-1次增量备份地址],一个个执行过去。然后想要还原的增量备份innobackupex --apply-log [完整备份的地址] --incremental-dir=[第n次增量备份地址]。这时所有需要的日志就到了完整备份目录下,最后执行innobackupex --apply-log [完整备份的地址],将未完成的日志执行。

        第二步、停止mysqld,恢复数据,恢复目录及文件权限,启动mysqld,检查是否正常。

      还原实例:

    [root@youxi1 ~]# innobackupex --apply-log --redo-only db_backup/2019-06-16_15-49-44/ 2>>db_backup/copyback.log
    [root@youxi1 ~]# innobackupex --apply-log --redo-only db_backup/2019-06-16_15-49-44/ --incremental-dir=db_backup/2019-06-16_17-26-54/ 2>>db_backup/copyback.log
    [root@youxi1 ~]# innobackupex --apply-log db_backup/2019-06-16_15-49-44/ --incremental-dir=db_backup/2019-06-16_17-40-13/ 2>>db_backup/copyback.log
    [root@youxi1 ~]# innobackupex --apply-log db_backup/2019-06-16_15-49-44/ 2>>db_backup/copyback.log
    [root@youxi1 ~]# systemctl stop mysqld
    [root@youxi1 ~]# rm -rf /var/lib/mysql/*  //危险操作
    [root@youxi1 ~]# innobackupex --copy-back db_backup/2019-06-16_15-49-44/ 2>db_backup/copyback.log
    [root@youxi1 ~]# chown -R mysql:mysql /var/lib/mysql/
    [root@youxi1 ~]# systemctl start mysqld
    [root@youxi1 ~]# mysql -uroot -p123456
    mysql> use test_db;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from user_tb;
    +------+----------+
    | id | name |
    +------+----------+
    | 1 | zhangsan |
    | 2 | lisi |
    +------+----------+
    2 rows in set (0.00 sec)
    

    5)--stream选项,数据流压缩

      注意:使用--stream选项时,会输出打包的数据流,并不会直接生成打包文件,此时需要使用重定向或其他命令对数据流进行处理。

      例如1:使用重定向生成压缩文件

    [root@mhaSpareMaster22 ~]# mkdir /db_backup
    //将标准输出重定向为tar文件,将标准错误重定向到日志文件
    [root@mhaSpareMaster22 ~]# innobackupex --databases=test_db --user=root --password=123456 --stream=tar /db_backup/
     >/db_backup/`date +%F`.tar 2> /db_backup/backup.log 
    [root@mhaSpareMaster22 ~]# ls /db_backup/
    2019-09-29.tar  backup.log
    [root@mhaSpareMaster22 ~]# cd /db_backup/
    //注意:解压的时候是散的,没有文件夹
    [root@mhaSpareMaster22 db_backup]# tar xf 2019-09-29.tar
    [root@mhaSpareMaster22 db_backup]# ls
    2019-09-29.tar  ib_buffer_pool  xtrabackup_binlog_info  xtrabackup_logfile
    backup.log      ibdata1         xtrabackup_checkpoints
    backup-my.cnf   test_db         xtrabackup_info
    

      例如2:使用ssh和cat组合命令,直接备份到其他服务器上

    [root@mhaSpareMaster22 ~]# ssh-keygen
    [root@mhaSpareMaster22 ~]# ssh-copy-id 192.168.5.70
    [root@mhaSpareMaster22 ~]# innobackupex --databases=test_db --user=root --password=123456 --stream=tar 2> /db_backup/backup.log
     | ssh 192.168.5.70 "cat - > /`date +%F`.tar "
    [root@mhaSpareMaster22 ~]# ssh 192.168.5.70
    [root@Zabbix70 ~]# ls /  //可以看到确实存在打包文件了
    2019-09-29.tar  boot  etc  lib   media  opt   root  sbin  sys  usr
    bin             ceph  dev  home  lib64  mnt   proc  run   srv  tmp  var
    [root@Zabbix70 ~]# mkdir /db
    [root@Zabbix70 /]# tar xf /2019-09-29.tar -C /db/  //解压下来看看
    [root@Zabbix70 /]# ls /db
    backup-my.cnf   ibdata1  xtrabackup_binlog_info  xtrabackup_info
    ib_buffer_pool  test_db  xtrabackup_checkpoints  xtrabackup_logfile
    [root@Zabbix70 ~]# exit
    登出
    Connection to 192.168.5.70 closed.
    

      例如3:使用gzip再压缩一下

    [root@mhaSpareMaster22 ~]# rm -rf /db_backup/*
    [root@mhaSpareMaster22 ~]# innobackupex --databases=test_db --user=root --password=123456 --stream=tar /db_backup/
     2> /db_backup/backup.log | gzip > /db_backup/`date +%F`.tar.gz
    [root@mhaSpareMaster22 ~]# ls /db_backup/
    2019-09-29.tar.gz  backup.log
    [root@mhaSpareMaster22 ~]# tar zxf /db_backup/2019-09-29.tar.gz -C /db_backup/
    [root@mhaSpareMaster22 ~]# ls /db_backup/  //可以看到也能正常解压
    2019-09-29.tar.gz  ib_buffer_pool  xtrabackup_binlog_info  xtrabackup_logfile
    backup.log         ibdata1         xtrabackup_checkpoints
    backup-my.cnf      test_db         xtrabackup_info
    

      

  • 相关阅读:
    MySQL学习笔记(一)
    MySQL学习笔记(六)
    MySQL学习笔记(三)
    MySQL学习笔记(二)
    eclipse使用SSH框架出现There is no Action mapped for namespace [/] and action name [] associated with context path错误
    网页分页功能的实现
    Linux配置LNMP环境(一)配置Nginx
    Linux配置LNMP环境(二)配置PHP
    [转]在WPF的TreeView中实现右键选定
    .NET 导出到Excel功能
  • 原文地址:https://www.cnblogs.com/diantong/p/11029285.html
Copyright © 2011-2022 走看看