Apache Druid执行SQL INSERT报405错误的排查与解决求助
Druid执行REPLACE INTO/INSERT类SQL返回405错误的排查与解决
问题现象
- 可通过批量提交ingest spec正常导入示例数据
- 执行Druid生成的
REPLACE INTO语句或官方参考的INSERT类SQL时,均返回405 Method Not Allowed错误
示例数据:
{"time": "2023-05-02T00:47:00.496Z","cooperative": "ABCBT","factory": "BTS","area": "1","dev": "BP","phaseA": 1.111}
Druid生成的REPLACE INTO语句:
REPLACE INTO inline_data OVERWRITE ALL WITH ext AS (SELECT * FROM TABLE( EXTERN( '{"type":"inline","data":"{\"time\": \"2023-05-02T00:47:00.496Z\",\"cooperative\": \"ABCBT\",\"factory\": \"BTS\",\"area\": \"1\",\"dev\": \"BP\",\"phaseA\": 1.111}"}', '{"type":"json"}', '[{"name":"time","type":"string"},{"name":"cooperative","type":"string"},{"name":"factory","type":"string"},{"name":"area","type":"string"},{"name":"dev","type":"string"},{"name":"phaseA","type":"double"}]' ) )) SELECT TIME_PARSE("time") AS __time, cooperative, factory, area, dev, phaseA FROM ext PARTITIONED BY DAY
排查原因
- 请求方法/接口路径错误:Druid的SQL写操作(如REPLACE/INSERT)必须通过
/druid/v2/sql/task接口用POST请求执行,若误用查询接口/druid/v2/sql或用GET请求,会直接返回405。 - 权限配置缺失:启用权限系统的情况下,当前用户若没有目标数据源的
WRITE权限或CREATE_TASK权限,部分场景会返回405(而非明确的权限错误)。 - 版本兼容性问题:0.20.x及更早的Druid版本对SQL写操作支持不完善,语法或接口规范与新版本不兼容,可能触发405。
- SQL语法异常:嵌套JSON的转义错误等语法问题,可能导致接口误返回405(而非语法错误提示)。
解决方法
- 使用正确的接口与请求方式
执行写操作SQL时,向/druid/v2/sql/task发送POST请求,请求体格式如下:
注意:查询类SQL用{ "query": "你的REPLACE INTO/INSERT完整SQL语句" }/druid/v2/sql接口(GET/POST均可),但写操作只能用/druid/v2/sql/task的POST请求。 - 检查并配置权限
确认当前操作用户拥有目标数据源的WRITE权限,以及CREATE_TASK权限(若启用权限系统),联系管理员调整权限配置。 - 升级Druid版本
若使用旧版本,升级到0.21.x及以上稳定版本,新版本对SQL写操作的支持更完善,接口规范更统一。 - 验证SQL语法
检查SQL中的嵌套字符串转义是否正确,确保语法无错误,避免因语法问题触发异常返回。
内容的提问来源于stack exchange,提问作者Xavier Z
相关产品推荐
相关产品推荐

