数据库备份与恢复

01 背景

    备份恢复的几个重要理由:

    1、灾难恢复

    2、审计

    3、测试

    4、误操作恢复

02 概述

2.1 frm

    与表相关的元数据信息都存放在.frm文件中,主要是表结构的定义信息,不论什么存储引擎,每一个表都会有一个以表名命名的.frm文件。

2.2 .MYD和.MYI

    .MYD:MY Data,是MyISAM存储引擎专用的用于存放MyISAM表的数据;

    .MYI:MY Index,也是专属于MyISAM存储引擎的主要存放MyISAM表的索引相关信息。

    2.3 .ibd和.ibdata

    两者都是专属于InnoDB存储引擎的数据库文件。

    之所以有两种文件来存放Innodb的数据(包括索引),是因为Innodb的数据存储方式能够通过配置文件决定是使用共享表空间还是独享表空间存放数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件。如果选用共享存储表空间来存放数据,则会使用ibdata文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata文件。

03 数据备份

3.1 背景

    在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失,大概分为以下几种:

    1、硬件故障

    2、软件故障

    3、自然灾害

    4、黑客攻击

    5、误操作 (占比最大)

    所以, 为了在数据丢失之后能够恢复数据, 我们就需要定期的备份数据, 备份数据的策略要根据不同的应用场景进行定制, 大致有几个参考数值, 我们可以根据这些数值从而定制符合特定环境中的数据备份策略:

    1、能够容忍丢失多少数据

    2、恢复数据需要多长时间

    3、需要恢复哪一些数据

    一般情况下, 我们需要备份的数据分为以下几种:

    1、数据

    2、二进制日志, InnoDB事务日志

    3、代码(存储过程、存储函数、触发器、事件调度器)

    4、服务器配置文件

3.2 分类

    根据备份数据集可以分为:

   1、完全备份

    备份整个数据集( 即整个数据库 )。

    2、部分备份

    备份部分数据集。

    部分备份又分为:

    1、增量备份

    备份自上一次备份以来(增量或完全)以来变化的数据,节约空间,但是还原麻烦。

    2、差异备份

    备份自上一次完全备份以来变化的数据,浪费空间,但是还原比增量备份简单。

    根据备份时数据库运行状态可以分为:

    1、热备份

    当数据库进行备份时, 数据库的读写操作均不是受影响。

    2、温备份

    当数据库进行备份时, 数据库的读操作可以执行, 但是不能执行写操作。

   3、冷备份

    当数据库进行备份时, 数据库不能进行读写操作, 即数据库要下线。

    根据数据库中数据的备份方式可以分为:

    1、物理备份

    一般就是通过tar,cp等命令直接打包复制数据库的数据文件达到备份的效果,逻辑备份会丢失数据精度。

    2、逻辑备份

    一般就是通过特定工具从数据库中导出数据并另存备份。

3.3 备份策略

    一般情况下, 备份策略一般为以下几种:

    1、使用cp/tar复制数据库文件

    2、mysqldump+复制binlog

    3、LVM快照+复制binlog

    4、xtrabackup专业第三方备份工具

    以上的几种解决方案分别针对于不同的场景:

    1、如果数据量较小, 可以使用第一种方式,直接复制数据库文件;

    2、如果数据量还行,可以使用第二种方式,先使用mysqldump对数据库进行完全备份,然后定期备份binlog达到增量备份的效果;

    3、如果数据量一般,而又不过分影响业务运行,可以使用第三种方式,使用lvm2的快照对数据文件进行备份后,定期备份binlog达到增量备份的效果;

    4、如果数据量很大,而又不过分影响业务运行,可以使用第四种方式,使用xtrabackup进行完全备份后,定期使用xtrabackup进行增量备份或差异备份。

3.4 逻辑备份

    1、mysqldump

    mysqldump先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。然后,将表中的所有记录转换成一条INSERT语句。然后通过这些语句,就能够创建表并插入数据。

    1)备份一个数据库

mysqldump-uusername-pdbnametable1table2...->BackupName.sql

    其中:

    dbname参数表示数据库的名称;

    table1和table2参数表示需要备份的表的名称,为空则整个数据库备份;

    BackupName.sql参数表设计备份文件的名称。

    2)备份多个数据库

    mysqldump-u user -p''--databases db1 db2 > Backup.sql

    加上了--databases选项,然后后面跟多个数据库

    3)备份所有数据库

mysqldump-u username -p -all-databases > BackupName.sql

    2、SELECT INTO OUTFILE

    MySQL中,可以使用SELECT...INTO OUTFILE语句将表的内容导出为一个文本文件。其基本的语法格式如下:

    SELECT[列名]FROMtable[WHERE语句]INTOOUTFILE'目标文件'[OPTION];

    OPTION参数为可选参数选项,其可能的取值有:

    FIELDS TERMINATED BY '字符串':设置字符串为字段之间的分隔符,可以为单个或多个字符。默认值是“\t”。

    FIELDS ENCLOSED BY '字符':设置字符来括住字段的值,只能为单个字符。默认情况下不使用任何符号。

    FIELDS OPTIONALLY ENCLOSED BY '字符':设置字符来括住CHAR、VARCHAR和TEXT等字符型字段。默认情况下不使用任何符号。

    FIELDS ESCAPED BY '字符':设置转义字符,只能为单个字符。默认值为“\”。

LINES STARTING BY '字符串':设置每行数据开头的字符,可以为单个或多个字符。默认情况下不使用任何字符。

    LINES TERMINATED BY '字符串':设置每行数据结尾的字符,可以为单个或多个字符。默认值是“\n”。

    FIELDS和LINES两个子句都是自选的,但是如果两个子句都被指定了,FIELDS必须位于LINES的前面。

    3、文件系统快照

    Logical VolumeManager(LVM)提供了对任意一个LogicalVolume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份。

3.5 物理备份

  1、cp/tar直接复制整个数据库目录

    MySQL有一种非常简单的备份方法,就是将MySQL中的数据库文件直接复制出来。这是最简单,速度最快的方法。

    如果在复制数据库的过程中还有数据写入,就会造成数据不一致。这种情况在开发环境可以,但是在生产环境中很难允许备份服务器。

    注意:这种方法不适用于InnoDB存储引擎的表,而对于MyISAM存储引擎的表很方便。同时,还原时MySQL的版本最好相同。

    2、使用mysqlhotcopy工具快速备份

    热备份,支持不停止MySQL服务器备份。mysqlhotcopy的备份方式比mysqldump快。mysqlhotcopy是一个perl脚本,主要在Linux系统下使用。

    原理:先将需要备份的数据库加上一个读锁,然后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库,最后,把需要备份的数据库文件复制到目标目录。

    命令格式如下:

    [root@localhost ~]#mysqlhotcopy [option] dbname1 dbname2 backupDir/

    dbname:数据库名称;

    backupDir:备份到哪个文件夹下;

    常用选项:

    --help:查看mysqlhotcopy帮助;

    --allowold:如果备份目录下存在相同的备份文件,将旧的备份文件加上_old;

    --keepold:如果备份目录下存在相同的备份文件,不删除旧的备份文件,而是将旧的文件重命名;

    --flushlog:本次备份之后,将对数据库的更新记录到日志中;

    --noindices:只备份数据文件,不备份索引文件;

    --user=用户名:用来指定用户名,可以用-u代替;

    --password=密码:用来指定密码,可以用-p代替。使用-p时,密码与-p之间没有空格;

    --port=端口号:用来指定访问端口,可以用-P代替;

    --socket=socket文件:用来指定socket文件,可以用-S代替。

    3、ibbackup

    ibbackup是innodb公司的一个热备份工具,专门对innodb存储引擎进行物理热备份,此工具是收费的,不能免费使用。

    4、Xtrabackup 

    一款非常强大的InnoDB/XtraDB热备工具, 支持完全备份、增量备份, 由percona提供。

    5、MEB

    MEB(MySQL Enterprise Backup)是MySQL商业版中提供的备份工具,属于物理备份。

    同XtraBackup一样,mysqlbackup的使用过程同样包含如下三个步骤:备份(--backup)-> 应用日志(--apply-log)-> 恢复(--copy-back)。

04 数据恢复

4.1 背景

    通常需要从备份恢复数据的场景有如下几种:

    1、误删库

    2、误删表

    3、误删列

    4、误删数据文件

    5、表空间损坏或出现坏块

    根据场景来说,我们可以大致分为两类:

    第一类为不可逆恢复,也就是通常的DDL,比如上述的1、2、3、5等场景;

    第二类为可逆的恢复,通常可以利用binlog进行回滚(要求binlog格式为ROW,binlog_image为FULL),也就是对应上述的场景4。

4.2 原理

    1、全备恢复(异机恢复)

    假设备份在远程机器,那么需要做如下操作来进行全备恢复:

    1)将备份数据拷贝到目标机器上;

    2)解压文件,apply redo log;

    4)更改文件权限;

    5)实例启动。

    2、增备恢复

    按照备份方案,需要通过binlog来完成增量数据的恢复。对于binlog恢复,我们通常需要以下几个步骤:

    1)确定需要恢复的起始点,即全备对应的binlog位点;

    2)解析主库的binlog,确定误删数据的位点,作为我们恢复的终点;

    3)利用mysqlbinlog —start-position —stop-position+管道的方式,将binlog恢复到目标实例上。

4.3 思路

    1、利用mysqldump+二进制日志实现备份

    2、利用LVM快照+二进制日志实现备份

    3、利用xrabackup等第三方工具实现备份

4.4 逻辑恢复

    1、mysqldump

    还原mysqldump命令备份的数据库,语法如下:

    mysql-uroot-p[dbname]

   2、mysqladmin

    mysqladmin-uroot -p create db_namemysql -uroot -p db_name < /backup/mysqldump/db_name.db

   注:在导入备份数据库前,db_name如果没有,是需要创建的;而且与db_name.db中数据库名是一样的才可以导入。

 3、source

    soure方法:

    mysql >use db_namemysql> source /backup/mysqldump/db_name.db

   4、mysqlimport

    5、LOAD DATA INFILE

    如果是通过SELECT INTO OUTFILE导出的符号分割文件,可以使用LOAD DATA INFILE通过相同的参数来加载。也可以使用mysqlimport,这是LOAD DATA INFILE的一个包装。

    6、alter table xxx import tablespace

    将需要备份的数据库表文件.frm和.ibd文件拷贝到对应的目录下,在当前的数据库上执行建表语句,创建一个与待备份表一样的空表。

    然后执行释放表空间语句:

    altertablexxxdroptablespace; //此时删除data目录下该表对应的ibd文件

    然后将对应的ibd文件拷贝到这个目录,接着执行:

    altertablexxximporttablespace;

4.5 物理恢复

    1、还原直接复制目录的备份

    通过这种方式还原时,必须保证两个MySQL数据库的版本号是相同的。MyISAM类型的表有效,对于InnoDB类型的表不可用,InnoDB表的表空间不能直接复制。

    2、ibbackup

    3、Xtrabackup

    4、MEB

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容