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

12 篇文章 0 订阅
本文详细介绍了如何使用Docker运行MySQL容器,并通过mysqldump进行全量备份,利用binlog进行增量备份,以及如何恢复数据。备份脚本包括了定时任务设置,保证数据安全。同时,还涉及到了数据一致性、日志管理和阿里云OSS的文件上传。
摘要由CSDN通过智能技术生成
  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 |
+----------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值