美文网首页
Linux下MySQL定时自动完整备份(mysqldump+cr

Linux下MySQL定时自动完整备份(mysqldump+cr

作者: jiezzy | 来源:发表于2020-04-08 16:06 被阅读0次
    #如果数据量比较小,而且服务器内存比较大,不需要压缩
    #!/bin/bash
    mysql -uUserName -pPassword DatabaseName >需要备份到的目录/bkdatabase/DatabaseName_$(date +%Y%m%d_%H%M%S).sql
    ------------------------------------------------------
    #需要压缩的
    #!/bin/bash
    mysql -uUserName -pPassword DatabaseName | gzip >需要备份到的目录/bkdatabase/DatabaseName_$(date +%Y%m%d_%H%M%S).sql.gz  
    
    
    
    crontab -e
     #每天凌晨两点执行一次
    0 2 * * * /脚本目录/脚本名称.sh
    

    一、前言

    1、本文目标

    • 实现数据库全量备份
    • 实现定时执行备份
    • 实现定时清理7天之前的备份

    2、环境信息

    image

    二、备份

    • 目录准备
    mkdir /mysql
    mkdir /mysql/backup
    mkdir /mysql/backup/scripts
    mkdir /mysql/backup/files
    mkdir /mysql/backup/logs
    
    
    • 备份脚本

    新建脚本

    vi /mysql/backup/scripts/backup_full.sh
    
    

    脚本内容

    #!/bin/bash
    
    #备份目录
    BACKUP_ROOT=/mysql/backup
    BACKUP_FILEDIR=$BACKUP_ROOT/files
    BACKUP_LOGDIR=$BACKUP_ROOT/logs
    
    #当前日期
    DATE=$(date +%Y%m%d)
    
    ######备份######
    
    #查询所有数据库
    #-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
    DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema")
    #DATABASES=$(mysql -uroot -p123456 -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('sys','mysql','information_schema','performance_schema');" | grep -v "SCHEMA_NAME","ken.io") 
    echo $DATABASES
    #循环数据库进行备份
    for db in $DATABASES
    do
    echo
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
    mysqldump -uroot -pRoot@1024 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
    echo
    done
    
    echo "done"
    
    

    备份测试&验证

    #执行备份脚本
    sh /mysql/backup/scripts/backup_full.sh
    
    #查看备份文件
    ll /mysql/backup/files -h
    
    #解压指定文件({file}自己替换成备份的文件)
    gunzip /mysql/backup/files/{file}
    
    

    三、定时任务

    yum install -y crontab
    
    

    1、定时执行MySQL完整备份

    • 创建定时备份任务
    #添加定时任务
    crontab -e
    
    #每天凌晨3点执行
    00 3 * * * sh /mysql/backup/scripts/backup_full.sh
    
    #查看定时任务
    crontab -l
    
    

    2、定时清理7天以前的备份

    • 创建文件清理脚本
    #创建脚本文件
    vi /mysql/backup/scripts/backup_full_clean.sh
    
    #写入以下内容
    #!/bin/bash
    find /mysql/backup/files -mtime +7 -name "*.gz" -exec rm -rf {} \;
    
    

    创建定时清理任务

    #添加定时任务
    crontab -e
    
    #每天凌晨1点执行
    00 1 * * * sh /mysql/backup/scripts/backup_full_clean.sh
    
    #每两天执行一次
    0 3 */2 * * sh /opt/data/sql/auto_backup.sh
    
    #查看定时任务
    crontab -l
    
    

    四、备注

    1、crontab命令示例

    image
    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
    
          minute   hour   day   month   week   command      
    
    其中:
    
             1、minute: 表示分钟,可以是从0到59之间的任何整数;
    
             2、hour:表示小时,可以是从0到23之间的任何整数;
    
             3、day:表示日期,可以是从1到31之间的任何整数;
    
             4、month:表示月份,可以是从1到12之间的任何整数;
    
             5、week:表示星期几,可以是从0到6之间的任何整数,这里的0代表星期日;
    
             6、command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
    
    前五个时间设定段,可以含如下特殊字符:
    
             1、星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作;
    
             2、逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”;
    
             3、中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”;
    
             4、正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
    

    2、本文参考


    mkdir -p /data/mysqlbal/data
    mkdir -p /data/mysqlbal/scripts
    mkdir -p /data/mysqlbal/logs
    
    
    
    cd /data/mysqlbak/scripts
    vi backup.sh
    
    #!/bin/bash
    
    #备份目录
    BACKUP_ROOT=/data/mysqlbak
    BACKUP_FILEDIR=$BACKUP_ROOT/data
    
    #当前日期
    DATE=$(date +%Y%m%d)
    
    ######备份######
    
    #查询所有数据库
    #-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
    DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema|performance_schema|mysql")
    #循环数据库进行备份
    for db in $DATABASES
    do
    echo
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
    mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
    echo
    done
    
    echo "done"
    
    
    
    
    #设置脚本的执行权限
    chmod 777 backup.sh
    
    
    ### 将备份操作加入到定时任务(每天凌晨2点定时执行)
    crontab -e
    
    00 2 * * * /data/mysqlbak/scripts/backup.sh > data/mysqlbak/logs/backup.log 2>&1
    
    ### 创建删除脚本(定时删除7天前的备份数据)
    vi backup_clean.sh
    
    #!/bin/bash
    echo ----------CLEAN BEGIN----------
    find /data/mysqlbak/data -mtime +7 -name "*.gz" -exec rm -rf {} \;
    echo ----------CLEAN COMPLETE----------
    
    
    
    #设置脚本的执行权限
    chmod 777 backup_clean.sh
    #将删除操作加入到定时任务(每天凌晨1点定时执行)
    00 1 * * * /data/mysqlbak/scripts/backup_clean.sh > /data/mysqlbak/logs/backup_full_clean.log 2>&1
    
    #查看定时任务
    crontab -l
    
    
    #如果需要备份到另外一台机器,可以备份完scp到另外一台机器
    首先服务器需要安装export,yum安装:
    yum  install expect
    
    
    
    #!/bin/bash
    
    #备份目录
    BACKUP_ROOT=/data/mysqlbak
    BACKUP_FILEDIR=$BACKUP_ROOT/data
    
    #当前日期
    DATE=$(date +%Y%m%d)
    
    ######备份######
    
    #查询所有数据库
    #-uroot -p123456表示使用root账号执行命令,且root账号的密码为:123456
    DATABASES=$(mysql -uroot -p123456 -e "show databases" | grep -Ev "Database|sys|information_schema|performance_schema|mysql")
    #循环数据库进行备份
    for db in $DATABASES
    do
    echo
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz BEGIN----------
    mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz
    echo ----------$BACKUP_FILEDIR/${db}_$DATE.sql.gz COMPLETE----------
    echo ----------scp 226  begin----------
    expect -c "
        spawn scp -r /data/mysqlbak/data/${db}_$DATE.sql.gz root@xxx.xxx.xxx.226:/data/mysqlbak/data225/
        expect {
            \"*assword\" {set timeout 300; send \"此处是scp的密码\r\"; exp_continue;}
            \"yes/no\" {send \"yes\r\";}
        }
    expect eof"
    echo ----------scp 226  end----------
    echo
    done
    
    echo "done"
    

    相关文章

      网友评论

          本文标题:Linux下MySQL定时自动完整备份(mysqldump+cr

          本文链接:https://www.haomeiwen.com/subject/kkutmhtx.html