mysql增量与全量备份亲测有效

  1. 前提
# 创建mysql容器
docker run -d -p 7706:3306 -v /home/yangqi/data/:/var/lib/mysql --name yq-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
# 进入容器
root@monitor-alarm:~# docker exec -it mysql sh

# 看你的mysql当前默认的存储引擎:
mysql> show variables like '%storage_engine%';
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| default_storage_engine          | InnoDB    |
| default_tmp_storage_engine      | InnoDB    |
| disabled_storage_engines        |           |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.01 sec)

# 查看binlog是否开启
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | ON                          |
+---------------------------------+-----------------------------+

数据备份

  1. 全量备份
root@monitor-alarm:~# cat /home/yangqi/mysql_backup/mysql_full_back.sh
#!/bin/bash

# 定时任务
# 每月15号凌晨0:40执行全量备份脚本
# 40 0 15 * * /bin/bash -x /home/yangqi/mysql_backup/mysql_full_back.sh >/dev/null 2>&1
# 每隔两天凌晨3:40执行增量备份脚本
# 40 4 */2 * * /bin/bash -x /home/yangqi/mysql_backup/mysql_incre_back.sh >/dev/null 2>&1

back_dir=/home/yangqi/mysql_backup/full_backup
log_file=/home/yangqi/mysql_backup/back.log
date=`date +"%Y%m%d%H%M%S"`
dumpfile=changshu_cong$date.sql
gzdumpile=$dumpfile.tgz

begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $back_dir
mysqldump --socket=/var/run/mysqld/mysqld.sock -h 172.17.28.52 -P 7706 -uroot -p123456 --quick --databases changshu_cong --flush-logs --master-data=2  --single-transaction > $dumpfile
/bin/tar -zcf $gzdumpile $dumpfile
/bin/rm $dumpfile
end=`date +"%Y年%m月%d日 %H:%M:%S"`
echo [FullBack] 开始:$begin 结束:$end $gzdumpile successful >> $log_file
# 上传至阿里云oss,提前下载安装好ossutils64
/home/yangqi/mysql_backup/ossutil64 appendfromfile /home/yangqi/mysql_backup/full_backup/$gzdumpile oss://ctdna-yq-mysql/$gzdumpile
# 删除上一次的全量备份文件
file_date=`date +"%Y%m%d"`
ls /home/yangqi/mysql_backup/full_backup | grep -v $file_date | xargs rm -f


#mysqldump参数说明
--quick : 该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--all-databases : 导出所有数据库
--flush-logs : 生成新的二进制日志文件
--single-transaction : 此选项会将隔离级别设置为:REPEATABLE READ。并且随后再执行一条START TRANSACTION语句,让整个数据在dump过程中保证数据的一致性,这个选项对InnoDB的数据表很有用,且不会锁表。但是这个不能保证MyISAM表和MEMORY表的数据一致性。 为了确保使用--single-transaction命令时,保证dump文件的有效性。需没有下列语句ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因为一致性读不能隔离上述语句。所以如果在dump过程中,使用上述语句,可能会导致dump出来的文件数据不一致或者不可用。
  1. 增量备份
root@monitor-alarm:~# cat /home/yangqi/mysql_backup/mysql_incre_back.sh
#!/bin/bash
backup_dir=/home/yangqi/mysql_backup/incre_backup
mysql_dir=/home/yangqi/data    #增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
log_file=/home/yangqi/mysql_backup/back.log
bin_file=/home/yangqi/data/binlog.index   #mysql的index文件路径,放在数据目录下的

mysqladmin -h 172.17.28.52 -P 7706 -uroot -p123456 flush-logs     #这个是用于产生新的mysql-bin.00000*文件
counter=`wc -l $bin_file | awk '{print $1}'`
next_num=0

#这个for循环用于比对$counter,$next_num这两个值来确定文件是不是存在或最新的
for file in `cat $bin_file`
do
    base=`basename $file`
    echo $base
    #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    next_num=`expr $next_num + 1`
    if [ $next_num -ne $counter ]
    then
        echo $base skip! >> $log_file
    else
        dest=$backup_dir/$base
        if (test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写exist!到$logFile去
        then
            echo $base exist! >> $log_file
        else
            cp $mysql_dir/$base $backup_dir
            echo $base copying >> $log_file
         fi
     fi
done
echo [PartBack] `date +"%Y年%m月%d日 %H:%M:%S"` Bakup successful! >> $log_file
# 上传增量备份文件至oss
latest_incre_file=`ls -t /home/yangqi/mysql_backup/incre_backup  | head -n 1`
/home/yangqi/mysql_backup/ossutil64 appendfromfile /home/yangqi/mysql_backup/incre_backup/$latest_incre_file oss://ctdna-yq-mysql/$latest_incre_file

# 保留最新的两个文件
ls -tr /home/yangqi/mysql_backup/incre_backup  | head -n -2 | xargs rm
root@monitor-alarm:~#
  1. 数据恢复
# 登陆
mysql -uroot -p123456
# 创建数据库和表
create database changshu_cong;
CREATE TABLE () ;
# 执行全量恢复
mysql> source /var/backups/changshu_cong2021****.sql
# 后顺序执行增量恢复,选择
mysqlbinlog binlog.000003* | mysql -uroot -p123456
# 数据量检测
mysql> SELECT COUNT(*) FROM changshu_cong.cong_raw where ist_year = 2021 and ist_month = 1 and ist_day = 14 ;
+----------+
| COUNT(*) |
+----------+
|    37559 |
+----------+

你可能感兴趣的:(linux,shell,mysql,增量备份,全量备份,docker)