• Mysql的备份回滚


    Mysql的备份回滚

    一、数据库备份的分类

    ​ 数据库备份逻辑备份策略大体上可以分为以下几种:

    完全备份:每次对数据库进行完整的备份

    差异备份:备份自从上次完全备份后被修改过的文件,下次备份备份的是相对原来的完全备份后增加啊 的差异的文件而不是相对于差异备份后增加的文件

    增量备份:备份相对于前一次备份后被修改的文件。

    二、常见的备份方法

    ​ 常见的数据库备份方法有以下几种:

    物理冷备:关闭数据库然后直接打包数据库文件

    专用备份工具mydump或mysqlhotcopy

    mysqldump:常用的逻辑备份工具

    mysqlhotcopy:仅拥有备份MylSAM和ARCHIVE表

    启用二进制日志进行备份:进行增量备份,需要刷新二进制文件

    第三方工具备份:免费的MySQL热备份软件Percona XtraBackup

    三、MYSQL日志管理

    ​ mysql的日志默认保存为/usr/local/mysql/data

    ​ 日志的种类:

    错误日志:用来记录MYSQL启动、停止或运行是发生的错误信息,当然默认已开启

    log-error=/usr/local/mysql/data/mysql_error.log
    
    • 1

    通用查询日志:用来记录MYSQL的所有连接和语句,默认是关闭

    general_log=ON 
    general_log_file=/usr/local/mysql/data/mysql_general.log
    
    • 1
    • 2

    二进制日志:用来记录所有更新了数据或已经潜在更新了数据的语句,记录数据的更改,可用于数据恢复,默认开启

    log-bin=mysql-bin 或 log_bin=mysql-bin
    
    • 1

    中继日志:一般情况下在Mysql主从同步(复制),读写分离集群的从节点开启。主节点一般不需要这个日志。

    慢查询日志:用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便提醒优化,默认是关闭的。

    s1ow query log=ON
    slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
    long query time=5
    #设置超过5秒执行的语句被记录,缺省时为10秒
    
    • 1
    • 2
    • 3
    • 4

    日志开启

    vim /etc/my.cnf
    log-error=/usr/local/mysql/data/mysql_error.log
    general_log=ON
    general_log_file=/usr/local/mysql/data/mysql_general.log
    log-bin=mysql-bin
    slow_query_log=ON
    slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log 
    long_query_time=5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查询开启

    show variables like 'general%';
    #查看通用查询日志是否开启
    show variables like ' log_bin% ';
    #查看二进制日志是否开启
    show variables like ' %slow% ';
    #查看慢查询日功能是否开启
    show variables like 'long query time' ;#查看慢查询时间设置
    set global slow_query_log=ON;
    #在数据库中设置开启慢查询的方法
    #variables代表变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    四、备份策略

    ​ 在企业中备份的合理的备份频率和备份策略是很重要的,较为合理的备份区间为:

    全备:一周一次,推荐时间为晚上10点到早上的5点进行全备

    增量:三天/两天/一天一次增量备份

    ​ 当然我们也可以在周四晚上进行完全备份,然后一天一次增量,下周继续再做一次完全备份然后在新完全备份发基础上进行增量备份

    五、Mysql的完全备份与恢复

    ​ 首先我们要知道InnoDB存储引擎的数据库在磁盘上存储成三个文件分别为:db.opt(表属性文件)表名.frm(表结构文件)表明.ibd(表数据文件)

    物理备份
    #首先我们要关闭数据库
    systemctl stop mysqld
    #然后简单粗暴,直接将mysql的数据目录打包压缩到指定的路径下
    tar -zcvf /opt/mysql.bak.gz /usr/local/mysql/data/
    #然后恢复也很简单
    tar -zxvf /opt/mysql.bak.gz  -C /
    #注意如果前面的绝对路径压缩的解压直接从/解压	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    mysqldump

    备份指定完整的库/多个完整的库

    mysqldump -u root -p2288 --databases 库名 >保存的地址
    mysqldump -u root -p2288 --databases kgc >/opt/kgc.sql
    mysqldump -uroot -p2288 --databases kgc MOGU >/opt/mogu_kgc.sql
    
    • 1
    • 2
    • 3

    备份所有的库

    mysql -u root -p2288 --all-databases >/opt/all.sql
    
    • 1

    备份所有库但只保留表结构

    mysqldump -u root -p2288 -d --databases 库名 >保存的地址
    
    • 1

    备份指定的表

    mysqldump -uroot -p2288  库名 表名 > 保存地址
    
    • 1

    备份指定的表但不保存表数据

    mysqldump -u root -p2288 -d 表名 >保存地址
    
    • 1

    查看备份文件

    grep -v "^--" XXXX(备份文件地址) |grep -v "^/" |grep -v "^$"
    
    • 1

    Mysql完全恢复

    免交互使用sql语句

    mysql -uroot -p2288 -e'show databases'
    
    • 1

    免交互完全恢复

    mysql -uroot -p2288 kgc 
    • 1
    mysql -uroot -p2288 
    • 1

    使用Source执行SQL脚本

    source /opt/MOGU.sql #后面跟指定的绝对路径
    
    • 1

    Mysql增量备份和恢复

    Mysql数据库增量恢复一般又三种分别是基于二进制文件的一般恢复,基于位置ID的位置恢复和基于时间的时间节点恢复,当然增量恢复的本质就是将二进制文件翻译成sql脚本,运行sql脚本还原之前修改数据的步骤。

    二进制日志(binlog)有三种不同的记录格式:

    • STATEMENT(基于SQL语句)
    • ROW(基于行)
    • MIXED(混合模式),默认格式是STATEMENT

    二进制文件的生成:

    • 重启服务就会刷新一个新的二进制文件
    • mysqladmin -u root -p flush-logs 生成二进制文件

    二进制文件的编译(查看)

    mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
    
    • 1

    一般恢复

    首先我们刷新一下日志此时出现最新日志04,我们写新增sql语句给ceshi表

    我们刷新下二进制文件此时出现二进制表出现了新的05,但是数据并不在05中,而在上一次的04中,你第一次刷新出来的日志其实就是新建开始记录你的操作,等你再次执行二进制文件刷新时前面的操作将保存到你上一次新建的日志及新日志-1。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ns4m604K-1663499419137)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811161715118.png)]

    我们查看下04这个二进制文件

     mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byv32EON-1663499419138)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811162427543.png)]

    此时我们将删除我们刚新增的数据,然后再用二进制文件恢复来测试,然后看下表是否有数据了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71pTuRos-1663499419139)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811162939730.png)]

    很好,没有,我们再执行下二进制文件恢复

    mysqlbinlog --no-defaults /opt/mysql-bin.000004 | mysql -uroot -p
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyTUVfQd-1663499419139)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811160743980.png)]

    我们再次查看,测试成功

     mysql -uroot -p2288 -e 'select * from a.ceshi;'
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RDb4d08J-1663499419140)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811163154871.png)]

    基于位置恢复

    普通恢复很不错,但是有的时候一个备份中有错误的语句有正确的,我们需要更精确的操作来完成,我们通过指定的at后的号作为表示来完成恢复(当然选择表示号也是要有讲究的,需要选择开始前和提交后的)。

    执行220行前的sql语句

    mysqlbinlog --no-defaults --stop-position='22236' mysql-bin.000012 | mysql -u root -p
    
    • 1

    执行220行后的sql语句

    mysqlbinlog --no-defaults --start-position='22236' mysql-bin.000012 | mysql -u root -p
    
    • 1

    执行10行后20行前的sql语句

    mysqlbinlog --no-defaults --start-position='10172' --stop-position='11208' /opt/mysql-bin.000001 | mysql -u root -p
    
    • 1

    基于时间戳恢复

    和上面一样,只是位置换成了时间

    mysqlbinlog --no-defaults --start-datetime='2022-08-11 17:05:55' /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p
    
    • 1
    mysqlbinlog --no-defaults --stop-datetime='2022-08-11 17:05:55' /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p
    
    • 1
    mysqlbinlog --no-defaults --start-datetime='2022-08-11 17:05:55'--stop-datetime='2022-08-11 17:06:0'  /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p
    
    • 1

    faults --stop-datetime=‘2022-08-11 17:05:55’ /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p

    
    
    • 1

    mysqlbinlog --no-defaults --start-datetime=‘2022-08-11 17:05:55’–stop-datetime=‘2022-08-11 17:06:0’ /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p

    
    
    • 1
  • 相关阅读:
    179基于matlab的2D-VMD处理图像
    一文看懂推荐系统:排序01:多目标模型
    android 刷机时缺少驱动无法识别
    【电巢】新能源产业景气度加速向上,功率器件3000亿赛道国产替代已在路上!(附70+厂家名单&部分厂家替代型号)
    新项目,Linux上一键安装MySQL,Redis,Nacos,Minio
    ShardingSphere打造高性能架构模式
    DeFi借贷重新洗牌 透过协议变化能找到哪些新趋势?
    独立咖啡店如何有效经营?看懂十三个生存逻辑就成功了
    深度学习(part5)--深度学习框架Keras
    Docker安装RabbitMQ
  • 原文地址:https://blog.csdn.net/weixin_52190986/article/details/126921576