
1.6 MySQL数据库的导入与导出
目前,很多网站系统都采用MySQL+PHP+Apache的架构,其中MySQL数据库是基础,查看数据库、将数据库导出到本地、将数据库导入本地数据库进行还原、在本地架设模拟环境进行测试等,都离不开对数据库的操作。尽管数据库的导入和导出是常见和基础的操作,但在实际操作过程中有很多技巧和注意事项。本节将对MySQL数据库的导入和导出进行详细介绍。
1.6.1 Linux下MySQL数据库的导入与导出
1.MySQL数据库的导出命令和参数
对于Linux而言,主要通过mysql和mysqldump命令来执行导出操作。在使用这两个命令时,都需要使用参数。
MySQL连接参数列举如下。
· -u$USER:用户名。
· -p$PASSWD:密码。
· -h127.0.0.1:如果连接远程服务器,请用对应的主机名或IP地址替换“127.0.0.1”。
· -P3306:端口。
· --default-character-set=utf8:指定字符集。
· --skip-column-names:不显示数据列的名字。
· -B:以批处理方式运行MySQL程序。查询结果将以制表符间隔格式显示。
· -e:执行命令后退出。
mysqldump参数列举如下。
· -A:全库备份。
· --routines:备份存储过程和函数。
· --default-character-set=utf8:设置字符集。
· --lock-all-tables:全局一致性锁。
· --add-drop-database:在每次执行建表语句之前,执行DROP TABLE IF EXIST语句。
· --no-create-db:不输出CREATE DATABASE语句。
· --no-create-info:不输出CREATE TABLE语句。
· --databases:将后面的参数都解析为库名。
· --tables:第一个参数为库名,后续参数均为表名。
2.MySQL数据库的常见导出命令
(1)将全库备份到本地目录

(2)将指定库导出到本地目录
将antian365库导出到本地目录,命令如下。

(3)将某个库中的表导出到本地目录
将antian365库中的user表导出到本地目录,命令如下。

(4)将指定库中的表(仅数据)导出到本地目录(带过滤条件)
将mysql库中的user表导出到本地目录,命令如下。

(5)将某个库的所有表结构导出

(6)将某个查询sql的数据以txt格式导出到本地目录
在导出的文件中,各数据间用制表符分隔,例如“'select user,host,password from mysql.user;'”,命令如下。

(7)将某个查询sql的数据以txt格式导出到MySQL服务器
登录MySQL,将默认的制表符换成逗号(适应csv格式),命令如下。

3.提高MySQL数据库导出速度的技巧
通过 MySQL 导出数据的速度可能非常慢,在处理百万级数据时可能要花上几个小时。在导出时,合理地使用几个参数,就可以提高速度。
· --max_allowed_packet=XXX:客户端和服务器之间通信缓存区的最大值。
· --net_buffer_length=XXX:TCP/IP和套接字通信缓存区的大小,创建长度为net_buffer_length的行。
注意
max_allowed_packet和net_buffer_length的值不能比目标数据库的设定值大,否则可能会出错。
首先,确定目标数据库的参数值,命令如下。

然后,根据参数值输入mysqldump命令,示例如下。

现在,导入速度就变得很快了。需要注意的是,max_allowed_packet和net_buffer_length参数的值应该设置得大一些。最简单的方法是直接复制数据库目录,不过在这样做之前要停止MySQL服务。
4.MySQL数据库的常见导入命令
在将全库数据恢复到 MySQL 时,因为包含 mysql库的权限表,所以导入后需要执行“FLUSH PRIVILEGES;”命令。
(1)使用mysql命令导入

(2)使用source命令导入
登录MySQL,执行source命令(后面的文件路径为绝对路径),示例如下。

(3)使用mysql命令恢复某个库的数据
使用mysql命令恢复antian365库中的user表,命令如下。

(4)使用source命令恢复某个库的数据
使用source命令恢复antian365库中的user表,命令如下。

(5)恢复MySQL服务器上的txt文件


(6)恢复MySQL服务器上的csv文件
在执行以下命令时,需要FILE权限,各数据间用逗号分隔。

(7)将本地txt或csv文件恢复到MySQL中

1.6.2 Windows下MySQL数据库的导入与导出
Windows 下 MySQL 数据库的导入和导出相对简单,在此仅作简单的介绍。在后面的章节中,会结合实际应用介绍一些在Windows下使用客户端软件导入和导出MySQL数据库的方法。
1.通过mysqldump命令导入和导出
命令格式如下。

把数据库db导出到backupdatabase20140916.sql文件,示例如下。

导入数据库的命令行,示例如下。

把backupdatabase20140916.sql导入新建数据库db,示例如下。

2.通过MySQL命令导入和导出
将数据库xxx导出到d盘根目录下的xxx.sql文件,示例如下。

将数据库d盘下的xxx.sql文件导入数据库xxx,示例如下。

登录MySQL以后,通过如下命令进行导入操作。

1.6.3 将html文件导入MySQL数据库
某些数据库,既不是sql文件,也不是txt、csv、xls等文件,而是html文件。数据在html文件中以表格的形式存在。打开该文件,数据以表格的形式展现,如图1-41所示。

图1-41 以表格形式显示的数据
1.选择导入类型
Navicat系列软件支持多种类型的数据。如图1-42所示,单击选中“HTML文件(*.htm;*.html)”,然后单击“下一步”按钮。

图1-42 选择导入文件的类型
在其他类型的库的导入过程中,需要针对不同的类型进行选择。例如,对于xls文件,需要单击选中“Excel文件(*.xls)”。
2.查看文件的编码格式
在导入前,需要知道文件是以何种格式编码的。在本例中,使用记事本程序打开文件,单击“格式”菜单项,即可看到该文件是用UTF-8格式编码的。如图1-43所示,在导入时需要设置文件的编码方式,否则导入的数据在数据库中会显示为乱码。
3.选择编码方式
因为文件是用UTF-8格式编码的,所以在“编码”下拉列表中选择“65001(UTF-8)”选项,如图1-44所示。这一步很关键,如果编码格式选择错误,导入的数据将显示为乱码。

图1-43 查看文件的编码方式

图1-44 选择编码
4.设置栏名称和起始数据行
如图1-45所示:输入数字“1”,设置导入数据的第一行为栏名称(如果设置第二行,则输入数字“2”);“第一个数据行”表示从第几行开始导入数据,在这里输入数字“1”,表示从第一行开始导入(如果输入数字“2”,则表示从第二行开始导入);“最后一个数据行”文本框可以为空。

图1-45 设置栏名称和起始数据行
5.设置目标表和源表
设置目标表和源表,如图1-46所示(默认会显示同样的名称)。可以手动修改目标表的名称。此时,可以新建表,也可以选择数据库中已经存在的表。

图1-46 设置目标表
6.设置目标表的栏名称
如图1-47所示,默认显示第一行数据为栏名称。可以对每一个目标栏名称进行设置,既可以使用默认名称,也可对其进行修改。同时,需要设置类型和长度等。

图1-47 设置目标表的栏名称
然后,单击“下一步”按钮,在导入模式中选择“添加:添加记录到目标表”选项,进行数据的导入。
7.查看导入日志
在导入过程中会显示导入百分比。如果显示“100%”,表示已经导入全部数据。在导入向导窗口会显示导入日志,如图1-48所示,其中包含导入的文件、新建的表等信息。如果导入成功,会显示“Finished-Successfully”。如果在导入过程中出现了错误,可以将日志信息复制下来。单击“关闭”按钮,完成数据的导入。

图1-48 查看日志
8.查看导入的数据
打开导入的数据库表,所有数据被正确地导入。接下来,就可以对数据进行查看和处理了。
1.6.4 将MSSQL数据库导入MySQL数据库
将MSSQL数据库导入MySQL数据库的操作,与将html文件导入MySQL数据库的操作基本相同。在“导入类型”中选择“ODBC”选项,设置数据连接属性为“Microsoft OLE DB Provider for SQL Server”,如图1-49所示。

图1-49 设置数据库连接属性
切换到“连接”标签页,输入服务器名称“.”(也可以输入IP地址或数据库服务器的名称,“.”表示本机或localhost)。输入登录服务器的信息,即设置数据连接方式是“使用Windows NT集成安全设置”还是“使用指定的用户名称和密码”。最后,选择一个数据库进行连接测试。如图1-50所示,如果显示“测试连接成功”,就可以进行后续操作。

图1-50 测试数据库连接
后续操作与将html文件导入MySQL数据库类似,在此就不赘述了。
1.6.5 将xls和xlsx文件导入MySQL数据库
将xls和xlsx文件导入MySQL数据库的步骤与前面介绍的大致相同,区别只是在导入这两种文件时需要选择表。
如图1-51所示,选择xlsx文件中存在数据的表,例如Sheet1和Sheet2。

图1-51 导入xlsx文件
1.6.6 将xml文件导入Navicat for MySQL
笔者在对某网站进行渗透测试时发现,该网站会自动记录用户个人信息,生成log.txt文件。该文件已经超过700MB,使用记事本程序打开比较困难。如图1-52所示,使用浏览器查看该文件,发现其明显是以XML语法进行记录的。通过测试发现,使用Navicat for MySQL可以将该文件导入数据库,但前提是将该文件重命名为xml文件。

图1-52 查看文件内容及其格式
下面介绍测试过程。
1.选择编码方式
打开Navicat for MySQL,选择一个数据库,依次选择“导入向导”→“导入类型”→“xml文件”选项。如图1-53所示,选择数据源(即需要导入的数据文件),同时设置编码格式为UTF-8。

图1-53 设置编码格式
注意
编码格式的选择是非常重要的。如果编码格式选择错误,不仅导入的数据库可能显示为乱码,还有可能在导入数据库的过程中直接出现错误,导致数据导入失败。
2.选择表字段
如图1-54所示,在下拉列表中选择一个值作为表行的标签。可以选择软件提供的值,也可以自行指定(其实就是表里面的字典)。然后,单击“下一步”按钮。

图1-54 选择表字段
3.设置数据行
如图1-55所示,如果第一个数据行是栏位名称,则将第一个数据行设置为“2”,否则设置为“1”,其他项保持默认设置即可。

图1-55 设置数据的第一行和栏位名称
4.设置目标表的名称
如图1-56所示,源表是指要将其内容导入数据库的表,目标表是指导入后数据库中的表(软件会自动指定一个表),自动显示出来的目标表的名称为“log”。

图1-56 设置表名称
注意
在一些情况下,目标表名称如果为特殊字符(例如含有“.”等),将无法成功导入数据。因为这些字符在数据库中是禁止使用的,所以无法创建表。
5.设置导入表的栏位名称
如图1-57所示,Navicat for MySQL会自动识别xml文件中的字段名称,并将其转换为数据库能够接受的格式(即数据库栏位名称),因此一般保持默认设置即可。在特殊情况下,可能需要修改栏位名称所对应的数据库类型和长度。

图1-57 设置栏位名称
6.选择导入模式
Navicat for MySQL提供了五种导入模式,但在本例中只能使用其中的两种,一种是添加,另一种是复制,如图1-58所示。保持“添加:添加记录到目标表”的默认选中状态,后续设置均保持默认状态,即可开始导入数据。

图1-58 选择导入方式
7.导入数据库
如图1-59所示,开始导入数据库。在该窗口中会显示数据导入进度、已处理数据的记录、错误信息、已添加数据的记录及耗费的时间等,窗口标题栏显示“100%”则表示导入成功。

图1-59 导入数据
8.后续处理
导入成功后,可以将一些无用的数据清理掉,命令如下。

1.6.7 通过Navicat for MySQL代理导入数据
使用Navicat for MySQL进行数据库连接,可以通过HTTP通道实现。
1.在“常规”选项卡中设置
新建MySQL连接,设置连接名、主机名(本例为“localhost”)、端口和密码,如图1-60所示。

图1-60 设置MySQL连接
2.使用HTTP通道
切换到“HTTP”标签页,勾选“使用 HTTP 通道”选项。如图1-61所示,在“通道地址”文本框中输入ntunnel_mysql.php文件的实际地址,单击“确认”按钮。

图1-61 使用HTTP通道
3.本地连接远程数据库
如图1-62所示,在Navicat for MySQL中双击新建数据库的地址,即可实现与该网站数据库的连接。

图1-62 本地连接远程数据库
尽管有些网站是禁止远程连接数据库的,但攻击者在拥有WebShell的情况下,仍然可以将文件C:\Program Files(x86)\PremiumSoft\Navicat for MySQL\ntunnel_mysql.php复制到目标站点根目录或其他目录下,从而导出数据库。因此,在实际工作中,即使禁用了远程数据库连接,也需要经常对网站数据库的安全性进行检查。
1.6.8 导入技巧和错误处理
1.转码处理
使用记事本程序(或者其他文本编辑器)打开文件,在“格式”菜单中选择“转为UTF-8编码格式”选项,文件将以UTF-8编码格式进行编码,如图1-63所示。

图1-63 进行转码处理
2.出错继续
如图1-64所示,在正式将数据导入数据库之前,勾选“遇到错误继续”复选框,导入过程就不会因为导入数据的格式错误而终止了。

图1-64 出错继续
3.错误信息再处理
如图1-65所示,如果数据格式不全或编码中有多余的特殊字符,数据导入将会失败,没有被成功导入的数据会在日志中显示出来。

图1-65 错误信息再处理
将日志中的出错信息复制到记事本程序中,修改其中的错误并保存,然后在查询器中进行查询和导入。
如图1-66所示,一些sql文件在导出时使用了错误的编码,特别是中文字符,会在其中显示“?”。这时,需要进行替换操作。可以将“?”替换为“'”,重新运行sql文件。

图1-66 处理文件中的特殊字符