zoukankan      html  css  js  c++  java
  • mysqldump全量和增量备份脚本

    mysqldump全量和增量备份脚本
    1)增量备份在周一到周六凌晨3点,复制mysql-bin.00000*到指定目录
    2)全量备份则使用mysqldump将所有的数据库导出,每周日凌晨3点执行
    3)应该用merge-master-logs,不应该用--delete-master-logs
    4)应该lock tables
    #mysql全量备份、增量备份。开启mysql的logbin日志功能。
    vi /etc/my.cnf
     
    [mysqld]
    log-bin = "/home/mysql/logbin.log"
    binlog-format = ROW
    log-bin-index = "/home/mysql/logindex"
    binlog_cache_size=32m
    max_binlog_cache_size=512m
    max_binlog_size=512m
     
    mkdir -p /home/mysql/backup/daily
     
    #1)全量备份脚本:
    vim /root/Mysql-FullyBak.sh
     
    #!/bin/bash
    #export LANG=en_US.UTF-8
    BakDir=/home/mysql/backup
    LogFile=/home/mysql/backup/bak.log
    Date=`date +%Y%m%d`
    Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
    cd $BakDir
    DumpFile=$Date.sql
    GZDumpFile=$Date.sql.tgz
    /usr/local/mysql/bin/mysqldump -uroot -pmysql --quick --events --all-databases --flush-logs --delete-master-logs --single-transaction > $DumpFile
    /bin/tar -zvcf $GZDumpFile $DumpFile
    /bin/rm $DumpFile
    #只保留过去一周的全量备份
    count=$(ls -l *.tgz |wc -l)
    if [ $count -ge 2 ]
    then
    file=$(ls -l *.tgz |awk '{print $9}'|awk 'NR==1')
    rm -f $file
    fi
    Last=`date +"%Y年%m月%d日 %H:%M:%S"`
    echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile
    cd $BakDir/daily
    /bin/rm -f *
     
    #2)增量备份脚本
    vim /root/Mysql-DailyBak.sh
     
    #!/bin/bash
    #export LANG=en_US.UTF-8
    BakDir=/home/mysql/backup/daily
    BinDir=/var/lib/mysql
    LogFile=/home/mysql/backup/bak.log
    BinFile=/var/lib/mysql/mysqlmaster-bin.index
    #这个是用于产生新的mysql-bin.00000*文件
    /usr/local/mysql/bin/mysqladmin -uroot -pmysql flush-logs
    Counter=`wc -l $BinFile |awk '{print $1}'`
    NextNum=0
    #这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
    for file in `cat $BinFile`
    do
    base=`basename $file`
    #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $Counter ]
    then
    echo $base skip! >> $LogFile
    else
    dest=$BakDir/$base
    if(test -e $dest)
    #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
    then
    echo $base exist! >> $LogFile
    else
    cp $BinDir/$base $BakDir
    echo $base copying >> $LogFile
    fi
    fi
    done
    echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $LogFile
     
    #3)设置crontab任务,执行备份脚本。先执行增量备份脚本,后执行全量备份脚本:
    #使计划任务生效
    systemctl restart crond.service
    crontab -e
     
    #每个星期日凌晨3:00执行完全备份脚本
    0 3 * * 0 /bin/bash -x /root/Mysql-FullyBak.sh >/dev/null 2>&1
    #周一到周六凌晨3:00做增量备份
    0 3 * * 1-6 /bin/bash -x /root/Mysql-DailyBak.sh >/dev/null 2>&1
     
    #4)手动执行上面两个脚本,测试下备份效果
    cd /home/mysql/backup
    #先执行增量备份脚本
    sh /root/Mysql-DailyBak.sh
    ll
    ll daily/
    cat bak.log
     
    #然后执行全量备份脚本
    sh /root/Mysql-FullyBak.sh
    ll
    ll daily/
    cat bak.log
     
    -------------------------------------------------------------------------------------------------
    1.MySQLdump全量备份
    #假定星期日下午1点执行全量备份,适用于MyISAM存储引擎,对于InnoDB将--lock-all-tables替换为--single-transaction;--flush-logs为结束当前日志,生成新日志文件;
    #--master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称:CHANGE MASTER TO
    MySQLdump --lock-all-tables --flush-logs --master-data=2 -u root -p test > backup_sunday_1_PM.sql
    #用于日后恢复时参考,例如输出的备份SQL文件中含有:
    CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106;
     
    2.MySQLdump增量备份其他说明:
    如果MySQLdump加上–delete-master-logs 则清除以前的日志,以释放空间。但是如果服务器配置为镜像的复制主服务器,用MySQLdump –delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容。在这种情况下,使用 PURGE MASTER LOGS更为安全。
    每日定时使用 MySQLadmin flush-logs来创建新日志,并结束前一日志写入过程。并把前一日志备份,例如上例中开始保存数据目录下的日志文件 MySQL-bin.000002 , ...
    1.恢复完全备份
    mysql -u root -p < backup_sunday_1_PM.sql
    2.恢复增量备份
    #注意此次恢复过程亦会写入日志文件,如果数据量很大,建议先关闭日志功能
    mysqlbinlog MySQL-bin.000002 … | MySQL -u root -p
    --compatible=name
    它告诉 MySQLdump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、MySQL323、MySQL40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等。
    --complete-insert,C
    导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。
    --default-character-set=charset,mysql5.7.18无此参数
    指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
    --disable-keys 该选项只适合 MyISAM 表
    告诉 MySQLdump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。
    --extended-insert = true|false
    默认情况下,MySQLdump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。
    --hex-blob
    使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。
    --lock-all-tables,-x
    在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。
    --lock-tables
    它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。
    --no-create-info,-t
    只导出数据,而不添加 CREATE TABLE 语句。
    --no-data,-d
    不导出任何数据,只导出数据库表结构。****************************************************************
    mysqldump --no-data --databases mydatabase1 mydatabase2 mydatabase3 > test.dump
    将只备份表结构。--databases指示主机上要备份的数据库。
    --opt
    这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 MySQLdump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 MySQLdump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
    --quick,-q
    该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
    --routines,-R
    导出存储过程以及自定义函数。
    --single-transaction
    该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。
    --triggers
    同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。
    跨主机备份
    使用下面的命令可以将host1上的sourceDb复制到host2的targetDb,前提是host2主机上已经创建targetDb数据库:
    -C 指示主机间的数据传输使用数据压缩
    mysqldump --host=host1 --opt sourceDb| mysql --host=host2 -C targetDb
     

  • 相关阅读:
    南阳oj 82 迷宫寻宝(一)
    杭电 oj 1016 Prime Ring Problem
    杭电 oj 3350 #define is unsafe
    南阳oj 366 全排列 D的小L
    南阳oj 32 组合数
    部分和问题 南阳oj 1058
    HNUSTOJ 1516:Loky的烦恼
    HDU-1874 畅通工程续
    T-聊天止于呵呵
    P-残缺的棋盘
  • 原文地址:https://www.cnblogs.com/buffercache/p/14045184.html
Copyright © 2011-2022 走看看