一、数据备份的重要性

在生产环境中,数据的安全性至关重要

任何数据的丢失都可能产生严重的后果

造成数据丢失的原因

·程序错误

·人为操作错误

·运算错误

·磁盘故障

·灾难(如火灾、地震等)

二、数据库备份的分类

从物理与逻辑的角度,备份可分为

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

物理备份方法:

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

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

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

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

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

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

·差异备份:备份自从上次完全备份之后被修改过的文件

·增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份

三、常见的备份方法

物理冷备

·备份时将数据库处于关闭状态,直接打包数据库文件

·备份速度快,恢复时也是最简单的

专用备份工具mydump或mysqlhotcopy

·mydump常用的逻辑备份工具

·mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

启用二进制日志进行增量备份

·进行增量备份,需要刷新二进制日志

第三方工具备份

·免费的MySQL热备份软件Percona XtraBackup

四、MySQL完全备份

是对整个数据库、数据库结构和文件结构的备份

保存的是备份完成时刻的数据库

是差异备份与增量备份的基础

优点:

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

缺点:

·数据存在大量的重复

·占用大量的备份空间

·备份与恢复时间长

数据库完全备份分类

·物理冷备份与恢复

①关闭MySQL数据库

②使用tar命令直接打包数据库文件夹

③直接替换现有MySQL目录即可

·mysqldump备份与恢复

①MySQL自带的备份工具,可方便实现对MySQL的备份

②可以将指定的库、表导出为SQL脚本

③使用命令mysql导入备份的数据

五、MySQL物理冷备份及恢复

# 数据库创建数据库和表

mysql> use lx;

mysql> create table aaa(id char(24) not null,name varchar(36) not null,score int(3) not null,primary key(id));

mysql> insert into aaq(id,name,score) values(1,'lisi',88),(2,'zhangsan',60),(3,'wangwu',78);

mysql> select * from aaa;

# 物理冷备份

systemctl stop mysqld           #冷备份一定要关闭数据库服务

mkdir /backup

tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data

systemctl start mysqld

#误删除操作

mysql -uroot -p

mysql> delete from aaa where name='zhangsan';

mysql> select * from aaa;

#恢复数据库

systemctl stop mysqld

mkdir /bak

mv /usr/local/mysql/data /bak

mkdir /restore

tar zxf /backup/mysql_all-$(date +%F).tar.gz -C /restore

mv /restore/usr/local/mysql/date /usr/local/mysql

systemctl start mysqld

#查看数据

mysql -uroot -p

mysql> use test;

mysql> select * from aaa;

六、mysqldump备份和恢复

mysqldump -u root -p --all-databses > all-data-$(date +%F).sql     ###备份所有数据库

mysqldump -u root -p -databases auth mysql > auth-mysql.sql      ###备份auth和mysql库

mysqldump -u root -p auth > auth-$(data +%F).sql                        ###备份auth数据库

mysqldump -u root -p mysql user > mysql-user-$(date +%F).sql   ###备份mysql的user表

mysqldump -u root -p -d mysql user > /tmp/desc-mysql-user.sql   ###备份mysql库user表的结构

方法一:

mysqldump -u root -p test > test-$(date +%F).sql

mysql> drop database test;

mysql> create database test2; ###建立空库

mysql -u root -p test2 < test-2020-11-04.sql

方法二:

mysqldump -u root -p test > test-$(date +%F).sql

mysql> drop database test;

mysql> create database test2;

mysql> use test2;

mysql> source /root/test-2020-11-04.sql;

七、MySQL增量备份与恢复

MySQL增量备份

使用mysqldump进行完全备份存在的问题

·备份数据中有重复数据

·备份时间与恢复时间过长

MySQL增量备份是自上一次备份后增加/变化的文件或者内容

特点

·没有重复数据,备份量不大,时间短

·恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复

MySQL数据库增量恢复

一般恢复

将所有备份的二进制日志内容全部恢复

断点恢复

基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作

可以基于精准的位置跳过错误的操作

基于时间点恢复

跳过某个发生错误的时间点实现数据恢复

增量恢复的方法

一般恢复

mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p

基于位置的恢复

恢复数据到指定位置(到错误操作前的最后一次正确操作)

mysqlbinlog --stop-position=‘操作id’ 二进制日志 | mysql -u 用户名 -p密码

从指定的位置开始恢复数据(跳过错误操作后的第一次正确操作)

mysqlbinlog --start-position=‘操作id’ 二进制日志 | mysql -u 用户名 -p密码

基于时间点恢复

跳过某个发生错误的时间点实现数据恢复

恢复数据到指定时间(停止错误操作的时间)

mysqlbinlog --stop-datetime=‘错误时间’ 二进制日志 | mysql -u 用户名 -p密码

从指定的位置开始恢复数据(跳过错误操作后的第一次正确操作)

mysqlbinlog --start-datetime=‘正确操作时间’ 二进制日志 | mysql -u 用户名 -p密码

时间点恢复:

[root@server1 ~]# mkdir -p /opt/bak_sql

[root@server1 ~]# mysqldump -uroot -p test2 > /opt/bak_sql/test2-$(date +%F).sql; ###完整备份

[root@server1 ~]# vi /etc/my.cnf

[mysqld]

log_bin=/usr/local/mysql/data/mysql_bin ###开启增量备份

[root@server1 ~]# systemctl restart mysqld

[root@server1 ~]# mysqladmin -uroot -p flush-logs ###将二进制日志更新,产生新的日志文件

[root@server1 ~]# cd /usr/local/mysql/data/

[root@server1 data]# ll ###查询增量备份结果

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000002 ###查询该二进制日志内容是否正确

mysql> insert into aa values(4,'sisi',90); ###正确操作

mysql> delete from aa where name='zhangsan'; ###错误操作

mysql> insert into aa values(5,'haha',89); ###正确操作

mysql> select * from aa;

+----+--------+-------+

| id | name   | score |

+----+--------+-------+

|  1 | lisi   | 88    |

|  3 | wangwu | 78    |

|  4 | sisi   | 90    |

|  5 | haha   | 89    |

+----+--------+-------+

4 rows in set (0.01 sec)

[root@server1 ~]# mysqladmin -u root -p flush-logs; ###将二进制日志更新,产生新的日志文件

[root@server1 ~]# cd /usr/local/mysql/data/

[root@server1 data]# ll ###查询增量备份结果

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003 ###查询该二进制日志内容是否正确

###还原时间点的步骤

mysql> use test2;

mysql> drop table aa; ###先删掉坏的那张表

[root@server1 ~]# mysql -u root -p test2 < /opt/bak_sql/test2-2020-10-24.sql ###还原完全备份的数据库

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000002 ###查询该二进制日志内容

# at 613

#201024  0:55:25 server id 1  end_log_pos 665 CRC32 0xa674c8df  Delete_rows: table id 219 flags: STMT_END_F

### DELETE FROM `test2`.`aa`

### WHERE

###   @1=2

###   @2='zhangsan'

###   @3='60'

# at 665

#201024  0:55:25 server id 1  end_log_pos 696 CRC32 0x297a966a  Xid = 14

COMMIT/*!*/;

# at 696

#201024  0:55:48 server id 1  end_log_pos 761 CRC32 0x11834792  Anonymous_GTID  last_committed=2        sequence_number=3       rbr_only=yes

/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;

SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;

# at 761

#201024  0:55:48 server id 1  end_log_pos 834 CRC32 0x28de3d38  Query   thread_id=4     exec_time=0     error_code=0

SET TIMESTAMP=1603526148/*!*/;

BEGIN

/*!*/;

# at 834

#201024  0:55:48 server id 1  end_log_pos 886 CRC32 0xa67e20b9  Table_map: `test2`.`aa` mapped to number 219

# at 886

#201024  0:55:48 server id 1  end_log_pos 934 CRC32 0x8a2c0765  Write_rows: table id 219 flags: STMT_END_F

### INSERT INTO `test2`.`aa`

### SET

###   @1=5

###   @2='haha'

###   @3='89'

[root@server1 ~]# mysqlbinlog --no-defaults --stop-datetime='2020-10-24  0:55:25' /usr/local/mysql/data/mysql_bin.000002 | mysql -u root -p ###停止错误的时间

[root@server1 ~]# mysqlbinlog --no-defaults --start-datetime='2020-10-24  0:55:48' /usr/local/mysql/data/mysql_bin.000002 | mysql -u root -p ###开始正确的时间

mysql> select * from aa; ###查看是否复原

+----+----------+-------+

| id | name     | score |

+----+----------+-------+

|  1 | lisi     | 88    |

|  2 | zhangsan | 60    |

|  3 | wangwu   | 78    |

|  4 | sisi     | 90    |

|  5 | haha     | 89    |

+----+----------+-------+

5 rows in set (0.00 sec)

位置点恢复:

mysql> use test2;

mysql> delete from aaa where name='lisi'; ###误操作

mysql> delete from aaa where name='haha'; ###误操作

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003 ###查询该二进制日志内容

...省略内容

# at 2168

#201024  1:26:20 server id 1  end_log_pos 2220 CRC32 0x5a192cfd         Table_map: `test2`.`aa` mapped to number 221

# at 2220

#201024  1:26:20 server id 1  end_log_pos 2268 CRC32 0x30f35bdf         Delete_rows: table id 221 flags: STMT_END_F

### DELETE FROM `test2`.`aa`

### WHERE

###   @1=1

###   @2='lisi'

###   @3='88'

# at 2268

#201024  1:26:20 server id 1  end_log_pos 2299 CRC32 0xe8fa9bd8         Xid = 123

COMMIT/*!*/;

# at 2299

#201024  1:26:26 server id 1  end_log_pos 2364 CRC32 0xfa901848         Anonymous_GTID  last_committed=9        sequence_number=10  rbr_only=yes

/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;

SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;

# at 2364

#201024  1:26:26 server id 1  end_log_pos 2437 CRC32 0x04379db1         Query   thread_id=12    exec_time=0     error_code=0

SET TIMESTAMP=1603527986/*!*/;

BEGIN

/*!*/;

# at 2437

#201024  1:26:26 server id 1  end_log_pos 2489 CRC32 0xa0c3b6c1         Table_map: `test2`.`aa` mapped to number 221

# at 2489

#201024  1:26:26 server id 1  end_log_pos 2537 CRC32 0xd7509926         Delete_rows: table id 221 flags: STMT_END_F

### DELETE FROM `test2`.`aa`

### WHERE

###   @1=5

###   @2='haha'

###   @3='89'

# at 2537

#201024  1:26:26 server id 1  end_log_pos 2568 CRC32 0xb7b17eee         Xid = 124

...省略内容

[root@server1 ~]# mysqlbinlog --no-defaults --stop-position='2168' /usr/local/mysql/data/mysql_bin.000003 | mysql -u root -p ###上一次操作正确的位置点停止

[root@server1 ~]# mysqlbinlog --no-defaults --start-position='2537' /usr/local/mysql/data/mysql_bin.000003 | mysql -u root -p ###下一次操作正确的位置点开始

mysql> select * from aa;

+----+----------+-------+

| id | name     | score |

+----+----------+-------+

|  1 | lisi     | 88    |

|  2 | zhangsan | 60    |

|  3 | wangwu   | 78    |

|  4 | sisi     | 90    |

|  5 | haha     | 89    |

+----+----------+-------+

5 rows in set (0.00 sec)

mysql数据库怎么冷备份恢复_MySQL数据库的备份与恢复相关推荐

  1. linux mysql 实战_Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06

    Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06 视频教程学习地址 Oracle/MySQL数据库学习专用QQ群:336282998.189070296 学完风哥本课程能熟悉 ...

  2. mongodb数据库恢复 mongo数据库无法启动恢复 mongodb数据库断电数据恢复

    mongodb数据库恢复 mongo数据库无法启动恢复 mongodb数据库断电数据恢复 数据类型 mongodb 3.x 数据容量 140 GB 故障类型 服务器断电导致WiredTiger.wt文 ...

  3. mysql数据库undo日志恢复_MySQL的undo/redo日志和binlog日志,以及2PC

    发现自己的知识点有点散,今天就把它们连接起来,好好总结一下. 一.undo log.redo log.binlog的定义和对比 定义和作用 所在架构层级 日志形式 所在文件和默认名称,组织结构 是否缓 ...

  4. mysql中数据如何备份_mysql数据库如何进行备份和恢复

    一.确保mysql开启了binlog日志功能 在/etc/my.cnf文件里的[mysqld]区块添加: #这个是存储的位置为mysql配置文件的位置 log-bin=mysql-bin 然后重启my ...

  5. mysql 从库数据损坏_MySQL数据库中数据损坏恢复全过程

    MySQL数据库中数据损坏恢复全过程 前几天因为MySQL数据库部分数据损坏原因,我尝试了下恢复数据,之后整理以下文档,供各位参考,以备各位同事以后如有类似问题,可以少走些弯路,尽快解决问题. 环境: ...

  6. mysql数据库比对视频教程_MySQL数据库全学习实战视频教程(27讲 )

    一)mySQL数据库简介:MySQL属于关系型数据库,是当前最流行的关系型数据库管理系统之一,在WEB项目使用方面,MySQL是最好的 RDBMS应用软件. 二)本mySQL数据库视频教程目录如下:  ...

  7. mysql数据库表格怎么建立_mysql数据库表格怎么建立

    我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ...

  8. mysql 数据库还原后没有_MySQL数据库的备份还原至最新状态

    模拟数据库在某次备份后但未达到下次备份时间中,被意外删除的数据 此处恢复hello数据库和里面的students表 使用工具:均为mariadb-server自带 1 mysqldump 2 mysq ...

  9. mysql数据库建新分区_mysql数据库分区

    日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分 ...

最新文章

  1. (流式、lambda、触发器)实时处理大比拼 - 物联网(IoT)\金融,时序处理最佳实践
  2. ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)
  3. Spark分布式集群的搭建和运行
  4. 测试基础-03-用例设计方法:案例讲解
  5. SQL基础语句汇总-学习
  6. 黑苹果hackintosh wifi驱动安装
  7. 慢速DoS攻击工具slowhttptest(网站压力测试工具)
  8. 2023年北京航空航天大学材料与化工(金属方向)考研成功经验
  9. 华为2019年4月10日实习生笔试题
  10. Velodyne 16线三维激光雷达
  11. java公路赛_为什么Java公路车总被黑?
  12. Excel中提取单元格中的部分内容或单元格中的数字公式大全(提取数字,提取前几位,提取指定文字之间的内容等等)
  13. 前端 css实现文字竖向排列
  14. 怎么在电脑上登陆多个微信
  15. ENDNOTE使用方法(转发)
  16. Python的5大就业方向
  17. c#实现qq音乐爬虫
  18. docker安装及设置镜像源-zls
  19. 计算机清理垃圾文件丢失怎么恢复,垃圾箱清空了怎么恢复
  20. hadoop运维--开启垃圾箱

热门文章

  1. 读王垠《一种新的操作系统设计》
  2. 基于树的模型的更好功能
  3. 服务器上的东西丢了怎么找回来,东西丢了不要急,教你用周易古诀找回失物!...
  4. time(),date(),microtime()三者的区别
  5. (已解决)win10电脑开机自动开启word文档
  6. 研究者发现DALL-E 2在用自创语言生成图像:全文黑话,人类都看不懂...
  7. 反编译工具java知乎_GDA反编译器更新至3.66:支持污点传播分析、方法签名、python脚本...
  8. 从「富爸爸现金流」游戏中总结的理财四条
  9. weautomate rpa开发心得
  10. 爬取链家二手挂单房屋 - 匹配百度地图API坐标 - python出地图【2】(end) echarts调用百度地图画自己喜欢的底图,最终python出地图