跳转到内容

关系数据库(可选)

关系数据库(可选)

本节介绍 IoT 架构中的关系数据库选项——MariaDB。学习完成后,您将能够:

  • 理解关系数据库在 IoT 中的使用场景
  • 了解 MariaDB 的特性和优势
  • 评估是否需要关系数据库组件
  • 掌握 MariaDB 的基本部署和配置

MariaDB 在 IoT 方案中主要用于存储结构化业务数据:

数据类型示例存储方案
设备元数据设备型号、安装位置、固件版本MariaDB
用户信息用户名、角色、权限MariaDB
告警记录告警时间、类型、处理状态MariaDB
配置信息阈值设置、通知规则、系统参数MariaDB
传感器时序数据温度、湿度、压力InfluxDB (推荐)
对比维度MariaDB (关系型)InfluxDB (时序型)
最佳用途业务数据、元数据传感器时序数据
数据模型表格、关系时间序列、标签
写入模式行写入批量、追加写入
查询模式复杂 JOIN、事务时间范围聚合
数据更新✅ CRUD 全部支持⚠️ 不推荐更新
压缩比普通 (2-3x)高 (8-15x)
存储成本较高较低
特性说明IoT 售前价值
完全免费GPL 许可证无许可成本
MySQL 兼容无缝替代 MySQL降低迁移成本
成熟稳定20+ 年发展历史生产环境验证
ACID 事务支持复杂业务逻辑数据一致性保证
丰富工具Adminer, DBeaver, MySQL Workbench管理方便
性能优化查询优化器、多种存储引擎满足业务需求
services:
mariadb:
image: mariadb:latest
container_name: mariadb
restart: unless-stopped
ports:
- "3306:3306"
volumes:
- ./mariadb/data:/var/lib/mysql
- ./mariadb/config:/etc/mysql/conf.d
environment:
- MARIADB_ROOT_PASSWORD=YourPassword2024!
- MARIADB_DATABASE=iot_demo
- MARIADB_USER=iot_user
- MARIADB_PASSWORD=iot_password
- TZ=Asia/Shanghai
Terminal window
docker run -d \
--name mariadb \
-p 3306:3306 \
-v mariadb_data:/var/lib/mysql \
-e MARIADB_ROOT_PASSWORD=YourPassword2024! \
-e MARIADB_DATABASE=iot_demo \
-e MARIADB_USER=iot_user \
-e MARIADB_PASSWORD=iot_password \
mariadb:latest
-- 数据库: iot_demo
-- 设备表
CREATE TABLE devices (
device_id VARCHAR(50) PRIMARY KEY,
device_name VARCHAR(100),
device_type VARCHAR(50),
location VARCHAR(100),
firmware_version VARCHAR(20),
registered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_seen TIMESTAMP NULL,
is_active BOOLEAN DEFAULT TRUE
);
-- 告警记录表
CREATE TABLE alerts (
alert_id INT AUTO_INCREMENT PRIMARY KEY,
device_id VARCHAR(50),
alert_type VARCHAR(50),
alert_message TEXT,
severity ENUM('info', 'warning', 'critical'),
status ENUM('new', 'acknowledged', 'resolved') DEFAULT 'new',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
resolved_at TIMESTAMP NULL,
FOREIGN KEY (device_id) REFERENCES devices(device_id)
);
-- 配置表
CREATE TABLE device_config (
config_id INT AUTO_INCREMENT PRIMARY KEY,
device_id VARCHAR(50),
config_key VARCHAR(100),
config_value TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (device_id) REFERENCES devices(device_id)
);
-- 插入示例数据
INSERT INTO devices (device_id, device_name, device_type, location) VALUES
('SENSOR-01', 'Factory A - Temperature Sensor', 'DHT22', 'Production Line A'),
('SENSOR-02', 'Factory A - Humidity Sensor', 'DHT22', 'Production Line B'),
('RELAY-01', 'Factory B - Power Switch', 'Shelly 1PM', 'Server Room');
INSERT INTO alerts (device_id, alert_type, alert_message, severity) VALUES
('SENSOR-01', 'HIGH_TEMP', 'Temperature exceeded 30°C threshold', 'warning'),
('SENSOR-02', 'LOW_HUMIDITY', 'Humidity below 40% threshold', 'info');
-- 获取激活设备数量
SELECT device_type, COUNT(*) as device_count
FROM devices
WHERE is_active = TRUE
GROUP BY device_type;
-- 获取未处理告警
SELECT d.device_name, a.alert_message, a.severity, a.created_at
FROM alerts a
JOIN devices d ON a.device_id = d.device_id
WHERE a.status = 'new'
ORDER BY a.created_at DESC;
-- 设备最后在线时间
SELECT device_name, last_seen,
TIMESTAMPDIFF(MINUTE, last_seen, NOW()) as minutes_offline
FROM devices
WHERE is_active = TRUE;

Adminer 是一个轻量级的数据库管理工具,替代 phpMyAdmin:

services:
adminer:
image: adminer:latest
container_name: adminer
restart: unless-stopped
ports:
- "8080:8080"
environment:
- ADMINER_DESIGN=nette

访问 http://<server-ip>:8080 管理 MariaDB 数据库。

Terminal window
# 备份
docker exec mariadb mysqldump -u root -pYourPassword2024! iot_demo \
> ./mariadb/backup/iot_demo_$(date +%Y%m%d).sql
# 压缩备份
docker exec mariadb mysqldump -u root -pYourPassword2024! iot_demo \
| gzip > ./mariadb/backup/iot_demo_$(date +%Y%m%d).sql.gz
# 恢复
docker exec -i mariadb mysql -u root -pYourPassword2024! iot_demo \
< ./mariadb/backup/iot_demo_20260518.sql
# 定时备份 (crontab)
0 2 * * * docker exec mariadb mysqldump -u root -pPASSWORD iot_demo \
| gzip > /opt/backups/mariadb/iot_demo_$(date +\%Y\%m\%d).sql.gz

A: 不是必须的。简单的 IoT 方案只需要 InfluxDB 即可。当需要管理设备元数据、用户信息、告警记录等结构化业务数据时,才建议引入 MariaDB。

A: MariaDB 是 MySQL 的完全兼容替代品,由 MySQL 原作者创建,保持了完全的开源特性。大多数情况下,两者使用方式完全相同。

Q3: 关系数据库和时序数据库如何配合?

Section titled “Q3: 关系数据库和时序数据库如何配合?”

A: 最佳实践是:InfluxDB 存储传感器时序数据,MariaDB 存储业务元数据。Node-RED 可以同时连接两个数据库,实现数据互补。

推荐做法:

  • IoT 方案中只存业务元数据(设备信息、告警记录)
  • 时序数据(温度、湿度等)仍使用 InfluxDB
  • 配置定期备份(SQL Dump)
  • 设置强密码和保护端口
  • 使用连接池管理数据库连接

避免做法:

  • 将传感器时序数据存入 MariaDB
  • 忽略数据备份
  • 数据库端口暴露到公网
  • 使用 root 账号连接应用
  • 未做定期索引优化
  1. MariaDB 用于管理 IoT 业务数据(设备、用户、配置、告警)
  2. 时序数据仍应存储到 InfluxDB
  3. 与 InfluxDB 组合使用,各司其职
  4. 完全免费开源,MySQL 兼容,工具生态丰富
  5. 非核心组件,按需引入