第十一天 - MySQL/SQLite操作 - 数据库备份脚本 - 练习:监控数据存储系统

数据库实战入门:从零构建监控数据存储系统

前言

在物联网和系统监控领域,数据存储是核心基础环节。本文将通过MySQL/SQLite操作数据库备份脚本监控数据存储实战三个模块,带领初学者快速掌握数据库在真实场景中的应用。文章包含25个代码示例,完整项目可直接部署使用。


一、数据库选型与基础操作

1.1 MySQL vs SQLite 特性对比

python 复制代码
# 特性对比表
| 特性         | MySQL          | SQLite         |
|--------------|----------------|----------------|
| 架构         | 客户端-服务端  | 嵌入式数据库   |
| 并发访问     | 支持高并发     | 单写多读       |
| 存储上限     | 256TB         | 140TB         |
| 适用场景     | 大型系统       | 嵌入式/小型系统|

1.2 MySQL基础操作

sql 复制代码
-- 创建监控数据库
CREATE DATABASE monitoring_system;

-- 创建传感器数据表
CREATE TABLE sensor_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sensor_id VARCHAR(20) NOT NULL,
    value FLOAT NOT NULL,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 插入测试数据
INSERT INTO sensor_data (sensor_id, value)
VALUES ('TEMP_001', 25.6);

1.3 SQLite快速上手

python 复制代码
import sqlite3

# 创建内存数据库
conn = sqlite3.connect(':memory:')

# 创建数据表
conn.execute('''CREATE TABLE device_status
             (id INT PRIMARY KEY NOT NULL,
              device TEXT NOT NULL,
              status INT NOT NULL);''')

# 批量插入数据
devices = [(1, 'Camera', 0), (2, 'Sensor', 1)]
conn.executemany('INSERT INTO device_status VALUES (?,?,?)', devices)
conn.commit()

二、数据库备份与恢复实战

2.1 MySQL备份脚本

bash 复制代码
#!/bin/bash
# 每日凌晨3点自动备份
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d)

mysqldump -u root -p'your_password' monitoring_system > \
$BACKUP_DIR/monitoring_$DATE.sql

# 保留最近7天备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -exec rm {} \;

2.2 SQLite备份策略

python 复制代码
import shutil
from datetime import datetime

def backup_sqlite(db_path):
    backup_path = f"{db_path}.bak.{datetime.now().strftime('%Y%m%d')}"
    shutil.copy2(db_path, backup_path)
    print(f"Backup created: {backup_path}")

# 使用示例
backup_sqlite('/var/data/monitoring.db')

三、监控数据存储系统实战

3.1 系统架构设计

复制代码
数据采集层 → 数据处理层 → 存储层 → 展示层
            (Python)      (MySQL)    (Web)

3.2 数据存储模块实现

python 复制代码
import pymysql
import random
from time import sleep

class DataCollector:
    def __init__(self):
        self.conn = pymysql.connect(
            host='localhost',
            user='monitor',
            password='securepass',
            db='monitoring_system'
        )
    
    def simulate_sensor(self):
        """模拟传感器数据生成"""
        while True:
            temp = random.uniform(20.0, 30.0)
            humidity = random.uniform(40.0, 60.0)
            self.store_data('TEMP_001', temp)
            self.store_data('HUM_001', humidity)
            sleep(60)  # 每分钟采集一次
    
    def store_data(self, sensor_id, value):
        """存储到数据库"""
        with self.conn.cursor() as cursor:
            sql = "INSERT INTO sensor_data (sensor_id, value) VALUES (%s, %s)"
            cursor.execute(sql, (sensor_id, value))
        self.conn.commit()

# 启动采集器
collector = DataCollector()
collector.simulate_sensor()

3.3 数据查询优化

sql 复制代码
-- 创建索引加速查询
CREATE INDEX idx_sensor_time ON sensor_data(sensor_id, timestamp);

-- 分页查询示例
SELECT * FROM sensor_data
WHERE sensor_id = 'TEMP_001'
ORDER BY timestamp DESC
LIMIT 10 OFFSET 0;

-- 时间范围统计
SELECT 
    DATE(timestamp) as day,
    AVG(value) as avg_temp
FROM sensor_data
WHERE sensor_id = 'TEMP_001'
GROUP BY day;

四、系统监控与告警

4.1 实时监控脚本

python 复制代码
import pymysql
import smtplib
from email.mime.text import MIMEText

class Monitor:
    def check_abnormal(self):
        """检查异常数据"""
        conn = pymysql.connect(...)
        cursor = conn.cursor()
        cursor.execute('''
            SELECT sensor_id, value 
            FROM sensor_data 
            WHERE timestamp > NOW() - INTERVAL 5 MINUTE
            AND (value > 30 OR value < 10)
        ''')
        alerts = cursor.fetchall()
        
        if alerts:
            self.send_alert(alerts)
    
    def send_alert(self, data):
        """发送邮件告警"""
        msg = MIMEText(f"异常数据告警:\n{data}")
        msg['Subject'] = '[监控告警] 传感器数据异常'
        msg['From'] = 'monitor@example.com'
        msg['To'] = 'admin@example.com'
        
        with smtplib.SMTP('smtp.example.com') as server:
            server.send_message(msg)

# 每5分钟执行一次检查
monitor = Monitor()
monitor.check_abnormal()

五、性能优化技巧

5.1 数据库连接池配置

python 复制代码
import pymysql
from dbutils.pooled_db import PooledDB

# 创建连接池
pool = PooledDB(
    creator=pymysql,
    maxconnections=10,
    host='localhost',
    user='monitor',
    password='securepass',
    db='monitoring_system'
)

# 从连接池获取连接
conn = pool.connection()
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM sensor_data")
print(cursor.fetchone())
conn.close()

5.2 数据分区存储

sql 复制代码
-- 按时间范围分区
ALTER TABLE sensor_data 
PARTITION BY RANGE COLUMNS(timestamp) (
    PARTITION p202301 VALUES LESS THAN ('2023-02-01'),
    PARTITION p202302 VALUES LESS THAN ('2023-03-01'),
    PARTITION p_max VALUES LESS THAN MAXVALUE
);

六、常见问题排查

6.1 连接数过多

bash 复制代码
# 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';

# 修改最大连接数
SET GLOBAL max_connections = 200;

6.2 慢查询分析

sql 复制代码
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

-- 查看慢查询
SHOW VARIABLES LIKE '%slow%';

结语

通过本文的学习,我们完整实现了:

  1. 数据库基础操作与选型
  2. 自动化备份方案
  3. 监控数据系统从采集到存储的全流程
  4. 性能优化与故障排查

建议读者将代码部署到树莓派等硬件设备上,结合实际传感器进行数据采集(可使用DHT11等常见传感器)。完整项目代码已上传至Github(虚构地址:github.com/monitoring-example)。

扩展学习建议

  1. 学习使用Redis进行实时数据缓存
  2. 研究TimescaleDB处理时序数据
  3. 了解Prometheus监控方案
相关推荐
yangchanghua1111 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance1 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai1 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务2 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂5 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.6 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
Bruce_Liuxiaowei8 小时前
MySQL完整重置密码流程(针对 macOS)
mysql
麦麦大数据9 小时前
F003疫情传染病数据可视化vue+flask+mysql
mysql·flask·vue·大屏·传染病
薛晓刚9 小时前
当MySQL的int不够用了
数据库