• FreeBSD 下的 MySQL 备份方案


    核心提示:如何在 FreeBSD 下实现 MySQL 的全量及增量备份,确保数据的最大可靠性。在这里利用了 MySQL 的复制以及新版本的 FreeBSD 集成的快照功能。

    约定:本备份方案是在 MySQL 的 复制从服务器 上执行。关于 MySQL 的复制设置方法请看 MySQL 同步(一)。MySQL 安装在 /usr/local/mysql 下,datadir 则为 /data/mysql,而日志以及 innodb 的 log_file 均保存在 /logs/mysql/ 下。用于保存备份文件的目录为 /backup/mysql/,备份方案分成 每天全量备份 一次以及 每小时增量备份 一次。因此,如果 MySQL 发生误操作以及其他情况导致数据丢失,那么在采用本方案的情况下,最坏的情况只会丢失不到一个小时所产生的数据。当然了,也可以实现实时增量备份,这会在以后的文章中讲到。

    一、全量备份
    先来看看全量备份的脚本:

     #!/bin/sh
    #
    # created by yejr,2007/06/03
    #
    # 本脚本用于定期做全量备份,备份的对象是slave上的全部数据
    # 每次备份之前都先执行"STOP SLAVE; FLUSH TABLES;",然后将所有文件拷贝到备份目录下
    #

    echo "[backupmysql_fullly]"
    date

    today=`date +"%Y_%m_%d"`

    logdir=/logs/mysql
    datadir=/data/mysql
    bkdir=/backup/mysql/$today/full_backup
    expdays=7

    if [ ! -d $bkdir/$today ] ; then
    mkdir -p $bkdir
    fi

    #停止同步,刷新日志,刷新表
    echo "stop slave; flush logs; flush tables;"
    mysqladmin -uroot stop-slave
    mysqladmin -uroot flush-logs
    mysqladmin -uroot flush-tables

    cd $logdir
    #备份日志文件
    echo "backup errro log"
    cp $logdir/error.log* $bkdir/

    echo "backup ib_logfile* master.info relay.info"
    cp ib_logfile* master.info relay.info $bkdir/

    #拷贝所有文件
    echo "backup my.cnf"
    cp /usr/local/mysql/my.cnf $bkdir/

    ##如果是老版本的 FreeBSD 不支持快照功能,就拷贝全部数据库文件
    #cd $datadir
    #cp -rf * $bkdir/

    ##如果是新版本的 FreeBSD,则采用其特有的 snapshot 功能,先制作镜像,而后挂载镜像,再拷贝数据文件
    echo "make snapshot of /backup"
    /sbin/mksnap_ffs /data/ /data/.snap/mysql_snap_$today

    #执行 slave-start;
    mysqladmin -uroot start-slave

    #挂载镜像文件,而后拷贝数据
    /sbin/mdconfig -a -t vnode -f /data/.snap/mysql_snap_$today -u 4
    /sbin/mount -r /dev/md4 /backup/.snap
    cp -rf /backup/.snap/mysql/data/* $bkdir/
    /sbin/umount /backup/.snap
    /sbin/mdconfig -d -u 4

    #删除7天前的过期文件
    find /backup/mysql -type d -mtime +$expdays -maxdepth 1 | xargs rm -rf
    find /data/.snap -type f -mtime +$expdays -maxdepth 1 | xargs rm -f

    #修改备份文件的属主
    chown -R nobody:nobody $bkdir

    echo "[/backupmysql_fullly]"

    接下来就是在 crontab 中增加一条记录,使得每天都执行本备份脚本。

    0 0 * * * (/bin/sh /backup/mysql/backupmysql_fullly.sh >> /backup/mysql/backupmysql.log)
    

    二、增量备份
    下面是增量备份的脚本:

    #!/bin/sh
    #
    # created by yejr,2007/06/03
    #
    # 本脚本用于定期做增量备份,备份的对象是binlog
    # 每次备份之前都先执行 flush-logs,然后将最近的binlog移动到备份目录下
    #
    
    echo "[backupmysql_hourly]"
    date
    
    logdir=/logs/mysql
    bkdir=/backup/mysql
    now=`date +"%Y_%m_%d_%H"`
    today=`date +"%Y_%m_%d"`
    
    if [ ! -d $bkdir/$today ] ; then
     mkdir -p $bkdir/$today
    fi
    
    #执行 "flush logs"
    echo "flush logs; backup error log"
    mysqladmin -uroot flush-logs
    
    #去的 binlog 文件总数,去掉最后一个以及 binlog.index
    total=`ls $logdir/logbin.*|wc -l`
    total=`expr $total - 2`
    
    #循环移动所有的 binlog 文件
    echo "backup binary logs"
    for f in `ls $logdir/logbin.*|head -n $total`
    do
     bf=`basename $f`
     mv -if $f  $bkdir/$today/$bf
    done
    
    chown -R nobody:nobody $bkdir
    echo "[/backupmysql_hourly]"
    

    然后在 crontab 中增加一条记录,使得每小时都执行本备份脚本。

    0 */` * * * (/bin/sh /backup/mysql/backupmysql_hourly.sh >> /backup/mysql/backupmysql.log)
    

    在 linux 下,也可以采用本备份方案,不过执行的是不支持 snapshot 情况下的备份策略,即拷贝所有文件。或者,也可以利用 linux 自带的 lvm 功能实现类似 FreeBSD 的快照功能。
    以上脚本在 FreeBSD 6.2 + MySQL 5.0.37 环境下实验通过。

    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    爬取校花网的视频
    实现爬取图片
    MongoDB简介和安装
    WebSocket实现简易聊天室
    WEB service基础
    Flask之CBV,flash,Flask-Session,WTForms,DBUtils
    Flask之session,路由,配置,蓝图, before/after_request
    Flask之request,response,Jinja2
    Linux下的docker
    Linux下docker配置镜像加速后重启docker服务失败
  • 原文地址:https://www.cnblogs.com/wangbin/p/1503352.html
Copyright © 2020-2023  润新知