MySQL备份

全量备份

全量备份脚本db_dbname_back_full.sh

#!/bin/bash
# mysql数据库全量备份
 
# ######Database info
#用户名
DB_USER=""
#连接密码
DB_PASS=""
#数据库地址
DB_HOST="localhost"
#数据库名称
DB_NAME=""
#待备份的表,不写表示备份整库
DB_TABLE="" 

# ######Others info
#mysql安装目录
MYSQL_HOME="/usr/local/mysql"
#mysql bin目录
BIN_DIR="$MYSQL_HOME/bin"
#备份文件存放目录
BACK_DIR="$MYSQL_HOME/backup"
#按时间格式进行备份
DATE=`date +%Y%m%d_%H%M%S`

# ######创建相应的文件夹
if [[ ! -d "$BACK_DIR" ]]; then
  mkdir $BACK_DIR
fi
if [[ ! -d "$BACK_DIR/$DB_NAME" ]]; then
  mkdir $BACK_DIR/$DB_NAME
fi
 
# ######数据备份
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME $DB_TABLE > $BACK_DIR/$DB_NAME/db_backup_$DATE.sql
#删除30天前的备份数据(-mtime +3 表示3天前 -mmin +3 表示3分钟前)
find $BACK_DIR/$DB_NAME -name "db_backup_*.sql" -type f -mtime +30 -exec rm {} \; > /dev/null 2>&1

# ######数据备份并压缩(为节省空间,可以使用压缩的方式备份)
#如果该数据库的用户没有分配锁表的权限,则备份会报错 when using LOCK TABLES,需加入--skip-lock-tables
#$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables $DB_TABLE | gzip > $BACK_DIR/$DB_NAME/db_backup_$DATE.sql.gz
#根据情况与上面这条命令二选一即可
#$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME $DB_TABLE | gzip > $BACK_DIR/$DB_NAME/db_backup_$DATE.sql.gz
#删除30天前的备份数据(-mtime +3 表示3天前 -mmin +3 表示3分钟前)
#find $BACK_DIR/$DB_NAME -name "db_backup_*.gz" -type f -mtime +30 -exec rm {} \; > /dev/null 2>&1
View Code

1)将脚本中的mysql数据库安装目录,数据库连接用户名、密码和数据库名等换成自己的即可,备份保留时间自行根据需要调整。

2)将脚本文件上传至linux服务器中并授权chmod +x db_dbname_back.sh,开启定时任务执行此脚本。crontab –e添加执行计划并重启systemctl restart crond.service

增量备份

准备工作

增量备份需要开始binlog日志,修改mysql的配置文件,并重启mysql

查看是否修改成功,登录mysql输入show variables like ‘%log_bin%’;

备份工作

全量备份脚本db_dbname_back_add.sh

#!/bin/bash
# mysql数据库增量备份

#用户名
DB_USER=""
#连接密码
DB_PASS=""
#数据库地址
DB_HOST="localhost"

#mysql安装目录
MYSQL_HOME="/usr/local/mysql"
#二进制的存放路径(在my.conf里指定)
BIN_DIR="/usr/local/mysql/logs"
#只要开启二进制,就会在存放二进制的目录里产生,以二进制为名.index文件
BIN_FILE=$BIN_DIR/mysql-bin.index

#增量备份时复制二进制文件(mysql-bin.00000*到备份的目录里
BACK_DIR="$MYSQL_HOME/backup"
#增量备份日志
LOG_FILE="/$BACK_DIR/backadd.log"
# ######创建相应的文件夹
if [[ ! -d "$BACK_DIR" ]]; then
  mkdir $BACK_DIR
fi

#这个是用于产生新的mysql-bin.00000*文件
/$MYSQL_HOME/bin/mysqladmin -u$DB_USER -p$DB_PASS -h$DB_HOST flush-logs
#统计以二进制为名.index文件里的二进制文件
Counter=`wc -l $BIN_FILE |awk '{print $1}'`

#开始循环,这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
NextNum=0
for file in `cat $BIN_FILE`
do
    #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    base=`basename $file`
    NextNum=`expr $NextNum + 1`
    #如果NextNum 等于 统计的统计的二进制数,就输入跳过
    if [ $NextNum -eq $Counter ]
    then
        echo $base skip! >> $LOG_FILE
    else
        #否则就判断备份目录$BACK_DIR下有没有二进制文件$dase
        dest=$BACK_DIR/$base

        if(test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写存在到$LOG_FILE去
        then
            echo $base exist! >> $LOG_FILE
        else
            #如果没有就复制二进制到备份目录$BACK_DIR里
            cp $BIN_DIR/$base $BACK_DIR
            echo $base copying >> $LOG_FILE
         fi
     fi
done
#最后将结束时间追加到 备份日志里
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $LOG_FILE
View Code

1) 将脚本中的mysql数据库安装目录,二进制文件存放目录,数据库连接用户名、密码和数据库名等换成自己的即可。

2) 跟全量脚本一样添加定时任务即可。

注:一般全量脚本可以设置一周一次,增量脚本每天一次,具体看业务需要。

#每个星期日凌晨2:00全量备份
0 2 * * 0 /bin/bash -x /全量脚本路径/xx_full.sh >/dev/null 2>&1

#周一到周六凌晨2:00增量备份
0 2 * * 1-6 /bin/bash -x /增量脚本路径/xx_add.sh >/dev/null 2>&1

数据恢复

1、 先恢复全量备份数据

mysql –uroot –p --database=数据库名 < 全量备份文件.sql

2、 追加增量备份数据

mysqlbinlog /xx/mysql-bin.00000*) | mysql -uroot -p;

posted @ 2022-02-21 12:59  聚散彡流沙  阅读(34)  评论(0编辑  收藏  举报