全量备份
全量备份脚本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
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
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;