MySQL4-备份与恢复

MySQL备份与恢复

没有哪一种数据库备份能够完美的解决所有的应用场景,而每个数据库环境所需要面对的数据库备份应用场景又可能各不一样,可能只是需要面对很多种场景中的某一种或几种,那么我们就非常有必要指定一个合适的备份方案和备份策略,通过最简单的技术和最低廉的成本,来满足我们的需求。

逻辑备份与恢复测试

什么样的备份是数据库逻辑备份呢

数据库逻辑备份就是备份软件按照我们最初所设计的逻辑关系,以数据库的逻辑结构对象为单位,将数据库中的数据按照预定义的逻辑关联格式一条一条生成相关的文本文件,以达到备份的目的。

常用的逻辑备份

在MySQL中我们常用的逻辑备份主要就是两种,①将数据生成可以完全重现当前数据库中数据的INSERT 语句;②将数据通过逻辑备份软件,将我们数据库表数据以特定分隔符进行分隔后记录在文本文件中。

生成INSERT语句的操作与缺点:简介

通过MySQL数据库软件自带工具程序中的mysqldump来生成INSERT语句的逻辑备份文件:

mysqldump [OPTIONS] database [tables]

mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]

mysqldump [OPTIONS] --all-databases [OPTIONS]

mysqldump程序的实现原理是通过我们给的参数信息加上数据库中的系统表信息来一个表一个表获取数据然后生成INSERT 语句再写入备份文件中的。这样就出现了一个问题,在系统正常运行过程中,很可能会不断有数据变更的请求正在执行,这样就可能造成在mysqldump 备份出来的数据不一致。也就是说备份数据很可能不是同一个时间点的数据,而且甚至可能都没办法满足完整性约束。这样的备份集对于有些系统来说可能并没有太大问题,但是对于有些对数据的一致性和完整性要求比较严格系统来说问题就大了,就是一个完全无效的备份集。

生成INSERT语句的操作与缺点:同一时刻取出所有数据

对于事务支持的存储引擎,如Innodb或者BDB等可以通过控制将整个备份过程控制在同一个事务中,来达到备份数据的一致性和完整性,而且mysqldump 程序也给我们提供了相关的参数选项来支持该功能,就是通过“--single-transaction”选项,可以不影响数据库的任何正常服务。

生成INSERT语句的操作与缺点:数据库中的数据处于静止状态

将需要备份的表锁定,只允许读取而不允许写入。让数据库在备份过程中仅提供数据的查询服务,锁定写入的服务,来使数据暂时处于一个一致的不会被修改的状态,等mysqldump 完成备份后再取消写入锁定,重新开始提供完整的服务。mysqldump 程序自己也提供了相关选项如“--lock-tables”和“--lock-all-tables”,在执行之前会锁定表,执行结束后自动释放锁定。这里有一点需要注意的就是,“--lock-tables”并不是一次性将需要dump 的所有表锁定,而是每次仅仅锁定一个数据库的表,如果你需要dump 的表分别在多个不同的数据库中,一定要使用“--lock-all-tables”才能确保数据的一致完整性。

当通过mysqldump 生成INSERT 语句的逻辑备份文件的时候,有一个非常有用的选项可以供我们使用,那就是“--master-data[=value]”。当添加了“--master-data=1”的时候,mysqldump 会将当前MySQL 使用到binlog 日志的名称和位置记录到dump 文件中,并且是被以CHANGE_MASTER 语句的形式记录,如果仅仅只是使用“--master-data”或者“--masterdata=2”,则CHANGE_MASTER 语句会以注释的形式存在。这个选项在实施slave 的在线搭建的时候是非常有用的,即使不是进行在线搭建slave,也可以在某些情况下做恢复的过程中通过备份的binlog 做进一步恢复操作。

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

这样的备份数据与INSERT 命令文件相比,所需要使用的存储空间更小,数据格式更加清晰明确,编辑方便。但是缺点是在同一个备份文件中不能存在多个表的备份数据,并且还没有数据库结构的重建命令。

执行SELECT ... TO OUTFILE FROM ...命令来实现。该命令有几个需要注意的参数如下:

①实现字符转义功能的“FIELDS ESCAPED BY ['分隔符']” 将SQL 语句中需要转义的字符name进行转义;

②可以将字段的内容“包装”起来的“FIELDS [OPTIONALLY] ENCLOSED BY 'name'”,如果不使用“OPTIONALLY”则包括数字类型的所有类型数据都会被“包装”,使用“OPTIONALLY”之后,则数字类型的数据不会被指定字符“包装”。

③通过"FIELDS TERMINATED BY 分隔符"可以设定每两个字段之间的分隔符;

④通过“LINES TERMINATED BY 分隔符”则会告诉MySQL 输出文件在每条记录结束的时候需要添加什么字符。

SELECT * INTO OUTFILE '/tmp/dump.text'

FIELDS TERMINATED BY ','

OPTIONALLY ENCLOSED BY '"'

LINES TERMINATED BY '\n'

FROM test_outfile limit 100;

把表test_outfile中前100条记录导出到/tmp/dump.text文件中。①每条记录结束后回车;②列中的内容被双引号包裹,除去数字;③列与列之间的内容用逗号分隔。

mysqldump 还同样能实现上面“SELECT ... TO OUTFILE FROM ...”所实现的功能,而且同时还会生成一个相关数据库结构对应的创建脚本。

逻辑备份恢复方法:INSERT语句文件的恢复

如果需要做完全恢复,那么我们可以通过使用“mysql < backup.sql”直接调用备份文件执行其中的所有命令,将数据完全恢复到备份时候的状态。如果已经使用mysql 连接上了MySQL,那么也可以通过在mysql中执行“source /path/backup.sql”或者“\. /path/backup.sql”来进行恢复。

逻辑备份恢复方法:纯数据文本备份的恢复

需要一个表一个表通过相关命令来进行恢复,当然如果通过脚本来实现自动多表恢复也是比较方便的。恢复方法也有两个,一是通过MySQL的“LOAD DATA INFILE”命令来实现,另一种方法就是通过MySQL提供的使用工具mysqlimport 来进行恢复。

物理备份与恢复测试

什么样的备份是数据库物理备份

数据库的物理备份就是对数据库的物理对象所做的备份。数据库的物理对象主要由数据库的物理数据文件、日志文件以及配置文件等组成。在MySQL 数据库中,除了MySQL 系统共有的一些日志文件和系统表的数据文件之外,每一种存储引擎自己还会有不太一样的物理对象。

MySQL物理备份所需文件:MyISAM存储引擎

MyISAM存储引擎的所有数据都存放在MySQL配置中所设定的“datadir”目录下。每一个MyISAM 存储引擎表都会有三个文件存在,分别为记录表结构元数据的“.frm”文件,存储表数据的“.MYD”文件,以及存储索引数据的“.MYI”文件。所以MyISAM 存储引擎的物理备份,除了备份MySQL 系统的共有物理文件之外,就只需要备份上面的三种文件即可。

MySQL物理备份所需文件:Innodb存储引擎

决定Innodb 存放数据位置的配置为“innodb_data_home_dir” 、“innodb_data_file_path” 和“innodb_log_group_home_dir”这三个目录位置指定参数,以及另外一个决定Innodb 的表空间存储方式的参数“innodb_file_per_table”。前面三个参数指定了数据和日志文件的存放位置,最后一个参数决定Innodb 是以共享表空间存放数据还是以独享表空间方式存储数据。

如果是共享表空间, 那么Innodb 需要备份备份“innodb_data_home_dir”和“innodb_data_file_path”参数所设定的所有数据文件,“datadir”中相应数据库目录下的所有Innodb 存储引擎表的“.frm”文件。

如果是独享表空间,那么我们除了备份上面共享表空间方式所需要备份的所有文件之外,我们还需要备份“datadir”中相应数据库目录下的所有“.idb”文件,该文件中存放的才是独享表空间方式下Innodb 存储引擎表的数据。

Innodb 是事务性存储引擎是需要undo和redo信息的,不管Innodb 使用的是共享还是独享表空间的方式来存储数据,与事务相关的undo信息以及其他的一些元数据信息,都是存放在“innodb_data_home_dir”和“innodb_data_file_path”这两个参数所设定的数据文件中的。所以要想Innodb 的物理备份有效,“innodb_data_home_dir”和“innodb_data_file_path”参数所设定的数据文件不管在什么情况下我们都必须备份。

除了上面所说的数据文件之外,Innodb 还有自己存放redo信息和相关事务信息的日志文件在“innodb_log_group_home_dir”参数所设定的位置。所以要想Innodb 物理备份能够有效使用,我们还要备份“innodb_log_group_home_dir”参数所设定的位置的所有日志文件。

各存储引擎常用物理备份方法

由于不同存储引擎所需要备份的物理对象(文件)并不一样,且每个存储引擎对数据文件的一致性要求也不一样所以各个存储引擎在进行物理备份的时候所使用的备份方法也有区别。如果我们是要做冷备份(停掉数据库之后的备份),我们所需要做的事情都很简单,那就是直接copy 所有数据文件和日志文件到备份集需要存放的位置即可,不管是何种存储引擎都可以这样做。冷备份方法简单,实现容易。

但现实是只能在数据库提供服务的情况下来完成数据库备份。这也就是我们俗称的热物理备份了。下面是针对各个存储引擎单独说明各自最常用的在线(热)物理备份方法:

各存储引擎常用物理备份方法:MyISAM存储引擎

虽然MyISAM 存储引擎没有事务,对数据文件的一致性要求没有那么严格,但是MyISAM存储引擎的同一个表的数据文件和索引文件之间是有一致性要求的。当MyISAM 存储引擎发现某个表的数据文件和索引文件不一致的时候,会标记该表处于不可用状态,并要求你进行修复动作。

这就要求我们必须做到在备份MyISAM数据库的物理文件的时候让MyISAM存储引擎停止写操作,仅仅提供读服务,其根本实质就是给数据库表加锁来阻止写操作。

MySQL自己提供了一个使用程序mysqlhotcopy,这个程序就是专门用来备份MyISAM存储引擎的。不过如果你有除了MyISAM之外的其他非事务性存储引擎,也可以通过合适的参数设置,或者微调该备份脚本,也都能通过mysqlhotcopy程序来完成相应的备份任务:

mysqlhotcopy db_name[./table_regex/]
[new_db_name | directory]

mysqlhotcopy 是一个用perl 编写的使用程序,其主要实现原理实际上就是通过先LOCK住表,然后执行FLUSH TABLES 动作,该正常关闭的表正常关闭,将该fsync 的数据都fsync,然后通过执行OS 级别的复制(cp 等)命令,将需要备份的表或者数据库的所有物理文件都复制到指定的备份集位置。此外,我们也可以通过登录数据库中手工加锁,然后再通过操作系统的命令来复制相关文件执行热物理备份,且在完成文件copy 之前,不能退出加锁的session(因为退出会自动解锁)。加锁命令是FLUSH TABLES WITH READ LOCK;解锁命令是unlock tables;

各存储引擎常用物理备份方法:Innodb存储引擎

Innodb 存储引擎由于是事务性存储引擎,有redo 日志和相关的undo 信息,而且对数据的一致性和完整性的要求也比MyISAM 要严格很多,所以Innodb 的在线(热)物理备份要比MyISAM 复杂很多,一般很难简单的通过几个手工命令来完成,大都是通过专门的Innodb在线物理备份软件来完成。Innodb 存储引擎的开发者(Innobase 公司)开发了一款名为ibbackup 的商业备份软件,专门实现Innodb 存储引擎数据的在线物理备份功能。该软件可以在MySQL 在线运行的状态下,对数据库中使用Innodb 存储引擎的表进行备份,不过仅限于使用Innodb 存储引擎的表。

这款软件需要花钱。

各存储引擎常用物理备份恢复方法:MyISAM存储引擎

如果是通过停机冷备份或者是在运行状态通过锁定写入操作后的备份集来恢复,仅仅只需要将该备份集直接通过操作系统的拷贝命令将相应的数据文件复制到对应位置来覆盖现有文件即可。

如果是通过mysqlhotcopy 软件来进行的在线热备份,而且相关的备份信息也记录进入了数据库中相应的表,其恢复操作可能会需要结合备份表信息来进行恢复。

各存储引擎常用物理备份恢复方法:Innodb存储引擎

对于冷备份,Innodb 存储引擎进行恢复所需要的操作和其他存储引擎没有什么差别,同样是备份集文件(包括数据文件和日志文件)复制到相应的目录即可。但是对于通过其他备份软件所进行的备份,就需要根据备份软件本身的要求来进行了。比如通过ibbackup 来进行的备份,同样也需要通过他来进行恢复才可以,具体的恢复方法请通过该软件的使用手册来进行。

猜你喜欢

转载自blog.csdn.net/attack_breast/article/details/84333633
今日推荐