尽管采取了一些管理措施来保证数据库的安全,但是在不确定的意外情况下,总是有可能造成数据的损失。例如,意外的停电,不小心的操作失误等都可能造成数据的丢失。
所以为了保证数据的安全,我们需要定期对数据进行备份。如果数据库中的数据出现了错误,就需要使用备份好的数据进行数据还原,这样可以将损失降至最低。
MySQL 提供了多种方法对数据进行备份和恢复。本章将介绍数据备份、数据恢复、数据迁移和数据导入导出的相关知识
MySQL mysqldump备份数据库(附带实例)
数据库的主要作用就是对数据进行保存和维护,所以备份数据是数据库管理中最常用的操作。为了防止数据库意外崩溃或硬件损伤而导致的数据丢失,数据库系统提供了备份和恢复策略。
保证数据安全的最重要的一个措施就是定期的对数据库进行备份。这样即使发生了意外,也会把损失降到最低。
数据库备份是指通过导出数据或者复制表文件的方式来制作数据库的副本。当数据库出现故障或遭到破坏时,将备份的数据库加载到系统,从而使数据库从错误状态恢复到备份时的正确状态。
MySQL 中提供了两种备份方式,即 mysqldump 命令以及 mysqlhotcopy 脚本。由于 mysqlhotcopy 只能用于 MyISAM 表,所以 MySQL 5.7 移除了 mysqlhotcopy 脚本。
本节主要介绍如何使用 mysqldump 命令备份数据库。
mysqldump 命令执行时,可以将数据库中的数据备份成一个文本文件。数据表的结构和数据将存储在生成的文本文件中。
备份一个数据库
使用 mysqldump 命令备份一个数据库的语法格式如下:
mysqldump -u username -p dbname [tbname ...]> filename.sql
对上述语法参数说明如下:
- username:表示用户名称;
- dbname:表示需要备份的数据库名称;
- tbname:表示数据库中需要备份的数据表,可以指定多个数据表。省略该参数时,会备份整个数据库;
- 右箭头“>”:用来告诉 mysqldump 将备份数据表的定义和数据写入备份文件;
- filename.sql:表示备份文件的名称,文件名前面可以加绝对路径。通常将数据库备份成一个后缀名为
.sql
的文件。
注意:mysqldump 命令备份的文件并非一定要求后缀名为.sql
,备份成其他格式的文件也是可以的。例如,后缀名为.txt
的文件。通常情况下,建议备份成后缀名为.sql
的文件。因为,后缀名为.sql
的文件给人第一感觉就是与数据库有关的文件。
例 1
root@kube ~]# mysqldump -u root -p employees >./employees_bak.sql
Enter password:
MySQL数据库恢复(LOAD DATA)
数据库恢复是指以备份为基础,与备份相对应的系统维护和管理操作。
系统进行恢复操作时,先执行一些系统安全性的检查,包括检查所要恢复的数据库是否存在、数据库是否变化及数据库文件是否兼容等,然后根据所采用的数据库备份类型采取相应的恢复措施。
数据库恢复机制设计的两个关键问题是:第一,如何建立冗余数据;第二,如何利用这些冗余数据实施数据库恢复。
建立冗余数据最常用的技术是数据转储和登录日志文件。通常在一个数据库系统中,这两种方法是一起使用的。
数据转储是 DBA 定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的版本成为后备副本或后援副本。
可使用 LOAD DATA…INFILE 语句来恢复先前备份的数据。
【实例】将之前导出的数据备份文件 file.txt 导入数据库 test_db 的表 tb_students_copy 中,其中 tb_students_copy 的表结构和 tb_students_info 相同。
首先创建表 tb_students_copy,输入的 SQL 语句和执行结果如下所示。
mysql> CREATE TABLE tb_students_copy -> LIKE tb_students_info; Query OK, 0 rows affected (0.52 sec) mysql> SELECT * FROM tb_students_copy; Empty set (0.00 sec)
导入数据与查询表 tb_students_copy 的过程如下所示。
mysql> LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/ Uploads/file.txt' -> INTO TABLE test_db.tb_students_copy -> FIELDS TERMINATED BY ',' -> OPTIONALLY ENCLOSED BY '"' -> LINES TERMINATED BY '?'; Query OK, 10 rows affected (0.14 sec) Records: 10 Deleted: 0 Skipped: 0 Warnings: 0 mysql> SELECT * FROM test_db.tb_students_copy; +----+--------+---------+------+------+--------+------------+ | id | name | dept_id | age | sex | height | login_date | +----+--------+---------+------+------+--------+------------+ | 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 | | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 | | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 | | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 | | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 | | 6 | John | 2 | 21 | M | 172 | 2015-11-11 | | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 | | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 | | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 | | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 | +----+--------+---------+------+------+--------+------------+ 10 rows in set (0.00 sec)
MySQL使用SELECTI...INTO OUTFILE导出表数据
通过对数据表的导入导出,可以实现 MySQL 数据库服务器与其它数据库服务器间移动数据。导出是指将 MySQL 数据表的数据复制到文本文件。数据导出的方式有多种,本节主要介绍使用 SELECTI...INTO OUTFILE 语句导出数据。
在 MySQL 中,可以使用 SELECTI...INTO OUTFILE 语句将表的内容导出成一个文本文件。SELECT...INTO OUTFILE 语句基本格式如下:
SELECT 列名 FROM table [WHERE 语句] INTO OUTFILE '目标文件'[OPTIONS]
该语句用 SELECT 来查询所需要的数据,用 INTO OUTFILE 来导出数据。其中,目标文件
用来指定将查询的记录导出到哪个文件。这里需要注意的是,目标文件不能是一个已经存在的文件。
[OPTIONS] 为可选参数选项,OPTIONS 部分的语法包括 FIELDS 和 LINES 子句,其常用的取值有:
- FIELDS TERMINATED BY '字符串':设置字符串为字段之间的分隔符,可以为单个或多个字符,默认情况下为制表符‘ ’。
- FIELDS [OPTIONALLY] ENCLOSED BY '字符':设置字符来括上 CHAR、VARCHAR 和 TEXT 等字符型字段。如果使用了 OPTIONALLY 则只能用来括上 CHAR 和 VARCHAR 等字符型字段。
- FIELDS ESCAPED BY '字符':设置如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认值为‘’。
- LINES STARTING BY '字符串':设置每行开头的字符,可以为单个或多个字符,默认情况下不使用任何字符。
- LINES TERMINATED BY '字符串':设置每行结尾的字符,可以为单个或多个字符,默认值为‘ ’ 。
注意:FIELDS 和 LINES 两个子句都是自选的,但是如果两个都被指定了,FIELDS 必须位于 LINES的前面。
示例 1
下面使用 SELECT...INTO OUTFILE 语句来导出 test 数据库中的 person 表中的记录。SQL 语句和运行结果如下:
[root@kube ~]# mysqldump -u root -p employees titles >./employees.titles.sql
Enter password:
[root@kube ~]#
MySQL恢复数据库(mysql命令)
当数据丢失或意外损坏时,可以通过恢复已经备份的数据来尽量减少数据的丢失和破坏造成的损失。本节主要介绍如何对备份的数据进行恢复操作。
在《MySQL mysqldump备份数据库》一节中介绍了如何使用 mysqldump 命令将数据库中的数据备份成一个文本文件,且备份文件中通常包含 CREATE 语句和 INSERT 语句。
在 MySQL 中,可以使用 mysql 命令来恢复备份的数据。mysql 命令可以执行备份文件中的 CREATE 语句和 INSERT 语句,也就是说,mysql 命令可以通过 CREATE 语句来创建数据库和表,通过 INSERT 语句来插入备份的数据。
mysql 命令语法格式如下:
mysql -u username -P [dbname] < filename.sql
其中:
- username 表示用户名称;
- dbname 表示数据库名称,该参数是可选参数。如果 filename.sql 文件为 mysqldump 命令创建的包含创建数据库语句的文件,则执行时不需要指定数据库名。如果指定的数据库名不存在将会报错;
- filename.sql 表示备份文件的名称。