MySql的备份还原

备份数据是数据库管理最经常使用的操做。为了保证数据库中数据的安全,数据管理员须要按期进行数据备份。一旦数据库遭到破坏,即可经过备份的文件来还原数据库。所以,数据备份是一项很重要的工做。html

数据备份

使用mysqldump命令备份,mysqldump命令能够将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。mysql

Mysqldump命令的工做原理很简单。它先查出须要备份的表的结构,再在文本文件中生存一个CREATE语句;而后,将表中的全部记录转换成一条INSERT语句,这些CREATE语句和INSERT语句都是还原时使用的,还原数据时就可使用其中的CREATE语句来建立表,使用其中的INSERT语句来还原数据。sql

备份一个数据库

使用mysqldump命令备份一个数据库的基本语法以下:数据库

mysqldump -uusername -p dbname table1 table2 …… > BackupName.sql安全

其中,dbname参数表示数据库的名称;table1和table2参数表示表的名称,没有该参数时将备份整个数据库;BackupName.sql参数表示备份文件的名称,文件名前面能够加上一个绝对路径。一般将数据库备份成一个后缀名为sql的文件。mysqldump命令备份的文件并不是必定要求后缀名为.sql,备份成其余格式的文件也是能够的,例如,后缀名为.txt的文件。可是,一般状况下是备份成后缀名为.sql的文件。服务器

ps:文件开头记录了MySQL的版本、备份的主机名和数据库名。文件中,以“--”开头的都是SQL语言的注释。以“/*!40101”等形式开头的都是与MySQL有关的注释。40101是MySQL数据库的版本号,这里就表示MySQL4.1.1。文件中没有建立数据库的语句,所以,student.sql文件中的全部表和记录必须还原到一个已经存在的数据库中。还原数据时,CREATE TABLE语句会在数据库中建立表,而后执行INSERT语句向表中插入记录。socket

备份多个数据库

mysqldump命令备份多个数据库的语法以下:工具

mysqldump -uusername -p --databases dbname1 dbname2 > BackupName.sql性能

这里要加上“databases”这个选项,而后后面跟多个数据库的名称。网站

备份全部数据库

mysqldump命令备份全部数据库的语法以下:

mysqldump -uusername -p --all-databases > BackupName.sql

使用“--all-databases”选项就能够备份全部数据库了。

直接复制整个数据库目录

MySQL有一种最简单的备份方法,就是将MySQL中的数据库文件直接复制出来。这种方法最简单,速度也最快。使用这种方法时,最好将服务器先中止。这样,能够保证在复制期间数据库中的数据不会发生变化。若是在复制数据库的过程当中还有数据写入,就会形成数据不一致。

这种方法虽然简单快捷,但不是最好的备份方法。由于,实际状况可能不容许中止MySQL服务器。并且,这种方法对INNODB存储引擎的表不适用。对于MyISAM存储引擎的表,这样备份和还原很方便。可是还原时最好是相同版本的MySQL数据库,不然可能会存储文件类型不一样的状况。

ps:在MySQL的版本号中,第一个数字表示主版本号。主版本号相同的MySQL数据库的文件类型会相同。例如,MySQL5.1.39和MySQL5.1.40这两个版本的主版本号都是5.那么这两个数据库的数据文件拥有相同的文件格式。

使用mysqlhotcopy工具快速备份

若是备份时不能中止MySQL服务器,能够采用mysqlhotcopy工具。使用mysqlhotcopy工具有份要比mysqldump命令快。

mysqlhotcopy工具是一个Perl脚本,主要在Linux操做系统下使用。mysqlhotcopy工具使用LOCK TABLES、FLUSH TABLES 和 cp来进行快速备份。其工做原理是,先将须要备份的数据库加上一个读操做锁,而后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库中,最后把须要备份的数据库文件复制到目标目录。使用mysqlhotcopy的命令以下:

[root@localhost~]#mysqlhotcopy [option] dbname1 dbname2 …… backupDir/

其中,dbname1等表示须要备份的数据库的名称;backupDir参数指定备份到哪一个文件夹下。这个命令的含义就是将dbname一、dbname2等数据库备份到backDir目录下。mysqlhotcopy工具备一些经常使用的选项,这些选项的介绍以下:

--help:用来查看mysqlhotcopy的帮助;

--allowold:若是备份目录下存在相同的备份文件,将旧的备份文件名加上_old;

--keepold:若是备份目录下存在相同的备份文件,不删除旧的备份文件,而是将旧文件改名;

--flushlog:本次备份以后,将对数据库的更新记录到日志中;

--noindices:只备份数据文件,不备份索引文件;

--user=用户名:用来指定用户名,能够用-u代替;

--password=密码:用来指定密码,能够用-p代替。使用-p时,密码与-p紧挨着,或者只使用-p,而后用交换的方式输入密码,这与登陆数据库时的状况是同样的;

--port=端口号:用来指定访问端口,能够用-P代替;

--socket=socket文件:用来指定socket文件,能够用-S代替。

ps:mysqlhotcopy工具不是MySQL自带的,须要安装Perl的数据接口包,Perl的数据库接口包能够在MySQL官方网站下载,网址是http://dev.mysql.com/downloads/dbi.html。mysqlhotcopy工具的工做原理是将数据库文件拷贝到目标目录。所以mysqlhotcopy工具只能备份MyISAM类型的表,不能用来备份InnoDB类型的表。

数据还原

管理员的非法操做和计算机的故障都会破坏数据库文件。当数据库遇到这些意外时,能够经过备份文件将数据库还原到备份时的状态,这样能够将损失下降到最小。

使用mysql命令还原

使用mysqldump命令能够将数据库的数据备份成一个文本文件,一般这个文件的后缀名是.sql。须要还原时,可使用mysql命令来还原备份的数据。

备份文件中一般包含CREATE语句和INSERT语句。mysql命令能够执行备份文件中的CREATE语句和INSERT语句,经过CREATE语句来建立数据库和表,经过INSERT语句来插入备份的数据。mysql命令的基本语法以下:

mysql -uroot -p  dbname < backup.sql

其中,dbname参数表示数据库名称。该参数为可选参数,能够指定数据库名,也能够不指定;指定数据库名时,表示还原该数据库下的表;不指定数据库名时,表示还原特定的一个数据库,而备份文件中有建立数据库的语句。

ps:若是使用--all-databases参数备份了全部的数据库,那么还原时不须要指定数据库。由于,其对应的sql文件包含有CREATE DATABASE语句,能够经过该语句建立数据库。建立数据库以后,能够执行sql文件中的USE语句选择数据库,而后在数据库中建立表而且插入记录。

直接复制到数据库目录

经过直接复制数据的方式备份的数据,能够直接复制到MySQL的数据库目录下。经过这种方式还原时,必须保证两个MySQL数据库的主版本号是相同的。并且,这种方式对MyISAM类型的表比较有效,对于InnoDB类型的表则不可用,由于InnoDB表的表空间不能直接复制。

使用mysqlhotcopy命令备份的数据也是经过这种方式来还原的。在Linux操做系统下,复制到数据库目录后,必定要将数据库的用户和组变成mysql。命令以下:

chown -R mysql.mysql dataDir

其中,两个mysql分别表示组和用户;“-R”参数能够改变文件夹下的全部子文件的用户和组;“dataDir”参数表示数据库目录。

ps:Linux操做系统下的权限设置很是严格。一般状况下,MySQL数据库只有root用户和mysql用户组下的mysql用户能够访问。所以,将数据库目录复制到指定文件夹后,必定要使用chown命令将文件夹的用户组变为mysql,将用户变为mysql。

数据库迁移

数据库迁移就是指将数据库从一个系统移动到另外一个系统上。数据库迁移的缘由有多种,多是由于升级了计算机,或者是部署开发的管理系统,或者升级了MySQL数据库,甚至是换用其余的数据库。根据上述状况,能够将数据库迁移大体分为3类。这3类分别是在MySQL相同版本的数据库之间迁移、迁移到MySQL其余版本的数据库中和迁移到其余类型的数据库中。

MySQL相同版本的数据库之间的迁移

MySQL相同版本的数据库之间的迁移就是在主版本号相同的MySQL数据库之间进行数据库移动,这种迁移的方式最容易实现。

MySQL相同版本的数据库之间进行数据库迁移的缘由不少。一般的缘由是换了新的机器,或者是装了新的操做系统;还有一种常见的缘由就是将开发的管理系统部署到工做机器上。由于迁移先后MySQL数据库的主本版号相同,因此能够经过复制数据库目录来实现数据库迁移。可是,只有数据库表都是MyISAM类型的才能使用这种方式。

最经常使用和最安全的方式是使用mysqldump命令来备份数据库。而后使用mysql命令将备份文件还原到新的MySQL数据库中。这里能够将备份和迁移同时进行。假设从一个名为host1的机器中备份出全部数据库,而后,将这些数据库迁移到名为host2的机器上。命令以下:

mysqldump -h name1 -u root -password=password1 -all-databases

mysql -h host2 -u root -password=password2

其中,“-password=password1”是name1主机上root用户的密码;同理,password2是name2主机上的root用户的密码。经过这种方式能够直接实现迁移。

不一样数据库之间的迁移

不一样数据库之间迁移是指从其余类型的数据库迁移到MySQL数据库,或者从MySQL数据库迁移到其余类型的数据库。例如,某个网站原来使用Oracle数据库,由于运营成本过高等诸多缘由,但愿改用MySQL数据库。或者,某个管理系统原来使用MySQL数据库,由于某种特殊性能的要求,但愿改用Oracle数据库。这样的不一样数据库之间的迁移也常常会发生,可是这种迁移没有广泛适用的解决方法。

MySQL之外的数据库也有相似mysqldump这样的备份工具,能够将数据库中的文件备份成sql文件或普通文件。可是,由于不一样数据库厂商没有彻底按照SQL标准来设计数据库,这就形成了不一样数据库使用的SQL语句的差别。例如,微软的SQL Server软件使用的是T-SQL语言。T-SQL中包含了非标准的SQL语句,这就形成了SQL Server和MySQL的SQL语句不能兼容。

除了SQL语句存在不兼容的状况外,不一样的数据库之间的数据类型也有差别。例如,SQL Server数据库中有ntext、Image等数据类型,这些MySQL数据库都没有;MySQL支持的ENUM和SET类型,这些SQL Server数据库不支持,数据类型的差别也形成了迁移的困难。从某种意义上说,这种差别是商业数据库公司故意形成的壁垒,这种行为是阻碍数据库市场健康发展的。

表的导出和导入

MySQL数据库中的表能够导出成文本文件、XML文件或者HTML文件;相应地,文本文件也能够导入MySQL数据库中。在数据库的平常维护中,常常须要进行表的导出和导入的操做。

用SELECT …… INTO OUTFILE导出文本文件

MySQL中,可使用SELECT …… INTO OUTFILE语句将表的内容导出成一个文本文件。其基本语法形式以下:

SELECT [列名] FROM table [WHERE语句] INTO OUTFILE '目标文件' [OPTION];

该语句分为两个部分,前半部分是一个普通的SELECT语句,经过这个SELECT语句来查询所须要的数据;后半部分是导出数据的。其中,“目标文件”参数指定将查询的记录导出到哪一个文件;“OPTION”参数时能够有经常使用的5个选项。介绍以下:

FIELDS TERMINATED BY '字符串':设置字符串为字段的分隔符,默认值是“\t”;

FIELDS ENCLOSED BY '字符':设置字符串括上字段的值。默认状况下不使用任何符号;

FIELDS OPTIOINALLY ENCLOSED BY '字符':设置字符串括上CHAR、VARCHAR、和TEXT等字符型字段。默认状况下不使用任何符号;

FIELDS ESCAPED BY '字符':设置转义字符,默认值为“\”;

LINES STARTING BY '字符串':设置每行开头的字符,默认状况下无任何字符;

LINES TERMINATED BY '字符串':设置每行的结束符,默认值是“\n”;

SELECT * FROM student INTO OUTFILE 'D:\student1.txt'
FIELDS TERMINATED BY '\,'OPTIONALLY ENCLOSED BY '\"' LINES STARTING BY '\>'
TERMINATED BY'\r\n';
字段之间用“,”隔开,字符型数据用双引号括起来,每条记录以“>”开头。“TERMINATED BY'\r\n'”能够保证每条记录占一行。

用mysqldump命令导出文本文件

mysqldump命令能够备份数据库中的数据,但在备份时保存了CREATE语句和INSERT语句,不只如此,mysqldump命令还能够导出文本文件。其基本的语法形式以下:

mysqldump -uroot -pPassword -T 目标目录 dbname table [option];

其中,Password参数表示root用户的密码,密码紧挨着-p选项;目标目录参数时指导出的文本文件的路径;dbname参数表示数据库的名称;table参数表示表的名称;option表示附件选项。这些选项介绍以下:

--fields-terminated-by=字符串:设置字符串为字段的分隔符,默认值是“\t”;

--fields-enclosed-by=字符:设置字符串括上字段的值;

--fields-optionally-enclosed-by=字符:设置字符括上CHAR、VARCHAR和TEXT等字符型字段;

--fields-escaped-by=字符:设置转义字符;

--lines-terminated-by=字符串:设置每行的结束符。

注意这些选项必须用双引号括起来,不然,MySQL数据库系统将不能识别这几个参数。

mysqldump -uroot -p111 -T D:\test student
"--fields-terminated-by=,""-fields-optionally-enclosed-by="
字段之间用“,”隔开,字符型数据用双引号括起来.

ps:其实,mysqldump命令也是调用SELECT……INTO OUTFILE语句来导出文本文件的。除此以外,mysqldump命令同时还生成了student.sql文件,这个文件中有表的结构和表中的记录。

mysqldump命令还能够导出xml格式的文件,其基本语法以下:

mysqldump -uroot -pPassword -xml-X dbname table > D:\name.xml;

其中,Password表示root用户的密码;使用-xml或者-X选项就能够导出xml格式的文件;dbname表示数据库的名称;table表示表的名称;D:\name.xml表示导出的xml文件的路径。

用mysql命令导出文本文件

mysql命令能够用来登陆MySQL服务器,也能够用来还原备份文件。同时,mysql命令也能够导出文本文件。其基本语法形式以下:

mysql -uroot -pPassword -e "SELECT语句" dbname > D:/name.txt;

其中,Password表示root用户的密码;使用-e选项就能够执行SQL语句:“SELECT语句”用来查询记录;D:/name.txt表示导出文件的路径。

mysql命令还能够导出XML文件和HTML文件。mysql命令导出XML文件的语法以下:

mysql -uroot -pPassword -xml-X -e "SELECT语句" dbname>D:/name.xml

其中,Password表示root用户的密码;使用-xml或者-X选项就能够导出xml格式的文件;dbname表示数据库的名称;D:/name.xml表示导出的XML文件的路径。

mysql命令导出HTML文件的语法以下:

mysql -uroot -pPassword --html-H -e "SELECT语句" dbname>D:/name.html

其中,使用--html或者-H选项就能够导出HTML格式的文件。