根据备份的方法来分,可以将备份分为:
| 备份方法 | 概述 |
| 热备(Hot Backup) | 是指数据库运行中直接备份,对正在运行的数据库操作没有任何的影响 |
| 冷备(Cold Backup) | 是指备份操作是在数据库停止的情况下,这种备份最为简单,一般只需要复制相关的数据库物理文件即可 |
| 温备(Warm Backup) | 备份同样是在数据库运行中进行的,但是会对当前数据库的操作有所影响,如加一个全局锁以保证备份数据的一致性 |
按照备份后文件的内容来分,备份可以分为:
| 备份方法 | 概述 |
| 逻辑备份 | 逻辑备份中备份出的文件内容是可读的,一般是文本文件。内容一般是由一条条SQL语句,或者实际数据组成。如mysqldump和SELECT * INTO OUTFILE的方法。这类方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是回复所需要的时间往往较长 |
| 裸文件备份 | 指复制数据库的物理文件,既可以是在数据库运行中复制(ibbackup、xtrabackup这类工具),也可以是在数据库停止运行时直接的数据文件复制。这类备份的恢复时间往往较逻辑备份短得多 |
按照备份数据库的内容来分,备份可以分为:
| 备份方法 | 概述 |
| 完全备份 | 指对数据库进行一个完整的备份 |
| 增量备份 | 指在上次完全备份的基础上,对于更改的数据进行备份 |
| 日志备份 | 指对MySQL数据库二进制日志的备份,通过对一个完全备份进行二进制日志的重做来完成数据库的point-in-time的恢复工作 |
对于InnoDB存储引擎的冷备非常简单,只需要备份MySQL数据库的frm文件,共享表空间文件,独立表空间文件(*.ibd),重做日志文件。另外建议定期备份MySQL数据库的配置文件my.cnf
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 [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;
通过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;
mysqlimplort是MySQL提供的一个命令行程序,从本质来说是LOAD DATA INFILE的命令接口:
$ mysqlimport [options] db_name textfile1 [textfile2 ...]