• mysql数据库备份工具xtrabackup


    1.下载二进制安装包

    其他高版本测试缺少依赖

    2.xtrabackup参数说明

    简介:
      Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
        Xtrabackup有两个主要的工具:xtrabackup、innobackupex
      (1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
      (2)innobackupex则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁

     innobackupex常用参数

     1 --compact        创建一个不包含第二索引(除了主键之外的索引)的备份
     2 --decompress        解压之前所有以–compress参数备份出来的带有.qp格式的备份文件,--parallel参数会允许同时解锁或解压多个文件。需要安装qpress软件。
     3 --defaults-file=[MY.CNF] 配置文件的路径
     4 --incremental-basedir 以上一次全量或增量备份的路径,作为增量备份的基础。指定这个参数的同时,应该同样指定--incremental参数
     5 --incremental 创建增量备份,当指定这个参数的时候,应该指定--incremental-lsn或--incremental-basedir参数,否则将会备份到--incremental-basedir路径
     6 --apply-log  在备份目录下,通过应用名称为xtrabackup_logfile的交易日志文件来准备备份。同时,创建新的交易日志。
     7 --redo-only 当准备数据库的全备或合并增量备份时,需要指定这个参数。这个参数实际上执行的是xtrabackup --apply-log-only,会让xtrabackup跳过回滚节点,只做“redo”步骤。当数据库需要应用增量备份时,需要指定这个参数。
     8 --incremental-dir=DIRECTORY 指定增量备份的目录,需要搭配--incremental参数。
     9 --no-timestamp 这个参数会让xtrabackup在备份的时候不创建带有时间格式的子文件夹。当指定了这个参数,备份会直接创建在指定的备份目录下
    10 --stream=STREAMNAME 指定流备份的格式。备份将会以指定格式输出到STDOUT。目前支持的格式有tar 和 xbstream。如果指定了这个参数,后面需要接tmpdir目录作为处理流的一个中间目录。
    11 --slave-info    当备份一个作为复制环境的服务器时,这个参数会自动将CHANGE MASTER语句写到备份中,在恢复备份后,不必执行CHANGE MASTER语句。
    12 --tables-file=FILE        这个参数会接受一个字符串,这个字符串指定了一个文件,这个文件包含了要备份的表名,格式如database.table,一行一个。
    13 --use-memory=#        这个参数用于在准备备份时,xtrabackup执行crash recovery所使用的内存大小。这个参数仅和--apply-log搭配时才生效。

    使用--stream=tar备份,压缩、解压、已经压缩后的大小都优于-stream=xbstream,推荐使用--stream=tar方式压缩,解压时还可以配合tar

    3.全量备份

    shell > vim script/backupdb.sh
    
    #!/bin/bash
    dbname='alldatabases'
    dbuser='user'
    dbpassword='passwd'
    
    backup_dir='/data/backup_db'
    backup_log='/root/script/logs/backup.log'
    
    mtime=`date +%Y-%m`
    dtime=`date +%d`
    
    log(){
      echo -e "`date "+%F %T"` DBname: $1 State: $2
    " >> $backup_log
    }
    
    [ ! -d $backup_dir/$mtime ] && mkdir -p $backup_dir/$mtime
    
    cd $backup_dir/$mtime && /usr/bin/innobackupex --no-lock --user=$dbuser --password=$dbpassword --no-timestamp $dbname > /dev/null 2>&1
    
    if [ $? -eq 0 ];then
      log $dbname 'Backup success.'
      dbakfile=$dbname.$dtime.tar.gz
      tar zcf $dbakfile $dbname --remove-files
      [ $? -eq 0 ] && log $dbakfile 'Packaging success.' || log $dbakfile 'Packaging failed.'
    else
      log $dbname 'Backup failed.'
    fi

    4.全备还原

    shell > /etc/init.d/mysql.server stop  # 首先关闭数据库
    
    shell > cd /data/backup_db  # 切换到备份目录
    
    shell > mv /usr/local/mysql-5.5.52/data data.old  # 将原来的数据目录备份一下
    
    shell > tar zxf alldatabase.11.tar.gz  # 然后将原来的备份解压缩
    
    shell > innobackupex --apply-log alldatabase  # 在备份上应用日志,一般没有看到报错且最后显示 OK 就没有问题 ( --use-memory 使用该参数加快速度 )
    12:07:33 completed OK!
    
    shell > innobackupex --copy-back alldatabase  # 将备份还原到 my.cnf 指定的 datadir 中,不指定 --defaults-file,默认 /etc/my.cnf
    
    Error: datadir must be specified.  # 报错信息显示,在默认配置文件 /etc/my.cnf 中,没有找到 datadir 配置项
    
    shell > vim /etc/my.cnf  # 加入 datadir 配置项
    
    datadir         = /usr/local/mysql-5.5.52/data
    
    shell > innobackupex --copy-back alldatabase  # 再次执行 copy 动作,没有报错且显示 OK 
    12:17:52 completed OK!
    
    shell > ll -d /usr/local/mysql-5.5.52/data
    drwxr-x--- 6 root root 4096 10月 11 12:17 /usr/local/mysql-5.5.52/data
    
    shell > chown -R mysql.mysql /usr/local/mysql-5.5.52/data  # 修改数据目录权限
    
    shell > /etc/init.d/mysql.server start

    # 备份已经恢复!
    # 回顾整个恢复过程,发现一个问题:之前数据库里的东西全部没有了...
    # 也就是说,innobackupex 只适用于该 MySQL 中除系统库外,只有一个库的备份。
    # 虽然有选项 --databases 可以指定备份哪个数据库,但是备出来的结果却是 all databases,且恢复的时候也是全部覆盖。(默认不指定备份数据库,则全库备份)
    # 1、采用 innobackupex 备份整库,然后恢复到一台新库上,再通过 mysqldump 将需要还原的单库备份一次,之后导入需要恢复的数据库中 ( 要考虑恢复时间 )。
    # 2、采用 innobackupex 备份只有一个业务库的 MySQL Server,恢复到只有该业务库的 MySQL Server 中。
    # 3、如果一个 MySQL Server 中有多个数据库,又只想备份某个库,且该库体积比较小的情况下,建议使用 mysqldump 备份。

  • 相关阅读:
    Github优秀java项目集合(中文版)
    gradle 将依赖打入Jar包的方法
    早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)
    最想挖的各家互联网公司最牛职位人才(哪方面值得去、值得学)
    C++使用libcurl做HttpClient(业务观摩,用C++封装过程式代码,post和get的数据,最好url编码,否则+会变成空格)good
    【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)
    PHP模拟POST提交数据并获得返回值之CURL方法(使用PHP extension,然后使用php_curl.dll,很不错)
    SignalR实现B/S系统对windows服务运行状态的监测
    滴滴出行秋招编程题
    Tag Helpers 介绍
  • 原文地址:https://www.cnblogs.com/lvcisco/p/11890202.html
Copyright © 2020-2023  润新知