首先要注意的是,select into outfile只能将文件转储到mysql服务所在的服务器上,不能存到客户机上。要存到客户机上,就直接查出来,然后把结果>到文件。

sudo mysql -h[host] -u[user] -p[password] db -e "[query]" > outfile

配置文件修改

默认只能导出到/var/lib/mysql-files/目录下,修改配置文件使其能导出到任意目录下

  1. 定位配置文件:locate mysqld.cnf
  2. 修改配置文件,在[mysqld]下加一行:secure_file_priv =
  3. 重启mysql服务:service mysql restart
  4. 这时再导出还会有权限问题 ,对所有用户赋予目标文件夹的所有权限:sudo chmod -R 777 outdir
  5. 修改apparmor对mysql的权限管理:sudo vim /etc/apparmor.d/usr.sbin.mysqld,在Allow data files dir access后新增一行/outdir/** rw,,保存退出
  6. 重启apparmor:service apparmor restart

select into outfile的使用

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

该语句分为两个部分。前半部分是一个普通的SELECT语句,通过这个SELECT语句来查询所需要的数据;后半部分是导出数据的。其中,“目标文件”参数指出将查询的记录导出到哪个文件中;“OPTION”参数为可选参数选项,其可能的取值有:

  • FIELDS TERMINATED BY ‘字符串’:设置字符串为字段之间的分隔符,可以为单个或多个字符。默认值是“\t”。
  • FIELDS ENCLOSED BY ‘字符’:设置字符来括住字段的值,只能为单个字符。默认情况下不使用任何符号。
  • FIELDS OPTIONALLY ENCLOSED BY ‘字符’:设置字符来括住CHAR、VARCHAR和TEXT等字符型字段。默认情况下不使用任何符号。
  • FIELDS ESCAPED BY ‘字符’:设置转义字符,只能为单个字符。默认值为“\”。
  • LINES STARTING BY ‘字符串’:设置每行数据开头的字符,可以为单个或多个字符。默认情况下不使用任何字符。
  • LINES TERMINATED BY ‘字符串’:设置每行数据结尾的字符,可以为单个或多个字符。默认值是“\n”。

FIELDS和LINES两个子句都是自选的,但是如果两个子句都被指定了,FIELDS必须位于LINES的前面。

常规用法(双引号作为字段分隔符和转义字符,当字段中包含双引号时转义成"",包含换行符时会在换行符前加",不建议使用):

sudo mysql -h[host] -u[user] -p[password] db -e 'select * from table  into outfile "outfile" FIELDS TERMINATED BY "," optionally ENCLOSED BY "\"" ESCAPED BY "\""'

导出所有表:

sudo mysql -h[host] -u[user] -p[password] db -e "show tables" |xargs -i{} -t sudo mysql -h[host] -u[user] -p[password] db -e 'select * from table into outfile "/var/lib/mysql-files/{}.csv" FIELDS TERMINATED BY "," optionally ENCLOSED BY "\"" ESCAPED BY "\""'

若某字段可能同时包含\n和",取消转义字符,并将字段中的"替换为"":

sudo mysql -h[host] -u[user] -p[password] db -e 'select replace(`field`,"\"","\"\"") from table into outfile "/var/lib/mysql-files/outfile" FIELDS TERMINATED BY "," optionally ENCLOSED BY "\"" ESCAPED BY "" '