xtrabackup介绍
percona公司的备份工具,性能比较高。物理备份工具。

  • 特点:
    物理备份工具,在同级数据量基础上,都要比逻辑备份性能要好的多。 特别是在数据量比较大的时候,体现的更加明显。
  • 备份方式:
    1、拷贝数据文件     
    2、拷贝数据页
  • 备份原理
    1、对于innodb表,可以实现热备
         (1)在数据还有修改操作的时刻,直接将数据文件中的数据页备份,此时,备份走的数据对于当前mysql来讲是不一致。         
         (2) 将备份过程中的redo和undo一并备走。         
         (3)为了恢复的时候,只要保证备份出来的数据页LSN能和redo LSN匹配,将来恢复的就是一致的数据。
         (4)redo应用和undo的应用。
    2、对与myisam表,实现自动锁表拷贝文件。


xtrabackup安装 

  1. 安装依赖包
    wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo
    yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

     

  2. 安装xtrabackup

    wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
    yum -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

     

  3. 备份命令(全量备份)

    innobackupex /data/mysql/backup/  #最简单的备份方式

    #这是个最简单的备份方式,但是需要满足几个条件
    1.你的my.cnf配置文件是放在/etc/my.cnf,并且my.cnf中指定的socket文件
    2.你的数据库是没有密码的
    否则请用以下方式备份:

    innobackupex --defaults-file=/application/mysql/my.cnf --user=root --password=123456 /data/mysql/backup/

    # --defaults-file  指定你的配置文件
    # --user  数据库用户名
    # --password  数据库密码

    以上条件都满足的时候,​​​​​​有人会碰到这个问题:

    [root@db01 mysql]# innobackupex --user=root --password=123456 --defaults-file=/application/mysql/my.cnf /data/mysql/backup/
    xtrabackup: Error: --defaults-file must be specified first on the command line
    [root@db01 mysql]# innobackupex --defaults-file=/application/mysql/my.cnf --user=root --password=123456 /data/mysql/backup/
    190817 09:07:47 innobackupex: Starting the backup operation

    让史上英语最牛的人给你解答:需要把--defaults-file 作为第一个参数

  4. 查看备份后的文件,xtrabackup会自动创建一个以日期命名的文件夹,将所有的数据库文件复制过来,并生成日志文件,配置文件。

    [root@db01 backup]# ll
    total 2032
    drwxr-x--- 9 root root   4096 Aug 17 09:07 2019-08-17_09-07-47
    [root@db01 backup]# ll 2019-08-17_09-07-47
    total 63536
    -rw-r----- 1 root root      431 Aug 17 09:07 backup-my.cnf
    drwxr-x--- 2 root root     4096 Aug 17 09:07 fxw
    drwxr-x--- 2 root root     4096 Aug 17 09:07 fxw1
    -rw-r----- 1 root root 12582912 Aug 17 09:07 ibdata1
    -rw-r----- 1 root root 52428800 Aug 17 09:07 ibdata2
    drwxr-x--- 2 root root     4096 Aug 17 09:07 mysql
    drwxr-x--- 2 root root     4096 Aug 17 09:07 performance_schema
    drwxr-x--- 2 root root     4096 Aug 17 09:07 table01
    drwxr-x--- 2 root root     4096 Aug 17 09:07 test
    drwxr-x--- 2 root root     4096 Aug 17 09:07 world
    -rw-r----- 1 root root       21 Aug 17 09:07 xtrabackup_binlog_info
    -rw-r----- 1 root root      113 Aug 17 09:07 xtrabackup_checkpoints
    -rw-r----- 1 root root      517 Aug 17 09:07 xtrabackup_info
    -rw-r----- 1 root root     2560 Aug 17 09:07 xtrabackup_logfile
    [root@db01 backup]# 
    

     

 

恢复数据库

  1. 恢复数据前的准备(合并xtabackup_log_file和备份的物理文件)

    innobackupex --apply-log --use-memory=32M /data/mysql/backup/2019-08-17_09-07-47
    # --apply-log  将备份中的redo和undo,恢复到数据库中,务必加上该参数
    # --use-memory  为恢复程序分配内存,避免占用系统过多内存,消耗大量资源
  2. 模拟故障
    停止数据库服务器
    pkill mysqld

    破坏数据

    [root@db01 backup]# cd /application/mysql/data/
    [root@db01 data]# ll
    total 162144
    -rw-rw---- 1 mysql mysql       56 Aug  2 12:08 auto.cnf
    drwxr-xr-x 2 mysql mysql     4096 Aug 17 08:58 binlog
    -rw-rw---- 1 mysql mysql    69869 Aug 14 16:11 db01.err
    drwx------ 2 mysql mysql     4096 Aug 15 11:35 fxw
    drwx------ 2 mysql mysql     4096 Aug  5 09:35 fxw1
    -rw-rw---- 1 mysql mysql 12582912 Aug 17 09:31 ibdata1
    -rw-rw---- 1 mysql mysql 52428800 Aug 17 09:31 ibdata2
    -rw-rw---- 1 mysql mysql 50331648 Aug 17 09:31 ib_logfile0
    -rw-rw---- 1 mysql mysql 50331648 Aug  2 12:06 ib_logfile1
    drwx------ 2 mysql mysql     4096 Aug 15 11:35 mysql
    drwx------ 2 mysql mysql     4096 Aug  2 12:06 performance_schema
    -rw-rw---- 1 mysql mysql   235988 Aug 17 08:58 slow.log
    drwx------ 2 mysql mysql     4096 Aug 15 11:35 table01
    drwxr-xr-x 2 mysql mysql     4096 Aug  2 12:04 test
    drwx------ 2 mysql mysql     4096 Aug 15 11:35 world
    [root@db01 data]# \rm -rf ./*
    [root@db01 data]# ll
    total 0
    [root@db01 data]# 

     

  3. 恢复数据

    cp -a /data/mysql/backup/2019-08-17_09-07-47/  /application/mysql/data
    或者
    ​​​​​​​innobackupex --copy-back  /data/mysql/backup/2019-08-17_09-07-47/   

    注意:恢复时,要确认数据路径是空的,并且数据库是停掉的,同样需要在第一个参数加上--defaults-file=/application/mysql/my.cnf,否则将会把参数恢复到它默认的地方

    [root@db01 data]# innobackupex --defaults-file=/application/mysql/my.cnf --copy-back /data/mysql/backup/2019-08-17_09-07-47/
    190817 09:36:56 innobackupex: Starting the copy-back operation
    
    IMPORTANT: Please check that the copy-back run completes successfully.
               At the end of a successful copy-back run innobackupex
               prints "completed OK!".
    
    innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
    190817 09:41:28 [01] Copying ib_logfile0 to /application/mysql/data/ib_logfile0
    190817 09:41:30 [01]        ...done
    190817 09:41:30 [01] Copying ib_logfile1 to /application/mysql/data/ib_logfile1
    190817 09:41:32 [01]        ...done
         .
         .
       省略部分
         .
         .
    190817 09:37:03 [01]        ...done
    190817 09:41:37 [01] Copying ./table01/t1.ibd to /application/mysql/data/table01/t1.ibd
    190817 09:41:37 [01]        ...done
    190817 09:41:37 [01] Copying ./table01/db.opt to /application/mysql/data/table01/db.opt
    190817 09:41:37 [01]        ...done
    190817 09:41:37 [01] Copying ./test/db.opt to /application/mysql/data/test/db.opt
    190817 09:41:37 [01]        ...done
    190817 09:41:37 completed OK!
    [root@db01 data]# 

     

  4. 修改权限,此时并不是把数据恢复就可以启动数据库正常使用了。

    [root@db01 data]# ll
    total 174116
    drwxr-x--- 2 root root     4096 Aug 17 09:41 fxw
    drwxr-x--- 2 root root     4096 Aug 17 09:41 fxw1
    -rw-r----- 1 root root 12582912 Aug 17 09:41 ibdata1
    -rw-r----- 1 root root 52428800 Aug 17 09:41 ibdata2
    -rw-r----- 1 root root 50331648 Aug 17 09:41 ib_logfile0
    -rw-r----- 1 root root 50331648 Aug 17 09:41 ib_logfile1
    -rw-r----- 1 root root 12582912 Aug 17 09:41 ibtmp1
    drwxr-x--- 2 root root     4096 Aug 17 09:41 mysql
    drwxr-x--- 2 root root     4096 Aug 17 09:41 performance_schema
    drwxr-x--- 2 root root     4096 Aug 17 09:41 table01
    drwxr-x--- 2 root root     4096 Aug 17 09:41 test
    drwxr-x--- 2 root root     4096 Aug 17 09:41 world
    -rw-r----- 1 root root       22 Aug 17 09:41 xtrabackup_binlog_pos_innodb
    -rw-r----- 1 root root      517 Aug 17 09:41 xtrabackup_info
    [root@db01 data]# chown -R mysql.mysql /application/mysql/data/

     

  5. 启动数据库,咦。。。。报错了

    [root@db01 data]# service mysqld start
    Starting MySQL. ERROR! The server quit without updating PID file (/application/mysql/data/db01.pid).
    [root@db01 data]# ps -ef|grep mysql
    root       2685   1246  0 09:46 pts/0    00:00:00 grep --color=auto mysql

    完全在意料之外呀,查找日志,发现原来是data目录中的binlog也被我删掉了,但它又不属于数据文件,所以没有备份到,所以报错。

    [root@db01 data]# cat /var/log/mysqld.log
    2019-08-17 09:31:18 1706 [Note] /application/mysql/bin/mysqld: Shutdown complete
    
    /application/mysql/bin/mysqld: File '/application/mysql/data/binlog/mysql-bin.index' not found (Errcode: 2 - No such file or directory)
    2019-08-17 09:44:23 2257 [ERROR] Aborting
    
    2019-08-17 09:44:23 2257 [Note] Binlog end
    2019-08-17 09:44:23 2257 [Note] /application/mysql/bin/mysqld: Shutdown complete
    
    /application/mysql/bin/mysqld: File '/application/mysql/data/binlog/mysql-bin.index' not found (Errcode: 2 - No such file or directory)
    2019-08-17 09:46:03 2680 [ERROR] Aborting
    
    2019-08-17 09:46:03 2680 [Note] Binlog end
    2019-08-17 09:46:03 2680 [Note] /application/mysql/bin/mysqld: Shutdown complete
    

    在/application/mysql/data/创建binlog日志文件夹,设置权限,重启服务。

    [root@db01 data]# mkdir binlog
    [root@db01 data]# chown -R mysql.mysql binlog
    [root@db01 data]# service mysqld start
    Starting MySQL. SUCCESS! 
    [root@db01 data]# ll

    # 所以建议不要把日志文件放在data目录下。
     

  6. 测试数据库

    [root@db01 data]# mysql -uroot -p123456 -e "select * from world.city where id < 10"
    Warning: Using a password on the command line interface can be insecure.
    +----+----------------+-------------+---------------+------------+
    | ID | Name           | CountryCode | District      | Population |
    +----+----------------+-------------+---------------+------------+
    |  1 | Kabul          | AFG         | Kabol         |    1780000 |
    |  2 | Qandahar       | AFG         | Qandahar      |     237500 |
    |  3 | Herat          | AFG         | Herat         |     186800 |
    |  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800 |
    |  5 | Amsterdam      | NLD         | Noord-Holland |     731200 |
    |  6 | Rotterdam      | NLD         | Zuid-Holland  |     593321 |
    |  7 | Haag           | NLD         | Zuid-Holland  |     440900 |
    |  8 | Utrecht        | NLD         | Utrecht       |     234323 |
    |  9 | Eindhoven      | NLD         | Noord-Brabant |     201843 |
    +----+----------------+-------------+---------------+------------+

     

搞定!!!!!!!!!!!!!
上一章是针对逻辑删库跑路的,这一章就是针对物理删库跑路的了,啊哈哈哈

最后修改于 2019-08-17 08:41:42
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇