• MySQL完全备份与恢复


    MySQL完全备份与恢复

    数据备份的重要性

    image-20220810093633847

    备份的主要目的是灾难恢复,备份还可以测试应用、回滚数据修改、查询历史数据、审计等。
    而备份、恢复中,日志起到了很重要的作用

    数据库备份的分类

    从物理和逻辑角度分

    1、物理备份

    对数据库操作系统的物理文件(如数据文件、日志文件等)的备份

    物理备份的方法 :

    冷备份(脱机备份) :是在关闭数据库的时候进行的

    热备份(联机备份) :数据库处于运行状态,依赖于数据库的日志文件;

    温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。

    2、逻辑备份

    对数据库逻辑组件(如:表等数据库对象)的备份

    从数据库的备份策略角度,备份可分为

    ·完全备份:每次对数据库进行完整的备份
    ·差异备份:备份自从上次完全备份之后被修改过的文件
    ·增量备份:只有在上次完全备份或者增量备份后被修改的
    文件才会被备份

    image-20220810101151814

    常见的备份方法

    image-20220810101417480

    MySQL完全备份

    ■是对整个数据库、数据库结构和文件结构的备份
    ■保存的是备份完成时刻的数据库
    ■是差异备份与增量备份的基础

    ■优点

    ●备份与恢复操作简单方便

    ■缺点

    ●数据存在大量的重复
    ● 占用大量的备份空间
    ● 备份与恢复时间长

    差异备份

    备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。恢复数据时只需要恢复上次的完全备份与最佳的一次差异备份
    每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全备份的数据,再恢复差异备份的数据

    增量备份

    只有那些在上次完全备份或者增量备份后被修改的文件才会被备份以上次完整备份或上次增量备份的时间为时间点,仅备份期间内的数据变化,因而备份的数据量小,占用空间小
    ,备份速度快。但恢复时,需要从上一次的完整备份开始到最后一次增量备份之间的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失

    每次增量备份都是在备份在上一次完成全备份
    每次增量备份都是备份在上一次完全备份或者增量备份之后的数据,不会出现重复数据的情况,也不会占用额外的磁盘空间
    恢复数据,需要按照次序恢复完全备份和增量备份的数据

    备份方式的比较

    image-20220810151954956

    逻辑备份的策略(增、全、差异)
    如何选择逻辑备份策略(频率)
    合理值区间
    一周一次的全备,全备的时间需要在不提供业务的时间区间进行PM 10点 AM 5:00之间进行全备
    增量:3天/2天/1天一次增量备份
    差异:选择特定的场景进行备份
    一个处理(NFS)提供额外空间给与mysql服务器用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    数据库完全备份分类

    ■物理冷备份与恢复

    ●关闭MySQL数据库
    ●使用tar命令直接打包数据库文件夹
    ●直接替换现有MySQL目录即可

    ■mysqldump备份与恢复

    ●MySQL自带的备份工具,可方便实现对MySQL的备份
    ●可以将指定的库、表导出为SQL脚本
    ●使用命令mysql导入备份的数据

    MySQL日志管理

    MySQL的日志默认保存位置为:/usr/local/mysql/data
    配置文件位于:/etc/my.cnf文件中的**[mysqld]**内

    1、日志分类

    1.1错误日志

    用来记录当MySQL启动、停止或运行时发生的错误信息,默认开启(实现命令需要添加进去,并且重新启动数据库,一般来说生产不允许重启数据库)

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

    1.2通用查询日志

    用来记录MySQL的所有连接和语句,默认是关闭的

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

    1.3二进制日志

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

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

    1.4慢查询日志

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

    slow_query_log=ON
    slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
    long_query_time=5 单位时间为s,缺省时为10s
    设置超过5秒执行的语句被记录。
    
    • 1
    • 2
    • 3
    • 4

    慢查询日志也可用来查询哪些搜索的字段超时,可以选择是否需要增加索引,加快查询速度

    1.5中继日志

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

    2、日志配置

    修改配置文件

    vim /etc/my.conf

    #错误日志
    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
    
    
    #配置文件添加完后需要重启MySQL
    systemctl restart mysqld
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、日志查询

    登入MySQL数据库,查询日志是否开启

    #variables 表示变量
    #like 表示模糊查询
    %xxx  以xxx为结尾的字段,
    xxx%  以xxx为开头的字段,
    %xxx%  只要出现xxx字段的都会显示出来
    
    #查看通用查询日志是否开启
    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.1查询通用日志是否开启

    show variables like ‘general%’;
    
    • 1

    image-20220810145421858

    3.2查询二进制日志是否开启

    show variables like ‘log_bin%’;
    
    • 1

    image-20220810145639966

    3.3查看慢查询日志是否开启

    show variables like '%slow%';
    
    • 1

    image-20220810150307094

    show variables like ‘long_query_time’;
    
    • 1

    image-20220810150137768

    查询日志位置

    image-20220810151234129

    mysql-bin.000001
    #开启二进制日志时会产生一个索引文件及一个索引列表
    
    索引文件:记录更新语句
    索引文件刷新方式:
    1、重启mysq1的时候会更新索引文件,用于记录新的更新语句
    2、刷新二进制日志
    
    mysql-bin.index
    二进制日志文件的索引
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实验环节

    InnoDB存储引擎的数据库在磁盘上存储成三个文件:
    db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)
    
    • 1
    • 2

    准备环境

     create database kgc;
     use kgc;
    create table banji(id int(4) not null auto_increment,name  varchar(10) not null,age char(10) not null,hobby varchar(50),priimary key (id));
    insert into banji values(1,'zy',45,'哈哈');
     insert into banji values(2,'lyy',44,'姐姐');
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1、物理冷备份

    • 备份时数据库处于关闭状态,直接打包数据库文件
    • 备份速度快,恢复时也是最简单的
    1. #关闭mysql,备份data目录
    systemctl stop mysqld
    yum -y install xz
    cd /usr/local/mysql
     
    #压缩备份data目录
    tar Jcvf /opt/mysql_all_$(date +%F).tar.xz data/
     
    2. #登录mysql,删除school库 
    systemctl start mysqld.service 
    mysql -u root -p123123
     
     
    3. #解压之前备份的数据库data目录,不用删除原目录,会自动替换
    cd /opt
    ls
    cd /usr/local/mysql
    tar Jxvf /opt/mysql_all_2021-11-28.tar.xz -C ./
    
    
    4. #重启服务查看被删除的库
    systemctl restart mysqld
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1)关闭mysql,备份data目录

    img

    2)登录mysql,删除kgc库

    image-20220810163404481

    3)解压之前备份的数据库data目录,不用删除原目录,会自动替换

    image-20220810164843630

    4)重启服务,查看被删除的库

    image-20220810165134446

    2、专用备份工具mydump(温备份)

    1. 完全备份一个或多个完整的库(包括其中所有的表)
    #导出的就是数据库脚本文件
    mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql
    
    • 1
    • 2
    备份单个库
    mysqldump -u root -p123456 --databases school > /opt/mysql.bak/school.sql
    备份对个库
     mysqldump -u root -p123456 --databases school kgc > /opt/mysql.bak/school-kgc.sql
    备份所有的库
    mysqldump -uroot -p123456 --all-databases > /opt/mysql.bak/all.sql
    
    回复数据
    进入到mysql数据库
    source /备份路径/备份的文件名
    source /opt/mysql.bak/school-kgc.sql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1)进入数据库删除两个库

    image-20220810172115810

    image-20220810172212285

    2)查看一下库

    image-20220810172633790

    3)恢复库

    image-20220810172715432

    备份库中的部分表
    mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
    
    mysqldump -u root -p123456 kgc banji > /opt/mysql.bak/kgc-banji.sql
    
    回复数据
    进入到mysql数据库
    source /备份路径/备份的文件名
    source /opt/mysql.bak/school-kgc.sql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1)备份库中的表

    image-20220810173546812

    2)删除库中的表

    image-20220810173640496

    3)恢复库中的表

    image-20220810173840625

    4)查看恢复的表

    image-20220810173911191

    温备份第二种方法

    mysqldump -u root -p123456 --databases school > /opt/mysql.bak/school.sql
    
    #恢复school数据库
    mysql -u root -p < /opt/mysql.bak/school.sql
    
    • 1
    • 2
    • 3
    • 4

    1)备份一个库

    2)删除一个库

    image-20220810182625145

    3)恢复库

    image-20220810182650530

    4)再次查看一下库

    image-20220810182719598

    3、增量备份与恢复

    把二进制文件格式的数据导出成txt格式的文件来查看
    mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000003 > /opt/mysql-bin.000003.txt
    
    刷新二进制文件
    mysqladmin -u root -p flush-logs
    
    利用二进制文件恢复数据
    mysqlbinlog --no-defaults /opt/mysql.bak/mysql-bin.000004 | mysql -uroot -p
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1)完全备份表的数据

    mysqldump -uroot -p123456 ky20 zz > /opt/mysql.bak/ky20_zz.sql
    
    • 1

    image-20220811174742739

    2)刷新一下二进制文件,(形成隔断)

    mysqladmin -u root -p flush-logs
    
    • 1

    image-20220811154502164

    3)往表里的添加一些数据

    image-20220811174939762

    4)再次刷新一下二进制文件,把刚刚操作的数据保存在上面刷新的二进制文件里,也就是增量备份

    mysqladmin -u root -p flush-logs
    
    • 1

    image-20220811155309302

    5)删除一些数据,模拟数据丢失

    image-20220811155056692

    6)先恢复完全备份的表

    source /opt/mysql.bak/ky20_zz.sql;
    
    • 1

    image-20220811160137149

    7)利用二进制文件恢复刚刚的数据表

    mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000005 | mysql -uroot -p
    
    • 1

    image-20220811160159513

    断点恢复,基于位置点恢复

    1)完全备份表的数据

    mysqldump -uroot -p123456 ky20 zz > /opt/mysql.bak/ky20_zz.sql
    
    • 1

    2)刷新一下二进制文件,形成隔断,让接下来的操作都保存在这个二进制文件里

    mysqladmin -u root -p flush-logs
    
    • 1

    image-20220811163840715

    3)往表里添加数据

    image-20220811164128706

    image-20220811164201289

    4)刷新二进制文件,为了把上面的操作保存在000007的二进制文件中

    mysqladmin -u root -p flush-logs
    
    • 1

    image-20220811164432958

    5)删除一些表里的数据,模拟数据丢失

    image-20220811170812077

    6)先恢复完全备份的表

    source /opt/mysql.bak/ky20_zz.sql;
    
    • 1

    image-20220811160137149

    7)利用节点号来回复数据

    mysqlbinlog --no-defaults --stop-position='1234' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p
    
    数据恢复到节点号为1234之前的所有数据
    用stop时,尽量用commit下面的节点号
    
    • 1
    • 2
    • 3
    • 4

    image-20220811183549442

    image-20220811185503923

    1)数据再次恢复到被删的状态

    image-20220811190522517

    2)利用二进制恢复id号为8位起始的数据

    mysqlbinlog --no-defaults --start-position='692' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p
    
    用start时尽量用bgein上面的节点号
    
    • 1
    • 2
    • 3

    image-20220811191059358

    1)数据再次恢复到被删的状态

    image-20220811190522517

    2)利用二进制恢复id号6-8的数据

    mysqlbinlog --no-defaults --start-position='291' --stop-position='961' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p
    
    
    • 1
    • 2

    image-20220811191538399

    基于时间点来恢复

    1)同样数据恢复到被删的状态

    image-20220811190522517

    2)利用时间点来恢复数据

    mysqlbinlog --no-defaults --stop-datetime='2022-08-11 16:40:54' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p
    
    仅恢复到16:40:54分之前的数据
    和节点号恢复基本一样
    stop同样可以换成start用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ]

    1)数据再次恢复到被删的状态

    [外链图片转存中…(img-cvs7f0MO-1660485291856)]

    2)利用二进制恢复id号6-8的数据

    mysqlbinlog --no-defaults --start-position='291' --stop-position='961' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p
    
    
    • 1
    • 2

    [外链图片转存中…(img-6G8VbzH8-1660485291856)]

    基于时间点来恢复

    1)同样数据恢复到被删的状态

    [外链图片转存中…(img-G34q4YKW-1660485291857)]

    2)利用时间点来恢复数据

    mysqlbinlog --no-defaults --stop-datetime='2022-08-11 16:40:54' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p
    
    仅恢复到16:40:54分之前的数据
    和节点号恢复基本一样
    stop同样可以换成start用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20220811193057645

  • 相关阅读:
    Springboot中国古代史在线学习网站 毕业设计-附源码260839
    ZooKeeper面试题
    java-net-php-python-ssm高校学生学业分析及预警系统查重PPT计算机毕业设计程序
    三个数的最大积(贪心法)
    通过阿里云宕机这件事,来看国内程序员的畸形职场文化
    宽占满整张纸
    大道至简,凯里亚德酒店成为酒店投资圈万众瞩目的“新”星
    机器人冗余自由度优化过程中的零空间概念
    LeetCode216. Combination Sum III
    Window function 优化速记
  • 原文地址:https://blog.csdn.net/weixin_68579466/article/details/126337030