MYSQL错误 NO.1130 ERROR的解决(使用客户端远程连接数据库)

本文介绍了解决CentOS 6.5下MySQL数据库无法通过SQLyog远程连接的问题。通过修改MySQL配置,更新user表中的host字段为“%”,并刷新权限,最终实现了从远程客户端成功连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景:

        linux系统,centos6.5,mysql数据库,

        远程计算机:SQLyog客户端,xshell远程工具;

通过xshell连接数据库,输入mysql -u root -p,然后输入密码,可以进入mysql,但是通过SQLyog在页面MYSQL Host Address这一项输入IP地址无法连接到数据库,出现1130 error。具体如下图:


查询原因:

        用xshell进入mysql,

        首先use mysql;

        然后select host, user from user;

        得到的结果里的host只有“127.0.0.1”、“localhost”,

        所以需要添加host为“%”或将localhost修改为“%”

  出现这种情况是因为mysql服务器出于安全考虑,默认只允许本地登录数据库服务器,如果不常用我们还是关了这个功能的好。


解决办法:

        改mysql的user表,具体方法如下:

        1、先用use mysql;进入名字为mysql的数据库;

        2、mysql>update user set host='%' where host='localhost' and user='root';

        3、mysql>flush privileges;

        4、使用查询语句查看是否修改过来:mysql>select host,user from user;

结果中若有,host为“%”的root用户,则直接在SQLyog客户端重新连接,就会连接成功,问题解决

        


<think>根据用户需求,我们需要构建一个WebSocket服务器,用于接收特定格式的数据,并将这些数据存储到远程MySQL数据库中。结合引用内容,我们将使用以下技术栈:-WebSocket服务器:使用Python的websockets库或Node.js的ws库(这里以Python为例)-MySQL连接使用mysql-connector-python步骤:1.创建WebSocket服务器,监听指定端口2.客户端连接时,接收客户端发送的数据3.解析数据(假设为JSON格式)4.将解析后的数据存入MySQL数据库具体实现:###1.安装必要的Python库```bashpipinstallwebsocketsmysql-connector-python```###2.创建WebSocket服务器和数据库操作####数据库配置(db_config.py)```python#db_config.pyDB_CONFIG={'host':'your_mysql_host','user':'your_username','password':'your_password','database':'your_database'}```####WebSocket服务器(server.py)```pythonimportasyncioimportwebsocketsimportjsonimportmysql.connectorfrommysql.connectorimportErrorfromdb_configimportDB_CONFIG#数据库连接池db_pool=Noneasyncdefhandle_client(websocket,path):try:asyncformessageinwebsocket:print(f"收到消息:{message}")#解析JSON数据try:data=json.loads(message)#假设数据格式为:{"device_id":"device1","timestamp":"2023-01-0112:00:00","tag_id":1,"value":123.45}device_id=data.get('device_id')timestamp=data.get('timestamp')tag_id=data.get('tag_id')value=data.get('value')#存入数据库ifdb_pool:connection=db_pool.get_connection()cursor=connection.cursor()sql="INSERTINTOsensor_data(device_id,timestamp,tag_id,value)VALUES(%s,%s,%s,%s)"cursor.execute(sql,(device_id,timestamp,tag_id,value))connection.commit()cursor.close()connection.close()print("数据存储成功")exceptjson.JSONDecodeError:print("无效的JSON格式")exceptExceptionase:print(f"数据处理错误:{e}")exceptwebsockets.exceptions.ConnectionClosedError:print("客户端断开连接")defcreate_db_pool():globaldb_pooltry:db_pool=mysql.connector.pooling.MySQLConnectionPool(pool_name="ws_pool",pool_size=5,**DB_CONFIG)print("数据库连接池创建成功")exceptErrorase:print(f"数据库连接池创建失败:{e}")asyncdefmain():create_db_pool()asyncwithwebsockets.serve(handle_client,"0.0.0.0",8765):print("WebSocket服务器启动,监听端口8765...")awaitasyncio.Future()#永久运行if__name__=="__main__":asyncio.run(main())```###3.创建数据库表在MySQL中创建存储数据的表:```sqlCREATETABLEsensor_data(idINTAUTO_INCREMENTPRIMARYKEY,device_idVARCHAR(50)NOTNULL,timestampDATETIMENOTNULL,tag_idINTNOTNULL,valueFLOAT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);```###4.测试客户端可以使用以下JavaScript代码测试(在浏览器或Node.js环境中):```javascriptconstws=newWebSocket('ws://localhost:8765');ws.onopen=()=>{console.log('连接已建立');constdata={device_id:'device001',timestamp:'2023-01-0112:00:00',tag_id:1,value:123.45};ws.send(JSON.stringify(data));};ws.onmessage=(event)=>{console.log(`收到消息:${event.data}`);};```###说明1.**数据库连接池**:使用连接池管理数据库连接,提高性能[^4]。2.**异步处理**:使用`asyncio`和`websockets`库实现异步非阻塞的WebSocket服务器[^2]。3.**数据格式**:假设客户端发送的是JSON格式的数据,包含设备ID、时间戳、标签ID和值。###扩展建议-**数据验证**:在存储前验证数据的完整性和有效性。-**错误处理**:增强错误处理,例如数据库连接失败重试。-**安全性**:增加身份验证机制,例如在WebSocket连接时验证token。-**性能监控**:监控服务器性能,如连接数、数据处理速度等。###相关问题1.如何处理WebSocket服务器的高并发连接?2.如何确保数据在传输过程中的安全性?3.如果MySQL数据库暂时不可用,如何保证数据不丢失?4.如何扩展此系统以支持多个数据源和多种数据格式?5.如何实现历史数据的查询和实时数据的推送功能?通过上述方案,您可以构建一个基本的WebSocket数据接收和存储系统,根据实际需求进行扩展和优化。</think># WebSocket服务器实现:接收数据并存储到MySQL数据库 ## 整体架构设计 ```mermaid graph TD A[客户端] -->|WebSocket连接| B(WebSocket服务器) B -->|解析数据| C{数据验证} C -->|有效数据| D[MySQL数据库] C -->|无效数据| E[错误日志] D -->|存储成功| F[确认响应] B -->|心跳检测| G[保持连接] ``` ## 完整实现方案 ### 1. 安装依赖库 ```bash pip install websockets mysql-connector-python python-dotenv ``` ### 2. 环境配置 (.env) ```env # 数据库配置 DB_HOST=your_db_host DB_PORT=3306 DB_USER=your_db_user DB_PASSWORD=your_db_password DB_NAME=iot_data # WebSocket配置 WS_HOST=0.0.0.0 WS_PORT=8765 ``` ### 3. WebSocket服务器实现 (server.py) ```python import asyncio import websockets import json import logging import mysql.connector from mysql.connector import pooling from dotenv import load_dotenv import os from datetime import datetime # 加载环境变量 load_dotenv() # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s', handlers=[logging.StreamHandler()] ) # 数据库连接池配置 db_pool = pooling.MySQLConnectionPool( pool_name="ws_pool", pool_size=5, host=os.getenv('DB_HOST'), port=os.getenv('DB_PORT'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME') ) def create_tables(): """创建数据库表结构""" try: conn = db_pool.get_connection() cursor = conn.cursor() # 创建数据表 cursor.execute(""" CREATE TABLE IF NOT EXISTS sensor_data ( id INT AUTO_INCREMENT PRIMARY KEY, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, device_id VARCHAR(50) NOT NULL, tag_id INT NOT NULL, value FLOAT, raw_data JSON, INDEX (device_id), INDEX (tag_id), INDEX (timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; """) # 创建标签映射表 cursor.execute(""" CREATE TABLE IF NOT EXISTS tag_mapping ( tag_id INT PRIMARY KEY, tag_name VARCHAR(255) NOT NULL, data_type ENUM('Float', 'Short', 'Boolean', 'String', 'Date') NOT NULL, description TEXT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; """) conn.commit() logging.info("数据库表创建成功") except mysql.connector.Error as err: logging.error(f"数据库表创建失败: {err}") finally: if conn.is_connected(): cursor.close() conn.close() def validate_data(data): """验证数据格式有效性""" required_fields = {'device_id', 'timestamp', 'data'} if not required_fields.issubset(data.keys()): return False, "缺少必需字段" if not isinstance(data['data'], list): return False, "data字段应为数组" for item in data['data']: if not isinstance(item, dict) or 'tag_id' not in item or 'value' not in item: return False, "数据项格式错误" return True, "" async def handle_client(websocket, path): """处理WebSocket客户端连接""" client_ip = websocket.remote_address[0] logging.info(f"客户端 {client_ip} 已连接") try: async for message in websocket: try: # 解析JSON数据 data = json.loads(message) logging.info(f"收到来自 {client_ip} 的数据: {data}") # 验证数据格式 is_valid, error_msg = validate_data(data) if not is_valid: error_response = {"status": "error", "message": error_msg} await websocket.send(json.dumps(error_response)) continue # 存储到数据库 save_to_database(data) # 发送成功响应 success_response = {"status": "success", "message": "数据已接收"} await websocket.send(json.dumps(success_response)) except json.JSONDecodeError: error_response = {"status": "error", "message": "无效的JSON格式"} await websocket.send(json.dumps(error_response)) except Exception as e: logging.error(f"处理数据时出错: {e}") error_response = {"status": "error", "message": "服务器内部错误"} await websocket.send(json.dumps(error_response)) except websockets.exceptions.ConnectionClosedError: logging.info(f"客户端 {client_ip} 断开连接") def save_to_database(data): """将数据保存到MySQL数据库""" try: conn = db_pool.get_connection() cursor = conn.cursor() # 插入主数据 insert_main = """ INSERT INTO sensor_data (device_id, timestamp, raw_data) VALUES (%s, %s, %s) """ cursor.execute(insert_main, ( data['device_id'], data['timestamp'], json.dumps(data) )) # 插入详细数据点 data_id = cursor.lastrowid insert_details = [] for item in data['data']: insert_details.append(( data_id, item['tag_id'], item['value'] )) if insert_details: insert_detail_sql = """ INSERT INTO sensor_data_details (data_id, tag_id, value) VALUES (%s, %s, %s) """ cursor.executemany(insert_detail_sql, insert_details) conn.commit() logging.info(f"成功存储 {len(data['data'])} 条数据") except mysql.connector.Error as err: logging.error(f"数据库存储失败: {err}") conn.rollback() finally: if conn.is_connected(): cursor.close() conn.close() async def main(): """启动WebSocket服务器""" create_tables() host = os.getenv('WS_HOST', '0.0.0.0') port = int(os.getenv('WS_PORT', 8765)) async with websockets.serve( handle_client, host, port, ping_interval=30, # 30秒心跳检测 ping_timeout=60 # 60秒无响应断开 ): logging.info(f"WebSocket服务器启动,监听 {host}:{port}") await asyncio.Future() # 永久运行 if __name__ == "__main__": asyncio.run(main()) ``` ### 4. 数据库表结构设计 ```sql -- 主数据表 CREATE TABLE sensor_data ( id INT AUTO_INCREMENT PRIMARY KEY, timestamp DATETIME NOT NULL, device_id VARCHAR(50) NOT NULL, raw_data JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 详细数据点表 CREATE TABLE sensor_data_details ( id INT AUTO_INCREMENT PRIMARY KEY, data_id INT NOT NULL, tag_id INT NOT NULL, value FLOAT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (data_id) REFERENCES sensor_data(id) ); -- 标签映射表 CREATE TABLE tag_mapping ( tag_id INT PRIMARY KEY, tag_name VARCHAR(255) NOT NULL, data_type ENUM('Float', 'Short', 'Boolean', 'String', 'Date') NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 索引优化 CREATE INDEX idx_device ON sensor_data(device_id); CREATE INDEX idx_timestamp ON sensor_data(timestamp); CREATE INDEX idx_tag ON sensor_data_details(tag_id); ``` ### 5. 客户端测试脚本 (client.py) ```python import asyncio import websockets import json import time from datetime import datetime async def send_data(): uri = "ws://localhost:8765" async with websockets.connect(uri) as websocket: # 模拟设备数据 data = { "device_id": "sensor_001", "timestamp": datetime.now().isoformat(), "data": [ {"tag_id": 101, "value": 23.45}, {"tag_id": 102, "value": 67.89}, {"tag_id": 103, "value": 12.34} ] } # 发送数据 await websocket.send(json.dumps(data)) print(f"发送数据: {json.dumps(data, indent=2)}") # 接收响应 response = await websocket.recv() print(f"收到响应: {response}") if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(send_data()) ``` ## 关键特性说明 1. **数据验证机制** - 验证必需字段存在性 - 检查数据类型一致性 - 错误处理与反馈 2. **连接管理** - 心跳检测保持连接活跃 - 连接断开自动处理 - 客户端IP记录 3. **高性能存储** - 使用连接池管理数据库连接[^4] - 批量插入优化写入性能 - 事务处理确保数据一致性 4. **数据格式规范** ```json { "device_id": "sensor_001", "timestamp": "2023-06-15T14:30:00Z", "data": [ {"tag_id": 101, "value": 23.45}, {"tag_id": 102, "value": 67.89} ] } ``` ## 部署与扩展建议 1. **容器化部署** ```dockerfile FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "server.py"] ``` 2. **水平扩展方案** - 使用Nginx作为WebSocket负载均衡器 - 多个服务器实例共享数据库 - Redis缓存频繁访问数据 3. **安全增强** ```python # 添加认证机制 async def handle_client(websocket, path): # 接收认证令牌 token = await websocket.recv() if not validate_token(token): await websocket.close(code=1008, reason="认证失败") return # 继续处理数据... ``` ## 性能优化技巧 1. **批量处理优化** ```python # 每100条数据批量插入一次 BATCH_SIZE = 100 buffer = [] async for message in websocket: data = json.loads(message) buffer.append(data) if len(buffer) >= BATCH_SIZE: save_batch_to_db(buffer) buffer = [] ``` 2. **异步数据库操作** ```python async def async_save_to_db(data): loop = asyncio.get_event_loop() await loop.run_in_executor(None, save_to_database, data) ``` 3. **压缩数据传输** ```python # 支持gzip压缩 import gzip async def handle_client(websocket, path): async for message in websocket: if isinstance(message, bytes): message = gzip.decompress(message).decode() # 处理解压后的数据... ``` ## 相关问题 1. 如何确保WebSocket服务器在高并发场景下的稳定性? 2.MySQL数据库暂时不可用时,如何实现数据的持久化和重试机制? 3. 如何设计数据加密方案以保证敏感工业数据在传输和存储中的安全性? 4. 如何扩展此系统以支持多种工业协议(如Modbus, OPC UA)的数据接入? 5. 如何实现实时数据监控和历史数据查询的API接口? 本方案提供了一个完整的WebSocket数据接收和存储解决方案,结合了数据库连接池管理[^4]和WebSocket双向通信特性[^2],能够满足工业物联网场景下的实时数据传输需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值