栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 系统运维 > 运维 > Linux

MYSQL8.0中关于load data infile命令

Linux 更新时间:发布时间: 百科书网 趣学号
MYSQL8.0中关于load data infile命令

提醒:遇到软件不同版本时,参考文档才是最佳的学习资料。

在学习mysql注入时认识了 LOAD DATA INFILE 语句。在注入时我们会需要一些特殊的文件,如配置文件,密码文件等。当拥有数据库权限时,可以将系统文件利用 load data infile 导入数据库中。
根据官方文档,了解该语句语法:

LOAD XML
    [LOW_PRIORITY | CONCURRENT] [LOCAL]
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE [db_name.]tbl_name
    [CHARACTER SET charset_name]
    [ROWS IDENTIFIED BY '']
    [IGNORE number {LINES | ROWS}]
    [(field_name_or_user_var
        [, field_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT}
        [, col_name={expr | DEFAULT}] ...]

首先我建了一个这样的表:

然后我意图将这个文档的内容插入表中

首先查看local_infile,将其开启为ON。

mysql >set global local_infile=1;
mysql> show global variables like 'local_infile'; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+

但是出现报错,通过参考文档发现高版本mysql将本地数据加载操作限制在了指定文档中。

//找到指定文件夹
mysql> show variables like '%secure%'; 
+--------------------------+------------------------------------------------+
| Variable_name            | Value                                          |
+--------------------------+------------------------------------------------+
| require_secure_transport | OFF                                            |
| secure_file_priv         | C:ProgramDataMySQLMySQL Server 8.0Uploads |
+--------------------------+------------------------------------------------+
//也有root权限
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+

//存在报错;
mysql> load data local infile 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\2.txt' into table test2 fields terminated by 'n';
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

发现 local 删掉就不会报错了?

LOCAL:
该关键字影响文件的预期读取位置及错误句柄。需要客户端及服务端都开启该选项,如果mysqld的启动参数包含local-infile=0,那么指定该参数是无效的。
使用时,客户端程序读取文件并将其内容发送到服务器。服务器在存储临时文件的目录中创建文件的副本,如果此目录中缺少足够的空间来存储副本,则也可能导致 LOAD DATA LOCAL 语句失败。

mysql> load data infile 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\2.txt' into table test2 fields terminated by 'n';
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

//这样也可以
mysql> load data infile 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\2.txt' ignore into table test2 character set gbk fields terminated by 't' lines terminated by 'n';
//将 2.txt 导入到 test2 表中,character set gbk 是字符集设置为 gbk,fields terminated by 是每一项数据之间的分隔符,lines terminated by 是行的结尾符。
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

随后我添加了环境变量,从cmd中进入mysql,成功使用 load data local infile 语句。



还要注意:
表中字段的类型要与输入数据类型对应,即为varchar即字符串类型,才能写进去;
查看 secure_file_priv 属性设置是否正确;
高版本的mysql如果是空值应该要写NULL或者0,否则会报错 Incorrect integer value: ” for column ‘id’ at row 1,但是这里只设置了一列因而不会有这个错;
在windows下, 路径可以为斜杠 ‘/’ 或双反斜杠 ‘\’ 。

官方文档中也提到了安全要求:
对于非加载操作,服务器读取位于服务器主机上的文本文件,因此必须满足以下安全要求:
必须具有 FILE 权限,该操作受 secure_file_priv 系统变量设置的约束:

  • 如果变量值是非空目录名,则文件必须位于该目录中。
  • 如果变量值为空(不安全),则服务器只需读取该文件。

对于装入操作,客户端程序读取位于客户端主机上的文本文件。由于文件内容是通过客户端与服务器的连接发送的,因此使用速度比服务器直接访问文件时慢一些。另一方面,您不需要 FILE 特权,并且该文件可以位于客户端程序可以访问的任何目录中。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1050441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号