Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何处理——MySQL中的安全文件priv?_Mysql_Database - Fatal编程技术网

我应该如何处理——MySQL中的安全文件priv?

我应该如何处理——MySQL中的安全文件priv?,mysql,database,Mysql,Database,我正在学习MySQL,并尝试使用LOAD DATA子句。当我使用它时,如下所示: LOAD DATA INFILE "text.txt" INTO table mytable; 我得到了以下错误: MySQL服务器正在使用--secure file priv选项运行,因此无法执行此语句 我如何处理这个错误 我查过了,但还是找不到解决办法 我正在使用MySQL 5.6,它按预期工作。MySQL服务器的启动选项基本上限制了您可以使用loaddatainfle从哪些目录加载文件 您可以使用显示变量,

我正在学习MySQL,并尝试使用
LOAD DATA
子句。当我使用它时,如下所示:

LOAD DATA INFILE "text.txt" INTO table mytable;
我得到了以下错误:

MySQL服务器正在使用--secure file priv选项运行,因此无法执行此语句

我如何处理这个错误

我查过了,但还是找不到解决办法


我正在使用MySQL 5.6,它按预期工作。MySQL服务器的启动选项基本上限制了您可以使用
loaddatainfle
从哪些目录加载文件

您可以使用
显示变量,如“secure\u file\u priv”
查看已配置的目录

您有两个选择:

  • 将文件移动到
    secure file priv
    指定的目录
  • 禁用
    安全文件priv
    。这必须从启动时删除,并且不能动态修改。为此,请检查MySQL启动参数(取决于平台)和my.ini

  • 我正在Debian上使用MySQL5.7.11,用于查看目录的命令是:

    mysql> SELECT @@global.secure_file_priv;
    

    以下是我在Windows 7中禁用
    安全文件priv
    (选项#2 from)的工作原理:

  • 进入
    services.msc
    停止MySQL服务器服务
  • 转到
    C:\ProgramData\MySQL\MySQL服务器5.6
    ProgramData
    在我的例子中是一个隐藏文件夹)
  • 在记事本中打开
    my.ini
    文件
  • 搜索“安全文件priv”
  • 通过在行的开头添加“#”,将行注释掉。对于MySQL服务器5.7.16及更高版本,评论将不起作用。您必须将其设置为如下所示的空字符串-
    secure file priv=“”
  • 保存文件
  • 进入
    services.msc
    启动MySQL服务器服务

  • 我对“安全文件私有”也有同样的问题。.ini文件中的注释无效,在“secure file priv”指定的目录中移动文件也无效


    最后,正如dbc所建议的,将“securefilepriv”设置为空字符串是可行的。因此,如果有人在尝试上述答案后遇到了问题,希望这样做会有所帮助。

    在Ubuntu 14和Mysql 5.5.53上,此设置似乎默认启用。要禁用它,您需要将
    secure file priv=”“
    添加到mysqld config组下的my.cnf文件中。例如:-

    [mysqld]
    secure-file-priv = ""
    

    我使用命令中的
    LOCAL
    选项解决了这个问题:

    LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;
    
    你可以找到更多信息

    如果指定了LOCAL,则客户端程序将在 客户端主机并发送到服务器。该文件可以作为完整文件提供 路径名以指定其确切位置。如果作为相对路径给出 名称,则该名称是相对于 客户端程序已启动


    我对此有各种各样的问题。我在修改我的.cnf和其他版本的问题试图展示的各种疯狂的东西

    对我有用的是:

    我犯的错误

    MySQL服务器正在使用--secure file priv选项运行,因此无法执行此语句

    我可以通过打开/usr/local/mysql/support files/mysql.server并更改以下行来修复它:

    $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" -- $other_args >/dev/null &
      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
    


    我在Windows10上遇到了这个问题。“--secure file priv in MySQL”为了解决这个问题,我做了以下操作

  • 在windows搜索(左下角)中,我键入了“powershell”
  • 右键单击powershell并以管理员身份运行
  • 导航到服务器bin文件。(C:\Program Files\MySQL\MySQL Server 5.6\bin)
  • 键入。/mysqld
  • 点击“回车”

  • 服务器按预期启动

    如果文件是本地文件,请使用命令中的local

    LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
    

    对我起作用的是:

  • 将文件放入
    secure file priv
    中指定的文件夹中

    要查找该类型,请执行以下操作:

    mysql> show variables like "secure_file_priv";  
    
  • 检查您是否有
    local\u infle=1

    请输入以下命令:

    mysql> show variables like "local_infile";
    
    如果您得到:

    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | local_infile  | OFF   |
    +---------------+-------+
    
    然后将其设置为一个:

    mysql> set global local_infile = 1;
    
  • 指定文件的完整路径。就我而言:

    mysql> load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt" into table test;
    

  • MySQL使用此系统变量控制文件的导入位置

    mysql> SHOW VARIABLES LIKE "secure_file_priv";
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | secure_file_priv | NULL  |
    +------------------+-------+
    
    所以问题是如何更改系统变量,例如
    secure\u file\u priv

  • 关机
    mysqld
  • sudo mysqld\u safe--secure\u file\u priv=“”
  • 现在你可能会看到这样的情况:

    mysql> SHOW VARIABLES LIKE "secure_file_priv";
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | secure_file_priv |       |
    +------------------+-------+
    

    @vhu我做了
    显示变量,比如“secure\u file\u priv”返回
    C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\
    ,所以当我插入时,它仍然无法工作

    当我直接转到
    my.ini
    文件时,我发现路径的格式有点不同:

    C:/ProgramData/MySQL/MySQL Server 8.0/Uploads
    

    然后,当我用它运行时,它工作了。唯一的区别是斜杠的方向。

    如果您在Ubuntu上运行,您可能还需要配置Apparmor以允许MySQL写入您的文件夹,例如,下面是我的配置:

    将此行添加到文件/etc/apparmor.d/usr.sbin.mysqld:

    /var/lib/mysql-files/* rw
    
    然后将这两个配置行添加到/etc/mysql/my.cnf部分:

    [client]
    loose-local-infile = 1
    
    [mysqld]
    secure-file-priv = ""
    
    以下是我的SQL:

    select id from blahs into outfile '/var/lib/mysql-files/blahs';
    

    这对我有用。祝你好运

    对于mysql 8.0版本,您可以执行以下操作:

    mysql.server stop
    mysql.server start --secure-file-priv=''
    

    它在Mac High Sierra上对我有效。

    在macOS Catalina,我按照以下步骤设置
    安全文件\u priv

    1.停止MySQL服务

     sudo /usr/local/mysql/support-files/mysql.server stop
    
    2.重新启动MYSQL分配--安全文件\u私有系统变量

    sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=YOUR_FILE_DIRECTORY
    
    注意:添加空值为我解决了这个问题,MYSQL将数据导出到/usr/local/MYSQL/data/YOUR_DB_TABLE/export_文件目录

    sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=
    

    谢谢,无需更改任何配置文件

  • 使用@vhu:
    SHOW变量如“secure\u file\u priv”
    发布的命令查找
    secure\u file\u priv
    的值
  • 定义查询的完整路径,例如:
    select*从表到输出文件“secure\u file\u priv\u path/OUTPUT-file”。。。其余的
    
    sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=
    
    INSERT INTO <your_table> VALUEs( **CSV LINE **)
    
    "city","city_ascii","lat","lng","country","iso2","iso3","id"
    "Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
    ...
    
    const express = require('express'),
       cors = require('cors'),
       fs = require('fs-extra'),
       byline = require('byline'),
       db = require('../database/db'),
       importcsv = express.Router();
    
    importcsv.use(cors());
    
    importcsv.get('/csv', (req, res) => {
    
       function processFile() {
          return new Promise((resolve) => {
             let first = true;
             var sql, sqls;
             var stream = byline(
                fs.createReadStream('../PATH/TO/YOUR!!!csv', {
                   encoding: 'utf8',
                })
             );
    
             stream
                .on('data', function (line, err) {
                   if (line !== undefined) {
                      sql = 'INSERT INTO <your_table> VALUES (' + line.toString() + ');';
                      if (first) console.log(sql);
                      first = false;
                      db.sequelize.query(sql);
                   }
                })
                .on('finish', () => {
                   resolve(sqls);
                });
          });
       }
    
       async function startStream() {
          console.log('started stream');
          const sqls = await processFile();
          res.end();
          console.log('ALL DONE');
       }
    
       startStream();
    });
    
    module.exports = importcsv;
    
    const Sequelize = require('sequelize');
    const db = {};
    const sequelize = new Sequelize(
       config.global.db,
       config.global.user,
       config.global.password,
       {
          host: config.global.host,
          dialect: 'mysql',
          logging: console.log,
          freezeTableName: true,
    
          pool: {
             max: 5,
             min: 0,
             acquire: 30000,
             idle: 10000,
          },
       }
    );
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
    
    module.exports = db;
    
    
    sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv='' --local-infile
    
    mysql -u root -p
    
    /etc/mysql/my.cnf
    
    secure-file-priv= <your data path directory like /home/user/data>
    
    volumes:
      - ./persistent:/var/lib/mysql
      - ./conf/my.cnf:/etc/mysql/my.cnf
    
    SHOW VARIABLES LIKE "secure_file_priv";
    
    [client]
    default-character-set=utf8
    
    [mysqld]
    character-set-server=utf8
    secure-file-priv = ""
    skip-external-locking
    
    Loading local data is disabled - this must be enabled on both the client and server sides