influxdb数据库笔记
·
这里用的是windows版本,influxdb3。
influxdb是一款时序数据库,在事件记录(例如日志),监控指标,传感器数据,金融行情等场景非常合适。
时序数据库和关系数据库的对比
| 特性 | 传统关系型数据库 (MySQL) | 时序数据库 (InfluxDB) |
|---|---|---|
| 最佳场景 | 用户订单、账户余额、商品库存、权限管理 | 传感器数据、监控指标、金融行情、事件记录 |
| 数据特点 | 数据结构复杂,需要频繁更新和关联查询 | 数据量大、只追加不更新、按时间排序 |
| 写入性能 | 较慢(受限于事务锁和索引更新) | 极快(顺序写入,无事务锁,高并发) |
| 存储效率 | 较低(行式存储,冗余多) | 极高(列式存储,自带高压缩算法) |
| 数据生命周期 | 需手动清理旧数据 | 自动过期(可配置保留策略,自动删除旧数据) |
操作
这一步是基于安装并已启动服务,安装见下文。
生成token
3.0版本之后需要token了。
生成token命令:
.\influxdb3.exe create token --admin --host http://localhost:8181
返回结果:
New token created successfully!
Token: 这里是token值
HTTP Requests Header: Authorization: Bearer 这里是token值
IMPORTANT: Store this token securely, as it will not be shown again.
保存好token值,后续用的到。
创建数据库
.\influxdb3.exe create database test_db --token "这里替换成你刚才复制的令牌" --host http://localhost:8181
插入数据
.\influxdb3.exe write --database test_db --token "这里是token值" --precision s "cpu,host=server01 usage=45.2 1715000001"
.\influxdb3.exe write --database test_db --token "这里是token值" --precision s "cpu,host=server01 usage=50.5 1715000002"
.\influxdb3.exe write --database test_db --token "这里是token值" --precision s "cpu,host=server02 usage=12.0 1715000003"
查询数据
.\influxdb3.exe query --database test_db --token "这里是token值" "SELECT * FROM cpu WHERE host='server01'"
如何界面化查看呢?
建议用grafana,见另外一篇笔记。
实测效果一般般,grafana是通用图形界面工具,并不是influxdb专用的,只是支持influxdb而已。
命令
–precision s # 指定时间戳数值精度,s表示秒,其他精度见后续列表
时间戳数值精度-列表
| 参数值 | 单位 | 说明 | 典型时间戳示例 (近似) |
|---|---|---|---|
| ns | 纳秒 | InfluxDB 默认精度 | 1715389200000000000 (19位) |
| u | 微秒 | 百万分之一秒 | 1715389200000000 (16位) |
| ms | 毫秒 | 千分之一秒 (Java/JS 常用) | 1715389200000 (13位) |
| s | 秒 | 标准 Unix 时间戳 (Python/Go 常用) | 1715389200 (10位) |
安装并启动服务
1、打开influxdb官网下载界面,地址:https://www.influxdata.com/downloads

到达这个界面,继续点:

继续点:

2、下载的文件找个位置解压,双击influxdb3.exe启动服务
这样这个服务就启动了,窗口不要关闭。
token设置环境变量
每次命令中都带token太麻烦,可以设置环境变量吗?
当然可以。设置了之后就可以把token参数从命令中去掉了。
永久设置环境变量(windows)
属性 | 环境变量 | 系统环境变量,新建:
键 INFLUXDB3_AUTH_TOKEN # 2.0版本用INFLUX_TOKEN
值 实际的token值
临时设置环境变量
命令窗口中执行对应版本的命令即可,只对当前窗口有效:
set INFLUXDB3_AUTH_TOKEN=实际的token值 # 3.0版本
set INFLUX_TOKEN=实际的token值 # 2.0版本
3.0版本有什么变化
1、端口不是8086了,而是8181
2、需要token了
3、移除了ui界面
没有看到表名啊?
观察的很细致,实际上是有的,第一列就是,这属于默认约定。
例如:
插入语句:
.\influxdb3.exe write --database test_db --precision s "cpu,host=server01 usage=50.5 1715000002"
cpu # 就是表名,查询的时候用这个表名就行,在influxdb中叫做measurement,相当于mysql中的表名
host=server01 # 叫做tags
usage=50.5 # 叫做fields
如果表已存在,直接插入数据,如果表不存在,新建表并插入数据。
数据组成
如下列表:
| 组成部分 | 内容 | 说明 |
|---|---|---|
| Measurement (表名) | cpu | 数据的分类,位于最开头,逗号之前。 |
| Tags (标签) | host=server01 | 位于第一个逗号和第一个空格之间。 这是用于索引的元数据。 |
| Fields (字段) | usage=45.2 | 位于第一个空格和最后一个空格之间。 这是实际存储的数值。 |
| Timestamp (时间戳) | 1715000001 | 位于最后,最后一个空格之后。 |
唯一标识是什么?
并不是单独的id,而是组合判断的。
唯一标识 = Measurement + Tags + Timestamp
如果唯一标识不存在,则新增,如果存在,则覆盖。
python连接influxdb
token值记得替换下。
代码:
from influxdb_client_3 import InfluxDBClient3
import datetime
import time
# ==========================================
# 1. 初始化配置
# ==========================================
DATABASE = "test_db"
TOKEN = "实际的token值" #
# 关键修改:使用完整的URL,明确指定不使用SSL
client = InfluxDBClient3(
host="http://localhost:8181", # 明确指定http协议
database=DATABASE,
token=TOKEN if TOKEN else None
)
def test_connection():
"""测试连接"""
try:
print("测试InfluxDB连接...")
result = client.query("SELECT * FROM cpu LIMIT 1")
print("✅ 连接成功!")
print(f"查询结果: {result}")
return True
except Exception as e:
print(f"❌ 连接失败: {e}")
print(f"\n错误类型: {type(e).__name__}")
import traceback
traceback.print_exc()
return False
def create_data():
"""写入数据"""
print("\n--- 🟢 开始写入数据 ---")
timestamp_ns = int(datetime.datetime.now().timestamp() * 1000000000)
line = f"cpu,host=server01 usage={55.5} {timestamp_ns}"
print(f"写入数据: {line}")
try:
client.write(record=line)
print("✅ 数据写入成功!")
time.sleep(1)
except Exception as e:
print(f"❌ 写入失败: {e}")
import traceback
traceback.print_exc()
def read_data():
"""查询数据"""
print("\n--- 🔵 开始查询数据 ---")
query = "SELECT * FROM cpu WHERE host='server01' ORDER BY time DESC LIMIT 10"
try:
table = client.query(query)
if table:
print(f"查询到数据:")
print(table)
else:
print("未查询到数据")
except Exception as e:
print(f"❌ 查询失败: {e}")
import traceback
traceback.print_exc()
def delete_data():
"""删除数据"""
print("\n--- 🔴 开始删除数据 ---")
try:
client.delete(
predicate="host='server01'",
start="-1h",
stop="now()"
)
print("✅ 删除请求已提交")
except Exception as e:
print(f"❌ 删除失败: {e}")
def update_data():
"""更新数据(覆盖写)"""
print("\n--- 🟠 模拟更新数据 ---")
timestamp_ns = int(datetime.datetime.now().timestamp() * 1000000000)
line = f"cpu,host=server01 usage={99.9} {timestamp_ns}"
print(f"覆盖写入: {line}")
try:
client.write(record=line)
print("✅ 覆盖写入完成")
time.sleep(1)
except Exception as e:
print(f"❌ 写入失败: {e}")
if __name__ == "__main__":
print("=" * 50)
print("InfluxDB 3.0 测试")
print("=" * 50)
if not test_connection():
print("\n请先确认:")
print("1. InfluxDB服务是否启动")
print("2. 运行: .\\influxdb3.exe query --database test_db \"SELECT * FROM cpu LIMIT 1\"")
exit(1)
try:
create_data()
read_data()
update_data()
read_data()
delete_data()
except Exception as e:
print(f"\n执行出错: {e}")
import traceback
traceback.print_exc()
finally:
client.close()
print("\n连接已关闭")
遇到的问题?
试了好几次,总是带有443端口,所以连不上。
改为直接指定具体http地址,问题解决了。
报错
报错 Write command failed: ensure that a single protocol line string is provided as the final argument, enclosed in quotes
插入数据时报的这个错。
解决方案:
单引号改为双引号问题解决。
文档
influxdb官网下载界面:
https://www.influxdata.com/downloads
更多推荐
所有评论(0)