首先要注意的是,select into outfile只能将文件转储到mysql服务所在的服务器上,不能存到客户机上。要存到客户机上,就直接查出来,然后把结果>
到文件。
sudo mysql -h[host] -u[user] -p[password] db -e "[query]" > outfile
配置文件修改
默认只能导出到/var/lib/mysql-files/目录下,修改配置文件使其能导出到任意目录下
- 定位配置文件:
locate mysqld.cnf
- 修改配置文件,在[mysqld]下加一行:
secure_file_priv =
- 重启mysql服务:
service mysql restart
- 这时再导出还会有权限问题 ,对所有用户赋予目标文件夹的所有权限:
sudo chmod -R 777 outdir
- 修改apparmor对mysql的权限管理:
sudo vim /etc/apparmor.d/usr.sbin.mysqld
,在Allow data files dir access
后新增一行/outdir/** rw,
,保存退出 - 重启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 "" '