数据库备份的重要性

  1. 提高系统的高可用性和灾难可恢复性,在数据库系统崩溃时,没有数据备份就没法找到数据。
  2. 使用数据库备份还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案。
  3. 没有数据库就没有一切,数据库备份是一种防范灾难的强力手段。

数据库备份的分类

  1. 物理备份:指对数据库操作系统的物理文件(例如数据文件、日志文件等)的备份。物理备份游客分为脱机备份(冷备份)和联机备份(热备份)。
    冷备份:在关闭数据库时进行的备份操作,能够较好地保证数据库的完整性。
    热备份:在数据库运行状态中进行操作,这种备份方法依赖于数据库的日志文件。
  2. 逻辑备份:指对数据库逻辑组件(如表等数据库对象)的备份。从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份。
    完全备份:每次对数据库进行完整的备份。可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。
    差异备份:备份那些自从上次完全备份之后被修改过的文件,只备份数据库的部分内容。
    增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。

完全备份(在linux模式中进行备份操作)

完全物理备份

使用tar打包文件夹备份

  • 数据库压缩时会使用压缩率较大的xz格式压缩。

    rpm -q xz    //检查xz软件包是否安装
    yum -y install xz //安装xz软件包
  • 对数据库文件夹(/usr/local/mysql/data/)进行打包操作
    tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/
    //备份数据库文件夹,并以年月日的形式命名
    ls /opt/
    mysql-2018-07-02.tar.xz

  • 对数据库文件进行恢复操作
    只需将数据库文件的压缩包,解压缩即可,即使整个/data/目录都丢失仍可找回
    mkdir /abc
    tar Jxf mysql-2018-07-03.tar.xz -C /abc/

    完全逻辑备份

    使用mysqldump工具备份

  • 备份某个数据库
    mysqldump -u root -p stady > /opt/stady.sql
    //备份stady库到/opt目录下,-p之后可跟密码,也可不写。不写就在回车之后输入密码验证。 **备份文件后缀都为.sql,前面名称见名知意即可**

  • 查看备份文件的内容
    1. 备份多个数据库

      mysqldump -u root -p --databases mysql stady > /opt/mysql-stady.sql

    2. 备份所有数据库
      mysqldump -u root -p --opt --all-databases > /opt//all.sql
    3. 备份数据库中的表
      mysqldump -u root -p stady info > /opt/stady-info.sql   //险些库名,再接表名
    4. 备份数据库的表结构
      mysqldump -u root -p -d stady info > /opt/decribe-info.sql
      // -d 库名+表名

      数据恢复

      登陆MySQL,使用source命令恢复

  • 恢复”备份数据库中的表“步骤中的info表
    [root@centos7-6 /]# mysql -u root -p
    Enter password:
    ··· //省略部分内容
    mysql> use stady; //切换到库
    Database changed
    mysql> drop table info; //删除info表
    Query OK, 0 rows affected (0.02 sec)
    mysql> show tables; //查看库中表
    Empty set (0.00 sec) //库中为空
    mysql> source /opt/stady-info.sql //恢复info表,格式是source+备份文件路径和文件名称
    Query OK, 0 rows affected (0.02 sec)
    ··· //省略部分内容
    mysql> show tables; //查看库中表
    +-----------------+
    | Tables_in_stady |
    +-----------------+
    | info | //info表已经成功恢复
    +-----------------+
    1 row in set (0.00 sec)
  • 使用mysql命令恢复表
    [root@centos7-6 /]# mysql -u root -p
    Enter password:
    ··· //省略部分内容
    mysql> use stady; //切换到库
    Database changed
    mysql> drop table info; //删除info表
    Query OK, 0 rows affected (0.02 sec)
    mysql> show tables; //查看库中表
    Empty set (0.00 sec) //库中为空
    mysql> quit //退出数据库,切换到linux
    Bye
    [root@centos7-6 /]# mysql -u root -p stady < /opt/stady-info.sql //在linux环境中恢复
    Enter password:
    [root@centos7-6 /]# mysql -u root -p //进入数据库查看
    Enter password:
    ··· //省略部分内容
    mysql> use stady;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    mysql> show tables;
    +-----------------+
    | Tables_in_stady |
    +-----------------+
    | info | //info表已恢复
    +-----------------+
    1 row in set (0.00 sec)

    恢复库和恢复表的方式相同,但在恢复数据表时要注意,如果备份文件中只备份了表文件,此时mysql中又没有库时,若直接恢复,会失败,必须先创建库,然后再进行恢复。

    增量备份

    在MySQL数据库中创建stady库,创建info表,并插入数据

    mysql> use stady;
    mysql> select * from info;
    +----------+-------+
    | name | score |
    +----------+-------+
    | zhangsan | 80.00 |
    | lisi | 90.00 |
    +----------+-------+
    2 rows in set (0.00 sec)
  • 开启二进制日志
    vim /etc/my.cnf
    log-bin=mysql-bin //在[mysqld]段插入该语句
    systemctl restart mysqld.service //重启mysql服务,会在/data/目录下生成新的日志文件(空文件)


  • 使用mysqldump备份stady库
    mkdir /backup
    mysqldump -u root -p stady > /backup/stady.sql
    mysqladmin -u root -p flush-logs //刷新生成新的日志文件,存在01中,新存在的02为空文件

  • 插入新数据,生成新的增量日志文件
    mysql> insert into info (name,score) values ('chen',90);//进入数据库,向表中插入数据
    mysqladmin -u root -p flush-logs //刷新生成新的增量文件,增量备份保存在02中
    mysql> insert into info (name,score) values ('chen01',96);//再次进入数据库,向表中插入数据
    mysql> select * from info;
    +----------+-------+
    | name | score |
    +----------+-------+
    | zhangsan | 80.00 |
    | lisi | 90.00 |
    | chen | 90.00 |
    | chen01 | 96.00 |
    +----------+-------+
    4 rows in set (0.00 sec)
    mysqladmin -u root -p flush-logs //再次刷新,增量备份保存在03中

    增量恢复

  • 模拟数据丢失,删除新添加的两条记录
    [root@centos7-6 data]# mysql -u root -p
    Enter password:
    mysql> use stady;
    Database changed
    mysql> delete from info where name='chen';
    Query OK, 1 row affected (0.00 sec)
    mysql> delete from info where name='chen01';
    Query OK, 1 row affected (0.00 sec)
    mysql> select * from info;
    +----------+-------+
    | name | score |
    +----------+-------+
    | zhangsan | 80.00 |
    | lisi | 90.00 |
    +----------+-------+
    2 rows in set (0.00 sec)
  • 使用mysqlbinlog命令,恢复数据
    [root@centos7-6 data]# mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p
    Enter password: //输入密码确认恢复数据
    [root@centos7-6 data]# mysql -u root -p
    Enter password: //输入密码登陆系统
    mysql> use stady;
    Database changed
    mysql> select * from info;
    +----------+-------+
    | name | score |
    +----------+-------+
    | zhangsan | 80.00 |
    | lisi | 90.00 |
    | chen | 90.00 |//增量备份的02数据成功恢复
    +----------+-------+
    3 rows in set (0.00 sec)

    使用mysqlbinlog查看增量备份文件的内容

    mysqlbinlog --no-defaults --base64-output-decode-rows -v /usr/local/mysql/data/mysql-bin.000002
    //--base64-output=decode-rows使用64位编码机制解码,按行读取 -v 显示出来
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    ··· //省略部分内容
    # at 345
    #180703 21:12:11 server id 1 end_log_pos 389 CRC32 0xb0bc2cb1 Write_rows: table id 118 flags: STMT_END_F
    ### INSERT INTO `stady`.`info`
    ### SET
    ### @1='chen'
    ### @2=90.00
    ···//省略部分内容

    在开启二进制日志之后就会在/data/目录下生成空的mysql-bin.000001文件,在使用该命令mysqladmin -u root -p flush-logs 后会将增量备份写入mysql-bin.000001,同时生成一个新的mysql-bin.000002空文件,等待下次刷新写入,同时再创建mysql-bin.000003……

    增量断点恢复

    模拟环境

    模拟插入数据出现误操作,在插入两条数据的同时,删除了一条正确的数据。

    [root@centos7-6 data]# mysql -u root -p
    Enter password:
    mysql> use stady;
    Database changed
    mysql> insert into info (name,score) values ('test01',88);
    Query OK, 1 row affected (0.00 sec)
    mysql> delete from info where name='chen';
    Query OK, 1 row affected (0.00 sec)
    mysql> insert into info (name,score) values ('test02',88);
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from info;
    +----------+-------+
    | name | score |
    +----------+-------+
    | zhangsan | 80.00 |
    | lisi | 90.00 |
    | test01 | 88.00 |
    | test02 | 88.00 |
    +----------+-------+
    4 rows in set (0.00 sec) //插入了两条test01和test02,但是chen被操作删除
    mysql> quit //退出数据库
    Bye
    [root@centos7-6 data]# mysqladmin -u root -p flush-logs //刷新生成新的增量文件,保存在04中
    Enter password:

    增量时间节点恢复

  • 解码导出增量备份文件,便于查看和做恢复
    mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004 > /backup/info.txt
    cd /backup

    记录错误操作的开始时间,以及正确操作的开始时间,恢复时跳过该时段的操作。

  • 根据时间点恢复被误操作的数据
    mysql> drop table info;   //删除被误操作的表
    mysql -u root -p stady < /backup/stady.sql //恢复完全备份的stady库
    mysqlbinlog --no-defaults --stop-datetime='2018-07-03 21:57:08' /usr/local/mysql/data/mysql-bin.000004 | mysql -u root -p //恢复误操作前的内容
    mysqlbinlog --no-defaults --start-datetime='2018-07-03 21:57:14' /usr/local/mysql/data/mysql-bin.000004 | mysql -u root -p //恢复误操作之后的内容
  • 根据位置标记号恢复数据
    mysql> drop table info;   //删除被误操作的表
    mysql -u root -p stady < /backup/stady.sql //恢复完全备份的stady库
    mysqlbinlog --no-defaults --stop-position='1408' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p
    mysqlbinlog --no-defaults --start-position='1674' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p

    数据完成恢复

mysqldump冷备份的更多相关文章

  1. Mysql实战之数据备份

    author:JevonWei 版权声明:原创作品 blog:http://119.23.52.191/ --- 数据备份和恢复 mysqldump 冷备份单库(不会创建新库,需要手动创建并指定导入数 ...

  2. mysql备份工具 :mysqldump mydumper Xtrabackup 原理

    备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...

  3. MariaDB/MySQL备份和恢复(一):mysqldump工具用法详述

    本文目录:1.备份分类2.备份内容和备份工具3.mysqldump用法详述 3.1 语法选项 3.1.1 连接选项 3.1.2 筛选选项 3.1.3 DDL选项 3.1.4 字符集选项 3.1.5 复 ...

  4. MySQL数据库备份工具mysqldump的使用(转)

    说明:MySQL中InnoDB和MyISAM类型数据库,这个工具最新版本好像都已经支持了,以前可能存在于MyISAM的只能只用冷备份方式的说法. 备份指定库: mysqldump -h127.0.0. ...

  5. MYSQL5.6学习——mysqldump备份与恢复

    MYSQL备份 冷备份:停止服务进行备份,即停止数据库的写入 热备份:不停止服务进行备份(在线) l  mysql的MyIsam引擎只支持冷备份,InnoDB支持热备份,原因: InnoDB引擎是事务 ...

  6. mysqldump的用法

    1.mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象.它也有 insert 语句来使用数据构成表. mysqldump可产生两 ...

  7. Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)

    备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...

  8. MySQL/MariaDB数据库的冷备份和还原

    MySQL/MariaDB数据库的冷备份和还原 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL/MariaDB数据库的备份和还原概述 1>.为什么要备份 为了 ...

  9. 数据库单,多,全库、冷热备份思路及备份与还原(mysqldump)

    热备份:服务开启状态下进行备份, 冷备份:服务关闭状态进行备份, 冷备份 数据库原有内容如下: MariaDB [(none)]> show databases;+--------------- ...

随机推荐

  1. lumen、laravel问题汇总

    框架报500 1.chmod 777 -R storage 将日志目录权限设置下. 2.修改fastcgi,将代码目录包含进去. fastcgi_param PHP_ADMIN_VALUE " ...

  2. Java之JNDI注入

    Java之JNDI注入 About JNDI 0x01 简介 JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JND ...

  3. 【JavaScript实用技巧(二)】Js操作DOM(由问题引发的文章改版,新人大佬都可)

    [JavaScript实用技巧(二)]Js操作DOM(由问题引发的文章改版,新人大佬都可!) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人 ...

  4. [啃书] 第1篇 - 输入输出/变量类型/math函数

    啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...

  5. (五)MySQL函数

    5.1  常用函数 5.2  聚合函数(常用) 函数名称 描述 COUNT() 计数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 ....   ....   想查询一 ...

  6. 25.A Famous Music Composer

    描述 Mr. B is a famous music composer. One of his most famous work was his set of preludes. These 24 p ...

  7. hbuilder中webview调试console.log无法输出日志的问题

    遇到这个问题的亲,肯定是用的模拟器来测试的,其实你只要换成真机测试就能打印了,前提是安卓系统. 有问题欢迎留言,如果你觉得这个文章对你有帮助,就请点个赞吧!

  8. thinkphp5 目录结构

    /*    ├─application           应用目录    │  ├─common             公共模块目录(可以更改)    │  ├─module_name       ...

  9. Java设计模式之(二)——工厂模式

    1.什么是工厂模式 Define an interface for creating an object,but let subclasses decide which class toinstant ...

  10. Python实战:截图识别文字,过万使用量版本!(附源码!!)

    前人栽树后人乘凉,以不造轮子为由 使用百度的图片识字功能,实现了一个上万次使用量的脚本. 系统:win10 Python版本:python3.8.6 pycharm版本:pycharm 2021.1. ...