zoukankan      html  css  js  c++  java
  • mysqldump根据通配符批量导出

    xtrabackup的主要优点:
    1,物理备份,备份速度快
    2,热备份、无需停机
    3,恢复速度快
    4.自动会对备份文件进行验证
    1. xtrabackup 工具的安装
    1.1 安装依赖包
    #No package perl-Digest-MD5 available.
    yum install -y rsync perl l perl-Digest-MD5 perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

    #rpm -ich libev-4.15-1.el6.rf.x86_64.rpm 可以不安装
    #error: Failed dependencies:libev.so.4()(64bit) is needed,添加 --nodeps
    rpm -ivh percona-xtrabackup-24-2.4.21-1.el6.x86_64.rpm --force --nodeps
    -------------------------------------
    #常见报错
    (1) libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.4-1..el6.x86_64
    解决办法:
    rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm
    (2)libnuma.so.1()(64bit) is needed by percona-xtrabackup-24-2.4.4-1.el6.x86_64
    解决办法:
    rpm -ivh http://mirror.centos.org/centos/6/os/x86_64/Packages/numactl-2.0.9-2.el6.x86_64.rpm

    #参考Centos7.4下MySql5.7安装Percona XtraBackup备份
    1、安装Percona XtraBackup
    --安装yum 源
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    --安装XtraBackup 2.4版本的
    yum install -y percona-xtrabackup-24.x86_64

    #1.2下载及安装说明
    #当前测试使用的数据库为MySQL5.7 因此下载2.4版本
    https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
    #另外,2.4.10及以后版本中,对libgcrypt进行了区分,因此也需要查询自己服务器的libgcrypt版本,然后选择对应的安装包
    [root@testdb ~]# yum list installed|grep libgcrypt
    libgcrypt.x86_64 1.5.3-14.el7 @anaconda

    #去percona官网下载对应版本的安装包 https://www.percona.com/downloads , 需要根据数据库的版本选择对应的xtrabackup的安装包,选择Percona XtraBackup.
    --实际找到的包
    wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
    /* 二进制包 怎么找到 */
    wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/tarball/percona-xtrabackup-2.4.18-Linux-x86_64.libgcrypt153.tar.gz
    /* rpm包 怎么找到*/
    wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.tar
    二进制包解压后即可使用,rpm包下载解压后 rpm -ivh 安装即可。操作均很简单,此处略过
    xtrabackup通常使用 innobackupex命令, 可以使用 innobackupex --help 命令查看参数及说明。
    其中常用参数及说明如下:
    --defaults-file 待备份mysql实例的配置文件
    --user=USER 备份用户,默认为当前系统用户,建议使用备份专用账号
    --password=PASSWD 备份用户密码
    --port=PORT 数据库端口,默认3306
    --host=HOST 需备份数据库的IP
    --apply-log 前滚、回滚日志,恢复前用
    --database 指定需要备份的数据库,多个数据库之间以空格分开
    --copy-back 将备份数据复制到目标路径
    --incremental 增量备份,后面接的参数值为指定的增量备份的路径
    --incremental-basedir=DIRECTORY 增量备份时使用指向上一次的增量备份所在的目录
    --incremental-dir=DIRECTORY 增量备份还原的时候用来合并增量备份到全量,用来指定全备路径
    --redo-only 对增量备份进行合并
    --rsync 加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用
    --no-timestamp 生成的备份文件不以时间戳为目录

    1.3 创建备份账号
    备份的账号建议单独创建,并授予相关权限
    CREATE USER 'backup'@'localhost' IDENTIFIED BY 'Backup@123.com';
    GRANT SUPER,RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
    FLUSH PRIVILEGES;

    2. 全量备份
    2.1 本地全量备份,不压缩
    后续会以此为基础进行增量备份
    /* 创建备份结果的目录, 此步骤也可以省略 */
    mkdir -p /app/all_backup
    #/root/xtrabackup/bin/innobackupex目录不存在
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --no-timestamp /app/all_backup

    备份的结果存放在指定的目录 all_backup里,内容如下:
    注: 如果没有添加阻塞DDL操作的参数,备份过程中如有DDL操作,备份将终止。因此建议日常备份放在从库中进行。
    2.2 本地tar方式压缩备份
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --stream=tar /tmp |gzip >/app/all_backup.tar.gz

    备份后的结果是一个压缩文件,经过对比,压缩后数据约为非压缩情况下的20%,压缩比还是比较高的。
    不过,压缩备份的方式速度相对较慢,且消耗CPU,该影响因素需要大家考虑到,视情况选择是否压缩。
    注意: 如果有单表过大 而/tmp路径空间不足的情况备份过程中可能会报错,因此可以指定其他空间较大的目录
    2.3 本地xbstream方式压缩备份
    gzip的压缩方式备份可能会有bug(案例可以自行寻找),出现如下错误:
    xtrabackup: error: The transaction log file is corrupted.
    xtrabackup: error: The log was not applied to the intended LSN!
    #因此可以采用xbstream方式进行备份,备份命令如下:
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' /app/backup --tmpdir=/app/backup --stream=xbstream|gzip - > /app/all_backup.xbstream.gz

    2.4 远程备份到其他机器
    远程备份与本地备份的相比 需要额外的配置远程主机的免密登录权限
    /* 在备份所在用户的主机下配置连接目标主机的免密 */
    #如果存在keygen,可跳过
    ssh-keygen
    ssh-copy-id -i user@'target_ip'
    #远程机器创建目录
    mkdir -p /app/backup/
    #之后就可以将类似于本地备份的模式 将备份结果发送到远程机器
    #如果存在大表或超大事务运行时不建议使用/tmp目录
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --stream=tar /tmp --no-timestamp | ssh root@'192.168.92.18' "cat - > /app/backup/remote_backup.tar"

    ---------------------------------------------------------------------
    --备份文件中删除已表空间加密的表t1,tab_type或删除加密表所在的库,仍然无法恢复
    #查看所有加密表(表空间):t1,tab_type
    select engine,TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS from information_schema.tables where create_options like '%ENCRYPTION%="Y"%';
    cd /home/backup
    cp -R 2020-05-29_12-37-02 2020-05-29_12-37-02-bak
    cd /home/backup/2020-05-29_12-37-02
    rm -rf test
    --cd /home/backup/2020-05-29_12-37-02/test
    --rm -rf t1.frm t1.ibd tab_type.frm tab_type.ibd
    systemctl stop mysqld
    --先应用日志
    innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /home/backup/2020-05-29_12-37-02/
    --再拷贝数据
    innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/backup/2020-05-29_12-37-02/
    ---------------------------------------------------------------------

    3. 增量备份
    mysql -uroot -pmysql
    use test;
    create table test.t1(id int,name varchar(200));
    insert into test.t1 select 1,'n1';

    3.1 第一次增量备份
    #可以先根据2.1的本地全备的基础上进行增量备份,首次增量备份脚本:

    #此时,备份的结果放在/app/backup目录下,由于没指定no-timestamp参数,备份的结果存在在以三期时间命名的目录下:
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --incremental /app/backup/ --incremental-basedir=/app/all_backup

    注: 增量备份仅能应用于InnoDB或XtraDB表等事务表,对于MyISAM表而言,执行增量备份时依旧进行全量备份
    3.2 第二次增量备份
    #第二次增量备份是在第一次增量备份的基础上进行,因此incremental-basedir参数内容指定为上一次增量备份的目录即可
    #完成后生成一个新的目录
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --incremental /app/backup/ --incremental-basedir=/app/backup/2020-11-25_08-38-21

    3.3 第二次增量备份
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --port=3306 --user=backup --password='Backup@123.com' --incremental /app/backup/ --incremental-basedir=/app/backup/2020-11-25_08-41-19

    4. 恢复
    4.1 基于全量备份的恢复
    4.1.1 回放日志
    备份后的文件不能直接用作恢复,还需要先使用apply-log 做前滚和回滚
    /usr/bin/innobackupex --defaults-file=/app/all_backup/my.cnf --apply-log /app/all_backup > /opt/apply-log.log
    注: 回放日志的时候 defaults-file 选择备份目录里的即可
    4.2.2 恢复至目标实例
    本次恢复至一个新实例中(如果恢复至现有的实例需要先关闭目标实例,删除数据目录及相关日志存储的目录。不建议直接恢复至现有实例 ,除非实际需要)
    /* 创建新实例的相关目录 */
    mkdir -p /app/data/mysql3307/{data,logs,tmp,etc}

    /* 生产配置文件 ,本次直接拷贝其他实例的配置文件 修改对应端口等*/
    cp /app/data/mysql3306/etc/my.cnf /app/data/mysql3307/etc/

    sed -i "s#3306#3307#g" my.cnf

    /* 创建错误日志 */
    touch /app/data/mysql3307/logs/mysqld.log

    #然后拷贝至新实例中
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /app/all_backup
    #修改目标实例相关目录的权限
    chown -R mysql:mysql /var/lib/mysql
    #启动新实例即可
    mysqld_safe --defaults-file=/etc/my.cnf > /dev/null 2>&1 &
    ps -ef | grep mysql
    #/usr/local/mysql5.7/bin/mysqld_safe --defaults-file=/app/data/mysql3307/etc/my.cnf &

    #启动mysql报错
    [ERROR] InnoDB: Unable to open undo tablespace './/undo001'.
    vi /etc/my.cnf
    innodb_undo_tablespaces=3

    --重新应用日志和拷贝备份数据
    /usr/bin/innobackupex --defaults-file=/app/all_backup/my.cnf --apply-log /app/all_backup > /opt/apply-log.log
    #先应用日志,不支持恢复加密表空间的库************************************************
    #error:InnoDB: Encryption information in datafile: ./test/t1.ibd can't be decrypted, please check if a keyring plugin is loaded and initialized successfully.
    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /app/all_backup
    chown -R mysql:mysql /var/lib/mysql
    mysql -uroot -pmysql
    show databases;
    use test;
    show tables;

    4.2 基于增量备份的恢复
    ps -ef | grep mysql
    kill -9
    rm -rf /var/lib/mysql/*
    如果是基于第一次增量备份的恢复,操作如下
    /* 使用合并增量备份的方式进行回放日志,先进行全量备份的合并 */
    /usr/bin/innobackupex --apply-log --redo-only /app/all_backup
    /* 再合并第一次增量备份 */
    /usr/bin/innobackupex --apply-log --redo-only /app/all_backup --incremental-dir=/app/backup/2020-11-25_08-38-21
    如果基于多次增量备份的恢复,则在全量备份及第一次增量备份的基础上继续合并后续的备份即可
    /* 基于第二次增量备份的合并 */
    /usr/bin/innobackupex --apply-log --redo-only /app/all_backup --incremental-dir=/app/backup/2020-11-25_08-41-19
    /* 基于第三次增量备份的合并 */
    /usr/bin/innobackupex --apply-log --redo-only /app/all_backup --incremental-dir=/app/backup/2020-11-25_09-47-12

    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /app/all_backup
    chown -R mysql:mysql /var/lib/mysql
    mysqld_safe --defaults-file=/etc/my.cnf > /dev/null 2>&1 &
    ps -ef | grep mysql
    mysql -uroot -pmysql
    show databases;
    use test;
    show tables;
    ------------------------------------------------------------------------------------
    #全量备份mysql shell脚本1
    mkdir -p /opt/script
    sh /opt/script/fullbak.sh
    vi /opt/script/fullbak.sh

    #!/bin/bash
    # mysql full back
    #date 2020.11.25
    #author:zh

    time=`date +%F`
    logfile="/data/bakup/mysql_full_bak_time.log"
    fullbakup_logfile="/data/bakup/fullbakup_logfile.log"
    mysql_bakdir="/data/bakup"
    user=backup
    password='Backup@123.com'

    [ ! -d $mysql_bakdir ] && mkdir -p $mysql_bakdir
    [ ! -e $logfile ] && touch $logfile
    [ ! -e $fullbakup_logfile ] && touch $fullbakup_logfile

    innobackupex --defaults-file=/etc/my.cnf --user=$user --password=$password --compress ${mysql_bakdir} 2>&1 >> $fullbakup_logfile
    ret=$?
    finishtime=`date +%Y%m%d_%H%M%S`
    [ $ret -eq 0 ] && echo "Mysql fullbakup finished, time: $finishtime" >> $logfile || echo "Mysql fullbakup failed,please check time:$finishtime" >> $logfile

    ------------------------------------------------------------------------------------
    #全量备份mysql shell脚本2
    vi backup_auto.sh

    #!/bin/bash
    #function:xtrabackup database
    #version:1.0
    #author:zh

    v_mysql_user="root"
    v_mysql_password="mysql"
    v_mysql_host="localhost"
    v_mysql_port="3306"
    v_mysql_charset="utf8"
    #v_mysql_socket=/data/my13306
    v_backup_location=/data/xtrabackup
    v_expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
    v_expire_days=3 #过期时间天数 默认为三天,此项只有在 v_expire_backup_delete 开启时有效

    v_backup_time=`date +%Y%m%d%H%M` #定义备份详细时间
    v_backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
    v_backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
    v_backup_dir=$v_backup_location/$v_backup_Ymd
    v_backup_log=$v_backup_location/$v_backup_Ymd/backup.log
    v_welcome_msg="Welcome to use MySQL backup tools!"

    #判断MYSQL是否启动,mysql没有启动则备份退出
    v_mysql_ps=`ps -ef |grep mysql |wc -l`
    v_mysql_listen=`netstat -an |grep LISTEN |grep $v_mysql_port|wc -l`
    if [ $v_mysql_ps == "0" -o $v_mysql_listen == "0" ]; then
    echo "ERROR:MySQL is not running! backup stop!"
    exit
    else
    echo $v_welcome_msg

    #连接到mysql数据库,无法连接则备份退出
    mysql -h$v_mysql_host -P$v_mysql_port -u$v_mysql_user -p$v_mysql_password <<end
    use mysql;
    select host,user from user where user='root' and host='localhost';
    exit
    end

    flag=$?
    if [ $flag != "0" ]; then
    echo "ERROR:Can’t connect mysql server! xtrabackup stop!"
    exit
    else
    echo "MySQL connect ok! Please wait…"

    #判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
    v_dbname=""
    echo "database $v_dbname backup start…"
    mkdir -p $v_backup_dir
    innobackupex --host=$v_mysql_host --user=$v_mysql_user --port=$v_mysql_port --password=$v_mysql_password $v_backup_dir --parallel=2 --no-timestamp >>$v_backup_log 2>&1
    flag=$?
    if [ $flag == "0" ];then
    echo "database $v_dbname success backup to $v_backup_dir"
    else
    echo "database $v_dbname backup fail!"
    fi
    fi

    #如果开启了删除过期备份,则进行删除操作
    if [ $v_expire_backup_delete == "ON" -a $v_backup_location != "" ];then
    #find $v_backup_location/ -type d -o -type f -ctime +$v_expire_days -exec rm -rf {} ;
    find $v_backup_location/ -type d -mtime +$v_expire_days | xargs rm -rf
    echo "Expired backup data delete complete!"
    fi
    echo "All database backup success!"
    exit
    fi

    ------------------------------------------------------------------------------------
    #全量增量自动备份mysql shell脚本3
    #创建备份用户
    mysql -uroot -pmysql
    grant reload,lock tables,replication client,create tablespace,process,super on *.* to backupuser@'localhost' identified by 'backup@che123';

    #加入自动执行任务计划
    crontab -e
    12 3 * * * sh /opt/script/xtrabackup.sh

    #创建冗余目录和创建备份用户:
    mkdir -p /database/detect/backup/
    ll /database/detect/backup/
    ll /database/detect/redundency/

    #配置备份脚本
    vi /opt/script/xtrabackup.sh

    #!/bin/bash
    BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"`
    format_time=`date +"%Y-%m-%d_%H:%M:%S"`
    week=`date +%Y-%m-%d`
    backupbin=/usr/bin
    backdir=/database/detect/backup/
    redun=/database/detect/redundency/
    file_cnf=/etc/my.cnf
    user_name=backupuser
    password="backup@che123"
    socket="/var/lib/mysql/mysql.sock"
    out_log=$backdir/xtrabackup_log_$format_time
    time_cost=$backdir/xtrabackup_time.txt

    if [ ! -d "/database/detect/redundency" ];
    then
    mkdir -p /database/detect/redundency
    fi

    if [ -d "$backdir/incr5" ];then
    tar -czvf ${redun}/redundency_${week}.tar.gz $backdir >/dev/null 2>&1

    rm -rf $backdir/*
    mkdir -p $backdir
    chown -R mysql.mysql $backdir
    # del backup
    DEL_UNTIL_DATE=`date --date='7 day ago' +%Y-%m-%d`

    sleep 30
    /bin/rm -f /${redun}/*${DEL_UNTIL_DATE}.tar.gz >/dev/null 2>&1

    fi

    #full
    if [ ! -d "$backdir/full" ];then
    echo "#####start full backup at $BEGINTIME to directory full" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket $backdir/full 1> $out_log 2>&1
    break;
    elif [ ! -d "$backdir/incr0" ];then
    echo "#####start 0 incremental backup at $BEGINTIME to directory incr0" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/full $backdir/incr0 1> $out_log 2>&1
    break;
    elif [ ! -d "$backdir/incr1" ];then
    echo "#####start 1 incremental backup at $BEGINTIME to directory incr1" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr0 $backdir/incr1 1> $out_log 2>&1
    break;
    elif [ ! -d "$backdir/incr2" ];then
    echo "#####start 2 incremental backup at $BEGINTIME to directory incr2" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr1 $backdir/incr2 1> $out_log 2>&1
    break;
    elif [ ! -d "$backdir/incr3" ];then
    echo "#####start 3 incremental backup at $BEGINTIME to directory incr3" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr2 $backdir/incr3 1> $out_log 2>&1
    break;
    elif [ ! -d "$backdir/incr4" ];then
    echo "#####start 4 incremental backup at $BEGINTIME to directory incr4" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr3 $backdir/incr4 1> $out_log 2>&1
    break;
    elif [ ! -d "$backdir/incr5" ];then
    echo "#####start 5 incremental backup at $BEGINTIME to directory incr5" >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir=$backdir/incr4 $backdir/incr5 1> $out_log 2>&1
    break;
    fi
    ENDTIME=`date +"%Y-%m-%d %H:%M:%S"`
    begin_data=`date -d "$BEGINTIME" +%s`
    end_data=`date -d "$ENDTIME" +%s`
    spendtime=`expr $end_data - $begin_data`
    echo "it takes $spendtime sec for packing the data directory" >>$time_cost

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    基于分布式锁解决定时任务重复问题
    基于Redis的Setnx实现分布式锁
    基于数据库悲观锁的分布式锁
    使用锁解决电商中的超卖
  • 原文地址:https://www.cnblogs.com/buffercache/p/14038248.html
Copyright © 2011-2022 走看看