int outfile错误

【 使用环境 】 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】按照文档学习into outfile用法,但是错误如下:

【复现路径】问题出现前后相关操作

一、第一张错误,授权错误原因

你在执行:

GRANT FILE ON db1.* TO ‘ljk’;

时报了错误:

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

错误原因

在 MySQL(以及 OceanBase MySQL 模式)中,FILE 权限是一个全局权限(global privilege),而不是数据库级别的权限。也就是说,不能在 db1.* 这样的数据库级别授予,而必须使用全局(.)级别授予。
解决办法

将授权改为全局:

GRANT FILE ON . TO ‘ljk’;

解释

全局权限(如 FILE、SUPER、PROCESS 等)只能在 *.* 级别授予。

数据库级别权限(如 SELECT、INSERT 等)才支持像 db1.* 这样的授权。

最终解决 SQL

GRANT FILE ON . TO ‘ljk’;

二、第二张错误原因

1 权限限制
需要有 FILE 权限(GRANT FILE ON . TO ‘root’@’%’)
但是在 OceanBase 中,通常不会默认授予该权限给普通用户。

2 secure_file_priv 参数限制
该参数用于限制 INTO OUTFILE(和 LOAD DATA INFILE)可以操作的目录。
你已经尝试执行:

SET GLOBAL secure_file_priv = ‘/home/admin’;
SET GLOBAL secure_file_priv = ‘/home/admin/dumpdata’;

但是即使设置了,也没有生效,原因在于 OceanBase 中的 secure_file_priv 并不像 MySQL 一样支持动态修改,或者受限于租户和集群层级管理,用户在会话中无法修改全局参数(除非是管理员在系统租户层操作)。
OceanBase 中的关键点

OceanBase 中:
secure_file_priv 参数通常在配置文件或者启动时由 observer 加载,无法在普通会话中修改
FILE 权限也可能不完全支持(OceanBase 版本和兼容 MySQL 特性支持程度有关)
另外,OceanBase 社区版通常更侧重于应用层面,INTO OUTFILE 可能被禁用或者不支持
解决办法
方案 1:确认 FILE 权限

查看当前用户是否有 FILE 权限:

show grants;

如果没有,切换到系统租户(sys)执行:

grant FILE on *.* to 'root'@'%';

(需要有足够权限的系统管理员执行)

方案 2:使用 SELECT … INTO DUMPFILE 替代

如果你只是想导出二进制数据,INTO DUMPFILE 也可以,但通常也依赖 FILE 权限。
方案 3:使用客户端导出

由于 OceanBase 兼容 MySQL 协议,可以用 MySQL 客户端或 mysqldump 来导出 CSV 文件,例如:

mysql -h {host} -P {port} -u {user}@{tenant}#{cluster} -p
-e “SELECT * FROM db1.t1;”
-B > t1.csv

1 个赞