zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/wangbin/p/1503352.html
Copyright © 2011-2022 走看看