zoukankan      html  css  js  c++  java
  • 使用mysqldump对mysql进行备份与恢复

    说明:
    主参考:
    https://blog.csdn.net/fanren224/article/details/79693860

    mysql数据全量备份

    1.开启二进制日志,备份指定数据库

    cat << EOF > /root/sqlfull.sh
    #!/bin/bash
    BACKUP_USER='root'
    BACKUP_PASSWD='m4r!adbOP'
    mysqldump --quick --events  --routines --triggers --hex-blob --flush-logs --single-transaction --master-data=2 -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} --databases {"test","test2"} > /root/dbbak.sql
    EOF
    chmod +x /root/sqlfull.sh

    --flush-logs 备份开始时滚动一次二进制日志
    --routines  备份存储过程和函数
    --triggers  备份触发器
    --events    备份事件表
    --single-transaction  表类型为InnoDB时,热备,表类型为MyISAM时,温备
    --master-data=2  以注释的方式记录备份开始时二进制日志的前缀名和位置
    --master-data=1  记录备份开始时二进制日志的前缀名和位置,用于从库通过备份sql还原数据,还原后能从指定位置开始同步


    2.未开启二进制日志,备份指定数据库

    cat << EOF > /root/sqlfull.sh
    #!/bin/bash
    BACKUP_USER='root'
    BACKUP_PASSWD='m4r!adbOP'
    mysqldump --quick --events  --routines --triggers --hex-blob --single-transaction -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} --databases {"test","test2"} > /root/dbbak.sql
    EOF
    chmod +x /root/sqlfull.sh


    mysql数据恢复


    因为恢复数据时会执行大量的insert语句,如果没有特殊要求,还原时没有必要将这些操作记录到二进制日志中,所以关闭当前会话的二进制日志记录。
    set sql_log_bin=OFF;
    所有恢复操作完成后,再将当前会话中的sql_log_bin再次开启。
    恢复命令
    source /root/dbbak.sql
    此命令只是恢复到了备份sql对应的时间点,还需要进行时间点还原。

    进行时间点恢复时,备份时间点之后的数据则需要通过二进制日志进行还原,首先,要从二进制日志中提取对应的sql,提取sql的起始位置为备份开始时那一刻二进制文件对应的position,因为在使用mysldump备份时,我们推荐使用--master-data=2选项,所以在对应的数据库备份sql文件中应该存在对应的position,提取sql的结束位置应该是drop语句对应的位置,因为咱们模拟的场景是有人误操作drop了数据库,所以结束位置应该是drop语句的位置。注意,不要把误操作的drop语句提取出来,否则重放对应sql时又会将对应的数据删除,如果是那样就前功尽弃了。


    通过二进制日志进行还原


    主参考:
    https://blog.csdn.net/liuchen1314/article/details/79628555

    基于位置恢复,通过查看日志文件信息,确认6259-6362为误操作点
    mysqlbinlog --stop-position=6259 mysql-bin.000001 | mysql -uroot -p #从1开始至6259的事件读,不包括6259事件
    mysqlbinlog --start-position=6363 mysql-bin.000001 | mysql -uroot -p #从6259的事件开始读
    取两事件点
    mysqlbinlog --start-position=5786 --stop-position=6254 mysql-bin.000001 | mysql -uroot -p



    mysql数据增量备份

    cat << EOF > /root/sqladd.sh
    #!/bin/bash
    BACKUP_USER='root'
    BACKUP_PASSWD='m4r!adbOP'
    backupdir=/root/backup
    datedir=`date "+%Y%m%d"`
    mkdir $backupdir/$datedir
    logsindexpath=/usr/local/mysqldata/binlogs/mysql-bin.index
    mysqladmin -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} flush-logs
    binlog_cp=`head -n -1 ${logsindexpath}`
    for i in ${binlog_cp}
    do
    mysql -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} -e "! cp -p ${i} ${backupdir}/${datedir}/"
    done
    binlog_rm=`tail -n 1 ${logsindexpath} | awk -F '/' '{print $NF}'`
    mysql -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} -e "purge binary logs to '${binlog_rm}'"
    EOF
    chmod +x /root/sqladd.sh


    每周一次全量备份,每天一次增量备份,只保留一月以内的备份。

    echo << EOF > /root/sqlclean.sh
    #!/bin/bash
    find /root/backup/ -type f -mtime +30 -exec rm -rf {} ;
    EOF
    chmod +x /root/sqlclean.sh
    crontab -e
    0 22 * * 6  /root/sqlfull.sh
    0 3 * * *   /root/sqladd.sh
    0 0 * * 7 /root/sqlclean.sh
    crontab -l

  • 相关阅读:
    vue,如何每次访问同样路由都可以刷新
    CentOS 7.X 关闭SELinux
    Centos7安装Redis
    ubuntu 18.04 安装 MySql,并配置远程连接
    CentOS7设置阿里镜像源
    ubuntu 18.04 设置静态ip方法
    发现网络产品漏洞后,应立即通知上游开发者,并及时通知下游用户
    ApacheCN 数据库译文集 20211112 更新
    ApacheCN Linux 译文集(二) 20211206 更新
    ApacheCN C# 译文集 20211124 更新
  • 原文地址:https://www.cnblogs.com/jipinglong/p/11235196.html
Copyright © 2011-2022 走看看