根据备份的方法来分,可以将备份分为:
备份方法 | 概述 |
热备(Hot Backup) | 是指数据库运行中直接备份,对正在运行的数据库操作没有任何的影响 |
冷备(Cold Backup) | 是指备份操作是在数据库停止的情况下,这种备份最为简单,一般只需要复制相关的数据库物理文件即可 |
温备(Warm Backup) | 备份同样是在数据库运行中进行的,但是会对当前数据库的操作有所影响,如加一个全局锁以保证备份数据的一致性 |
按照备份后文件的内容来分,备份可以分为:
备份方法 | 概述 |
逻辑备份 | 逻辑备份中备份出的文件内容是可读的,一般是文本文件。内容一般是由一条条SQL语句,或者实际数据组成。如mysqldump和SELECT * INTO OUTFILE的方法。这类方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是回复所需要的时间往往较长 |
裸文件备份 | 指复制数据库的物理文件,既可以是在数据库运行中复制(ibbackup、xtrabackup这类工具),也可以是在数据库停止运行时直接的数据文件复制。这类备份的恢复时间往往较逻辑备份短得多 |
按照备份数据库的内容来分,备份可以分为:
备份方法 | 概述 |
完全备份 | 指对数据库进行一个完整的备份 |
增量备份 | 指在上次完全备份的基础上,对于更改的数据进行备份 |
日志备份 | 指对MySQL数据库二进制日志的备份,通过对一个完全备份进行二进制日志的重做来完成数据库的point-in-time的恢复工作 |
冷备
对于InnoDB存储引擎的冷备非常简单,只需要备份MySQL数据库的frm文件,共享表空间文件,独立表空间文件(*.ibd),重做日志文件。另外建议定期备份MySQL数据库的配置文件my.cnf
冷备的优点:
- 备份简单,只要复制相关文件即可
- 备份文件易于在不同操作系统,不同MySQL版本上进行恢复
- 恢复相当简单,只需要把文件恢复到指定位置即可
- 恢复速度快,不需要执行任何SQL语句,也不需要重建索引
冷备的缺点:
- InnoDB存储引擎冷备的文件通常比逻辑文件大很多,因为表空间中存放着很多其他数据,如undo段,插入缓冲等信息
- 冷备也不总是可以轻易的跨平台。操作系统、MySQL版本、文件大小写敏感和浮点数格式都会成为问题
逻辑备份
mysqldump
mysqldump备份工具最初是由Igor Romanenko编写完成,通常用来完成转存数据库的备份及不同数据库之间的移植。
语法:
$ mysqldump [arguments] > file_name
参数 | 作用 | 用例 |
--all-databases | 备份所有的数据库 | $ mysqldump -all-databases > dump.sql |
--databases | 备份指定的数据库 | $ mysqldump --databases db1 db2 db3 > dump.sql |
--single-transaction | 对某个架构进行备份,在备份开始前,先执行START TRANSACTION 命令,以此来获得备份一致性,备份时确保没有其他任何的DDL语句执行,一致性读并不能隔离DDL操作 | mysqldump --single-transaction test > test_backup.sql |
--lock-tables | 在备份中,依次锁住每个架构下的所有表。当备份时只能对数据库进行读取操作,备份依然可以保证一致性。--lock-tables 和--single-transaction 是互斥的,不能同时使用。该选项是依次对每个架构中的表上锁的,因此只能保证每个架构下表备份的一致性,而不能保证所有架构下表的一致性 | |
--lock-all-tables | 在备份过程中,对所有架构中的所有表上锁,可以避免--lock-tables 不能同时锁住所有表的问题 | |
--add-drop-database | 在CREATE DATABASE 前先运行DROP DATABASE 。这个参数需要和--all-databases 或者--database 选项一起使用。在默认情况下,导出的文本文件不会有CREATE DATABASE 除非指定了这个参数 | |
--master-data[=value] | 通过该参数产生的备份转存文件主要用来建立一个replication。当value的值为1时,转存文件中记录CHANGE MASTER语句。当value为2时,CHANGE MASTER语句被注释。在默认情况下,value值为空 | |
--master-data | 会自动忽略--lock-tables 选项。如果没有使用--single-transaction 选项会自动使用--lock-all-tables 选项 | |
--events | 备份事件调度器 | |
--routines | 备份存储过程和函数 | |
--triggers | 备份触发器 | |
--hex-blob | 将BINARY、VARBINARY、BLOG和BIT列类型被分为十六进制格式。 | |
--tab=path | 产生TAB分割数据的数据文件。对于每张表mysqldump创建一个包含CREATE TABLE语句的table_name.sql文件,和包含数据的tbl_name.txt文件。可以使用--fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--line-terminated-by=... 来改变默认的分隔符、换行符等 | |
--where='where_condition' | 导出给定条件的数据 |
SELECT…INTO OUTFILE
语法如下:
SELECT [column 1],[column 2] ...
INTO
OUTFILE 'file_name'
[
{FIELDS|COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[
LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
FROM TABLE WHERE ...
参数 | 作用 |
FIELDS[TERMINATED BY 'string'] | 表示每个列的分隔符 |
[[OPTIONALLY] ENCLOSED BY 'char'] | 表示对于字符串的包含符 |
[ESCAPED BY 'char'] | 表示转义符 |
[STARTING BY 'string'] | 表示每行的开始符号 |
TERMINATED BY 'string' | 表示每行的结束符号 |
如果没有指定任何的FIELDS和LINES的选项,则默认使用:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
逻辑备份的恢复
mysqldump的恢复因为备份的文件就是导出的SQL语句,所以只需执行这个文件就可以:
$ mysql -uroot -p < test_backup.sql;
LOAD DATA INFILE
通过SELECT INTO OUTFILE方法导出的数据恢复可以用LOAD DATA INFILE进行导入:
LOAD DATA INTO TABLE a IGNORE 1 LINE '/home/mysql/a.txt'
[REPLACE|IGNORE]
INTO TABLE tbl_name
[CHARACTER SET charset_name]
[
{FIELDS|COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[
LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name=expr,...]
例:
mysql> load data infile '/home/mysql/a.txt' into table a;
为了加快InnoDB存储引擎的导入,导入过程忽略外键检查,可以使用如下方式:
mysql> SET @@foreign_key_checks=0;
mysql> LOAD DATA INFILE '/home/mysql/a.txt' INTO TABLE a;
mysql> SET @@foreign_key_checks=1;
mysqlimport
mysqlimplort是MySQL提供的一个命令行程序,从本质来说是LOAD DATA INFILE的命令接口:
$ mysqlimport [options] db_name textfile1 [textfile2 ...]