• Linux上docker部署Mysql备份与恢复


    Linux上Mysql备份与恢复

    1.完全备份

    完整备份是将所选的全部数据都备份起来,将备份文件生成一个镜像,再保存到其他的硬盘分区中。

    1.1 完全备份一个或多个完整的库

    ps: 博主mysql是用docker部署的,这时候需要进入docker容器进行操作。

    docker exec -it hjt-mysql /bin/bash
    
    • 1

    先去/opt目录下 新建 mysqlData

    mkdir mysqlData
    
    • 1

    进入容器后,进入 /var/lib/mysql目录。这是我们存储数据的地方

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKmGOzfV-1670290326434)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123100925199.png)]

    先备份一个库,执行命令。

    mysqldump -u root -p数据库密码 --databases hjt-data > /opt/mysqlData/hjt-data.sql
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PP97nx5X-1670290326435)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123101309480.png)]

    这时候sql文件就生成了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NBjUh8hZ-1670290326436)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123101342258.png)]

    如果是要备份整个数据库,执行的命令是

    mysqldump -u root -p数据库密码 --all databases > /opt/mysqlData/hjt-data.sql
    
    • 1

    查看备份文件

    cat /opt/mysqlData/hjt-data.sql
    
    • 1

    1.2 完全备份恢复

    先把hjt-data数据库删除

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuRjpkaI-1670290326436)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123102550927.png)]

    先新建数据库 hjt-data

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrmtMsfi-1670290326437)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123103029409.png)]

    然后执行命令

    mysql -uroot -p hjt-data 
    • 1

    输入mysql密码后

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZVZ73E4-1670290326437)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123103114177.png)]

    可见数据已经恢复

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r9oJCxjG-1670290326437)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123103139369.png)]

    2.增量备份+完全备份

    增量备份是一种智能备份方式,只备份有变化的部分,也就是在上一次备份之后,将新增的或有变化的数据备份起来,每一次增量备份都是和上一次备份(可以是完整备份、差异备份或增量备份)相对比。比如周一进行了一次完整备份,周三进行了一次增量备份,那么周三这次增量备份会将周一完整备份之后有变化的数据备份起来,若周五又进行了一次增量备份,那么这一次将会备份周三增量备份之后有变化的数据。

    首先需要开启二进制日志功能
    vim /etc/my.cnf

    [mysqld]
    log-bin=mysql-bin
    binlog_format = MIXED				指定二进制日志(binlog)的记录格式为 MIXED
    server-id = 1
    
    • 1
    • 2
    • 3
    • 4

    ③ 二进制日志的格式
    A) binlog_format 在mysql5.7默认是row, 不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨

    例如:update a < 10 的数据,statement模式会记录这一条sql,而row模式的话,会记录a=1,a=2到a=9所有的记录的更改

    B) STATEMENT模式 每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题

    C) MIXED模式 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

    2.1 可对每周进行完全备份

    下面是完全备份备份库的

    mysqldump -u root -p  hjt-data > /opt/mysqlData/hjt-data_$(date +%F).sql
    
    • 1

    如果是备份某个库中的某张表

    在这里插入图片描述

    mysqldump -u root -p  hjt-data sys_file  > /opt/mysqlData/hjt-data_sys_file$(date +%F).sql
    
    • 1

    2.2 每天进行增量备份

    生成新的二进制日志文件(例如 mysql-bin.000002)

    插入新数据,以模拟数据的增加或变更

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umwNu4Fe-1670290326438)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123111612658.png)]

    再次生成新的二进制日志文件

    mysqladmin -u root -p flush-logs
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSDz8vFQ-1670290326439)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123111930880.png)]

    查看二进制日志

    mysqlbinlog --no-defaults --base64-output=decode-rows -v /var/lib/mysql/mysql-binlog.000001
    
    • 1

    如果想看到我们写入的sql语句格式,则需要设置 binlog_rows_query_log_events = 1

    --start-position 可以通过偏移量进行查询
    
    --start-datetime 通过开始时间来查询
    
    --stop-datetime 通过结束时间查询
    
    mysqlbinlog  --base64-output=decode-rows -v /var/lib/mysql/mysql-binlog.000001 --start-datetime='2022-11-23 09:18:22'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3 MySQL增量恢复

    一般恢复

    首先我们先创建一张表test

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J75P6zxM-1670290326439)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123140447318.png)]

    然后执行sql命令 ,生成二进制日志。

    mysqladmin -u root -p flush-logs
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFGqbmhN-1670290326439)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123140618993.png)]

    这时候我们把test表删除

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v44lQPrz-1670290326440)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123140642511.png)]

    然后再执行一下命令,进行增量恢复。

    mysqlbinlog --no-defaults  /var/lib/mysql/mysql-binlog.000002  | mysql -u root -p
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlgzMcLQ-1670290326440)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123140710990.png)]

    这是test表就恢复了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yxyo85OR-1670290326440)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221123140737665.png)]

    3.定时任务完成备份

    docker容器内安装crontab

    进入容器,执行命令

    apt update
    
    #安装 cron
    apt install -y cron
    
    • 1
    • 2
    • 3
    • 4

    安装成功后,执行

    touch /var/log/cron.log
    
    # 更改时区
    
    rm -rf /etc/localtime
    
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    cron && tail -f /var/log/cron.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后执行命令 ,会报一下错误

    crontab -e
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3LqCDjxu-1670290326440)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221124092346475.png)]

    这个报错是因为你docker容器没有安装vi命令

    解决方案:

    apt-get update 
    
    apt-get install vim
    
    • 1
    • 2
    • 3

    在宿主机新建mysqlData.sh脚本,并把复制到容器内部

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h2kNIvNQ-1670290326441)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221124111525506.png)]

    脚本内容如下:

    #!/bin/bash
    echo '开始执行mysql备份操作'
    mysqldump -u root -p970628hjt.  hjt-data > /opt/mysqlData/hjt-data_$(date +%F).sql
    echo 'mysql备份完成'
    
    • 1
    • 2
    • 3
    • 4

    执行命令

    docker cp  /mydata/sh/mysqlData.sh hjt-mysql:/sh/ 
    
    • 1

    再执行命令 crontab -e ,然后输入

    * * * * * /sh/mysqlData.sh > /opt/log/mysql.log 2>&1
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XSc5H1t-1670290326441)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221124095554711.png)]

    查看定时任务列表

    crontab -l
    
    • 1

    查看生成好的sql文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARU8JEgM-1670290326441)(Linux%E4%B8%8AMysql%E5%A4%87%E4%BB%BD%E4%BA%8E%E6%81%A2%E5%A4%8D.assets/image-20221124112116657.png)]

    因为我宿主机映射容器/var/lib/mysql/是这个目录

  • 相关阅读:
    redis数据导入导出 - AOF方式
    斐波那契数列,剑指offer,力扣
    基于SpringBoot的在线教育平台系统
    c++ builder 6.0 使用 Programming with DB-Library for C
    MVP模式根模块
    vivado流程导航器详细介绍【全网最详细】
    CVE-2022-25237 Bonitasoft Platform RCE漏洞复现
    每日学习笔记:C++ STL 的队列Deque
    预测性维护为何能够帮助企业降低设备维护成本?
    微信私域怎么高效转化?看看这款系统!
  • 原文地址:https://blog.csdn.net/weixin_40483369/article/details/128197145