zoukankan      html  css  js  c++  java
  • MySQL备份与恢复-innobackupex

     :上一片myloder搞崩溃,为什么百度的博文都是抄袭一模一样的,哎烦!

    这一片文章我们来介绍物理备份工具xtracebackup!

    首先是安装可以percona官网下载安装,下载rpm包直接yum安装即可!

    yum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio*         #安装依赖包
    yum
    install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
    [root@test2 ~]# xtrabackup -v
    xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
    #下载的时候尽量下载新版本的percoan,这样会有对MySQL5.7的支持
    #写这个博文的时候,官网最新版本好像是8.0的吧,这个8.0版本应该是为了支持MySQL8.x吧,后续再测一下!

    XtraceBackup是由知名数据库软件服务企业Percona提供的一款热备工具,除了能够支持最为常见的MyISAM,INNODB引擎对象外,还支持XtraDB引擎。

    查看percona的安装文件:

    [root@test2 ~]# rpm -ql percona-xtrabackup-24-2.4.4-1.el6.x86_64
    /usr/bin/innobackupex 
    /usr/bin/xbcloud
    /usr/bin/xbcloud_osenv
    /usr/bin/xbcrypt
    /usr/bin/xbstream                 #以专用的xbstream格式压缩xtrabackup输出的信息。也可以使用tar 
    /usr/bin/xtrabackup               
    #最经常使用的就是这两个备份工具,其中之前的版本xtracebackup只能备份INNODB存储引擎,而innobackupex对xtracebackup进行了封装,不仅能备份INNODB存储
    引擎,也能备份myisam存储引擎,但是查看官方2.4版本的文档时候,percona说在之后的版本会放弃innobackupex这个工具,建议使用xtracebackup命令! /usr/share/doc/percona-xtrabackup-24-2.4.4 /usr/share/doc/percona-xtrabackup-24-2.4.4/COPYING /usr/share/man/man1/innobackupex.1.gz /usr/share/man/man1/xbcrypt.1.gz /usr/share/man/man1/xbstream.1.gz /usr/share/man/man1/xtrabackup.1.gz

    XtraceBackup备份有以下几个优点:

    l  备份集高效,完整,可用。

    l  备份任务执行过程中不会有阻塞任务

    l  节省磁盘空间,降低网络带宽占用

    l  备份集自动验证机制

    l  恢复更快

    xtrabackup必须在MySQL服务端执行(但是创建的备份集不一定是保存在本地),特别是通过innobackupex命令创建备份集时,由于操作需要连接数据库获取信息,因此还要指定的连接参数(用户名,密码),而且连接所使用的的用户,必须拥有正确的操作权限。

    特别提醒:

    percona官方在文档中说要在之后的版本中放弃innobackupex工具,推荐使用xtracebackupex工具,但是截至目前为止,我们公司线上环境的备份还是使用的innobackupex。因此这里我们首先介绍innobackupex的备份使用,然后再介绍xtracebackup的使用。

    xtraceback2.4.x的官方文档地址:CLICK HEERE

    innobackupex的备份与恢复

    innobackupex的参数有很多,仅通过实例来讲解经常使用的,若需要某些参数可以查看官方文档!

    一个完全备份

    [root@test3 ~]# innobackupex --user=root --password=123456  /data/backup/          #备份很简单,/data/backup/为备份的目录
    181128 18:50:47 innobackupex: Starting the backup operation
    
    IMPORTANT: Please check that the backup run completes successfully.
               At the end of a successful backup run innobackupex
               prints "completed OK!".
    
    181128 18:50:47  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=localhost' as 'root'  (using password: YES).
    181128 18:50:47  version_check Connected to MySQL server
    181128 18:50:47  version_check Executing a version check against the server...
    181128 18:50:47  version_check Done.
    181128 18:50:47 Connecting to MySQL server host: localhost, user: root, password: set, port: 0, socket: (null)
    Using server version 5.7.22-log
    innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
    xtrabackup: uses posix_fadvise().
    xtrabackup: cd to /data/mysql
    xtrabackup: open files limit requested 0, set to 1024
    xtrabackup: using the following InnoDB configuration:
    xtrabackup:   innodb_data_home_dir = .
    xtrabackup:   innodb_data_file_path = ibdata1:12M:autoextend
    xtrabackup:   innodb_log_group_home_dir = ./
    xtrabackup:   innodb_log_files_in_group = 2
    xtrabackup:   innodb_log_file_size = 50331648
    InnoDB: Number of pools: 1
    181128 18:50:47 >> log scanned up to (13741543758)
    xtrabackup: Generating a list of tablespaces
    InnoDB: Allocated tablespace ID 48 for mysql/servers, old maximum was 0
    181128 18:50:48 [01] Copying ./ibdata1 to /data/backup/2018-11-28_18-50-47/ibdata1 #拷贝的是ibd文件,然后分别拷贝每张表的文件,然后再拷贝redo日志
    181128 18:50:48 >> log scanned up to (13741543758)
    181128 18:50:49 >> log scanned up to (13741543758)
    181128 18:50:50 [01]        ...done
    181128 18:50:50 [01] Copying ./mysql/servers.ibd to /data/backup/2018-11-28_18-50-47/mysql/servers.ibd
    181128 18:50:50 [01]        ...done
    181128 18:50:50 [01] Copying ./mysql/time_zone_name.ibd to /data/backup/2018-11-28_18-50-47/mysql/time_zone_name.ibd
    ...... MySQL binlog position: filename
    'test3-bin.000001', position '21818' 181128 18:51:12 [00] Writing backup-my.cnf 181128 18:51:12 [00] ...done 181128 18:51:12 [00] Writing xtrabackup_info 181128 18:51:12 [00] ...done xtrabackup: Transaction log of lsn (13741543749) to (13741543758) was copied. 181128 18:51:12 completed OK! #出现completed OK表示备份完成!

    因为过程比较长,没有粘贴,可以看一下备份的过程!

    innobackupex会在备份目录下面创建以当前时间点命名的备份文件如下:

    [root@test3 ~]# cd /data/backup/
    [root@test3 backup]# ls
    2018-11-28_18-50-47             #以当前时间点命名的备份文件集
    [root@test3 backup]# cd 2018-11-28_18-50-47/
    [root@test3 2018-11-28_18-50-47]# ls          #看到的备份之后的文件集
    backup-my.cnf  employees   hostinfo        ibdata1  mysql   performance_schema  sys   tpcc_test  xtrabackup_binlog_info  xtrabackup_info
    cmdb           financesys  ib_buffer_pool  lianxi   mytest  sbtest              test  ts1.ibd    xtrabackup_checkpoints  xtrabackup_logfile
    [root@test3 2018-11-28_18-50-47]# cd employees; ls #每个数据库中包含的表的结构文件(frm)和表数据文件(ibd)
    current_dept_emp.frm  departments.frm  dept_emp.frm  dept_emp_latest_date.frm  dept_manager.ibd  employees.ibd  salaries.ibd  test2.frm  titles.frm
    db.opt                departments.ibd  dept_emp.ibd  dept_manager.frm          employees.frm     salaries.frm   test1.frm     test3.frm  titles.ibd
    [root@test3 employees]#


    backup-my.cnf: 为当前数据库配置文件的备份!
    xtrabackup_binlog_info:当前备份文件对应的二进制日志文件和position位置,做PIT恢复时使用。

    [root@test3 2018-11-28_18-50-47]# cat xtrabackup_info #包含信息比较多
    uuid = 85662dd9-f2fb-11e8-a47c-fa336351fc00 #当前数据库的UUID
    name =
    tool_name = innobackupex #包含备份的工具,备份的命令,备份工具的版本,MySQL的版本
    tool_command = --user=root --password=... /data/backup/
    tool_version = 2.4.4
    ibbackup_version = 2.4.4
    server_version = 5.7.22-log
    start_time = 2018-11-28 18:50:47 #备份的开始时间
    end_time = 2018-11-28 18:51:12 #备份的结束时间
    lock_time = 0
    binlog_pos = filename 'test3-bin.000001', position '21818' #二进制日志的位置
    innodb_from_lsn = 0
    innodb_to_lsn = 13741543749 #刷新到lsn的位置
    partial = N
    incremental = N #增量备份
    format = file
    compact = N
    compressed = N
    encrypted = N

    [root@test3 2018-11-28_18-50-47]# cat xtrabackup_checkpoints #包含checkpoint的信息,以及备份方式
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 13741543749
    last_lsn = 13741543758
    compact = 0
    recover_binlog_info = 0

    xtrabackup_logfile:【未知】

    执行恢复

    恢复分为两个步骤:

    准备恢复:所谓准备恢复,就是要为恢复做准备。就是说备份集没办法直接拿来用,因为这中间可能存在未提交或未回滚的事务,数据文件不一致,所以需要一个队备份集的准备过程。

    [root@test3 ~]# innobackupex --apply-log /data/backup/2018-11-28_18-50-47/        #准备阶段的命令   
    181128 19:16:57 innobackupex: Starting the apply-log operation
    
    IMPORTANT: Please check that the apply-log run completes successfully.
               At the end of a successful apply-log run innobackupex
               prints "completed OK!".
    
    innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
    xtrabackup: cd to /data/backup/2018-11-28_18-50-47
    xtrabackup: This target seems to be not prepared yet.
    InnoDB: Number of pools: 1
    .....
    InnoDB: 5.7.13 started; log sequence number 13741544981
    xtrabackup: starting shutdown with innodb_fast_shutdown = 1
    InnoDB: FTS optimize thread exiting.
    InnoDB: Starting shutdown...
    InnoDB: Shutdown completed; log sequence number 13741545378
    181128 19:17:02 completed OK!

    执行恢复:innobackupex提供了--copy-back参数,就是将指定的备份集,恢复到指定的路径下面(这个指定的路径是配置文件中datadir指定的路径)!

    [root@test3 ~]# service mysqld stop       #首先停掉数据库
    Shutting down MySQL.... SUCCESS! 
    [root@test3 ~]# rm -fr /data/mysql/*      #情况datadir指定的目录,若是线上环境,确保一定备份过
    [root@test3 ~]# innobackupex --copy-back /data/backup/2018-11-28_18-50-47/     #备份命令
    181128 19:20:58 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)
    ......
    181128 19:21:30 [01] Copying ./xtrabackup_info to /data/mysql/xtrabackup_info
    181128 19:21:30 [01]        ...done
    181128 19:21:30 [01] Copying ./xtrabackup_binlog_pos_innodb to /data/mysql/xtrabackup_binlog_pos_innodb
    181128 19:21:30 [01]        ...done
    181128 19:21:30 [01] Copying ./xtrabackup_galera_info to /data/mysql/xtrabackup_galera_info
    181128 19:21:30 [01]        ...done
    181128 19:21:30 [01] Copying ./ibtmp1 to /data/mysql/ibtmp1
    181128 19:21:30 [01]        ...done
    181128 19:21:30 completed OK!        #恢复完成

    数据库恢复之后,启动数据库:

    [root@test3 ~]# chown -R mysql:mysql /data/mysql/
    [root@test3 ~]# service mysqld start
    Starting MySQL.. SUCCESS!

    至此一个完全备份的数据恢复工作完成!

    在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录,我们可以自定义备份集的名字如下:

    [root@test3 ~]# innobackupex --user=root --password=123456 --no-timestamp /data/backup/test_`date +%F`  #指定备份集的名字
    [root@test3 ~]# cd /data/backup/
    [root@test3 backup]# ls           #查看备份集
     test_2018-11-28
    [root@test3 backup]#

    有时候因为socket文件不在默认位置,可以使用--socket指定位置:

    [root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp /data/backup/testdb
    181128 19:40:10 innobackupex: Starting the backup operation
    
    IMPORTANT: Please check that the backup run completes successfully.
               At the end of a successful backup run innobackupex
               prints "completed OK!".
    
    181128 19:40:10  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root'  (using password: YES).
    181128 19:40:10  version_check Connected to MySQL server
    181128 19:40:10  version_check Executing a version check against the server...
    181128 19:40:10  version_check Done.
    181128 19:40:10 Connecting to MySQL server host: localhost, user: root, password: set, port: 0, socket: (null)
    Failed to connect to MySQL server: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2).
    [root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp --socket=/var/lib/mysql/mysql.sock  data/backup/testdb

     增量备份与恢复

    增量备份时与全备一起结合使用的,因此这里我们会说明一个全部的过程。

    1:首先对目前的数据库做一个全备

    [root@test3 ~]# innobackupex --user=root --password=123456 --no-timestamp /data/backup/full_backup
    [root@test3 ~]# cd /data/backup/
    [root@test3 backup]# ls #全部备份的文件
    full_backup

    2:对数据做一些修改,如下

    mysql> use sbtest;              #创建了一张表,然后插入了两条记录
    Database changed
    mysql> create table tb3(a varchar(5), sysTime datetime);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into tb3 select "aa", now();
    Query OK, 1 row affected (0.01 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> insert into tb3 select "bb", now();
    Query OK, 1 row affected (0.01 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> select * from tb3;
    +------+---------------------+
    | a    | sysTime             |
    +------+---------------------+
    | aa   | 2018-11-29 09:14:00 |
    | bb   | 2018-11-29 09:14:11 |
    +------+---------------------+
    2 rows in set (0.00 sec)

    3:开始增量备份

    [root@test3 backup]# innobackupex --user=root --password=123456 --no-timestamp --incremental /data/backup/incre1 --incremental-basedir=/data/backup/full_backup

    --no-timestamp: 上面已经说过,自己定义备份集的名字
    --incremental /data/backup/incre1 :参数说明这次备份时一个增量备份,后面的路径指定增量备份的目录
    --incremental-basedir=/data/backup/full_backup :增量备份时基于全备的,这个参数就是说明本次的增量备份时基于那次的全备,指向全备的目录文件

    查看增量备份的文件记录:

    [root@test3 incre1]# cat xtrabackup_checkpoints
    backup_type = incremental                 #备份类型
    from_lsn = 13741583205                    #需要说明增量备份只能INNODB,xtrack存储引擎,备份是基于lsn的改变的
    to_lsn = 13741590096
    last_lsn = 13741590105
    compact = 0
    recover_binlog_info = 0

    备份完成之后,我们需要恢复操作,记得上面恢复第一步是什么?准备数据,也就是redo已经提交的事务,回滚未提交的事务。增量备份也是这样,但是操作有些不同。

    把全备文件备份一下,把数据库二进制日志也保存一下:【这一步为了二进制增备恢复做准备

    [root@test3 backup]# cp -r  full_backup full_backup_bak
    [root@test3 backup]# cp /data/mysql/test3-bin.000001 /data/backup/
    [root@test3 backup]# ls
    full_backup  full_backup_bak  incre1  test3-bin.000001

    恢复操作:

    准备数据

    第一准备全备:
    [root@test3 ~]# innobackupex  --apply-log --redo-only --use-memory=1G /data/backup/full_backup

    --use-memory=1G #表示使用的内存大小

    第二步:把增量备份在全备上面回放,也就是把增量备份附加到全备上。
    [root@test3 ~]# innobackupex --apply-log --redo-only /data/backup/full_backup --incremental-dir=/data/backup/incre1

    整个恢复操作分为两步
    1:准备全部备份,保证文件的一致性。
    2:把所有的增量备份附加到全备备份上。如果有多个增量备份,则每一个增量备份文件都要执行附加操作。但是要注意顺序,可以查看增量备份的xtrabackup_checkpoints文件
    根据lsn来确定文件的顺序

    开始恢复

    [root@test3 ~]# service mysqld  stop
    [root@test3 ~]# rm -fr /data/mysql/*
    [root@test3 ~]# innobackupex --copy-back /data/backup/full_backup
    [root@test3 ~]# chown -R mysql:mysql /data/mysql/

    #启动数据库,若是之前插入的两条数据存在,则说明增量备份恢复成功!
    [root@test3 ~]# service mysqld start
    Starting MySQL... SUCCESS!
    [root@test3 ~]# 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.22-log MySQL Community Server (GPL)

    Copyright (c) 2000, 2018, 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> use sbtest;
    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 tb3; #增量备份插入的数据存在
    +------+---------------------+
    | a    | sysTime             |
    +------+---------------------+
    | aa   | 2018-11-29 09:14:00 |
    | bb   | 2018-11-29 09:14:11 |
    +------+---------------------+
    2 rows in set (0.00 sec)

    特别提示:

    若有多个增量备份,则每一个增量备份都要重放到全备的文件中,一定要注意重放增量备份时候的顺序,可以在xtrabackup_checkpoints文件中根据lsn的大小来判断文件的顺序。

    利用二进制日志做增量恢复

    上面innobackupex的增量恢复,有点不方便,若是要恢复到某个时间点,显得有点无能为力了!但是二进制日志可以,二进制日志可以恢复指定时间点。

    在上面的插入数据中,我们插入两条数据,但是一个要求,我们只要恢复到2018-11-29 09:14:00的数据,也就是插入的第二条数据不需要了!

    我们上面备份了全备和二进制日志,现在就可以使用了!

    基于全备恢复所有的数据,然后根据二进制日志把数据库恢复到我们要的时间点!

    #执行全部备份的恢复
    [root@test3 ~]#  innobackupex  --apply-log /data/backup/full_backup_bak
    [root@test3 ~]# service mysqld stop [root@test3 ~]# rm -fr /data/mysql/ [root@test3 ~]# innobackupex --copy-back /data/backup/full_backup_bak [root@test3 ~]# chown -R mysql:mysql [root@test3 ~]# chown -R mysql:mysql /data/mysql/ [root@test3 ~]# service mysqld start Starting MySQL.. SUCCESS! [root@test3 ~]# 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.22-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, 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> use sbtest; #全备的时候,我们并没有在sbtest下面创建tb3这张表 Database changed mysql> show tables; Empty set (0.00 sec)

     #执行基于二进制时间点的恢复

    innobackupex备份的是,命令结束的时候的全部数据文件,可以在如下文件查看全备的时间信息:

    #有两种恢复方式基于时间点恢复
    [root@test3 mysql]# cat xtrabackup_info uuid = e44e6a70-f373-11e8-a5cd-fa336351fc00 name = tool_name = innobackupex tool_command = --user=root --password=... --no-timestamp /data/backup/full_backup tool_version = 2.4.4 ibbackup_version = 2.4.4 server_version = 5.7.22-log start_time = 2018-11-29 09:12:17 end_time = 2018-11-29 09:12:51 #全部结束的时间 lock_time = 0 binlog_pos = filename 'test3-bin.000001', position '1782' innodb_from_lsn = 0 innodb_to_lsn = 13741583205 partial = N incremental = N format = file compact = N compressed = N encrypted = N
    #基于二进制的日志点恢复 [root@test3 mysql]#
    cat xtrabackup_binlog_pos_innodb #全部备份结束的时间点 test3-bin.000001 1227 [root@test3 mysql]#

    导出要恢复时间段的二进制日志文件:

    我们要截取的日志时间段是从 全备结束 到 2018-11-29 09:14:00 这个时间点的文件。全备结束时间点作为起始点,起始点有两种确定方式,第一种上面文件中

    的end_time指定的时间点;第二种二进制日志的position位置。这两种方式都可以。

    [root@test3 mysql]# cd /data/backup/
    [root@test3 backup]# mysqlbinlog --start-datetime="2018-11-29 09:12:51" --stop-datetime="2018-11-29 09:14:00" test3-bin.000001 > /root/bak.sql
    --start-datetime : 指定起始的时间点。
    --stop-datetime: 指定结束的时间点。
    --start-position: 指定二进制日志开始日志点。
    --stop-position : 指定二进制日志结束的日志点。
    上面四个参数可以配合使用

    然后把上面导出sql文件导入到MySQL服务中。

    mysql> set sql_log_bin=0;          #导入时,若文件较大会产生很多二进制日志文件,可以先把二进制日志文件关闭,
    
    mysql> source bak.sql;             #导入文件,可以使用mysql直接导入
    
    mysql> set sql_log_bin=1;           #导入完成之后,开启二进制日志文件 

    查看数据:

    mysql> use sbtest;   #完了演砸了,但是数据库已经存在了,说明这种方法是正确的!
    Database changed
    mysql> select * from tb3;
    Empty set (0.01 sec)
    
    mysql> show tables;
    +------------------+
    | Tables_in_sbtest |
    +------------------+
    | tb3              |
    +------------------+
    1 row in set (0.00 sec)

    查看一下二进制日志:

    [root@test3 backup]# mysqlbinlog test3-bin.000001
    .......
    #181129  9:13:47 server id 5  end_log_pos 1973 CRC32 0xcad0188f     Query    thread_id=13    exec_time=0    error_code=0
    SET TIMESTAMP=1543454027/*!*/;
    create table tb3(a varchar(5), sysTime datetime)
    /*!*/;
    # at 1973        #用时间截取的时候很可能是截取到了这个时间点就停止了,因此只有tb3这个表,没有后面的插入的第一条数据,因此我们选择用日志点截取数据
    #181129  9:14:00 server id 5  end_log_pos 2038 CRC32 0x670a3d93     Anonymous_GTID    last_committed=9    sequence_number=10    rbr_only=yes
    /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 2038
    #181129  9:14:00 server id 5  end_log_pos 2120 CRC32 0x6a82446d     Query    thread_id=13    exec_time=0    error_code=0
    SET TIMESTAMP=1543454040/*!*/;
    BEGIN
    /*!*/;
    # at 2120
    #181129  9:14:00 server id 5  end_log_pos 2172 CRC32 0x7c9e9e8c     Table_map: `sbtest`.`tb3` mapped to number 117
    # at 2172
    #181129  9:14:00 server id 5  end_log_pos 2216 CRC32 0xda4461be     Write_rows: table id 117 flags: STMT_END_F
    
    BINLOG '
    WD3/WxMFAAAANAAAAHwIAAAAAHUAAAAAAAEABnNidGVzdAADdGIzAAIPEgMFAAADjJ6efA==
    WD3/Wx4FAAAALAAAAKgIAAAAAHUAAAAAAAEAAgAC//wCYWGZoXqTgL5hRNo=
    '/*!*/;
    # at 2216
    #181129  9:14:00 server id 5  end_log_pos 2247 CRC32 0x3b63c077     Xid = 92
    COMMIT/*!*/;
    # at 2247            #选择这个日志点
    #181129  9:14:11 server id 5  end_log_pos 2312 CRC32 0xbd634458     Anonymous_GTID    last_committed=10    sequence_number=11    rbr_only=yes
    /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 2312
    #181129  9:14:11 server id 5  end_log_pos 2394 CRC32 0xb5eba130     Query    thread_id=13    exec_time=0    error_code=0
    SET TIMESTAMP=1543454051/*!*/;
    BEGIN
    /*!*/;
    # at 2394
    #181129  9:14:11 server id 5  end_log_pos 2446 CRC32 0xfcaf0343     Table_map: `sbtest`.`tb3` mapped to number 117
    # at 2446
    #181129  9:14:11 server id 5  end_log_pos 2490 CRC32 0x080cd871     Write_rows: table id 117 flags: STMT_END_F
    
    BINLOG '
    Yz3/WxMFAAAANAAAAI4JAAAAAHUAAAAAAAEABnNidGVzdAADdGIzAAIPEgMFAAADQwOv/A==
    Yz3/Wx4FAAAALAAAALoJAAAAAHUAAAAAAAEAAgAC//wCYmKZoXqTi3HYDAg=
    '/*!*/;
    # at 2490
    #181129  9:14:11 server id 5  end_log_pos 2521 CRC32 0x14fd7636     Xid = 93
    COMMIT/*!*/;
    SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
    DELIMITER ;
    # End of log file
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

    用日志点重新导入一下

    mysqlbinlog --start-position=1227 --stop-position=2247 test3-bin.000001 > /root/bak.sql  #截取二进制日志

    导入数据,查看数据:

    mysql> source bak.sql;
    mysql> use sbtest; Database changed mysql> show tables; +------------------+ | Tables_in_sbtest | +------------------+ | tb3 | +------------------+ 1 row in set (0.00 sec) mysql> select * from tb3; #数据已经存在 +------+---------------------+ | a | sysTime | +------+---------------------+ | aa | 2018-11-29 09:14:00 | +------+---------------------+ 1 row in set (0.00 sec)

    增量备份有两种方法,一个是利用innobackupex的方式进行增量备份另一个是利用二进制日志进行增量备份;建议使用二进制日志增量备份!

    我们公司的备份策略时,每一天凌晨全部备份,然后备份当天的二进制日志文件,这样就可以把数据恢复到任何一个时间点!

    流压缩

    上面备份的数据比较少,并没有考虑磁盘空间问题。下面我们来备份一个大库!

    [root@test2 mariadb]# du -sh
    47G    .
    #datadir的数据文件时47G,好吧也不是太大,能说明问题了!

    查看备份之后的文件大小:

    [root@test2 ~] innobackupex --user=root --password="123456" --no-timestamp --socket=/var/lib/mysql/mysql.sock  /test/backup/testdb
    [root@test2 ~]# cd /test/backup/
    [root@test2 backup]# ls
    testdb
    [root@test2 backup]# du -sh #可以看到备份的文件也是47G
    47G    .
    [root@test2 backup]#

    #innobackupex是逻辑备份,就是拷贝数据,因此备份文件和源文件的大小相差不大

    引入流压缩:

    [root@test2 backup]# innobackupex --user=root --password="7abec53701c3eefb" --no-timestamp --socket=/var/lib/mysql/mysql.sock --stream=tar /tmp |gzip -> testdb.tar.gz

    --stram=tar : 指定标准输出格式,一种是tar,另一种是xbstream;xbstream是xtraceback提供的,解压的时候需要专用命令处理,考虑通用性,选择用tar!

    /tmp : 流格式标准输出,临时存放于/tmp目录下面

    | gzip -> : 通过管道把流格式输出传给gzip进行压缩

    #压缩备份完之后,查看一下压缩之后文件的大小:
    [root@test2 backup]# ll -h testdb.tar.gz
    -rw-r--r-- 1 root root 18G Nov 29 11:27 testdb.tar.gz

    压缩之前文件是47个G
    未压缩的备份文件是47个G,
    压缩之后备份文件是18个G。

    之前的使用流压缩备份出来的命令,解压时必须带上 “-i” 参数!

    [root@test3 backup]# tar -ixvf testdb.tar.gz -C db/        #之前的版本解压时候必须带上-i参数,否则会报错的

    -C :直接把解压的文件放到指定的目录中,在恢复时,我们可以直接放到datadir指定的目录当中、

    [root@test3 backup]# tar -zxvf testdb.tar.gz -C db/ #但是2.4版本直接使用zxvf解压也是可以的!percona优化了很多参数

    文件解压之后,然后需要准备文件也就是需要使用--apply-log选项,之后进行恢复就可以了!恢复过程可以参照上面的恢复过程!

    percona还有一种压缩方式,官方文档给出的就是这种压缩方式:CLICK HERE!

    #备份指令如下
    [root@test2 ~]# innobackupex --user=root --password="7abec53701c3eefb" --socket="/var/lib/mysql/mysql.sock" --no-timestamp --compress --compress-threads=4  /test/backup/compress_db

    --compress:开启压缩

    --compress-threads=4 : 使用4个压缩线程

    备份的文件如下:
    [root@test2 backup]# cd compress_db
    [root@test2 compress_db]# ls #文件如下
    backup-my.cnf.qp  ib_buffer_pool.qp  mysql               xtrabackup_binlog_info.qp  xtrabackup_info.qp
    financesys        ibdata1.qp         performance_schema  xtrabackup_checkpoints     xtrabackup_logfile.qp
    [root@test2 compress_db]# du -sh #文件大小为23G
    23G    .

    #这个压缩文件,对表结构文件(frm)和表数据文件(ibd)都进行了压缩,压缩后的后缀名为 .qp!

    在xtraceback2.1.4之前需要使用一个简短的shell来解压备份出来的文件,在2.1.4之后可以使用如下命令解压!

    [root@test2 backup]# innobackupex --decompress /test/backup/compress_db/    
    181129 13:55:50 innobackupex: Starting the decrypt and decompress operation
    
    IMPORTANT: Please check that the decrypt and decompress run completes successfully.
               At the end of a successful decrypt and decompress run innobackupex
               prints "completed OK!".
    
    innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
    181129 13:55:50 [01] decompressing ./ibdata1.qp
    sh: qpress: command not found
    cat: write error: Broken pipe
    Error: thread 0 failed.
    [root@test2 backup]# yum install -y qpress
    Loaded plugins: fastestmirror
    Setting up Install Process
    Loading mirror speeds from cached hostfile
    base                                                                                                                                                 | 3.7 kB     00:00     
    epel                                                                                                                                                 | 4.4 kB     00:00     
    mariadb                                                                                                                                              | 2.9 kB     00:00     
    zabbix                                                                                                                                               | 2.9 kB     00:00     
    No package qpress available.       #这里报错了没有qpress这个命令,这个命令需要从percona官网下载!网络有点渣,随后补上!
    Error: Nothing to do

    compress压缩备份之后的数据是23个G,而流压缩备份是18个G,源文件大小是47个G!根据存储来说建议使用流压缩吧!

    #备份指定的库,而不是全部的库!

    #!/bin/bash
    #在备份指定库时,可以使用--include参数,也可以使用--tables-file参数,把指定的库写在文件中
    User="root"
    Hostip=x.x.x.x
    Passwd="x.x.x.x.x.x"
    Tbname="fi_repayplan.fi_reapyplan,fi_repayplan.fi_reapyplan_bank_once,fi_repayplan.fi_reapyplan_boc,fi_repayplan.fi_reapyplan_ccb,fi_repayplan.fi_reapyplan_irr,fi_repayplan.fi_reapyplan_irrmoney,fi_repayplan.fi_reapyplan_money,fi_repayplan.fi_reapyplan_once,fi_repayplan.fi_reapyplan_oncemoney"
    
    innobackupex --user=${User} --password=${Passwd} --host=${Hostip} --no-timestamp --include=${Tbname} --stream=tar /tmp | gzip > /data/fi_repayplan-`date +%F`.tar.gz 
    备份指定的库

    #一个用于恢复的脚步

    #!/bin/badh
    #Auth: wangxz
    #需要把要解压的文件作为脚本执行的参数
    #例如:sh huifu.sh xxx_2017-07-08_03-01-01.tar.gz
    DB_DIR=/data/mariadb
    DB_PORT=`netstat -lntp |grep 3306 | wc -l`
    PROCESS_NUM=`ps aux |grep mysql |wc -l`
    recover_log=/tmp/recover.log
    print_str() ##打印说明信息
    {
        echo -e "------------e[0;31;1m $1 e[0m-------------------"    
        sleep 1
    }
    
    check_ok()  ##一个检测函数
    {
        if [ $? != 0 ]; then
            print_str "Some error has happened"
            exit
        else
            sleep 1
        fi
    }
    ##检测是否给出要解压的文件
    if [ $# !=  1 ]; then
        print_str "Please give a tar file"
        exit
    fi
     
    if [ $DB_PORT == 1 ] && [ $PROCESS_NUM == 3 ]; then
        print_str "It's stopping the mysql service"
        service mysql stop >> $recover_log
        check_ok
        sleep 3
    fi
    
    if [ $DB_PORT == 0 ] && [ $PROCESS_NUM == 1 ]; then
        print_str "The mysql service is not running!"
    fi
    
    ###清楚datadir目录
    print_str "Delete the datadir"
    rm -fr $DB_DIR/*
    check_ok
    sleep 3
    
    ###解压数据库
    print_str "Start Uncompress the backup file"
    tar -ixvf $1 -C $DB_DIR/>> $recover_log
    check_ok
    sleep 3 
    
    ###准备数据库备份
    print_str "apply log the datadir"
    innobackupex --apply-log $DB_DIR  >> $recover_log
    check_ok
    sleep 3
    
    ###修改权限
    chown -R mysql:mysql $DB_DIR
    sleep 3
    
    ###启动数据库
    service mysql start >>$recover_log
    check_ok
    ###检测是否启动成功
    PROCESSLIST=`ps aux |grep mysql |wc -l`
    PORT_NUM=`netstat -lntp |grep 3306 | wc -l`
    if [ $PROCESSLIST -gt 1 ] && [ $PORT_NUM -le 1 ]; then
        print_str "the mysql service has started successfully!"
        rm -fr $recover_log
        check_ok
        print_str "The log was deleted successfully!"
    else
        print_str  "Some unexcept things has happened"
    fi  
    恢复脚本
  • 相关阅读:
    HOJ 2930 Perfect Fill IIl 线性递推
    BZOJ 1269: [AHOI2006]文本编辑器editor Splay
    linux shell常用快捷键(转)
    【引用】Linux date命令
    linux shell if 参数(转)
    vsftpd 530 Permission denied(转)
    捕获非广播包和非发给自己主机的数据包的原理是什么 混杂模式(转)
    代理ARP(转)
    Linux和Unix系统 关系和区别详细介绍(转)
    路由表(转)
  • 原文地址:https://www.cnblogs.com/wxzhe/p/10033983.html
Copyright © 2011-2022 走看看