需要将 MySQL 数据库中的某个表,导出成 CSV 文件格式。方便在 Excel 中查看和修改,然后再导入回数据库。 突然感觉智能表格才是应用的未来。。。因为大家还是习惯在 Excel 中查看和修改数据。
尝试了几种方法,最终发现还是 mysqldump 命令最方便。
mysqldump 导出 CSV 文件
sudo mysqldump -u username -p \
--tab=/var/lib/mysql-files/ \
--fields-terminated-by=',' \
--fields-enclosed-by='"' \
db_name table_name
--tab 参数是指定导出文件的目录,必须是 MySQL 服务器有权限写入的目录。
导出速度很快,50 万条记录,秒完成。大概 100MB 左右的文件大小。查看导出目录:
> sudo ls /var/lib/mysql-files/
table_name.sql table_name.txt
会看到两个文件,其中的 txt 文件就是 CSV 格式的文件,可以直接改后缀名为 .csv。 sql 文件是表结构的定义,可以忽略。
为何要指定 /var/lib/mysql-files/ 目录
如果指定了其他目录,可能会报错:
mysqldump: Got error: 1290: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement when executing 'SELECT INTO OUTFILE'
进入 MySQL 命令行,执行下面的命令,可以查看 secure_file_priv 的值:
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.01 sec)
看起来是为了安全起见,MySQL 限制只能在指定目录下读写文件。
要修改这个值,需要修改 MySQL 的配置文件 my.cnf,然后重启 MySQL 服务。 不想重启服务的话,就只能使用这个目录了。
方案二:SELECT ... INTO OUTFILE
也可以使用 SQL 语句导出 CSV 文件:
SELECT * FROM table_name
INTO OUTFILE '/var/lib/mysql-files/table_name.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
同样需要指定 secure_file_priv 目录,否则会报上面同样的错误:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
不靠谱方案:MySQL Workbench 导出 CSV
MySQL Workbench 中右键表名,选择 "Table Data Export Wizard"。也能将表导出成 CSV 文件。 但是这个导出功能,上面1秒完成的任务,导出1个小时也没执行完,而且界面卡死。
docker 环境下导出 CSV
如果 MySQL 是运行在 Docker 容器中,可以使用 docker exec 命令进入容器,然后执行上面的 mysqldump 命令。 或者使用一行命令:
docker compose exec mysql /usr/bin/mysqldump -u root --password=password --tab=/var/lib/mysql-files/ --fields-terminated-by=',' --fields-enclosed-by='"' db table
但是也有指定目录的限制。
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式