QuestDB 10.0.1 常用命令与 API 详解
QuestDB 10.0.1 常用命令与 API 详解:questdb.sh 进程管理、REST API(/ping /exec /imp /write)、ILP TCP/HTTP 写入、PG wire 连接与 systemd 运维命令,全部为实测输出
QuestDB 10.0.1 常用命令与 API 详解
目标:整理 QuestDB 10.0.1 日常运维与开发接入的完整命令速查:
questdb.sh进程管理、REST API(/ping、/exec、/imp、/write)、ILP(TCP/HTTP)写入、PostgreSQL wire 连接与 systemd 服务命令。文中命令与回显均来自 QuestDB 10.0.1 真实环境实测。
环境信息
- QuestDB 版本:10.0.1
- 安装目录:
/opt/questdb/bin(questdb.sh、java、questdb.jar) - 数据目录:
/var/lib/questdb - 服务端口:9000(HTTP/REST/ILP over HTTP)、9009(ILP TCP)、8812(PG wire)
- 默认账号:
admin/quest - 服务单元:
questdb.service(systemd)
工具概览
| 工具 | 用途 | 载体 |
|---|---|---|
questdb.sh | 进程启停与状态管理 | 服务器本地脚本 |
curl | REST API 与 ILP over HTTP 调用 | 任意客户端 |
psql / PG 驱动 | PostgreSQL wire 协议接入 | 任意客户端 |
nc | ILP TCP 写入 | 服务器本地 |
systemctl | systemd 服务管理 | 服务器本地 |
前置条件
- 已按安装指南完成部署并处于运行状态
- REST 调用需知道账号密码(默认
admin/quest);PG wire 默认数据库名qdb
1. questdb.sh 进程管理命令
questdb.sh 位于 /opt/questdb/bin/,子命令为 start|status|stop|profile。
1.1 启动
执行命令:
sudo -u questdb /opt/questdb/bin/questdb.sh start -d /var/lib/questdb
执行结果:
Starting QuestDB v10.0.1
💡 说明:
-d指定数据目录。启动后进程立即转入后台,日志输出到数据目录log/。
1.2 查看状态
执行命令:
sudo -u questdb /opt/questdb/bin/questdb.sh status -d /var/lib/questdb
执行结果:
PID: 71
💡 说明:输出
PID: <进程号>表示运行中;输出not running表示已停止。
1.3 停止
执行命令:
sudo -u questdb /opt/questdb/bin/questdb.sh stop -d /var/lib/questdb
执行结果:
Stopping QuestDB v10.0.1
💡 说明:
stop向进程发送优雅停止信号,等待写入合并完成后退出,避免数据丢失。强杀场景才使用kill -9 <PID>。
1.4 查看进程与启动参数
执行命令:
ps aux | grep questdb
执行结果:
questdb 71 11.6 2.4 44069732 788524 ? Sl 09:57 0:29 /opt/questdb/bin/java -DQuestDB-Runtime-66535 -Dcontainerized=false -Dquestdb.libs.dir=/opt/questdb/lib -ea -Dnoebug -XX:ErrorFile=/var/lib/questdb/db/hs_err_pid+%p.log -XX:+UnlockExperimentalVMOptions -XX:+AlwaysPreTouch -XX:+UseParallelGC --sun-misc-unsafe-memory-access=allow --enable-native-access=io.questdb --add-opens=java.base/java.lang=io.questdb --add-opens=java.base/java.lang.reflect=io.questdb --add-opens=java.base/java.nio=io.questdb --add-opens=java.base/java.time.zone=io.questdb --add-exports=java.base/jdk.internal.vm=io.questdb -p /opt/questdb/bin/questdb.jar -m io.questdb/io.questdb.ServerMain -d /var/lib/questdb
💡 说明:实际进程由
questdb.sh以-p questdb.jar -m io.questdb/io.questdb.ServerMain(jlink 模块)方式启动。
2. REST API 命令
REST 端点统一在 9000 端口。除 /ping 外均需认证(Authorization: Basic,账号 admin)。
2.1 健康检查 GET /ping
执行命令:
curl -s -o /dev/null -w "%{http_code}" http://localhost:9000/ping
执行结果:
204
💡 说明:HTTP 204 即健康。用于探活脚本与负载均衡检查。
2.2 SQL 查询 GET /exec?query=
/exec 仅支持 GET,参数 query 为 URL 编码后的 SQL。
执行命令:
curl -s "http://localhost:9000/exec?query=select%20version()"
curl -s "http://localhost:9000/exec?query=show%20tables"
curl -s "http://localhost:9000/exec?query=create%20table%20t1%20(ts%20timestamp,%20val%20double)"
curl -s "http://localhost:9000/exec?query=insert%20into%20t1%20values(now(),%201.5)"
执行结果:
{"query":"select version()","columns":[{"name":"version()","type":"STRING"}],"timestamp":-1,"dataset":[["PostgreSQL 12.3, compiled by Visual C++ build 1914, 64-bit, QuestDB"]],"count":1}
{"query":"show tables","columns":[{"name":"table_name","type":"STRING"}],"timestamp":-1,"dataset":[["t1"]],"count":1}
{"ddl":"OK"}
{"dml":"OK"}
💡 说明:返回 JSON 中
columns为列元数据(名称与类型),dataset为二维数组,count为行数,timestamp为结果集时间戳列索引(-1 表示无)。select version()返回 PG 兼容层标识字符串。
2.3 CSV 批量导入 POST /imp?tableName=×tamp=
将 CSV 一次性导入指定表(自动建表),适用于批量历史数据灌入。
执行命令:
curl -s -X POST "http://localhost:9000/imp?tableName=csv_test×tamp=ts&partitionBy=DAY" \
-H "Content-Type: text/csv" \
--data-binary @/var/lib/questdb/import/data.csv
执行结果:
{"status":"OK","location":"/imp?tableName=csv_test×tamp=ts&partitionBy=DAY","rowsImported":1000,"columns":{"ts":"TIMESTAMP","val":"DOUBLE"},"rowsRejected":0,"errors":null}
💡 说明:
tableName为表名,timestamp指定 CSV 中时间列列名,partitionBy指定分区粒度(DAY/WEEK/MONTH/YEAR)。rowsImported为成功行数,rowsRejected为拒绝行数。
2.4 ILP over HTTP POST /write
ILP 行通过 HTTP 写入 9000 端口的 /write,返回 204 表示成功。
执行命令:
curl -s -X POST "http://localhost:9000/write" --data-binary $"sensor temp=22.5,city=\"beijing\" $(date +%s%N)\n"
执行结果:
(HTTP 204,无响应体)
💡 说明:ILP 行格式
表名 字段=值,... 时间戳;字段逗号分隔,字符串值加双引号,时间戳为裸纳秒数。批量写入时一次请求可含多行(每行以\n结尾)。
3. ILP 协议写入命令(TCP 9009)
ILP TCP 端口 9009 支持直接 socket 写入,常用于 Java/Go 等语言的高吞吐接入。
3.1 单行写入
执行命令:
printf "ilp_test temp=21.5,city=\"shanghai\" %s\n" "$(date +%s%N)" | nc -q1 127.0.0.1 9009
curl -s "http://localhost:9000/exec?query=select%20*%20from%20ilp_test"
执行结果:
{"query":"select * from ilp_test","columns":[{"name":"temp","type":"DOUBLE"},{"name":"city","type":"VARCHAR"},{"name":"timestamp","type":"TIMESTAMP"}],"timestamp":2,"dataset":[[21.5,"shanghai","2026-10-03T09:59:05.668057Z"]],"count":1}
3.2 多行批量写入
执行命令:
printf "m1 temp=1.1,city=\"a\" %s\nm2 temp=2.2,city=\"b\" %s\n" "$(date +%s%N)" "$(date +%s%N)" | nc -q1 127.0.0.1 9009
执行结果:
(无输出,写入成功;随后查询可见两行)
💡 说明:ILP TCP 保持长连接时吞吐最高(官方 ILP 客户端默认复用连接)。
nc -q1发送后等待 1 秒关闭连接。
4. PostgreSQL wire 连接命令(8812)
QuestDB 暴露 PG wire 协议,标准 psql 与 JDBC/psycopg2 等驱动可直接接入。默认数据库名 qdb。
4.1 psql 连接
执行命令:
PGPASSWORD=quest psql -h 127.0.0.1 -p 8812 -U admin -d qdb -c "select version()"
执行结果:
version()
---------------------------------------------------------------------
PostgreSQL 12.3, compiled by Visual C++ build 1914, 64-bit, QuestDB
(1 行记录)
4.2 建表、插入、查询
执行命令:
PGPASSWORD=quest psql -h 127.0.0.1 -p 8812 -U admin -d qdb -c "create table pg_t(ts timestamp, val double)"
PGPASSWORD=quest psql -h 127.0.0.1 -p 8812 -U admin -d qdb -c "insert into pg_t values(now(), 9.99)"
PGPASSWORD=quest psql -h 127.0.0.1 -p 8812 -U admin -d qdb -c "select * from pg_t"
执行结果:
OK
INSERT 0 1
ts | val
----------------------------+------
2026-10-03 09:59:34.560796 | 9.99
(1 行记录)
💡 说明:QuestDB 的 PG 协议支持常见 DDL/DML 与时间序列函数(
now()、sum、savg、timeseries等),也支持预编译语句。连接串示例:postgresql://admin:quest@127.0.0.1:8812/qdb。
5. systemd 运维命令
systemd 部署下(见安装指南)使用标准 systemctl 管理。
执行命令:
systemctl status questdb --no-pager
systemctl restart questdb
systemctl stop questdb
systemctl start questdb
systemctl enable questdb
journalctl -u questdb -n 50
执行结果(status):
● questdb.service - QuestDB database server
Loaded: loaded (/etc/systemd/system/questdb.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2026-10-03 09:57:10 UTC; 13s ago
Process: 45 ExecStart=/opt/questdb/bin/questdb.sh start -d /var/lib/questdb (code=exited, status=0/SUCCESS)
Main PID: 71 (java)
💡 说明:
journalctl -u questdb输出与数据目录log/questdb-rolling.log.<日期>一致;排查启动失败优先看这两处日志。
注意事项
/exec仅支持 GET,POST /exec会返回Method POST not supported。- ILP 字符串字段值必须加双引号(如
city="beijing"),裸字符串会报field value is invalid。 - ILP 时间戳单位默认纳秒(
line.tcp.timestamp=n),毫秒时间戳会被误解析为 1970 年。 - REST 除
/ping外均要求认证;不带认证调用返回 401。 - 备份数据:直接打包
/var/lib/questdb/db目录;恢复时将db目录原样放回并重启。
常见问题
Q1. curl 调用 /exec 返回 401
- 现象:
Unauthorized,请求被拒。 - 解决:加认证头
curl -u admin:quest "http://localhost:9000/exec?query=..."。
Q2. ILP 报 INVALID_FIELD_SEPARATOR
- 现象:写入被拒,错误
INVALID_FIELD_SEPARATOR。 - 定位:QuestDB 10 ILP 字段以逗号分隔,而非空格。
- 解决:改为
temp=21.5,city="shanghai" <ts>格式。
Q3. 大批量导入用 /imp 还是 /write
- 建议:历史全量数据用
/imp(CSV 直导,一次建表 + 分区);实时增量用/write(ILP,低延迟高吞吐)。
Q4. psql 提示 password authentication failed
- 现象:默认密码错误。
- 解决:用
PGPASSWORD=quest;或按配置文档修改pg.password后重启。
参考链接
- REST API 参考:https://questdb.io/docs/reference/api/rest/
- ILP API 参考:https://questdb.io/docs/reference/api/ilp/overview/
- PG wire 兼容性:https://questdb.io/docs/reference/api/postgres/