我正在尝试使用我的脚本中的以下代码将MySQL脚本的结果写入文本文件.
SELECT p.title, p.content, c.name FROM post p
LEFT JOIN category c ON p.category_id=c.id
INTO OUTFILE 'D:\MySql\mysqlTest.txt';
Run Code Online (Sandbox Code Playgroud)
但是,我得到以下内容
错误1290(HY000):MySQL服务器正在运行--secure-file-priv选项,因此无法执行此语句
我该如何解决这个问题?
rus*_*spy 41
Ubuntu 16.04(EASY):找出你可以写的地方
mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| /var/lib/mysql-files/ |
+---------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
然后,就在那里写
mysql> SELECT * FROM train INTO OUTFILE '/var/lib/mysql-files/test.csv' FIELDS TERMINATED BY ',';
Query OK, 992931 rows affected (1.65 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
Mac OSX:通过MAMP安装Mysql
找出你可以写的地方
mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| NULL |
+---------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
NULL意味着你被搞砸了所以你必须创建文件"〜/ .my.cnf"
启用通过MAMP安装的MySQL的读/写(在Mac上):
编辑〜/ .my.cnf(使用vi或您喜欢的编辑器)并添加以下行:
$ vi~/.my.cnf
Run Code Online (Sandbox Code Playgroud)[mysqld_safe] [mysqld] secure_file_priv="/Users/russian_spy/"
现在检查它是否有效:
一个.启动mysql(默认MAMP用户是root,密码也是root)
$ /Applications/MAMP/Library/bin/mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
湾 在mysql中查看列入白名单的路径
mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| /Users/russian_spy/ |
+---------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
C.最后,通过将表导出train
为CSV文件进行测试
mysql> SELECT * FROM train INTO OUTFILE '/Users/russian_spy/test.csv' FIELDS TERMINATED BY ',';
Query OK, 992931 rows affected (1.65 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
小智 12
secure-file-priv = ""
行systemctl stop mysqld
systemctl start mysqld
它现在允许您导入和导出数据.
您无法导出数据,因为它是在mysql配置文件中配置的.打开my.cnf配置文件并检查.
引用MySQL 文档
此变量用于限制数据导入和导出操作,如那些由执行的效果
LOAD DATA
和SELECT ... INTO OUTFILE
报表和LOAD_FILE()
功能.仅允许具有此FILE
权限的用户执行这些操作.
secure_file_priv
可以设置如下:
如果为空,则变量无效.
如果设置为目录名称,则服务器会将导入和导出操作限制为仅适用于该目录中的文件.目录必须存在; 服务器不会创建它.
如果设置为
NULL
,则服务器禁用导入和导出操作.从MySQL 5.7.6开始允许该值.
(空值是默认值,或者可以在my.cnf中明确指定为secure_file_priv=""
.NULL
可以使用secure_file_priv=NULL
.设置值.)
因此,如果要导出数据,则需要注释此选项并重新启动mysql服务器.然后你就可以出口了.
/etc/my.cnf
只需创建一个包含以下内容的文件
[mysqld]
secure_file_priv = ''
Run Code Online (Sandbox Code Playgroud)
您可以使用此单行:
echo "[mysqld]\nsecure_file_priv\t\t= ''\n" | sudo tee /etc/my.cnf
Run Code Online (Sandbox Code Playgroud)
然后重启mysql。如果使用brew安装mysql,则运行以下命令:
brew services restart mysql
Run Code Online (Sandbox Code Playgroud)