MySQL 数据库故障排查指南
MySQL 数据库故障排查指南
本指南旨在帮助您识别和解决常见的 MySQL 数据库故障。我们将从问题识别开始,逐步深入到具体的故障类型和排查步骤。
1. 问题识别与信息收集
在开始排查之前,首先需要清晰地了解问题的现象和范围。
- 故障现象: 数据库完全不可用?连接缓慢?特定查询失败?服务器崩溃?
- 影响范围: 所有用户都受到影响吗?只有部分应用或用户受到影响?
- 发生时间: 故障是突然发生的还是逐渐恶化的?最近是否进行了任何更改(例如,软件更新、配置修改、硬件更换)?
- 错误信息: 检查应用程序日志、系统日志和最重要的 MySQL 错误日志 (error log)。错误日志通常是排查问题的首要信息来源。
- 监控数据: 如果有数据库监控系统,查看故障发生期间的各项指标,如 CPU、内存、磁盘 I/O、网络流量、连接数、QPS (Queries Per Second)、TPS (Transactions Per Second) 等。
2. 检查 MySQL 服务器状态
确认 MySQL 服务器是否正在运行。
-
Linux/Unix:
# 检查 MySQL 服务状态 (systemd)systemctl status mysql
# 检查 MySQL 服务状态 (SysVinit)
service mysql status
# 查找 MySQL 进程
ps aux | grep mysql
-
Windows:
在服务管理器中查找 MySQL 服务并检查其状态。
如果服务未运行,尝试启动它并观察是否有错误信息输出。
# 启动 MySQL 服务 (systemd)
systemctl start mysql
# 启动 MySQL 服务 (SysVinit)
service mysql start
如果启动失败,务必查看错误日志以获取详细信息。
3. 常见故障类型与排查步骤
3.1 连接问题
用户或应用程序无法连接到 MySQL 数据库。
-
检查网络连通性:
-
使用 ping 命令测试客户端到服务器的网络连通性。
ping <server_ip>
-
使用 telnet 或 nc (netcat) 测试端口是否开放。
telnet <server_ip> <mysql_port>
# 默认为 3306
nc -vz <server_ip> <mysql_port>
# 使用 nc
-
-
检查防火墙: 确保服务器和客户端的防火墙允许 MySQL 端口的流量通过。
-
Linux (firewalld):
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent sudo firewall-cmd --reload
-
Linux (iptables):
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT sudo service iptables save
-
Windows: 检查 Windows 防火墙设置。
-
-
检查 MySQL 用户权限: 确保连接用户具有从客户端 IP 连接的权限。
– 连接到 MySQLmysql -u root -p
– 查看用户的连接权限
SELECT user, host FROM mysql.user WHERE user = 'your_user';
– 示例:允许 ‘myuser’ 从 ‘192.168.1.100’ 连接
-- GRANT ALL PRIVILEGES ON your_database.* TO 'myuser'@'192.168.1.100' IDENTIFIED BY 'password';
– 示例:允许 ‘myuser’ 从任何主机连接 (不推荐用于生产环境)
-- GRANT ALL PRIVILEGES ON your_database.* TO 'myuser'@'%' IDENTIFIED BY 'password';
– 刷新权限
FLUSH PRIVILEGES;
-
检查 bind-address: 在 MySQL 配置文件 (my.cnf 或 my.ini) 中,检查 bind-address 设置。
[mysqld] # bind-address = 127.0.0.1 # 如果是这个,只允许本地连接 # bind-address = <server_ip> # 允许指定 IP 连接 bind-address = 0.0.0.0 # 允许所有 IP 连接 (请注意安全性)
修改后需要重启 MySQL 服务。
-
检查最大连接数: 查看 max_connections 参数是否达到上限。
SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected';
如果 Threads_connected 接近或等于 max_connections,并且连接被拒绝,考虑增加 max_connections。
[mysqld] max_connections = 500 # 增加连接数
修改后需要重启 MySQL 服务。
-
检查跳过网络: 检查配置文件中是否启用了 skip-networking 选项。
[mysqld] # skip-networking # 如果存在这一行,注释掉或删除
修改后需要重启 MySQL 服务。
3.2 性能问题
数据库响应缓慢,查询执行时间长。
-
查看慢查询日志 (slow query log): 启用慢查询日志,分析执行时间超过 long_query_time 阈值的查询。
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log # 指定日志文件路径 long_query_time = 1 # 记录执行时间超过 1 秒的查询 log_queries_not_using_indexes = 1 # 记录未使用索引的查询 (可选)
修改后需要重启 MySQL 服务。使用 mysqldumpslow 工具分析慢查询日志。
mysqldumpslow -s t -a /var/log/mysql/mysql-slow.log | less # 按时间排序
-
使用 EXPLAIN 分析查询计划: 对慢查询使用 EXPLAIN 命令。
EXPLAIN SELECT * FROM your_table WHERE your_column = 'value';
关注 type (如 ALL 表示全表扫描,index 或 ref 表示使用了索引)、rows (扫描的行数)、Extra (额外信息,如 Using filesort, Using temporary)。
-
检查索引: 确保表上有合适的索引来支持查询条件。
SHOW INDEX FROM your_table;
– 创建索引示例
-- CREATE INDEX idx_your_column ON your_table (your_column);
-
检查服务器资源: 使用操作系统监控工具。
-
CPU: top, htop
-
内存: free -m, vmstat。检查 innodb_buffer_pool_size 设置。
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
调整 innodb_buffer_pool_size:
[mysqld] innodb_buffer_pool_size = 4G # 例如设置为 4GB
修改后需要重启 MySQL 服务。
-
磁盘 I/O: iostat -xz 1。关注 %util (磁盘利用率), await (I/O 等待时间)。
iostat -xz 1
- 网络: netstat -s, iftop。
netstat -s iftop
-
-
检查锁: 查看是否存在锁等待。
SHOW ENGINE INNODB STATUS\G;
– 在输出中查找 LATEST DETECTED DEADLOCK 和 TRANSACTIONS 部分
SHOW PROCESSLIST;
– 关注 State 列中包含 ‘waiting for lock’ 或长时间处于 ‘Running’ 状态的查询
如果发现长时间的锁,可以考虑 KILL 掉相关的进程 ID。
KILL <process_id>;
-
优化数据库结构和应用程序代码:
- 避免在大表上执行全表扫描。
- 减少事务的持续时间。
- 批量插入数据而不是逐条插入。
- 考虑使用连接池。
3.3 服务器崩溃或意外重启
MySQL 服务突然停止运行。
-
检查错误日志 (error log): 默认位置通常在数据目录下(如 /var/lib/mysql/hostname.err)。
tail /var/log/mysql/error.log
# 查看日志尾部
查找日志末尾附近的
[ERROR]
或[Warning]
信息。 -
检查系统日志:
- Linux: journalctl -xe, dmesg, /var/log/syslog, /var/log/messages
journalctl -xe dmesg
- Windows: 事件查看器 (Event Viewer)
-
检查资源限制:
- 文件句柄限制: ulimit -n。在 /etc/security/limits.conf 中设置。
ulimit -n
- 进程数限制: ulimit -u。
ulimit -u
-
检查硬件问题: 运行内存检测工具 (如 memtest86+),检查磁盘健康状态 (如 smartctl)。
smartctl -a /dev/sda # 检查磁盘 /dev/sda
-
检查 OOM Killer: 在系统日志中查找包含 “Out of memory” 或 “OOM-killer” 的信息。
-
检查 Bug: 如果错误日志指向特定的 Bug,在 MySQL Bug 报告系统 (bugs.mysql.com) 中搜索相关信息。考虑升级到已修复该 Bug 的版本。
3.4 数据损坏
表或索引损坏,导致查询失败或数据不一致。
-
检查错误日志: 错误日志中可能会有关于损坏的警告或错误信息。
-
使用 CHECK TABLE: 检查表是否存在损坏。
CHECK TABLE your_database.your_table;
-
使用 REPAIR TABLE: 如果 CHECK TABLE 指示损坏,可以尝试修复表(主要用于 MyISAM)。
REPAIR TABLE your_database.your_table;
注意: 对于 InnoDB 表,通常不需要手动修复,InnoDB 会在启动时进行崩溃恢复。如果 InnoDB 表损坏,通常需要从备份恢复或使用更高级的工具。
-
从备份恢复: 如果修复失败或数据丢失,从最新的可用备份中恢复数据。
mysqldump -u user -p your_database > your_database_backup.sql
mysql -u user -p your_database < your_database_backup.sql
-
使用 mysqlcheck 工具:
# 检查指定数据库的所有表 mysqlcheck -u your_user -p --check your_database # 检查所有数据库的所有表 mysqlcheck -u your_user -p --check --all-databases # 修复指定表 (主要用于 MyISAM) mysqlcheck -u your_user -p --repair your_database your_table # 自动修复所有数据库的所有表 (主要用于 MyISAM) mysqlcheck -u your_user -p --auto-repair --all-databases
3.5 复制问题
主从复制中断或数据不一致。
-
检查主库和从库的错误日志: 查看是否有复制相关的错误信息。
-
检查从库的复制状态:
SHOW SLAVE STATUS\G;
关注以下字段:
- Slave_IO_Running: Should be Yes.
- Slave_SQL_Running: Should be Yes.
- Last_IO_Errno, Last_IO_Error: IO 线程的错误码和错误信息。
- Last_SQL_Errno, Last_SQL_Error: SQL 线程的错误码和错误信息。
- Seconds_Behind_Master: 从库落后主库的时间(秒)。
-
检查主库的二进制日志 (binary log):
SHOW BINARY LOGS;
– 查看二进制日志文件列表
SHOW MASTER STATUS;
– 查看当前正在写入的二进制日志文件和位置
-
检查从库的中继日志 (relay log):
SHOW SLAVE STATUS\G;
– 查看 Relay_Log_File 和 Relay_Log_Pos
-
检查网络连通性: 确保主从之间网络稳定。
ping <master_ip>
telnet <master_ip> 3306
-
检查主从配置: 检查主库的 my.cnf (server_id, log_bin) 和从库的 my.cnf (server_id, relay_log, log_slave_updates)。
-
处理复制错误: 根据 Last_SQL_Error 的信息,判断错误原因。
- 跳过错误: 如果错误可以安全跳过(例如,某些非关键的插入或更新错误),可以使用
SET GLOBAL sql_slave_skip_counter = N; START SLAVE;
(不推荐,除非你知道你在做什么)。更好的方法是使用CHANGE MASTER TO IGNORE_SERVER_IDS=(server_id)
或在主库上执行一个空事务来跳过有问题的事件。
SET GLOBAL sql_slave_skip_counter = N; START SLAVE;
CHANGE MASTER TO IGNORE_SERVER_IDS=(server_id);
- 重新同步数据: 如果数据不一致严重,可能需要停止从库复制,从主库重新导出数据并在从库导入,然后重新配置复制。
- 跳过错误: 如果错误可以安全跳过(例如,某些非关键的插入或更新错误),可以使用
4. 有用的工具和命令
-
mysql 命令行客户端: 执行 SQL 查询和管理命令。
mysql -u your_user -p -h <server_ip> -P <mysql_port> your_database
-
mysqldump: 备份数据库。
mysqldump -u your_user -p your_database > your_database_backup.sql
mysqldump -u your_user -p --all-databases > all_databases_backup.sql
-
mysqlcheck: 检查、修复、优化和分析表。
mysqlcheck -u your_user -p --analyze --all-databases
# 分析表,更新索引统计信息
mysqlcheck -u your_user -p --optimize --all-databases
# 优化表 (主要用于 MyISAM)
-
mysqladmin: 执行管理命令。
mysqladmin -u your_user -p status
# 查看简要状态
mysqladmin -u your_user -p version
# 查看版本信息
mysqladmin -u your_user -p shutdown
# 关闭服务器
-
SHOW PROCESSLIST: 查看当前正在执行的查询。
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
– 显示完整的查询信息
-
SHOW ENGINE INNODB STATUS: 查看 InnoDB 存储引擎状态。
SHOW ENGINE INNODB STATUS\G;
-
SHOW STATUS: 查看服务器状态变量。
SHOW GLOBAL STATUS LIKE 'Com_%';
– 查看各种命令的执行次数
SHOW GLOBAL STATUS LIKE 'Bytes_%';
– 查看网络流量
-
SHOW VARIABLES: 查看服务器配置变量。
SHOW VARIABLES LIKE '%buffer%';
SHOW VARIABLES LIKE '%timeout%';
-
操作系统监控工具: top, htop, vmstat, iostat, netstat, sar 等。
5. 预防措施
- 定期备份: 制定并执行可靠的备份策略,并定期测试备份的可用性。
- 监控: 实施全面的数据库监控,及时发现潜在问题。使用专业的监控工具,如 Prometheus + Grafana, Zabbix, Nagios 等。
- 日志管理: 合理配置和管理错误日志、慢查询日志等,定期清理或归档。
- 资源规划: 确保服务器有足够的 CPU、内存、磁盘和网络资源。根据业务增长进行容量规划。
- 安全性: 合理设置用户权限,遵循最小权限原则,限制远程访问,定期审计用户权限。
- 定期维护: 定期进行表优化、索引维护、清理不再需要的数据等。
- 版本管理: 及时关注 MySQL 的更新和 Bug 修复,考虑升级到稳定版本。在升级前进行充分的测试。
- 压力测试: 在生产环境上线前进行压力测试,评估数据库在高负载下的表现。
- 高可用方案: 考虑实施高可用方案,如主从复制、MHA、Group Replication 等,以减少单点故障的影响。
相关文章:
MySQL 数据库故障排查指南
MySQL 数据库故障排查指南 本指南旨在帮助您识别和解决常见的 MySQL 数据库故障。我们将从问题识别开始,逐步深入到具体的故障类型和排查步骤。 1. 问题识别与信息收集 在开始排查之前,首先需要清晰地了解问题的现象和范围。 故障现象: 数…...
MacOS Python3安装
python一般在Mac上会自带,但是大多都是python2。 python2和python3并不存在上下版本兼容的情况,所以python2和python3可以同时安装在一台设备上,并且python3的一些语法和python2并不互通。 所以在Mac电脑上即使有自带python,想要使…...
锁相放大技术:从噪声中提取微弱信号的利器
锁相放大技术:从噪声中提取微弱信号的利器 一、什么是锁相放大? 锁相放大(Lock-in Amplification)是一种用于检测微弱信号的技术,它能够从强噪声背景中提取出我们感兴趣的特定信号。想象一下在嘈杂的派对上听清某个人…...
机器学习总结
1.BN【batch normalization】 https://zhuanlan.zhihu.com/p/93643523 减少 2.L1L2正则化 l1:稀疏 l2:权重减小 3.泛化误差 训练误差计算了训练集的误差,而泛化误差是计算全集的误差。 4.dropout 训练过程中神经元p的概率失活 一文彻底搞懂深度学习&#x…...
基于神经网络的无源雷达测向系统仿真实现
基于神经网络的无源雷达测向系统仿真实现 项目概述 本项目实现了基于卷积神经网络(CNN)的无源雷达方向到达角(DOA)估计系统。通过深度学习方法,系统能够从接收到的雷达信号中准确估计出信号源的方向,适用于单目标和多目标场景。相比传统的DOA估计算法&…...
《用MATLAB玩转游戏开发》Flappy Bird:小鸟飞行大战MATLAB趣味实现
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-Flappy Bird:小鸟飞行大战MATLAB趣味实现 文章目录 《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互…...
【C/C++】跟我一起学_C++同步机制效率对比与优化策略
文章目录 C同步机制效率对比与优化策略1 效率对比2 核心同步机制详解与适用场景3 性能优化建议4 场景对比表5 总结 C同步机制效率对比与优化策略 多线程编程中,同步机制的选择直接影响程序性能与资源利用率。 主流同步方式: 互斥锁原子操作读写锁条件变量无锁数据…...
linux 三剑客命令学习
grep Grep 是一个命令行工具,用于在文本文件中搜索打印匹配指定模式的行。它的名称来自于 “Global Regular Expression Print”(全局正则表达式打印),它最初是由 Unix 系统上的一种工具实现的。Grep 工具在 Linux 和其他类 Unix…...
【js基础笔记] - 包含es6 类的使用
文章目录 js基础js 预解析js变量提升 DOM相关知识节点选择器获取属性节点创建节点插入节点替换节点克隆节点获取节点属性获取元素尺寸获取元素偏移量标准的dom事件流阻止事件传播阻止默认行为事件委托 正则表达式js复杂类型元字符 - 基本元字符元字符 - 边界符元字符 - 限定符元…...
《Linux命令行大全(第2版)》PDF下载
内容简介 本书对Linux命令行进行详细的介绍,全书内容包括4个部分,第一部分由Shell的介绍开启命令行基础知识的学习之旅;第二部分讲述配置文件的编辑,如何通过命令行控制计算机;第三部分探讨常见的任务与必备工具&…...
补补表面粗糙度的相关知识(一)
表面粗糙度,或简称粗糙度,是指表面不光滑的特性。这个在机械加工行业内可以说是绝绝的必备知识之一,但往往也是最容易被忽略的,因为往往天天接触的反而不怎么关心,或者没有真正的去认真学习掌握。对于像我一样…...
Python实用工具:pdf转doc
该工具只能使用在英文目录下,且无法转换出图片,以及文本特殊格式。 下载依赖项 pip install PyPDF2 升级依赖项 pip install PyPDF2 --upgrade 查看库版本 python -c "import PyPDF2; print(PyPDF2.__version__)" 下载第二个依赖项 pip i…...
基于Dify实现对Excel的数据分析
在dify部署完成后,大家就可以基于此进行各种应用场景建设,目前dify支持聊天助手(包括对话工作流)、工作流、agent等模式的场景建设,我们在日常工作中经常会遇到各种各样的数据清洗、格式转换处理、数据统计成图等数据分…...
Win全兼容!五五 Excel Word 转 PDF 工具解决多场景转换难题
各位办公小能手们!今天给你们介绍一款超牛的工具——五五Excel Word批量转PDF工具V5.5版。这玩意儿专注搞批量格式转换,能把Excel(.xls/.xlsx)和Word(.doc/.docx)文档唰唰地变成PDF格式。 先说说它的核心功…...
java加强 -Collection集合
集合是一种容器,类似于数组,但集合的大小可变,开发中也非常常用。Collection代表单列集合,每个元素(数据)只包含1个值。Collection集合分为两类,List集合与set集合。 特点 List系列集合&#…...
BGP实验练习1
需求: 要求五台路由器的环回地址均可以相互访问 需求分析: 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5,分属不同自治系统(AS),AR1 在 AS 100,AR2 - AR4 在 AS 200,AR5 在 AS …...
Nginx location静态文件映射配置
遇到问题? 以下这个Nginx的配置,愿意为访问https://abc.com会指向一个动态网站,访问https://abc.com/tongsongzj时会访问静态网站,但是配置之后(注意看后面那个location /tongsongzj/静态文件映射的配置)&…...
四、Hive DDL表定义、数据类型、SerDe 与分隔符核心
在理解了 Hive 数据库的基本操作后,本篇笔记将深入到数据存储的核心单元——表 (Table) 的定义和管理。掌握如何创建表、选择合适的数据类型、以及配置数据的读写方式 (特别是 SerDe 和分隔符),是高效使用 Hive 的关键。 一、创建表 (CREATE TABLE)&…...
每日脚本 5.11 - 进制转换和ascii字符
前置知识 python中各个进制的开头 二进制 : 0b 八进制 : 0o 十六进制 : 0x 进制转换函数 : bin() 转为2进制 oct() 转换为八进制的函数 hex() 转换为16进制的函数 ascii码和字符之间的转换 : chr(97) 码转为字符 …...
cookie和session的区别
一、基本概念 1. Cookie 定义:Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据(通常小于4KB),浏览器会在后续请求中自动携带该数据。作用:用于跟踪用户状态(如登录状态)、记…...
Kotlin Multiplatform--03:项目实战
Kotlin Multiplatform--03:项目实战 引言配置iOS开发环境配置项目环境运行程序 引言 本章将会带领读者进行项目实战,了解如何从零开始编译一个能同时在Android和iOS运行的App。开发环境一般来说需要使用Macbook,笔者没试过Windows是否能开发。…...
图形学、人机交互、VR/AR领域文献速读【持续更新中...】
(1)笔者在时间有限的情况下,想要多积累一些自身课题之外的新文献、新知识,所以开了这一篇文章。 (2)想通过将文献喂给大模型,并向大模型提问的方式来快速理解文献的重要信息(如基础i…...
opencascade.js stp vite 调试笔记
Hello, World! | OpenCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 当你不知道文件写哪的时候trae还是有点用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plugi…...
openharmony系统移植之gpu mesa3d适配
openharmony系统移植之gpu mesa3d适配 文章目录 openharmony系统移植之gpu mesa3d适配1. 环境说明2. gpu内核panfrost驱动2.1 使能panfrost驱动2.2 panfrost dts配置 3. buildroot下测试gpu驱动3.1 buildroot配置编译 4. ohos下mesa3d适配4.1 ohos下mesa3d编译调试4.1.2 编译4.…...
Java开发经验——阿里巴巴编码规范经验总结2
摘要 这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制,因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻…...
Linux中常见开发工具简单介绍
目录 apt/yum 介绍 常用命令 install remove list vim 介绍 常用模式 命令模式 插入模式 批量操作 底行模式 模式替换图 vim的配置文件 gcc/g 介绍 处理过程 预处理 编译 汇编 链接 库 静态库 动态库(共享库) make/Makefile …...
深入理解深度Q网络DQN:基于python从零实现
DQN是什么玩意儿? 深度Q网络(DQN)是深度强化学习领域里一个超厉害的算法。它把Q学习和深度神经网络巧妙地结合在了一起,专门用来搞定那些状态空间维度特别高、特别复杂的难题。它展示了用函数近似来学习价值函数的超能力…...
使用lldb看看Rust的HashMap
目录 前言 正文 读取桶的状态 获取键值对 键值对的指针地址 此时,读取数据 读取索引4的键值对 多添加几个键值对 使用i32作为键,&str作为值 使用i32作为键,String作为值 前言 前面使用ldb看了看不同的类型,这篇再使用…...
Vue3简易版购物车的实现。
文章目录 一、话不多说,直接上代码? 一、话不多说,直接上代码? <template><div><input type"text" placeholder"请输入内容" v-model"keywords"><button click"addGood…...
比亚迪全栈自研生态的底层逻辑
比亚迪全栈自研生态的底层逻辑:汽车工程师必须理解的闭环技术革命 引言:当技术壁垒成为护城河 2023年比亚迪销量突破302万辆的震撼数据背后,隐藏着一个更值得工程师深思的事实:其全栈自研体系覆盖了新能源汽车83%的核心零部件。这…...
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下,为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持,无论是开发环境测试还是生产环境部署࿰…...
5.1.1 WPF中Command使用介绍
WPF 的命令系统是一种强大的输入处理机制,它比传统的事件处理更加灵活和可重用,特别适合 MVVM (Model, View, ViewModel)模式开发。 一、命令系统核心概念 1.命令系统基本元素: 命令(Command): 即ICommand类,使用最多的是RoutedCommand,也可以自己继承ICommand使用自定…...
设计模式简述(十九)桥梁模式
桥梁模式 描述基本组件使用 描述 桥梁模式是一种相对简单的模式,通常以组合替代继承的方式实现。 从设计原则来讲,可以说是单一职责的一种体现。 将原本在一个类中的功能,按更细的粒度拆分到不同的类中,然后各自独立发展。 基本…...
常用设计模式
一、什么是设计模式 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验总结,旨在解决面向对象设计中反复出现的问题,提升代码的可重用性、可理解性和可靠性。以下从多个维度详细讲解ÿ…...
20242817-李臻-课下作业:Qt和Sqlite
实验内容 阅读附件内容,编译运行附件中第一章,第三章的例子。 实验过程 第一章 t1实践 #include <QApplication> #include <QWidget> #include <QPushButton> #include <QVBoxLayout>int main(int argc, char *argv[]) {QA…...
嵌入式机器学习平台Edge Impulse图像分类 – 快速入门
陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能: Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…...
JavaWeb, Spring, Spring Boot
出现时间 JavaWeb - Spring - Spring Boot 一、JavaWeb 的发展历程 Servlet 和 JSP: Servlet:1997 年首次发布,用于处理 HTTP 请求和响应。 JSP:1999 年首次发布,用于动态生成 HTML 页面。 特点:提供了基…...
upload-labs靶场通关详解:第五关
一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(".php",".php5",".php4",".php3",".php2",".html",".htm",".ph…...
【问题】Watt加速github访问速度:好用[特殊字符]
前言 GitHub 是全球知名的代码托管平台,主要用于软件开发,提供 Git 仓库托管、协作工具等功能,经常要用到,但是国内用户常因网络问题难以稳定访问 。 Watt Toolkit(原名 Steam)是由江苏蒸汽凡星科技有限公…...
GitHub打开缓慢甚至失败的解决办法
在C:\Windows\System32\drivers\etc的hosts中增加如下内容: 20.205.243.166 github.com 199.59.149.236 github.global.ssl.fastly.net185.199.109.153 http://assets-cdn.github.com 185.199.108.153 http://assets-cdn.github.com 185.199.110.153 http://asset…...
【25软考网工】第六章(3)数字签名和数字证书
博客主页:christine-rr-CSDN博客 专栏主页:软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你!…...
Android Native 函数 Hook 技术介绍
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 前言 Android Native 函数 Hook 技术是一种在应用运行时拦截或替换系统或自身函数行为的手段,常见实现包括 PLT Hook、Inline Hook。 PLT Hook 和…...
代码随想录算法训练营第60期第三十二天打卡
大家好,今天是我们贪心算法章节的第三阶段,前面我们讲过的几道题不知道大家理解的情况如何,还是那句话,贪心算法没有固定的套路与模板,一道题一个思路,我们要多思考这样慢慢地我就就可以水到渠成。今天我们…...
Problem C: 异常1
1.题目描述 检测年龄,其中若为负数或大于等于200岁皆为异常,请将下列代码补充完整。 // 你的代码将被嵌入这里 class Main{ public static void main(String[] args){ Person p1new Person("John",80); Person p2new Pers…...
Ollama部署使用以及模型微调和本地部署
ollama是一款开源的本地大语言模型管理工具,专注于简化大语言模型(LLM)的本地部署和使用。以下是关于 Ollama 应用的详细介绍: Ollama 的主要功能 本地化部署: Ollama 支持在本地运行模型,无需依赖外部云…...
汇编学习——iOS开发对arm64汇编的初步了解
汇编学习——iOS开发对arm64汇编的初步了解 文章目录 汇编学习——iOS开发对arm64汇编的初步了解前言栈 指令 寄存器寄存器指令运算指令寻址指令前变基 与 后变基 栈堆(Heap)内存机制三、栈(Stack)内存机制 3. 多级调用示例 例子A…...
前端代理问题
在前后端联调的时候,有一次因为前端项目代理配置有问题,导致请求接口对不上, transpileDependencies: true,devServer: {hot: true,port: 8081,proxy: {/api: {target: http://localhost:8080,changeOrigin: true,ws: true,pathRewrite: {^/a…...
E+H流量计通过Profibus DP主站转Modbus TCP网关与上位机轻松通讯
EH流量计通过Profibus DP主站转Modbus TCP网关与上位机轻松通讯 在现代工业自动化的广阔舞台上,Profibus DP与Modbus TCP这两种通信协议各领风骚,它们在不同的应用场景中发挥着举足轻重的作用。但工业生产的复杂性往往要求不同设备、系统之间能够顺畅沟…...
TCP/IP 模型每层的封装格式
TCP/IP 模型是一个四层网络架构,每一层在数据传输时都会对数据进行封装,添加相应的头部(和尾部)信息。以下是各层的封装格式及关键字段说明: 1. 应用层(Application Layer) 封装格式:…...
openjdk底层汇编指令调用(一)——汇编指令及指令编码基础
汇编指令 计算机在执行过程时只识别代表0或者1的电信号。因此为了让计算机能够执行则须向计算机输入一系列01构成的指令。 例如在x64平台下,0x53,二进制为01010011,表示将rbx寄存器中的值压栈。 但是,对于程序员而言,…...