使用mysqldump以分隔文本格式导出数据

来自泡泡学习笔记
跳到导航 跳到搜索

这节介绍了如何使用mysqldump创建分隔文本格式的转储文件。


如果您使用--tab=dir_name选项调用mysqldump,它将使用dir_name作为输出目录,并在该目录中单独为每个表创建两个文件进行转储。表名是这些文件的基本名称。对于名为t1的表,文件的名称分别为t1.sql和t1.txt。.sql文件包含表的CREATE TABLE语句,.txt文件包含表数据,每行一个表行。


以下命令将db1数据库的内容转储到/tmp数据库中的文件中:

$> mysqldump --tab=/tmp db1


包含表数据的.txt文件由服务器编写,因此它们由用于运行服务器的系统帐户拥有。服务器使用SELECT ... INTO OUTFILE来编写文件,因此您必须具备FILE特权才能执行此操作,如果给定的.txt文件已存在,则会出现错误。


服务器将转储表的CREATE定义发送给mysqldump,mysqldump将它们写入.sql文件。因此,这些文件的所有者是执行mysqldump的用户。


最好只使用--tab来转储本地服务器。如果您将其用于远程服务器,那么--tab目录必须同时存在于本地和远程主机上,.txt文件将由服务器在远程目录(服务器主机上)中编写,而.sql文件将由mysqldump在本地目录(客户端主机上)中编写。


对于mysqldump --tab,服务器默认将表数据写入.txt文件,每行一行,列值之间用制表符分隔,列值周围没有引号,并将换行符作为行终止符。(这些与SELECT ... INTO OUTFILE的默认设置相同。)


为了支持使用不同的格式写入数据文件,mysqldump提供了以下选项:

  • --fields-terminated-by=str

用于分隔列值的字符串(默认为制表符)。


  • --fields-enclosed-by=char

用于将列值括起来的字符(默认为没有字符)。


  • --fields-optionally-enclosed-by=char

用于将非数字列值括起来的字符(默认为没有字符)。


  • --fields-escaped-by=char

用于转义特殊字符的字符(默认为不转义)。


  • --lines-terminated-by=str

行终止字符串(默认为换行符)。


根据您为这些选项指定的值,可能需要在命令行中适当地引用或转义该值以适应您的命令解释器。或者,可以使用十六进制表示法指定该值。假设您希望mysqldump在双引号内引用列值。为此,请将双引号作为--fields-enclosed-by选项的值。但是,这个字符对于命令解释器来说通常是特殊的,需要特殊处理。例如,在Unix上,您可以像这样引用双引号:


  • --fields-enclosed-by='"'

在任何平台上,您都可以使用十六进制指定该值:


  • --fields-enclosed-by=0x22

通常会同时使用多个数据格式选项。例如,要以逗号分隔值格式,并以回车/换行对(\r\n)终止行的方式转储表,请使用以下命令(将其输入为单行):

$> mysqldump --tab=/tmp --fields-terminated-by=,
         --fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1


如果您在转储表数据时使用了任何数据格式选项,您需要在以后重新加载数据文件时指定相同的格式,以确保正确解释文件内容。