关系数据库(可选)
关系数据库(可选)
本节介绍 IoT 架构中的关系数据库选项——MariaDB。学习完成后,您将能够:
- 理解关系数据库在 IoT 中的使用场景
- 了解 MariaDB 的特性和优势
- 评估是否需要关系数据库组件
- 掌握 MariaDB 的基本部署和配置
Why Relational Database in IoT?
Section titled “Why Relational Database in IoT?”MariaDB 在 IoT 方案中主要用于存储结构化业务数据:
| 数据类型 | 示例 | 存储方案 |
|---|---|---|
| 设备元数据 | 设备型号、安装位置、固件版本 | MariaDB |
| 用户信息 | 用户名、角色、权限 | MariaDB |
| 告警记录 | 告警时间、类型、处理状态 | MariaDB |
| 配置信息 | 阈值设置、通知规则、系统参数 | MariaDB |
| 传感器时序数据 | 温度、湿度、压力 | InfluxDB (推荐) |
MariaDB vs InfluxDB
Section titled “MariaDB vs InfluxDB”| 对比维度 | MariaDB (关系型) | InfluxDB (时序型) |
|---|---|---|
| 最佳用途 | 业务数据、元数据 | 传感器时序数据 |
| 数据模型 | 表格、关系 | 时间序列、标签 |
| 写入模式 | 行写入 | 批量、追加写入 |
| 查询模式 | 复杂 JOIN、事务 | 时间范围聚合 |
| 数据更新 | ✅ CRUD 全部支持 | ⚠️ 不推荐更新 |
| 压缩比 | 普通 (2-3x) | 高 (8-15x) |
| 存储成本 | 较高 | 较低 |
MariaDB Features
Section titled “MariaDB Features”| 特性 | 说明 | IoT 售前价值 |
|---|---|---|
| 完全免费 | GPL 许可证 | 无许可成本 |
| MySQL 兼容 | 无缝替代 MySQL | 降低迁移成本 |
| 成熟稳定 | 20+ 年发展历史 | 生产环境验证 |
| ACID 事务 | 支持复杂业务逻辑 | 数据一致性保证 |
| 丰富工具 | Adminer, DBeaver, MySQL Workbench | 管理方便 |
| 性能优化 | 查询优化器、多种存储引擎 | 满足业务需求 |
Deployment
Section titled “Deployment”Docker Deployment
Section titled “Docker Deployment”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/ShanghaiDocker Run
Section titled “Docker Run”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:latestBasic Usage
Section titled “Basic Usage”Create IoT Database Schema
Section titled “Create IoT Database Schema”-- 数据库: 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');Query Examples
Section titled “Query Examples”-- 获取激活设备数量SELECT device_type, COUNT(*) as device_countFROM devicesWHERE is_active = TRUEGROUP BY device_type;
-- 获取未处理告警SELECT d.device_name, a.alert_message, a.severity, a.created_atFROM alerts aJOIN devices d ON a.device_id = d.device_idWHERE a.status = 'new'ORDER BY a.created_at DESC;
-- 设备最后在线时间SELECT device_name, last_seen, TIMESTAMPDIFF(MINUTE, last_seen, NOW()) as minutes_offlineFROM devicesWHERE is_active = TRUE;Integration with Adminer
Section titled “Integration with Adminer”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 数据库。
Backup and Restore
Section titled “Backup and Restore”SQL Dump (推荐)
Section titled “SQL Dump (推荐)”# 备份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.gzCommon Customer Questions
Section titled “Common Customer Questions”Q1: IoT 方案中必须用 MariaDB 吗?
Section titled “Q1: IoT 方案中必须用 MariaDB 吗?”A: 不是必须的。简单的 IoT 方案只需要 InfluxDB 即可。当需要管理设备元数据、用户信息、告警记录等结构化业务数据时,才建议引入 MariaDB。
Q2: MariaDB 和 MySQL 有什么区别?
Section titled “Q2: MariaDB 和 MySQL 有什么区别?”A: MariaDB 是 MySQL 的完全兼容替代品,由 MySQL 原作者创建,保持了完全的开源特性。大多数情况下,两者使用方式完全相同。
Q3: 关系数据库和时序数据库如何配合?
Section titled “Q3: 关系数据库和时序数据库如何配合?”A: 最佳实践是:InfluxDB 存储传感器时序数据,MariaDB 存储业务元数据。Node-RED 可以同时连接两个数据库,实现数据互补。
✅ 推荐做法:
- IoT 方案中只存业务元数据(设备信息、告警记录)
- 时序数据(温度、湿度等)仍使用 InfluxDB
- 配置定期备份(SQL Dump)
- 设置强密码和保护端口
- 使用连接池管理数据库连接
❌ 避免做法:
- 将传感器时序数据存入 MariaDB
- 忽略数据备份
- 数据库端口暴露到公网
- 使用 root 账号连接应用
- 未做定期索引优化
Summary
Section titled “Summary”- MariaDB 用于管理 IoT 业务数据(设备、用户、配置、告警)
- 时序数据仍应存储到 InfluxDB
- 与 InfluxDB 组合使用,各司其职
- 完全免费开源,MySQL 兼容,工具生态丰富
- 非核心组件,按需引入