MySQL全面瓦解30:备份与恢复
1 为什么需要数据库备份
- 灾难恢复:当发生数据灾难的时候,需要对损坏的数据进行恢复和还原
- 需求的变更或者回滚:当需求发生变更,或者需要回滚到之前的版本时,数据库备份也显得很重要。
- 审计:需要知道某一个阶段的数据或者Schema的实际情况
- 测试:将实际的生产环境的数据导入到本地备份为测试数据,来验证新功能,可以省去很多麻烦。
2 备份需要考虑的几个关键点
- 恢复点目标(PRO):可以容忍丢失多少数据
- 恢复时间目标(RTO):需要等待多久将数据恢复
- 恢复的时候是需要持续提供服务 还是 停机恢复。
- 需要恢复的内容:整个服务器,多库多表,单库单表,或是特定的事务或语句。
3 备份方案
3.1 离线备份和在线备份
离线备份:就是传统意义上的cold backup(冷备份):需要关闭MySQL服务,读写请求均不允许状态下进行,这种模式下数据损坏和不一致性风险最小。
半离线备份:也就是我们说的warm backup(温备份): MySQL服务不关闭,但只开放了Read操作,关闭了Write操作。
在线备份:也就是hot backup(热备份):在数据备份的同时,MySQL业务持续进行中,仅限于InnoDB引擎。
3.2 逻辑备份和物理备份
3.2.1 逻辑备份:导出数据库表的定义和数据
逻辑备份有如下优点:
- 恢复非常简单
- 可以通过网络来备份和恢复
- 备份的结果为ASCII文件,可以编辑
- 与存储引擎无关
- 非常灵活,可以使用mysqldump的工具提供很多可选项。
逻辑备份的缺点:
- 必须由数据库服务器来完成备份和恢复过程
- 备份结果占据更多的空间:逻辑备份在某些场景下比数据库文件本身还要大
- 精度问题,无法保证还原出来的数据强一致
- 还原时间长:还原之后,加载注释语句,转换存储格式,重建索引都需要消耗一定时间
3.2.2 物理备份:直接复制原数据文件
物理备份的优点:
- 备份和恢复操作都比较简单,且能够跨平台,操作系统和MySQL版本。
- 恢复速度快,都是基于文件的,复制到对应的目的地即可,InnoDB需要停止数据库服务,有额外的动作。
- 步骤更少:不需要执行重新生成数据和重建索引的动作,效率提升。
物理备份的缺点:
- InnoDB备份的原始文件往往比逻辑备份的大很多,空间要求大。
3.3 根据要备份的数据集合的范围
- 完全备份:full backup,备份整个数据库信息。
- 增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,需与完全备份配合使用。一般来说增量频率高,备份频率也高。
- 差异备份:differential backup 上次完全备份以来改变了的数据。
- 建议的恢复策略:
- 完全+增量+二进制日志
- 完全+差异+二进制日志
4 备份的内容主要有哪些?
- 数据:基础数据。
- 日志:包含 二进制日志 和 InnoDB事务日志 等。
- 配置信息:包括服务器配置 和 复制相关的配置(主从复制中的中继日志和日志索引文件等)。
- 代码:存储过程、函数、触发器、视图等
- 选定的OS文件:入UNIX服务器上的 cron任务、用户和组的配置、管理的脚本、sudo规则等。
5 数据备份和数据恢复方案介绍
5.1 输出outfile文件
使用 select into outfile
方式实现数据的备份和还原
具体的操作步骤如下:
# 选择对应的数据库
mysql> use attend;
Database changed
# 查询需要备份的数据
mysql> select * from userinfo where id < 10000;
+----+----------+------------------+---------+
| id | usercode | username | usersex |
+----+----------+------------------+---------+
| 1 | 374532 | 翁智华_attend | 1 |
| 2 | 123456 | 小度 | 0 |
+----+----------+------------------+---------+
2 rows in set (0.01 sec)
# 选择备份的数据(可以精确条件),应该有两条数据,注意备份的地址具备write权限
mysql> select * from userinfo where id < 10000 into outfile '/Users/Brand/Downloads/tmp/userinfo.txt' ;
# 检查文件是否存在
brand@MacBook-Pro ~ % cd /Users/Brand/Downloads/tmp/
# 因为它是文本模式,所以我们使用 load data infile 恢复,并且在恢复之前先删除掉要恢复的数据,做个测试
mysql> delete from userinfo where id < 10000;
mysql> load data infile '/Users/Brand/Downloads/tmp/userinfo.txt' into table userinfo;
5.2 使用工具进行备份与还原
可以使用类似 mysqldump工具 或者 mysqlhotcopy工具对数据进行备份和还原,也可以使用免费的热备份软件 Percona XtraBackup。
这边以 mysqldump 为例子演示温备的实现:
5.2.1 备份基本语法
mysqldump -h主机 -P端口 -u用户名 -p密码 param1, param2, param3... > bak_filename.sql
这边对各个字段坐下说明:
- h:登录用户所在的主机名称
- P:主机端口
- u:登录用户用户名
- p:用户密码
- param:导出参数(库、表、加锁等参数)
- ">":将备份数据表的定义和数据写入备份文件的定义
- bak_filename.sql:备份的文件名
5.2.2 导出全部数据库
–all-databases 或者 -A
mysqldump -uroot -p123456 --all-databases > /user/brand/db_bak/all.sql
mysqldump -uroot -p123456 -A > /user/brand/db_bak/all.sql
5.2.3 导出部分数据表
-databases [dbname,[dbname...]] --tables [tbname,[tbname...]] ,如果多个表where条件相同,也可以组合在一起使用:
mysqldump -uroot -p123456 --databases db1 --tables tb1 --where="id>1000" > /user/brand/db_bak/db1_tb1.sql
5.2.4 创建之前先删库或表
–add-drop-database 、 –add-drop-table
- 在create database 前先 drop database;在create table之前先 drop table
- 默认关闭,所以一般在导入时需要保证数据库已存在。。
mysqldump -uroot -p123456 -A --add-drop-database --skip-add-drop-table > /user/brand/db_bak/all.sql
5.2.5 锁表
–add-locks:备份数据库表时锁定数据库表,默认就是打开的状态,可以使用–skip-add-locks取消
# 不佳参数选项的时候,默认是添加LOCK的
mysqldump -uroot -p123456 -A > /user/brand/db_bak/all.sql
# 取消LOCK的状态
mysqldump -uroot -p123456 -A --skip-add-locks > /user/brand/db_bak/all_skip_lock.sql
5.2.6 进行压缩
–compact:压缩模式,去掉注释、头尾等结构信息,让输出更少
mysqldump -uroot -p123456 -A --compact > /user/brand/db_bak/all_compact.sql
5.2.7 数据恢复
使用mysql命令进行恢复,语法如下
mysql -u user -p pwd [dbname] < bak_filename.sql
注意箭头方向
# 删除数据库,模拟数据库损坏
mysql> drop database db1;
# 导入完全备份的文件
mysql < /user/brand/db_bak/all_compact.sql
6 总结
备份和恢复主要使用在以下几个方面:
- 灾难恢复
- 需求的变更或者版本回滚
- 数据和变更审计
- 多版本测试
MySQL全面瓦解30:备份与恢复的更多相关文章
- MySQL全面瓦解13:系统函数相关
概述 提到MySQL的系统函数,我们前面有使用过聚合函数,其实只是其中一小部分.MySQL提供很多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,并更加灵活地满足不同用 ...
- MySQL全面瓦解23:MySQL索引实现和使用
MySQL索引实现 上一篇我们详细了解了B+树的实现原理(传送门).我们知道,MySQL内部索引是由不同的引擎实现的,主要包含InnoDB和MyISAM这两种,并且这两种引擎中的索引都是使用b+树的结 ...
- MySQL全面瓦解24:构建高性能索引(策略篇)
学习如果构建高性能的索引之前,我们先来了解下之前的知识,以下两篇是基础原理,了解之后,对面后续索引构建的原则和优化方法会有更清晰的理解: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦 ...
- MySQL全面瓦解25:构建高性能索引(案例分析篇)
回顾一下上面几篇索引相关的文章: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦解23:MySQL索引实现和使用 MySQL全面瓦解24:构建高性能索引(策略篇) 索引的十大原则 1. ...
- MySQL 日志管理及备份与恢复
MySQL 日志管理及备份与恢复 1.日志管理 2.备份与恢复 1.日志管理: MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种:通过配置文件或者是通过命令 ...
- MySQL 5.6.30 升级到5.7.10
MySQL 5.6.30 升级到5.7.10 注意,这种方式的前提是数据文件没有和软件目录在一起,如果在一起,需要停止数据库后先移动数据文件 1.解压5.7.10包到/usr/local2.停止当前的 ...
- MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)
楔子 由于之前电脑上安装的MySQL版本是比较老的了,大概是5.1的版本,不支持JSON字段功能.而最新开发部门开发的的编辑器产品,使用到了JSON字段的功能. 因此需要升级MySQL版本,升级的目标 ...
- MySQL日志管理、备份与恢复
MySQL日志管理.备份与恢复 目录 MySQL日志管理.备份与恢复 一.MySQL日志管理 1. MySQL日志路径 2. 设置.修改日志路径 3. 查询日志功能是否开启 二.MySQL备份与恢复 ...
- Linux(CentOS) Mysql 8.0.30 安装(多源安装)
Linux(CentOS) Mysql 8.0.30 安装(多源安装) 安装命令根据实际部署情况修改调整,CentOS一般选择通用版本Red Hat Enterprise Linux 7 本文档使用w ...
- mysql 8.0.30 忘记密码登录mysql:
mysql 8.0.30 忘记密码登录mysql: cmd(使用管理员运行)-切换到mysql的bin目录下:一.输入命令:net stop mysql 停止服务: 二.输入命令:mysqld --c ...
随机推荐
- 为什么要用Redis压缩表,是快吗?
首先需要了解什么是压缩表,推荐Redis设计与实现第二版:压缩列表_w3cschool 为什么要用压缩表呢?是快吗? 其实不是的,恰恰相反,ziplist 是为了节省内存而设计出来的一种数据结构.zi ...
- 【Visual Leak Detector】在 QT 中使用 VLD(方式三)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用前的准备 2. 在 QT 中使用 VLD 2.1 复制 lib 库及头文件 2.2 在项目 .pro 文件中指明路 ...
- 【随笔】Axios delete传递数组问题
pre { overflow-y: auto; max-height: 300px } img { max-width: 500px; max-height: 300px } Axios delete ...
- win10_Dock安装设置
1.安装:(在win10上安装) 桌面版:https://www.docker.com/products/docker-desktop, 安装后重启电脑 2.配置 打开DockerDesktop,(可 ...
- keyclaok~keycloak存到cookie中的值和session_state
keycloak存到cookie中的值 AUTH_SESSION_ID KEYCLOAK_IDENTITY KEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_ ...
- keepalived的简单使用
原理简述 本篇主要学习keepalived配合nginx实现nginx的高可用, 也就是需要keepalived检测到nginx宕机时停用keepalived, 备用keepalived会自动接收过来 ...
- [Java]排序算法>插入排序>【直接插入排序】(O(N*N)/稳定/N较小/有序/顺序存储+链式存储)
1 直接插入排序 1.1 算法思想 插入排序的基本思想是:每一趟将1个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止. 1.2 算法特征 属于[插 ...
- 人群定向SQL表
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for rc_throng -- ------ ...
- AutoGPT目前只是成功学大师GPT版
一大波韭菜被收割了 最近很多人在交流对于AutoGPT的震惊和激动.AutoGPT是一个开源的应用程序,展示了GPT-4语言模型的能力.这个程序由GPT-4驱动,自主地开发和管理业务,以增加净值.它是 ...
- 火山引擎 DataTester:让企业“无代码”也能用起来的 A/B 实验平台
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当数字化变革方兴未艾,无代码正受到前所未有的关注.Salesforce 的数据显示,52%的 IT 部门表示,公司 ...