zoukankan      html  css  js  c++  java
  • 使用Xtrabackup备份--适用于mysql8

    下载安装xtrabackup  

    官方下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
    官方安装步骤:https://www.percona.com/doc/percona-xtrabackup/8.0/installation/yum_repo.html
    
    rpm安装:
    wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
    
    yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm   #需要EPEL源
    
    xtrabackup -version

    epel.repo

    [epel]
    name=Extra Packages for Enterprise Linux 7 - $basearch
    baseurl=http://mirrors.aliyun.com/epel/7/$basearch
    failovermethod=priority
    enabled=1
    gpgcheck=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
     
    [epel-debuginfo]
    name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
    baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
    failovermethod=priority
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
    gpgcheck=0
     
    [epel-source]
    name=Extra Packages for Enterprise Linux 7 - $basearch - Source
    baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
    failovermethod=priority
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
    gpgcheck=0

    xtrabackup介绍

    XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部开源,真可谓是业界良心。阿里的 RDS MySQL 物理备份就是基于这个工具做的。
    由于是采取物理拷贝的方式来做的备份,所以速度非常快,几十G数据几分钟就搞定了,而它巧妙的利用了mysql 特性做到了在线热备份,不用像以前做物理备份那样必须关闭数据库才行,直接在线就能完成整库或者是部分库的全量备份和增量备份。
    新版本的xtrabackup改成了cmake安装,和以前有点不一样。 版本说明:
    2.3.3之后不备份死锁,如果数据库是mysql 5.7之后的必须要装2.4.4才可以用,当然了, 会向下兼容的。 `Xtrabackup`是由`percona`提供的`mysql`数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点: 1. 备份过程快速、可靠; 2. 备份过程不会打断正在执行的事务; 3. 能够基于压缩等功能节约磁盘空间和流量; 4. 自动实现备份检验; 5. 还原速度快;
    xtrabackup选项
    
    选项
    
    --apply-log-only 
    prepare备份的时候只执行redo阶段,对增量备份非常重要
    --backup
    创建备份并且放入--target-dir目录中
    --close-files
    不保持文件打开状态,xtrabackup打开表空间的时候通常不会关闭文件句柄目的是为了正确处理DDL操作。然而,如果表空间数量非常巨大并且不适合任何限制,一旦文件不在被访问的时候这个选项可以关闭文件句柄.打开这个选项会产生不一致的备份。自己评估风险。。
    --compact
    创建一份没有辅助索引的紧凑备份
    --compress
    压缩所有输出数据,包括事务日志文件和元数据文件,通过指定的压缩算法,目前唯一支持的算法是quicklz.结果文件是qpress归档格式,每个xtrabackup创建的*.qp文件都可以通过qpress程序提取或者解压缩
    --compress-chunk-size=#
    压缩线程工作buffer的字节大小,默认是64K
    --compress-threads=#
    xtrabackup进行并行数据压缩时的worker线程的数量,该选项默认值是1,并行压缩('compress-threads')可以和并行文件拷贝('parallel')一起使用。例如:'--parallel=4 --compress --compress-threads=2'会创建4个IO线程读取数据并通过管道传送给2个压缩线程
    --create-ib-logfile
    这个选项目前还没有实现,目前创建Innodb事务日志,你还是需要prepare两次bakcup
    --datadir=DIRECTORY
    backup的源目录,mysql实例的数据目录。从my.cnf中读取,或者命令行指定
    --defaults-extra-file=[MY.CNF]
    在global files文件之后读取,必须在命令行的第一选项位置指定
    --defaults-file=[MY.CNF]
    唯一从给定文件读取默认选项,必须是个真实文件,必须在命令行第一个选项位置指定
    --defaults-group=GROUP-NAME
    从配置文件读取的组,innobakcupex多个实例部署时使用
    --export
    为导出的表创建必要的文件
    --extra-lsndir=DIRECTORY
    (for --bakcup):在指定目录创建一份xtrabakcup_checkpoints文件的额外的备份
    --incremental-basedir=DIRECTORY
    创建一份增量备份时,这个目录是增量别分的一份包含了full bakcup的Base数据集
    --incremental-dir=DIRECTORY
    prepare增量备份的时候,增量备份在DIRECTORY结合full backup创建出一份新的full backup
    --incremental-force-scan
    创建一份增量备份时,强制扫描所有增在备份中的数据页即使完全改变的page bitmap数据可用
    --incremetal-lsn=LSN
    创建增量备份的时候指定lsn。
    --innodb-log-arch-dir
    指定包含归档日志的目录。只能和xtrabackup --prepare选项一起使用
    --innodb-miscellaneous
    从My.cnf文件读取的一组Innodb选项。以便xtrabackup以同样的配置启动内置的Innodb。通常不需要显示指定
    --log-copy-interval=#
    这个选项指定了log拷贝线程check的时间间隔(默认1秒)
    --log-stream
    xtrabakcup不拷贝数据文件,将事务日志内容重定向到标准输出直到--suspend-at-end文件被删除。这个选项自动开启--suspend-at-end
    --no-defaults
    不从任何选项文件中读取任何默认选项,必须在命令行第一个选项
    --databases=#
    指定了需要备份的数据库和表
    --database-file=#
    指定包含数据库和表的文件格式为databasename1.tablename1为一个元素,一个元素一行
    --parallel=#
    指定备份时拷贝多个数据文件并发的进程数,默认值为1
    --prepare
    xtrabackup在一份通过--backup生成的备份执行还原操作,以便准备使用
    --print-default
    打印程序参数列表并退出,必须放在命令行首位
    --print-param
    使xtrabackup打印参数用来将数据文件拷贝到datadir并还原它们
    --rebuild_indexes
    在apply事务日志之后重建innodb辅助索引,只有和--prepare一起才生效
    --rebuild_threads=#
    在紧凑备份重建辅助索引的线程数,只有和--prepare和rebuild-index一起才生效
    --stats
    xtrabakcup扫描指定数据文件并打印出索引统计
    --stream=name
    将所有备份文件以指定格式流向标准输出,目前支持的格式有xbstream和tar
    --suspend-at-end
    使xtrabackup在--target-dir目录中生成xtrabakcup_suspended文件。在拷贝数据文件之后xtrabackup不是退出而是继续拷贝日志文件并且等待知道xtrabakcup_suspended文件被删除。这项可以使xtrabackup和其他程序协同工作
    --tables=name
    正则表达式匹配database.tablename。备份匹配的表
    --tables-file=name
    指定文件,一个表名一行
    --target-dir=DIRECTORY
    指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件
    --throttle=#
    指定每秒操作读写对的数量
    --tmpdir=name
    当使用--print-param指定的时候打印出正确的tmpdir参数,除此之外没有任何用。。
    --to-archived-lsn=LSN
    指定prepare备份时apply事务日志的LSN,只能和xtarbackup --prepare选项一起用
    --user-memory = #
    通过--prepare prepare备份时候分配多大内存,目的像innodb_buffer_pool_size。默认值100M如果你有足够大的内存。1-2G是推荐值,支持各种单位(1MB,1M,1GB,1G)
    --version
    打印xtrabackup版本并退出

    全量备份

    #全量备份
    xtrabackup --user=用户名 --password=数据库密码 --databases=数据库名称   --backup  --target-dir=备份文件路径
    
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base
    
    chown -R mysql:mysql /backup/base
    
    #恢复备份:在同版本数据库中执行;恢复不用启动MySQL
    xtrabackup --user=root --password=数据库密码  --datadir=/usr/local/mysql8/data/  --copy-back --target-dir=/backup/base
    
    xtrabackup --prepare --target-dir=/backup/base
    
    xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/usr/local/mysql8/data/  --copy-back --target-dir=/backup/base
    
    chown -R mysql.mysql /data
    chown -R mysql.mysql /usr/local/mysql/
    

      

    实例演示

    备份:

    #全量备份
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base
        ... ...
        MySQL binlog position: filename 'mysql-bin.000009', position '155'
        210913 18:03:04 [00] Writing /backup/base/backup-my.cnf
        210913 18:03:04 [00]        ...done
        210913 18:03:04 [00] Writing /backup/base/xtrabackup_info
        210913 18:03:04 [00]        ...done
        xtrabackup: Transaction log of lsn (19198828) to (19198828) was copied.
        210913 18:03:04 completed OK!
    
    #拷贝到备机
    scp -P 10088 base.tgz 10.3.65.18:/backup/

    备机恢复:

     #停mysql
         /etc/init.d/mysql stop
     
     #解压备份
         tar -zxvf base.tgz 
     
     #恢复,先prepare回滚未提交事务;需要对未提交的事务进行回滚以及对提交的事务进行前滚
        xtrabackup --prepare --target-dir=/backup/base
    
    #备份恢复,datadir目录必须为空
    xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/data/mysql_3306/  --copy-back --target-dir=/backup/base
    
        xtrabackup: recognized server arguments: --datadir=/data/mysql_3306 --open_files_limit=65535 --log_bin=mysql-bin --server-id=7001 --innodb_data_home_dir=/data/mysql_3306 --innodb_data_file_path=ibdata1:10M:autoextend --innodb_log_group_home_dir=/data/mysql_3306 --innodb_buffer_pool_size=4096M --innodb_log_file_size=1024M --innodb_log_buffer_size=8M --innodb_flush_log_at_trx_commit=1 --datadir=/data/mysql_3306/ 
        xtrabackup: recognized client arguments: --port=3306 --socket=/var/run/mysql/mysql_3306.sock --user=root --password=* --copy-back=1 --target-dir=/backup/base 
        xtrabackup version 8.0.25-17 based on MySQL server 8.0.25 Linux (x86_64) (revision id: d27028b)
        Original data directory /data/mysql_3306/ is not empty!
        原来要空的才行,但是我的数据目录下面还有别的东西,数据库重新初始化再来一遍吧
    
        210914 14:46:12 [01] Copying ./xtrabackup_info to /data/mysql_3306/xtrabackup_info
        210914 14:46:12 [01]        ...done
        210914 14:46:12 [01] Copying ./xtrabackup_binlog_pos_innodb to /data/mysql_3306/xtrabackup_binlog_pos_innodb
        210914 14:46:12 [01]        ...done
        210914 14:46:12 [01] Copying ./xtrabackup_master_key_id to /data/mysql_3306/xtrabackup_master_key_id
        210914 14:46:12 [01]        ...done
        210914 14:46:12 [01] Copying ./ibtmp1 to /data/mysql_3306/ibtmp1
        210914 14:46:13 [01]        ...done
        210914 14:46:13 [01] Creating directory ./#innodb_temp
        210914 14:46:13 [01] ...done.
        210914 14:46:13 completed OK!
    
    #由于我是用root执行,所以属主要重新调整
        chown -R mysql.mysql /data
        chown -R mysql.mysql /usr/local/mysql/
    
    #启动数据库并进行验证
        mysql> show databases;
        +--------------------+
        | Database           |
        +--------------------+
        | TEST1              |
        | TEST2              |
        | TEST3              |
        | information_schema |
        | mysql              |
        | performance_schema |
        | sys                |
        | testDB             |
        +--------------------+

    增量备份

    #先进行全量备份
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base
    
    #基于全量备份,做增量备份
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
    
    #第二次创建增量备份
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
    
    #检查增量备份
    cat /backup/inc1/xtrabackup_checkpoints 

    恢复备份

    #停止数据库
    /etc/init.d/mysql stop
    
    #清空现有数据
    rm -rf /data/mysql_3306/*
    
    #prepare完整备份,注意使用--apply-log-only选项,防止日志回滚,最后一个增量备份不用此选项
    xtrabackup --prepare --apply-log-only --target-dir=/backup/base
    xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
    xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
    
    #还原数据库
    xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/data/mysql_3306/  --copy-back --target-dir=/backup/base/
    
    #还原属主为mysql
    chown -R mysql.mysql /data
    #chown -R mysql.mysql /usr/local/mysql/
    
    #启动数据库检查
    /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --plugin-dir=/usr/local/mysql/lib/plugin --open-files-limit=65535 --pid-file=/var/run/mysql/mysql_3306.pid --user=mysql
    
    mysql -u root -h localhost -p

    实例演示

    #先进行全量备份,上面做了,这一步省略
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base
    
    #插入一条数据,好进行判断
    mysql -u root -h localhost -p
    Enter password: 
        MySQL [(none)]> use testDB;
        Database changed
        MySQL [testDB]> select * from t;
        +------+--------+
        | a    | b      |
        +------+--------+
        |    1 | 小王   |
        +------+--------+
        1 row in set (0.02 sec)
        MySQL [testDB]> insert into t(a,b) values (2, "小李");
        Query OK, 1 row affected (0.23 sec)
    
        MySQL [testDB]> select * from t;
        +------+--------+
        | a    | b      |
        +------+--------+
        |    1 | 小王   |
        |    2 | 小李   |
        +------+--------+
        2 rows in set (0.00 sec)
    
    #基于全量备份,做增量备份
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
    
        MySQL binlog position: filename 'mysql-bin.000011', position '155'
        210914 15:49:32 [00] Writing /backup/inc1/backup-my.cnf
        210914 15:49:32 [00]        ...done
        210914 15:49:32 [00] Writing /backup/inc1/xtrabackup_info
        210914 15:49:32 [00]        ...done
        xtrabackup: Transaction log of lsn (19228665) to (19228665) was copied.
        210914 15:49:33 completed OK!
    
    #同上,在插入一条数据,继续做增量备份
        MySQL [testDB]> insert into t(a,b) values (3,"小王八");
        Query OK, 1 row affected (0.12 sec)
    
        MySQL [testDB]> select * from t;
        +------+-----------+
        | a    | b         |
        +------+-----------+
        |    1 | 小王      |
        |    2 | 小李      |
        |    3 | 小王八    |
        +------+-----------+
        3 rows in set (0.00 sec)
    
    #基于增量备份inc1,做增量备份
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
        MySQL binlog position: filename 'mysql-bin.000012', position '155'
        210914 15:55:42 [00] Writing /backup/inc2/backup-my.cnf
        210914 15:55:42 [00]        ...done
        210914 15:55:42 [00] Writing /backup/inc2/xtrabackup_info
        210914 15:55:42 [00]        ...done
        xtrabackup: Transaction log of lsn (19231721) to (19231721) was copied.
        210914 15:55:43 completed OK!
    
    #检查增量备份
    cat /backup/inc1/xtrabackup_checkpoints 
        backup_type = incremental
        from_lsn = 19198828
        to_lsn = 19228665
        last_lsn = 19228665
        flushed_lsn = 19228665
    
    #######恢复数据#######
    #停止数据库
    /etc/init.d/mysql stop
    
    #清空现有数据
    rm -rf /data/mysql_3306/*
    
    #prepare完整备份,注意使用--apply-log-only选项,防止日志回滚,最后一个增量备份不用此选项
    xtrabackup --prepare --apply-log-only --target-dir=/backup/base
        .......
        Starting shutdown...
        Log background threads are being closed...
        Shutdown completed; log sequence number 19198828
        Number of pools: 1
        210914 19:31:58 completed OK!
    
    xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
        ......
        210914 19:33:38 [00] Copying /backup/inc1/mysql-bin.index to ./mysql-bin.index
        210914 19:33:38 [00]        ...done
        210914 19:33:39 completed OK!
    
    
    xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
        ......
        Trying to access missing tablespace 4294967294
        Starting shutdown...
        Log background threads are being closed...
        Shutdown completed; log sequence number 19231756
        210914 19:34:11 completed OK!
    
    
    #还原数据库
    xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/data/mysql_3306/  --copy-back --target-dir=/backup/base/
        ......
        210914 19:35:05 [01] Creating directory ./#innodb_temp
        210914 19:35:05 [01] ...done.
        210914 19:35:05 completed OK!
    
    
    #还原属主为mysql
    chown -R mysql.mysql /data
    #chown -R mysql.mysql /usr/local/mysql/
    
    #启动数据库检查
    /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --plugin-dir=/usr/local/mysql/lib/plugin --open-files-limit=65535 --pid-file=/var/run/mysql/mysql_3306.pid --user=mysql
    
    mysql -u root -h localhost -p
    
        mysql> use testDB;
        Database changed
        mysql> select * from t;
        +------+-----------+
        | a    | b         |
        +------+-----------+
        |    1 | 小王      |
        |    2 | 小李      |
        |    3 | 小王八    |
        +------+-----------+
        3 rows in set (0.01 sec)
  • 相关阅读:
    测试
    unittest发送测试报告邮件
    unittest生成测试报告
    Navicat连接Oracle详细教程
    Windows 2012 安装 Oracle 11g 报错:[INS-13001]环境不满足最低要求。
    Windows server 2012安装oracle11g(32/64位)步骤
    ElasticSearch和solr的差别
    HashMap和Hashtable的区别
    final关键字所修饰的类有什么特点
    springboot测试的时候插入数据: error performing isolated work; SQL [n/a]; nested exception is org.hibernate...
  • 原文地址:https://www.cnblogs.com/litzhiai/p/15271156.html
Copyright © 2011-2022 走看看