数据备份和恢复

数据备份和恢复

什么情况下会用到数据备份呢

数据丢失的场景

  • 人为误操作造成的某些数据被误操作
  • 软件BUG造成数据部分或者全部丢失
  • 硬件故障造成数据库部分或全部丢失
  • 安全漏洞被入侵数据恶意破坏

非数据丢失场景

  • 基于某个时间点的数据恢复
  • 开发测试环境数据库搭建
  • 相同数据库的新环境搭建
  • 数据库或者数据迁移

既然数据备份如此重要,那么如何进行数据备份呢?

主要有逻辑备份和物理备份两个方向

逻辑备份与对应的恢复

逻辑备份是比较简单的,也是中小型系统中最常用的备份方式,主要有两种方式,一种是将数据生成可以完全重现当前数据库中数据的insert语句;另一种就是将数据通过逻辑备份软件,将数据库表数据以特定分隔符进行分隔记录在文本文件中

生成insert语句备份

使用mysqldump可以来实现生成insert语句的逻辑备份文件

sql 复制代码
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

mysqldump的参数选项很多

shell 复制代码
  --add-drop-database 在create database之前先执行drop database
  
  -E, --events        备份事件
 
  -x, --lock-all-tables  锁住所有数据库下的所有表
                      
  -l, --lock-tables   在备份中,锁住所有的表,备份时只能进行读取操作,一般用于Myisam,INNODB一般使用																	--single-transaction
  --master-data[=#]   当value为1时,转储文件中记录change master语句,当value为2时,change master语句被注释,默认为空
  
  -R, --routines      备份函数和存储过程
  
  --single-transaction  只对innodb有效,保证获得备份的一致性,但是并不能隔离DDL语句的操作,ALTER TABLE, 													DROP TABLE, RENAME TABLE,TRUNCATE TABLE
                
  -T, --tab=name      产生tab分割的数据文件
  --triggers          备份触发器
  -w, --where=name    导出给定条件的数据
  

不过为了保证数据库中的数据一致,就需要进行一下特殊处理,两种方式都可

第一种方式:保证在同一事务里备份

使用--single-transaction选项,可以保证备份过程在同一个事务中,而且可以不影响数据库的任何正常服务

第二种方式:数据库不在有其他新的操作

这种方式就是将所需要备份的表锁住,只允许读不允许写,可以使用--lock-tables--lock-all-tables来进行锁表操作,执行结束后会自动释放锁定

对于--lock-tables选项并不会一次性将所有需要备份的表都锁定,而是每次仅仅锁定一个数据库的表,所以如果需要备份多个数据库的表,要使用--lock-all-tables来进行锁表,才能确保数据的完全一致性

恢复方式

可以使用source命令来进行数据恢复

sql 复制代码
source /tmp/backup.sql

也可以使用mysql命令行来进行恢复

shell 复制代码
mysql <backup.sql

生成特定格式的纯文本备份

这种备份方式比insert命令文件相比,占用的存储空间更小,但是在同一个备份文件中不能存在多个表的备份数据

mysql中提供两种方式来实现这种备份文件

第一种方式

使用select ... into outfile from ...来实现

示例

sql 复制代码
select * from user into outfile '/tmp/dump.txt' 
fields terminated by ',' -- 表示每列的分隔符
optionally enclosed by '"'  -- 对于字符串的包含符
lines terminated by '\n'; 

第二种方式

依然使用mysqldump来实现

sql 复制代码
mysqldump -uroot -T/temp/dump test user --fields-enclosed-by=\" --fields-terminated-by=,
恢复方式

由于该方式是按照每个表来进行备份的,所以恢复起来也需要每张表来进行恢复

有两种方式来进行恢复

第一种方式

使用load data infile命令,只能导入一张表

示例

sql 复制代码
load data infile '/tmp/user.txt' into table user fields terminated by ',' enclosed by '"'

第二种方式

使用mysql提供的mysqlimport来进行恢复,可以导入多张表,使用--user-threads参数可以并发导入多个文件

示例

sql 复制代码
mysqlimport --user=name --password=pwd test --fields-enclosed-by=\" fields-terminated-by=, /tmp/user.txt
mysqlimport --user=name --password=pwd test --user-threads=2 --fields-enclosed-by=\" fields-terminated-by=, /tmp/user.txt /tmp/student.txt

物理备份与对应的恢复

物理备份就是对数据库的物理对象所做的备份,数据库的物理对象主要由数据库的物理数据文件、日志文件以及配置文件等组成,由于不同的存储引擎存储的文件也不同,所以对于不同的存储引擎备份的文件也有所不同

MyISAM存储引擎

存储表结构元数据的.frm文件,存储表数据的.MYD文件,存储索引数据的.MYI文件

mysql提供了mysqlhotcopy来备份MyISAM存储引擎的数据

sql 复制代码
mysqlhotcopy db_name [./table_regex/] [new_db_name | directory]

该命令会先lock住表,然后执行flush tables动作,该正常关闭的表正常关闭,该fsync的数据都fsync,然后通过执行OS级别的复制命令,将需要备份的表或数据库的所有物理文件都复制到指定的备份集位置

Innodb存储引擎

Innodb中存放数据位置的配置有innodb_data-home-dirinnodb_data_file_pathinnodb_log_group_home_dirinnodb_file_per_table

分为热备份和冷备份

  • 冷备份:数据库处于关闭状态

  • 热备份:数据库处于运行状态,热备份不停机进行备份,可以使用xtrabackup工具

zhhll.icu/2021/数据库/关系...

本文由mdnice多平台发布

相关推荐
君不见,青丝成雪24 分钟前
Hadoop技术栈(四)HIVE常用函数汇总
大数据·数据库·数据仓库·hive·sql
不羁。。5 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
yangchanghua1117 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance7 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai7 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白7 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务7 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂11 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.12 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚14 小时前
当MySQL的int不够用了
数据库