MySQL数据库备份

一、数据库逻辑备份

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

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

3、生成INSERT语句备份
在MySQL数据库中,我们一般都是通过MySQL数据库软件自带工具程序中的mysqldump来实现生成INSERT语句的逻辑备份文件。

4、备份时数据的一致性和完整性要求
我们知道,想数据库中的数据一致,那么只有两种情况下可以做到。
第一、同一时刻取出所有数据;
第二、数据库中的数据处于静止状态。

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

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

5、生成特定格式的纯文本备份数据文件备份
将数据库中的数据以特定分隔字符将数据分隔记录在文本文件中,以达到逻辑备份的效果。这样的备份数据与INSERT命令文件相比,所需要使用的存储空间更小,数据格式更加清晰明确,编辑方便。

1)通过执行 SELECT … INTO OUTFILE FROM …命令来实现
通过“FIELDS TERMINATED BY”可以设定每两个字段之间的分隔符。
通过“LINES TERMINATED BY”则会告诉MySQL输出文件在每条记录结束的时候需要添加什么字符。
通过“[OPTIONALLY] ENCLOSED BY ‘name’”,将字段的内容“包装”起来,OPTIONALLY表示数字类型不会被包装。

执行:
select * into outfile '/tmp/dump.txt' from t_crcs_check_diff;
报错:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
因为mysql导出文件有安全路径,解决办法:
show variables like '%secure%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | NULL |
+--------------------------+-------+

NULL是不允许导入导出

修改/etc/my.cnf,在[mysqld]下添加
secure_file_priv = /tmp
重启服务

整理后的语句:
select * from t_crcs_check_diff into outfile '/tmp/dump.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' ;
Query OK, 12630 rows affected (0.03 sec)

2)通过mysqldump导出
mysqldump同样能实现上面“SELECT … INTO OUTFILE FROM …”所实现的功能,而且同时还会生成一个相关数据库结构对应的创建脚本。
执行:
mysqldump -uroot -p crcs t_crcs_check_diff -t -T/tmp --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --lines-terminated-by='\n' ;
说明:
-t:不导出创建表语句
-T:导出位置
--fields-terminated-by:字段之间分隔符
--fields-optionally-enclosed-by:字段包装
--lines-terminated-by:记录结尾添加字符

二、逻辑备份恢复测试
时有听到某某的数据库出现问题,而当其信心十足的准备拿之前所做好的数据库进行恢复的时候才发现自己的备份集不可用,或者并不能达到自己做备份时候所预期的恢复效果。遇到这种情景的时候,恐怕每个人都会郁闷至极的。数据库备份最重要最关键的一个用途就是当我们的数据库出现某些异常状况,需要对数据进行恢复的时候使用的。作为一个维护人员,我们是绝对不应该出现此类低级错误的。那我们到底该如何避免此类问题呢?只有一个办法,那就是周期性的进行模拟恢复测试,校验我们的备份集是否真的有效,是否确实能够按照我们的备份预期进行相应的恢复。

三、物理备份
数据库的物理备份就是对数据库的物理对象所做的备份。数据库的物理对象主要由数据库的物理数据文件、日志文件以及配置文件等组成。

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

而如果我们使用了独享表空间,那么我们除了备份上面共享表空间方式所需要备份的所有文件之外,我们还需要备份“datadir”中相应数据库目录下的所有“.idb”文件,该文件中存放的才是独享表空间方式下Innodb存储引擎表的数据。可能在这里有人文,既然是使用独享表空间,那我们为什么还要备份共享表空间“才使用到”的数据文件呢?其实这是很多人的一个共性误区,以为使用独享表空间的时候Innodb的所有信息就都存放在“datadir”所设定数据库目录下的“.ibd”文件中。实际上并不是这样的,“.ibd”文件中所存放的仅仅只是我们的表数据而已,大家都很清楚,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”参数所设定的位置的所有日志文件。

1、冷备份
停机copy所有数据文件和日志文件

2、在线(热)物理备份
Innodb存储引擎由于是事务性存储引擎,有redo日志和相关的undo信息,而且对数据的一致性和完整性的要求也比MyISAM要严格很多,所以Innodb的在线(热)物理备份要比MyISAM复杂很多,一般很难简单的通过几个手工命令来完成,大都是通过专门的Innodb在线物理备份软件来完成。