数据备份和康复

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

数据丢掉的场景

  • 人为误操作形成的某些数据被误操作
  • 软件BUG形成数据部分或许全部丢掉
  • 硬件故障形成数据库部分或全部丢掉
  • 安全漏洞被侵略数据歹意破坏

非数据丢掉场景

  • 基于某个时间点的数据康复
  • 开发测验环境数据库建立
  • 相同数据库的新环境建立
  • 数据库或许数据迁移

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

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

逻辑备份与对应的康复

逻辑备份是比较简单的,也是中小型体系中最常用的备份方法,主要有两种方法,一种是将数据生成能够彻底重现当时数据库中数据的insert句子;另一种就是将数据通过逻辑备份软件,将数据库表数据以特定分隔符进行分隔记载在文本文件中

生成insert句子备份

运用mysqldump能够来完成生成insert句子的逻辑备份文件

Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

mysqldump的参数选项很多


  --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指令来进行数据康复

source /tmp/backup.sql

也能够运用mysql指令行来进行康复

mysql <backup.sql

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

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

mysql中供给两种方法来完成这种备份文件

第一种方法

运用select ... into outfile from ...来完成

示例

select * from user into outfile '/tmp/dump.txt'
fields terminated by ',' -- 表明每列的分隔符
optionally enclosed by '"'  -- 关于字符串的包括符
lines terminated by 'n'; 

第二种方法

仍然运用mysqldump来完成

mysqldump -uroot -T/temp/dump test user --fields-enclosed-by=" --fields-terminated-by=,
康复方法

由于该方法是依照每个表来进行备份的,所以康复起来也需求每张表来进行康复

有两种方法来进行康复

第一种方法

运用load data infile指令,只能导入一张表

示例

load data infile '/tmp/user.txt' into table user fields terminated by ',' enclosed by '"'

第二种方法

运用mysql供给的mysqlimport来进行康复,能够导入多张表,运用--user-threads参数能够并发导入多个文件

示例

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存储引擎的数据

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多平台发布