12.1 数据备份
12.1.1 使用mysqldump命令备份
mysqldump是MySQL提供的一个非常有用的数据库备份工具。mysqldump命令执行时,可以将数据库备份成一个文本文件,该文件中实际上包含了多个CREATE和INSERT语句,使用这些语句可以重新创建表和插入数据。
mysqldump –u user –h host –ppassword dbname[tbname, [tbname...]]> filename.sql
12.1.2 直接复制整个数据库目录
因为MySQL表保存为文件方式,所以可以直接复制mysql数据库的存储目录及文件进行备份。
InnoDB存储引擎的表不适用。使用这种方法备份的数据最好还原到相同版本的服务器中,因为不同的版本可能不兼容。
12.1.3 使用mysqlhotcopy工具快速备份
mysqlhotcopy是一个Perl脚本,它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。
只可以备份MyISAM类型的表
12.2 数据还原
12.2.1 使用mysql命令还原
对于已经备份的包含CREATE、INSERT语句的文本文件,可以使用mysql命令导入到数据库中。本小节将介绍mysql命令导入sql文件方法。
12.2.2 直接复制到数据库目录
如果数据库通过复制数据库文件备份,可以直接复制备份的文件到到MySQL数据目录下实现还原。通过这种方式还原时,必须保存备份数据的数据库和待还原的数据库服务器的主版本号相同。而且这种方式只对MyISAM引擎的表有效。对于InnoDB引擎的表不可用。
12.2.3 mysqlhotcopy快速恢复
mysqlhotcopy备份后的文件也可以用来恢复数据库,在MySQL服务器停止运行时,将备份的数据库文件拷贝到MySQL存放数据的位置(MySQL的Data文件夹中),重新启动MySQL服务即可。如果以根用户执行该操作,必须指定数据库文件的所有者。
12.3 数据库迁移
12.3.1 相同版本的MySQL数据库之间的迁移
相同版本的MySQL数据库之间的迁移就是在主版本号相同的MySQL数据库之间进行数据库移动。迁移过程其实就是在源数据库备份和目标数据库还原过程的组合。
12.3.2 不同版本的MySQL数据库之间的迁移
因为数据库升级等原因,需要将较旧版本MySQL数据库中的数据迁移到的较新版本的数据库中。
12.3.3 不同数据库之间迁移
不同类型的数据库之间的迁移,是指从把MySQL的数据库转移到其他类型的数据库,例如从MySQL迁移到ORACLE,从ORACLE迁移到MySQL和从MySQL迁移到sqlserver等。
12.4 表的导出和导入
12.4.1 用SELECT…INTO OUTFILE导出文本文件
MySQL数据库导出数据时,允许使用包含导出定义的SELECT语句进行数据的导出操作。该文件被创建到服务器主机上。
SELECT columnlist FROM table
WHERE condition
INTO OUTFILE ‘filename’ [OPTIONS]
这里回报一个错误
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
这时候需要找到my.ini文件(C:ProgramDataMySQLMySQL Server 8.0),然后找到该C:ProgramDataMySQLMySQL Server 8.0Uploads字段
在其下方添加:
secure-file-priv="D:/"字段即可,并把上方的字段用#注释掉
12.4.2 用mysqldump命令导出文本文件
mysqldump工具不仅可以将数据导出为包含CREATE、INSERT的sql文件,也可以导出为纯文本文件。
mysqldump -T path-u root -p
dbname [tables] [OPTIONS]
12.4.3 用mysql命令导出文本文件
mysql是一个功能丰富的工具命令,还可以在命令行模式下执行SQL指令将查询结果导入到文本文件中。
mysql -u root -p
--execute=”SELECT 语句” dbname
> filename.txt
12.4.4 用LOAD DATA INFILE方式导入文本文件
LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。
LOAD DATA INFILE 'filename.txt'
INTO TABLE tablename [OPTIONS] [IGNORE number LINES]
12.4.5 用mysqlimport命令导入文本文件
mysqlimport可以导入文本文件,使用mysqlimport不需要登录MySQL客户端。使用mysqlimport语句需要指定所需的选项、导入的数据库名称以及导入的数据文件的路径和名称。
mysqlimport –u root –p
dbname filename.txt [OPTIONS]
12.5 综合案例——数据的备份与恢复
备份有助于保护数据库,通过备份可以完整保存MySQL中各个数据库的特定状态。而通过还原,可防在系统出现故障数据丢失或者不合理操作对数据库造成的灾难时,恢复数据库中的数据。本章综合案例将向读者提供数据库备份与还原的方法与过程。
一.使用MySQLdump命令将me表备份到d:/beifen/me1.sql
在命令窗口下输入如下指令
mysqldump -u root -p 1test me > d:/beifen/me1.sql
Enter password: *************
二.使用mysql命令将备份文件me1.sql中的数据恢复到me表
为了验证恢复之后数据的正确性,删除me表的所有数据。
mysql> delete from me;
Query OK, 2 rows affected (0.08 sec)
mysql> select * from me;
Empty set (0.00 sec)
然后执行恢复语句 source
mysql> source d:/beifen/me_bk1.sql;
三.使用select ...into outfile语句导出me表中的记录,导出文件位于d:/下,名称为me1.txt
mysql> select * from 1test.me into outfile 'd:me1.txt';
四.使用load data infile 语句导入me1.txt数据到me表
首先还是使用delete语句删除表中的数据
delete from me;
然后执行如下语句
load data infile 'd:/me1.txt' into table 1test.me;
五.将me表中的记录导出到文件c:/me1.html中
在命令窗口下输入如下语句
C:Program FilesMySQLMySQL Server 8.0in>mysql -u root -p --html --execute="select * from me;" 1test > c:1.html
Enter password: *************
疑问解答
MySQLdump备份的文件只能在MySQL中使用么?
MySQLdump备份的文本文件实际上是数据库的一个副本,使用该文件不仅可以在MySQL中恢复数据库,而且通过对该文件的简单修改可以使用该文件在SQL Server或者Sybase等其他数据库中恢复数据库。这在某种程度上实现了数据库之间的迁移。
如何选择备份工具
直接复制数据文件是最为直接、快速的备份方法,但缺点是基本尚不能实现增量备份。备份时必须确保没有使用这些表。如果在复制一个表的同时服务器正在修改它,复制就会无效。备份文件时,最好关闭服务器,然后重新启动服务器。为了保证数据的一致性,需要在本分文件前执行以下SQL语句。
flush tables with read bock
就是把内存中的数据都刷到磁盘中,同时锁定数据表,以保证复制过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接复制回原来的数据库目录即可。
MySQLhoscopy是一个PERL程序,它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。这是备份数据库或单个表最快的途径,但只能运行在数据库文件所在的机器上,并且MySQLhotcopy只能用于备份MyISAM表。MySQLhotcopy适合小型数据库的备份数据量不大,可以使用MySQLhotcopy程序每天进行一次完全备份。
mysqldump将数据表导成SQL脚本文件,在不同的mysql版本之间升级时相对比较合适,这也是常用的备份方法。使用MySQLdump比直接复制慢一些
使用mysqldump备份整个数据库成功,把表和数据库都删除,但使用备份文件不能恢复数据库,是为什么?
出现这种情况,是因为备份的时候没有指定--databases参数。默认情况下,如果只指定数据库名称,mysqldump备份的就是数据库中所有的表,而不包括数据库的创建语句。
mysqldump -u root -p booksDB > C:/1.sql;
该语句只备份了booksDB数据库下所有的表,备份的文件并不宝华创建数据库的create databases语句,因此如果把booksDB删除,就必须用MySQL命令行创建booksDB数据库,并使用use语句选择booksDB之后才可以恢复。
而下面的语句,在数据库删除之后,可以正常恢复备份时的状态。
mysqldump -u root -p --databases booksDB > C:/2.sql;
该语句不仅备份了所有的数据库下的表结构,而且包括创建数据库的语句