常见的MySQL数据导出有三种形式
SELECT * FROM person INTO OUTFILE '/var/lib/mysql-files/person.data';
LOAD DATA INFILE
LOAD DATA INFILE
是SELECT ... INTO OUTFILE
的逆操作常用选项
FIELDS TERMINATED BY ','
:字段分隔符ENCLOSED BY '"'
:包围字段的符号LINES TERMINATED BY '\r\n'
:行分隔符导出的数据格式非常灵活,但是只能导出在MySQL服务器上,而且是指定的目录(可能没有权限)
mysqldump -uroot -p blog > blog.sql
使用mysqldump需要锁表,有时候会因为安全规则,不允许使用。
mysqldump: Got error: 1044: "Access denied for user 'tenmao'@'192.168.58.100' to database 'tenmao_blog'" when using LOCK TABLES
常用选项
--where
条件过滤mysqldump -uroot -p tenmao person --where="status=1" > tenmao.sql
--no-data
只导出表结构mysqldump -uroot -p tenmao > tenmao_structure.sql
--single-transaction
不锁表这个功能还是很实用的,只支持InnoDB引擎
mysql -A tenmao_blog -h 192.168.58.200 -utenmao -p -e "select * from article where status=1" > articles.csv
这种方式特别灵活,缺点是不能像
SELECT ... INTO OUTFILE
指定分隔符,在一些column内容比较复杂的场景下(比如同时有'
,"
,\n
,\t
的时候),效果不太好
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
:因为只能导出到指定目录,该目录可以通过命令show global variables like '%secure_file_priv%';
查询得到