目录
1、 使用SELECT ... INTO OUTFILE导出文本文件
尽管采取了一些管理措施来保证数据库的安全,但是不确定的意外情况总是有可能造成数据的损失,例如意外的停电、管理员不小心的操作失误都可能会造成数据的丢失。保证数据安全的最重要的一个措施是确保对数据进行定期备份。如果数据库中的数据丢失或者出现错误,可以使用备份的数据进行恢复,这样就尽可能地降低了意外原因导致的损失。MySQL 提供了多种方法对数据进行备份和恢复。
数据备份是数据库管理员非常重要的工作之一。系统意外崩溃或者硬件的损坏都可能导致
数据库的丢失,
因此 MySQL 管理员应该定期地备份数据库,使得在意外情况发生时,尽可能减少损失。
MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行
时,可以将数据库备份成一个文本文件,该文件中实际上包含了多个CREATE和INSERT语
句,使用这些语句可以重新创建表和插入数据。MySQLdump备份数据库语句的基本语法格式如下:
mysqldump -u user -h host -p password dbname [tbname,[tbname...]] >
filename.sql
user表示用户名称;
host表示登录用户的主机名称;
password 为登录密码;
dbname为需要备份的数据库名称;
tbname为 dbname 数据中需要备份的数据表
可以指定多个需要备份的表:右箭头符号“>”告诉 MySQLdump 将备份数据表的定义和
数据
写入备份文件;filename.sql为备份文件的名称。
使用MySQLdump备份单个数据库中的所有表,举例如下:
为了更好理解 MySQLdump 工具如何工作,本章给出一个完整的数据库例子。首先登
录MySQL,
按下面数据库结构创建booksDB 数据库和各个表,并插入数据记录。数据库和表定义
如下:
/***************************样例表***************************/
CREATE DATABASE booksDB2;
use booksDB2;
CREATE TABLE books
(
bk_id INT NOT NULL PRIMARY KEY,
bk_title VARCHAR(50) NOT NULL,
copyright YEAR NOT NULL
);
INSERT INTO books
VALUES (11078, 'Learning MySQL', 2010),
(11033, 'Study Html', 2011),
(11035, 'How to use php', 2003),
(11072, 'Teach youself javascript', 2005),
(11028, 'Learing C++', 2005),
(11069, 'MySQL professional', 2009),
(11026, 'Guide to MySQL 5.5', 2008),
(11041, 'Inside VC++', 2011);
CREATE TABLE authors
(
auth_id INT NOT NULL PRIMARY KEY,
auth_name VARCHAR(20),
auth_gender CHAR(1)
);
INSERT INTO authors
VALUES (1001, 'WriterX' ,'f'),
(1002, 'WriterA' ,'f'),
(1003, 'WriterB' ,'m'),
(1004, 'WriterC' ,'f'),
(1011, 'WriterD' ,'f'),
(1012, 'WriterE' ,'m'),
(1013, 'WriterF' ,'m'),
(1014, 'WriterG' ,'f'),
(1015, 'WriterH' ,'f');
CREATE TABLE authorbook
(
auth_id INT NOT NULL,
bk_id INT NOT NULL,
PRIMARY KEY (auth_id, bk_id),
FOREIGN KEY (auth_id) REFERENCES authors (auth_id),
FOREIGN KEY (bk_id) REFERENCES books (bk_id)
);
INSERT INTO authorbook
VALUES (1001, 11033), (1002, 11035), (1003, 11072), (1004, 11028),
(1011, 11078), (1012, 11026), (1012, 11041), (1014, 11069);
/***************************样例表***************************/
完成数据插入后打开操作系统命令行输入窗口,输入备份命令如下:
mysqldump -u root -p booksDB2 > ./booksdb_20231231.sql
输入密码之后,MySQL 便对数据库进行了备份,在文件夹下面查看刚才备份过的文
件,
使用文本查看器打开文件可以看到其部分文件内容大致如下:
可以看到,备份文件包含了一些信息,文件开头首先表明了备份文件使用的
MySOLdump工具的版本号:
然后是备份账户的名称和主机信息以及备份的数据库的名称 最后是 MySQL服务器的版
本号,在这里为 5.7.43。 备份文件接下来的部分是一些 SET 语句,这些语句将一些系统变量值赋给用户定义变量,
以确保被恢复的数据库的系统变量和原来备份时的变量相同,例如:
40101 SET COLD CHARACTER SET CLIENT=CCCHARACTER SET CLIENT */:
该SET 语句将当前系统变量 character set client 的值赋给用户定义变量@old
characterset client。其他变量与此类似。
备份文件的最后几行 MvSOL 使用 SET语恢复服务器系统变量原来的值,
例如:*!40101 SET CHARACTER SET CLIENT-COLD CHARACTER SET CLIENT*/;
该语句将用户定义的变量@old character set client 中保存的值赋给实际的系统变量
character set client。
备份文件中的“--”字符开头的行为注释语;以“/*!”开头、“*/”结尾的语为可执行的MySQL注释,这些语句可以被 MySQL 执行,但在其他数据库管理系统将被作为注释忽略,这可以提高数据库的可移植性。
另外注意到,备份文件开始的一些语句以数字开头,这些数字代表了 MySQL 版本号,
该数字告诉我们,这些语句只有在指定的 MySQL 版本或者比该版本高的情况下才能执行。例如40101,表明这些语句只 有在MySQL版本号为4.01.01或者更高的条件下才可以被执行。
在前面MySQLdump语法中介绍过,MySQLdump还可以备份数据库中的某个表其语法
格式为:
mysqldump -u user -h host -p dbname [tbname,[tbname...]] > filename.sql
tbname表示数据库中的表名,多个表名之间用空格隔开备份表和备份数据库中所有表
的语句中不同的地方在于,要在数据库名称 dbname之后指定需要备份的表名称。
举例:
备份booksDB数据库中的books表
mysqldump -u root -p booksDB2 books > ./books_202312311.sql
该语句创建名称为 books_202312311.sql 的备份文件,文件中包含了前面介绍的SET
语等内容, 不同的是,该文件只包含 books表的CREATE和INSERT语句。
如果要使用MySQLdump备份多个数据库,需要使用--databases 参数。备份多个数据
库的语句格式如下:
mysqldump -u user -h host -p --databases [dbname [dbname...]] > filename.sql
使用--databases 参数之后,必须指定至少一个数据库的名称,多个数据库名称之间用
空格隔开。
举例:使用mysqldump备份booksDB和test数据库
mysqldump -u root -p --databases booksDB2 test> ./books_20231231.sql
该语句创建名称为books_20231231.sql 的备份文件,文件中包含了创建两个数据库
booksDB2和test_db所必须的所有语。
另外,使用--all-databases 参数可以备份系统中所有的数据库,语句如下:
mysaldump -u user -h host -p --all-databases> filename.sql
使用参数--all-databases 时,不需要指定数据库名称。
举例:使用mysqldump备份服务器中的所有数据库
mysqldump -u root -p --all-databases > ./books_202312311.sql
该语句创建名称为books_202312311.sql的备份文件文件中包含了对系统中所有数据库
的备份信息。
注意:
如果在服务器上进行备份,并且表均为 MyISAM 表,应考虑使用
MySQLhotcopy,因为可以更快地进行备份和恢复。
MySQLdump提供许多选项,包括用于调试和压缩的,在这里只是列举最有用的。
运行帮助命令MySQLdump--help,可以获得特定版本的完整选项列表。
================================================================
因为MySQL表保存为文件方式,所以可以直接复制MySQL数据库的存储目录及文件进
行备份。 MySQL的数据库录位置不一定相同,在Wndows平台下,MySOL5.7存放数据库的目录通常默认为
“C\:Documents and Settings\All Users \Application Data\MySQL\MySQIServer
5.7\data”
或者其他用户自定义目录;
在 Linux 平台下,数据库目录位置通常为/var/lib/MySQL/,不同Linux版本下目录会有
不同,
这是一种简单、快速、有效的备份方式。要想保持备份的一致性,备份前需要对相关表执行 LOCK TABLES 操作,然后对表执行FLUSH TABLES。这样当复制数据库目录中的文件时允许其他客户继续查询表。需要FLUSH TABLES 语来确保开始备份前将所有激活的索引页写入硬盘。当然,也可以停止MySQL服务再进行备份操作。这种方法虽然简单,但并不是最好的方法。因为这种方法对InnoDB 存储引擎的表不适用使用这种方法备份的数据最好恢复到相同版本的服务器中,不同的版本可能不兼容。
================================================================
管理人员操作的失误、计算机故障以及其他意外情况,都会导致数据的丢失和破坏。
当数据丢失或意外破坏时,可以通过恢复已经备份的数据尽量减少数据丢失和破坏造成的
损失。
对于已经备份的包含 CREATE、INSERT语的文本文件,可以使用MySQL命令导入到数
据库中。
本小节将介绍MySQL命令导入SQL文件的方法。
备份的sql文件中包含 CREATE、INSERT语(有时也会有DROP语)。MySQL命令可以直
接执行文件中的这些语句。其语法如下:
mysql -u user -p [dbname] < filename.sql
user 是执行 backupsql中语的用户名;
-p表示输入用户密码;
dbname 是数据库名。
如果filename.sql文件为MySQLdump工具创建的包含创建数据库语句的文件,
执行的时候不需要指定数据库名。
举例:使用mysql命令将./booksdb_20231231.sql文件中的备份导入到数据库中
mysql -u root -p booksDB <./booksdb_20231231.sql
执行该语句前,必须先在 MySQL 服务器中创建 booksDB 数据库,如果不存在恢复过
程将会出错命令 执行成功之后 booksdb_20231231.sql 文件中的语就会在指定的数据库中恢复以前的表。
如果已经登录MySQL服务器,还可以使用source 命令导入SQL文件。source 语语法如
下:
source filename
举例:使用root用户登录到服务器,然后使用souce导入本地的备份文件
booksdb_20231231.sql
use booksdb;
source ./booksdb_20231231.sql
执行source 命令前,必须使用 use 语句选择数据库。不然恢复过程中会出现
“ERROR1046(3D000):No database selected”的错误。
如果数据库通过复制数据库文件备份,可以直接复制备份的文件到 MySQL 数据目录下
实现恢复。 通过这种方式恢复时,必须保存备份数据的数据库和待恢复的数据库服务器的主版本号相同。而且这种方式只对MyISAM引擎的表有效,对于InnoDB引擎的表不可用。执行恢复以前关闭 MySQL 服务,将备份的文件或目录覆盖 MYSQL的data目录,启动MySQL 服务。对于 Linux/Unix 操作系统来说,复制完文件需要将文件的用户和组更改为MySQL运行的用户和组,通常用户是MySQL,组也是MySQL。
有时会需要将MySQL数据库中的数据导出到外部存储文件中,MySQL数据库中的数据可以导出成sql文本文件、xm文件或者html文件。同样这些导出文件也可以导入到MySQL数据库中。
MySQL 数据库导出数据时,允许使用包含导出定义的 SELECT 语句进行数据的导出操
作。 该文件被创建到服务器主机上,因此必须拥有文件写入权限(FILE 权限),才能使用此
语法 。“SELECT ... INTO OUTFILE ‘fename’ ”形式的SELECT语可以把被选择的行写入一个文件中, filename不能是一个已经存在的文件。
举例:
使用SELECT...INTO OUTFILE将test数据库中的a表中的记录导出到文本文件
SELECT * FROM test.a INTO OUTFILE "./person0.txt";
如果出错:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
则:sudo vim /etc/my.cnf
添加:secure_file_priv = ''
保持退出,重启服务 sudo service mysqld restart
文件就会存储在;/var/lib/mysql/person0.txt
可以看到默认情况下,MySQL 使用制表符“\t”分隔不同的字段,字段没有被其他字符
括起来。另外, 在 Windows 平台下,使用记事本打开该文件,显示的格式与这里并不相同,这是因 为 Windows 系统 下回车换行符为“\r\n”,默认换行符为“\n”,因此会在 person0.txt中可能看到类似黑色方块的字符, 所有的记录也会在同一行显示。另外,注意到第 5行中有一个字段值为“\N”,这表示该字段的值为 NULL。 默认情况下如果遇到NULL值,将会返回“\N”代表空值,反斜线“\”表示转义字符,如果使ESCAPEDBY
选项,则N前面为指定的转义字符。
举例2:使用SELECT...INTO OUTFILE将test数据库中的student表中的记录导出到文本
文件,
使用FIELDS选项和LINES选项,要求字段之间使用逗号‘,’间隔,所有字段值用双引号括
起来,
定义转义字符定义为单引号‘\’’
SELECT * FROM test.student INTO OUTFILE "./student1.txt"
FIELDS
TERMINATED BY ','
ENCLOSED BY '\"'
ESCAPED BY '\''
LINES
TERMINATED BY '\r\n';
结果如下:
该语句将把test.student表中所有记录导入到student1.txt文本文件中。
FIELDSTERMINATED BY ‘,’表示字段之间用逗号分隔;
ENCLOSED BY ‘\"’表示每个字段用双引号括起来:
ESCAPED BY ‘\'’表示将系统默认的转义字符替换为单引号:
LINESTERMINATED BY ‘\r\n'表示每行以回车换行符结尾,保证每一条记录占一行。
举例3:使用SELECT...INTO OUTFILE将test数据库中的person表中的记录导出到文本
文件,
使用LINES选项,要求每行记录以字符串“> ”开始,以“<end>”字符串结尾
SELECT * FROM test.student INTO OUTFILE "./student2.txt"
LINES
STARTING BY '> '
TERMINATED BY '<end>';
除了使用SELECT...INTO OUTFILE语导出文本文件之外,还可以使用MySQLdump命
令。该工具不仅可以将数据导出为包含CREATE、INSERT的SQL 文件,也可以导出为纯文本文件。MySQLdump创建 一个包含创建表的CREATE TABLE语句的 tablename.sql文件和一个包含其数据的tablename.txt文件。
举例:使用mysqldump将test数据库中的student表中的记录导出到文本文件
mysqldump -T /tmp/ test student -u root -p
语句执行成功,目标目录下面将会有两个文件,分别为 student.sql和 student.txt。
student.sql包含创建student表的CREATE语句,其内容如下;
student.txt 内容如下:
举例:使用mysqldump命令将test数据库中的person表中的记录导出到文本文件,
使用FIELDS选项,要求字段之间使用逗号‘,’间隔,所有字符类型字段值用双引号括起
来,
定义转义字符定义为问号‘?’,每行记录以回车换行符“\r\n”结尾
mysqldump -T /tmp/ test student -u root -p --fields-terminated-by=, --fields
optionally-enclosed-by=\" --fields-escaped-by=? --lines-terminated-by=\r\n
MySQL是一个功能丰富的工具命令,使用MySQL还可以在命令行模式下执行SQL指令将
查询结果导入到文本文件中。相比MySQLdump,MySQL工具导出的结果可读性更强。如果MySOL服务器是单独的机器, 用户是在一个client 上进行操作,用户要把数据结果导入到client机器上。可以使用MySOL-e语句。
使用MySOL导出数据文本文件语句的基本格式如下:
mysql -u root -p --execute= "SELECT 语句 ” dbname > filename.txt
该命令使用--execute 选项,表示执行该选项后面的语句并退出,后面的语句必须用双
引号括起来, dbname 为要导出的数据库名称;导出的文件中不同列之间使用制表符分隔,第1行包含了各个字段的名称。
举例:使用mysql语句导出test数据库中person表中的记录到文本文件
mysql -u root -p --execute="SELECT * FROM student;" test > ./person3.txt
可以看到,person3.txt 文件中包含了每个字段的名称和各条记录,该显示格式与
MySQL命令行下SELECT查询结果显示相同。
使用MySQL命令还可以指定查询结果的显示格式,如果某行记录字段很多,可能一行
不能完全显示,可以使用--vartical参数,将每条记录分为多行显示。
举例:使用mysql命令导出test数据库中person表中的记录到文本文件,使用--vertical
参数显示结果
mysql -u root -p --vertical --execute="SELECT * FROM student;" test > ./person4.txt
举例:使用mysql命令导出test数据库中person表中的记录到html文件
mysql -u root -p --html --execute="SELECT * FROM student;" test > ./person5.html
使用mysql命令导出test数据库中person表中的记录到xml文件
mysql -u root -p --xml --execute="SELECT * FROM student;" test > ./person6.xml
MySQL 允许将数据导出到外部文件,也可以从外部文件导入数据。MySQL 提供了一
些导入数据的工具, 这些工具有LOAD DATA语、source 命令和MySQL命令。LOAD DATA INFILE 语句用于高速地从一个 文本文件中读取行,并装入一个表中。文件名称必须为文字字符串。本节将介绍
LOAD DATA语句的用法。
举例1:使用LOAD DATA命令将./person3.txt文件中的数据导入到test数据库中的
person表
LOAD DATA INFILE './person3.txt' INTO TABLE test.student;
恢复之前将person 表中的数据全部删除,登录MySQL使用 DELETE语句,语句如下
mysq1>USE test;
Database changed;
mysql> DELETE FROM student;
Query OK,10 rows affected (0.00 sec)
从person3.txt文件中恢复数据,语句如下:
LOAD DATA INFILE './person3.txt' INTO TABLE test.student;
可以看到,语句执行成功之后,原来的数据重新恢复到了 person 表中。
使用MySQLimport可以导入文本文件,并且不需要登录MySQL客户端。MySQLimport
命令提供许多与LOAD DATA INFILE 语相同的能,大多数选项直接对应LOAD DATA INFILE子句。使用MySQLimport 语句需要指定所需的选项、导入的数据库名称以及导入的数据文件的路径和名称。
举例:使用mysqlimport命令将目录下的person.txt文件内容导入到test数据库中,
字段之间使用逗号‘,’间隔,字符类型字段值用双引号括起来,定义转义字符定义为问
号‘?’, 每行记录以回车换行符“\r\n”结尾
mysqlimport -u root -p test ./person.txt --fields-terminated-by=, --fields-optionally-enclosed-by=\" --fields-escaped-by=? --lines-terminated-by=\r\n
mysql之事务处理,在mysql版本5.5之前的引擎是MyISAM,后调整为支持事务的InnoDB。 事务(Transaction)指作为一个逻辑工作单元执行一系列操作,这些操作要么全部成功,要么全部失败,
确保对多个数据的操作当成一个单元来处理。
1、MySQL中只有使用了Innodb存储引擎的数据库或表才支持事务处理。
2、事务用于维护数据库的完整性,保证成批的sql语句要么都执行,要么都不执行,尽可能保证数据的完整。
3、事务用于管理 INSERT、UPDATE、DELETE 语句。
事务的原则(ACID):
原子性【基础】:Atomicity ,不可分割,组成物质的基本单位。
一致性【约束】:Consistency,事务操作后由原来的一致状态变成另一种一致的状态。
隔离性【手段】:Isolation,指的是每个事务都是彼此独立的,不受其他事务执行影响。
持久性【目的】:Durability,事务提交之后对数据的修改是持久性的。
事务处理常用的命令
查看当前mysql支持的存储引擎是否支持事务:show variables like
'%storage_engine%';
显示开启一个事务:START TRANSACTION 或者 Begin
提交事务: COMMIT
回滚事务:ROLLBACK
保存点:SAVEPOINT
删除保存点:RELEASE SAVEPOINT
设置事务的隔离级别: SET TRANSACTION
使用事务有两种方式,分别为 显式事务和 隐式事务
步骤1: START TRANSACTION 或者 BEGIN,作用是显式开启一个事务
mysql> BEGIN;
#或者
mysql> START TRANSACTION;
步骤2:
一系列事务中的操作(主要是DML,不含DDL) insert update delete
步骤3:
提交事务 或 中止事务(即回滚事务)
# 提交事务 当提交事务后,对数据库的修改是永久性的
mysql > COMMIT;
# 回滚事务。即撤销正在进行的所有没有提交的修改
mysql > ROLLBACK;
#将事务回滚到某个保存点
mysql > ROLLBACK TO [SAVEPOINT]
其中关于savepoint的相关操作有
# 在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多
个保存点
savepoint 保存点名称;
# 删除某个保存点
release savepoint 保存点名称
MySQL中有一个系统变量 autocommit
SHOW VARIABLES LIKE 'autocommit';
默认是开启自动提交事务的,以下SQL会产生一个隐式的提交操作,即执行完这些语句后,会有一个隐式的COMMIT操作。
DDL语句 //DDL是指数据库的架构,就是比如表,储存过程,游标这些
ALTER TABLE ..
UPGRADE DATA DIRECTORY NAME..
ALTER EVENT
用来隐式地修改Mysql架构的操作
CREATE USER
DROP USER
我们如果想关闭这种自动提交的功能,可以使用下面2种方法
显示的使用start transaction或者begin语句开启一个事务。
这样在本次事务提交或者回滚前会暂时关闭掉自动提交的功能
把系统变量 autocommit的值设置为OFF,Oracle默认不自动提交,需要手写commit命令,
而Mysql默认自动提交
事务事务自动提交的开启和关闭
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启(默认的)
一般事务使用流程
SET autocommit = 0 -- 设置自动提交关闭
START TRANSACTION -- 标记事务开启,以下的sql语句都在同一个事务内
SQL.....
SQL.....
...
COMMIT -- 提交成功,数想据持久化
ROLLBACK -- 提交失败,数据回滚,回到原来的数据
SET autocommit = 1 -- 事务结束,开启自动提交
-- 其中可以设置保存点,类似我们玩游戏时的存档功能
SAVEPOINT 名 -- 保存点
ROLLBACK TO SAVEPOINT 名-- 回滚到一个保存点
RELEASE SAVEPOINT 名 -- 撤销一个保存点
操作举例:使用begin...end语法可以将一组相关的SQL语句组织成一个事务,确保它们要么全部成功执行,要么全部回滚。下面是一个示例,展示了事务的使用方法:
BEGIN; -- 开始事务
-- 执行一系列的SQL语句
INSERT INTO customers (c_name, c_email) VALUES ('John Doe xx',
'john.doe@example.com');
UPDATE orders SET o_date = now() WHERE c_id = 10001;
COMMIT; -- 提交事务
BEGIN语句表示开始一个事务,COMMIT语句表示提交事务。在BEGIN和COMMIT之间,可以包含多个SQL语句,这些语句将作为一个原子操作执行。如果中间的任何一条语句失败,整个事务将被回滚到初始状态。
使用ROLLBACK语句手动回滚事务,示例如下:
START TRANSACTION; -- 开始一个事务
-- 执行一系列的SQL语句
INSERT INTO customers (c_name, c_email) VALUES ('John Doe xx',
'john.doe@example.com');
UPDATE orders SET o_date = now() WHERE c_id = 10001;
-- 根据条件判断是否回滚事务
IF some_condition = true THEN
ROLLBACK; -- 回滚事务
ELSE
COMMIT; -- 提交事务
END IF;
在上述代码中,根据条件的判断结果,决定是回滚事务还是提交事务。
或者:
SELECT * FROM student;
START TRANSACTION;
DELETE FROM student;
SELECT * FROM student;
ROLLBACK;
SELECT * FROM student;
START TRANSACTION;
INSERT INTO customers (c_name, c_address) VALUES ('John Doe', '123 Main St');
SAVEPOINT sp1;
UPDATE customers SET c_address = '456 Market St' WHERE c_name = 'John Doe';
ROLLBACK TO sp1;
UPDATE customers SET c_address = '457 Market St' WHERE c_name = 'John Doe';
COMMIT;
扩展:
Mysql当中针对于并发事务会存在脏读、不可重复读、幻读等情况,可以参考如下内容:
https://zhuanlan.zhihu.com/p/150107974
5、练习题
问题:
1:MySQLdump备份的文件只能在MySQL中使用吗?
MySQLdump备份的文本文件实际是数据库的一个副本,使用该文件不仅可以在MySQL中恢复数据库,而且通过对该文件的简单修改,可以使用该文件在SOLServer 或者 Sybase等其他数据库中恢复数据库。这在某种程度上实现了数据库之间的迁移。
2:如何选择备份工具?
直接复制数据文件是最为直接、快速的备份方法,但缺点是基本上不能实现增量备份。备份时必须确保没有使用这些表。如果在复制一个表的同时服务器正在修改它,则复制无效。备份文件时,最好关闭服务器,然后重新启动服务器。为了保证数据的一致性,需要在备份文件前,执行以下SOL语句:
FLUSH TABLES WITH READ LOCK:
也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证复制过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接复制回原来的数据库目录下即可。
3:使用MySQLdump备份整个数据库成功,把表和数据库都删除了,但使用备份文件却不能恢复数据库?
出现这种情况,是因为备份的时候没有指定--databases 参数。默认情况下,如果只指定数据库名称, MySQLdump 备份的是数据库中所有的表,而不包括数据库的创建语句,例如:mysqldump -u root -p booksDB > c:\backup\booksDB_20160101.sql
该语句只备份了 booksDB 数据库下所有的表,打开该文件,可以看到文件中不包含创建booksDB 数据库的CREATE DATABASE语句,因此如果把 booksDB 也删除了,使用该SQL文件不能恢复以前的表,恢复时会出现ERROR 1046(3D000)No database selected 的错误信息。必须在MySOL命令行下创建 booksDB数据库,并使用 use 语选booksDB之后才可以恢复。而下面的语句,数据库删除之后,可以正常恢复备份时的状态。mysqldump -u root -p --databases booksDB > C:\backup\books_DB_20160101.sql
该语句不仅备份了所有数据库下的表结构,而且包括创建数据库的语句。
练习题:
(1)同时备份 test 数据库中的 fruits和suppliers表,然后删除两个表中的内容并恢复。
(2)将test数据库中不同的数据表中的数据导出到xml文件或者html文件并查看文件内容。
(3)使用 MySQL命令导出 fruits 表中的记录,并将查询结果以垂直方式显示导出文件。