IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:mysql

共 545 篇相关文章

IT 累计浏览 41

有惊无险的一次网站系统升级

本次系统升级涉及操作系统、PHP、Apache及MySQL等多个组件的跨版本升级。作者将运行超过十年的老旧系统从Ubuntu早期版本逐步升级至2024 LTS,其中MySQL从4.x版本强制升至8.x版本引发的字符集问题尤为棘手。博客数据库原采用GBK编码存储,升级后字段编码信息丢失导致内容显示为乱码。作者通过查阅官方文档、社区求助及本地实验,最终采用二进制模式导出数据库,并编写Lua脚本智能解析导出文件,准确识别并转换其中的GBK内容,同时保留混杂的UTF-8数据片段,成功完成向UTF-8的迁移。整个过程体现了对历史遗留数据的审慎处理,包括备份验证、分段转换、语法校验等关键步骤。升级后系统运行稳定,预计可支持长期使用。

IT 累计浏览 50

SQLite + zstd:定时任务日志压缩优化实践

针对定时任务日志系统的性能与存储压力问题,我们重构了原有基于MySQL的Webcron系统。原系统因日志查询与主业务共用数据库,导致页面加载严重超时;同时高频任务产生的海量日志数据急剧膨胀,占用大量磁盘空间。为此,我们采用SQLite替代MySQL作为独立的日志存储引擎,以消除对主业务的影响。核心优化在于应用zstd压缩算法,针对大于150字节的日志内容进行压缩,相比明文存储和gzip,实现了更优的压缩比与性能平衡。我们设计了按月分库的存储策略,将每月日志存入独立的SQLite文件,既简化了数据清理,也保证了查询性能的稳定。最终方案使用Go语言结合GORM与zstd库实现,达到每10万条日志仅占约10MB的压缩效果,并在数百万条日志中实现了毫秒级查询。此实践证明,对于中小型系统,SQLite配合压缩技术是一种轻量、高效且易于维护的日志管理方案。未来可探索DuckDB及动态字典等方向进一步优化。

IT 累计浏览 157

让 AI 把我的 PHP 博客重写成 Go

作者尝试将一个运行近20年的古老PHP博客系统重构为Go语言。项目启用了Claude Code的Superpowers插件,通过结构化问答明确了技术选型:采用Go的Gin框架、GORM作为ORM,并构建Vue 3 SPA前端,保持与原MySQL数据库100%兼容。AI助手在确认需求后,自动生成了包含项目结构、API设计等详细规划文档,并利用子代理驱动开发模式执行了约22个开发任务,最终生成一个约35MB的单文件可执行程序,集成了前端SPA。 实现过程并非一帆风顺,主要挑战在于处理历史遗留数据。最复杂的是对UBB标记语法的解析与渲染,因内容已含HTML实体转义且标签存在嵌套,作者编写了34个测试用例才覆盖所有边界情况。此外,需为三代不同的旧URL格式实现301重定向以保持外链有效,并调整了附件链接的解析逻辑以适配反向代理路径。数据库中的标签词频统计也因数据陈旧而改为通过关联查询实时计算。 最终项目产出包括约2800行Go后端代码和2000行Vue前端代码,实现了完整的REST API、JWT认证、防盗链等40余个端点。作者评价整个过程耗时约两三小时,主要负责需求反馈与测试,AI则负责编码、构建与部署,认为这种人机协作模式展现了AI在复杂工程任务中的实用潜力。

IT 累计浏览 5,208

Python连接 MySQL 数据库的超时问题

这篇文章深入分析了Python开发中一个常见的“坑”:使用Flask-SQLAlchemy连接MySQL时,为何会突然抛出“MySQL server has gone away”的异常。作者从实际案例出发,先拆解了MySQL服务端的`wait_timeout`机制(默认8小时,常被企业调至600秒)和Flask-SQLAlchemy客户端的连接回收策略(`SQLALCHEMY_POOL_RECYCLE`默认2小时),指出了问题的核心——两端的超时设置不匹配,导致数据库端已关闭空闲连接,而客户端仍试图使用该失效连接。 针对这个具体的超时错位问题,文章提供了三种切实可行的解决方案:一是执行无意义的`SELECT 1`来预先检测连接活性;二是调整客户端的回收时间,使其低于服务端超时阈值(文章推荐使用新的`SQLALCHEMY_ENGINE_OPTIONS`配置方式);三是使用后主动关闭连接。作者结合企业实践,最终选择了调整客户端配置这一更便捷的方法。 文章的分析紧扣故障现场,将超时参数的具体数值、异常产生的典型堆栈以及配置修改的代码示例一一呈现,为遇到同类问题的开发者提供了清晰的排查路径和落地参考。

IT 累计浏览 1,642

迁移到 Octopress

作者将用了三年的 WordPress 博客迁移到了 Octopress。主要动机是 WordPress 太过臃肿,仅几个 PHP-FPM 进程和 MySQL 就占用了约 400MB 内存,对于访问量不高的博客来说资源消耗很不划算。Octopress 作为一个静态发布系统,以其配置简单、原生支持 Markdown 语法、模板美观等优点,迅速吸引了作者。 迁移过程主要参考了 Octopress 官方文档和几篇社区文章,几个小时内便完成了数据导出、导入和部分文章的润色,一个全新的静态博客就基本可用。不过作者也指出了 Octopress 不够完美的地方,例如插件生态较少,甚至缺少标签云这类基础功能。在迁移中还遇到了一个具体坑:更换正式域名后,生成的静态页面和 RSS 中的 URL 会新旧随机变化,导致 IFTTT 误认为文章全部更新而向 Twitter 发送了大量重复信息。清除缓存目录后问题得以解决。 总的来说,Octopress 虽不完美,但已能很好地满足作者对轻量、高效博客系统的需求。

IT 累计浏览 1,724

修复 MySQL 编码问题

这篇文章讲的是一个技术人在升级MySQL后遭遇的乱码危机。作者发现自己的博客内容全都变成了乱码,查看建表语句后发现问题根源:数据表以latin1字符集存储了UTF-8编码的内容。 传统的ALTER TABLE转换方案效果不佳,于是作者转向了更灵活的mysqldump与重新导入策略。他先用 `mysqldump --default-character-set=latin1` 将数据按原貌导出,避免二次错误编码;接着通过sed命令将导出文件中的字符集声明从latin1批量替换为utf8;最后删除SET NAMES latin1语句,用utf8编码重新导入。这套组合拳成功将数据“救”了回来,避免了更糟糕的情况(如使用zfs回滚)。 整个过程清晰展示了面对编码“坑”时,如何通过理解底层原理(字符集与连接设置)来设计修复方案,而不仅仅是依赖单一命令。对于同样遭遇字符集问题的开发者,这份具体可复现的操作记录提供了直接的解决思路。

IT 累计浏览 1,864

如何获取 MySQL innodb 的 B+tree 的高度

这篇文章深入讲解了如何获取MySQL InnoDB存储引擎中B+树索引的实际高度。作者从树高直接影响查询性能这一核心点出发,指出通常3到4层较为理想,并通过一个包含百万条数据的具体示例,演示了两种实用的获取方法。 首先,文章详细说明了如何通过查询`INNODB_SYS_INDEXES`等系统表获取索引根页的页号,然后结合`innodb_page_size`和`hexdump`工具直接读取`.ibd`数据文件,从中解析出表示树高的`PAGE_LEVEL`字段。这种方法能让你直观地看到主键、`name`、`age`等索引分别处于第几层。 其次,文章还提供了一个不依赖数据库权限的估算思路:基于B+树结构,计算非叶子节点和叶子节点单页可容纳的索引项数量,从而推算出特定数据量下树的大致高度。例如,通过计算得出百万级数据下,`age`索引的高度就达到了3层。 整个过程既有动手操作的命令,也有原理性的估算,让读者不仅能“知其然”,还能“知其所以然”,非常适合希望深入理解InnoDB底层存储机制的开发者参考。

IT 累计浏览 1,779

修改重置MySQL5.7得root登录密码

作者从一台测试服务器忘记MySQL root密码的实际问题出发,分享了在MySQL 5.7环境下重置密码的完整流程。文章直接切入痛点,说明了问题的根源:长期未登录导致密码遗忘。 解决方法的核心是利用MySQL的配置跳过启动时的密码验证。具体操作上,需要在配置文件`/etc/my.cnf`的`[mysqld]`部分添加`skip-grant-tables=1`,然后重启服务。此时可以直接用root用户免密登录数据库,通过`update user`命令直接修改`authentication_string`字段来设置新密码。这里作者特别指出,5.7版本将密码字段名从`password`改为`authentication_string`,这是一个关键的版本差异,照搬旧教程会出错。 完成密码更新后,必须记得删除配置行并再次重启服务,才能让数据库恢复正常的安全校验。整篇文章步骤清晰,从问题复现到最终解决形成了一个闭环,对遇到同类问题的开发者来说,是一个可直接按步骤操作的实用指南。

IT 累计浏览 2,519

PHPTS:一键免费搭建 Nginx + PHP + MySQL + Redis + Memcached 网站、APP、小程序服务器端运行环境

这篇讲的是如何在 Windows 上快速搭建网站服务器环境。传统方式需要手动安装和配置 Nginx、PHP、MySQL 等一堆组件,过程繁琐且容易出错,尤其是官方 Nginx for Windows 版本在连接数和性能模型上限制明显,往往只能用于测试。 文章介绍的 PHPTS 软件给出了一个“一键搞定”的方案。它将上述组件集成为一个安装包,并对关键的 Nginx 进行了深度优化——采用了 Windows IOCP 模型并支持多进程,将连接数上限从官方版本的 1024 大幅提升至 32768,使其在 Windows 上也能胜任生产环境。这解决了长期困扰 Windows 开发者的性能痛点。 除了作为本地开发环境,软件还定位为边缘计算平台。它可以运行在各类本地设备上,利用本地算力完成 AI、音视频处理等任务,减少对公有云的依赖,并支持与云服务组建混合云。对于需要在 Windows 下快速启动 Web 服务或探索本地化部署的开发者来说,这提供了一个免费且开箱即用的选择。

IT 累计浏览 1,598

MGR监控及优化点

这篇从实战角度出发,详细梳理了MySQL Group Replication(MGR)在日常运维中需要关注的核心监控指标与性能调优参数。文章开篇指出了MGR官方文档在监控优化方面资料较少的现状,因此作者结合自身教学经验进行了系统总结。 内容主要分为两大块。监控部分,不仅列出了判断节点状态(是否Online、是否可写)的SQL语句,更深入讲解了如何量化复制延迟(通过对比GTID)以及检查节点执行队列堆积情况。对于MGR特有的“流控”机制,文章解释了其触发条件(默认在延迟达25000个GTID时Block写操作),并给出了关闭流控的建议与注意事项,特别提到在多IDC部署时推荐关闭。 优化部分则直指复制性能的瓶颈,给出了具体的参数调整建议,例如将复制并行类型改为LOGICAL_CLOCK、增加并行线程数,以及针对大事务场景调整压缩阈值以减少CPU消耗。这些调优点都紧扣MGR基于逻辑重放的本质。 总的来说,这篇文章并非泛泛而谈,而是提供了许多即查即用的监控命令与可落地的优化参数,对需要实际运维或深入理解MGR性能机制的技术人员来说,是一份很好的实践参考。

IT 累计浏览 1,911

删库跑路救命策略

这篇文章从作者亲身经历的“血泪教训”出发:休假期间因备份脚本的字符集设置错误,导致数据回滚失败,最终背锅降绩效。基于这次事故,作者系统梳理了MySQL误删数据的常见“坑”、预防措施以及紧急恢复方案。 预防篇提出了五条实用建议,比如将 `rm` 改为 `mv`、删除对象先 `rename` 归档、操作前善用事务与小批量验证等,核心在于培养操作习惯并保持敬畏之心。恢复篇则针对误删库表、物理文件被删、未提交事务的 `delete` 等不同场景,给出了从“立刻 kill 进程”到利用 `innodb_force_recovery` 启动恢复模式等具体的急救步骤。 文章结尾强调,无论平台如何发展,物理与逻辑备份都是不可替代的底线。这篇分享将事故复盘与实战经验结合,对所有涉及数据库操作的人员都是一次生动的安全警示。

IT 累计浏览 1,456

个人博客技术演进的流水账

这篇文章从个人博客的“搬家史”出发,串起了一个Web前端技术演进的缩影。 作者最初受困于商业博客平台的种种限制——域名不可控、内容易丢失、样式不自由,为了“把数据和控制权握在自己手里”,走上了自建博客之路。文章以这个起点展开,以博客系统的技术栈变迁为线索,梳理了Web开发的几个关键时期:从前后端不分的“SHTML+SSI”时代,到ASP/PHP动态脚本主导、MySQL普及的“前后端初分”时期;再到jQuery大行其道、前端资源开始分离,以及MV*框架、模块化构建工具与Node.js全栈模式兴起的高速迭代时代。 文中提及了SaBlog、WordPress、Ghost等具有代表性的博客系统,并剖析了它们在各自阶段如何体现当时的主流技术架构与痛点。作者的流水账,实际上记录了前端如何从一个“后台附属”逐渐走向工程化、复杂化并分担更多职责的过程。文章结尾留下的疑问,也为思考当下技术选型提供了一个历史参照。

IT 累计浏览 2,383

sqlite3导入到mysql

这篇讲的是如何将一个膨胀到15GB的SQLite3数据库(具体来自磁力链接抓取工具magnetico)成功迁移到MySQL。作者从实际问题出发:SQLite3文件过大且不支持分布式,因此需要“魔改”为MySQL,但迁移过程卡在了导入环节。 文章清晰地拆解了整个流程:先用`.dump`导出SQL,但面对大文件,导入常常中途失败。作者的核心技巧在于利用`awk`按行号切分文件,从失败点重新开始。同时,必须调整MySQL的`max_allowed_packet`参数,并使用`sed`对导出的SQL进行“方言翻译”——比如将双引号包裹的表名改为反引号,并处理十六进制数据,以解决SQLite与MySQL的语法兼容问题。 最终,通过这些针对性的步骤和一条关键的`-f`强制导入参数,完成了大规模数据的跨库迁移。对于面临类似场景的开发者,这提供了一套可复现的实战解决方案。

IT 累计浏览 2,507

mysql,redis数据备份方案

这篇讲的是,一家公司在阿里云上自建MySQL和Redis存储时,如何从一套简陋的备份方案,逐步迭代出相对可靠的数据保障策略的实践。 起初,团队的备份方案是每天一次冷备加Redis的RDB自动保存,简单但隐患重重:MySQL的dump操作会引发游戏卡顿,冷备间隔过长导致恢复数据太旧,Redis缺乏热备风险大。 针对这些痛点,他们首先优化了MySQL方案:搭建主从同步实现热备,并将冷备任务转移到从机上每十分钟执行一次,再同步至OSS,避免了主机性能受损。接着处理Redis备份,最初考虑效仿MySQL做主从热备,但评估后发现,如果主机宕机重启,其RDB可能会覆盖从机数据;而从机重建同步又会触发主机大规模bgsave,可能导致内存飙升。最终,他们选择了一个务实的方案:将RDB文件通过SSH传输到另一台独立机器上进行冷备,从而规避了本地磁盘IO竞争导致MySQL变慢的核心问题。 整个过程印证了作者开头的观点:很多事的推进,取决于“时”与“势”。而备份方案的完善,正是在服务器故障的“势”到来之前,团队早已开始思考和储备的结果。

IT 累计浏览 2,192

MySQL复制线程长时间Opening tables

这篇讲的是一个MySQL主从复制中,slave实例的SQL线程长时间卡在“Opening tables”状态,导致复制延迟超过16小时的实际案例。 作者从现象出发,先排除了table cache过小的常见猜测,通过检查slave status、系统负载和磁盘IO,均未发现明显异常。线索最终指向了MySQL的错误日志,其中出现了大量关于“performance_schema”表结构错误的提示。 问题的根源在于跨版本复制:master是MySQL 5.5,而slave是5.6。从5.5到5.6,performance_schema的内部表定义发生了变化。当使用xtrabackup搭建新slave后,旧的5.5版本元数据被带入,导致5.6版本的slave在尝试打开并初始化这些系统表时,因结构不符而陷入困境。 解决方法明确:在slave实例上执行`mysql_upgrade`命令,更新所有系统表到正确的版本。这个案例提醒我们,在MySQL版本升级或跨版本搭建复制环境时,系统表的兼容性是一个需要特别注意的潜在风险点。

IT 累计浏览 2,178

MySQL 管理工具集 percona-toolkit

这篇讲的是如何用 Percona Toolkit 这个强大的命令行工具集,来高效管理 MySQL 数据库。作者从日常运维的真实场景出发,直接演示了几个核心工具的用法。 文章首先展示了如何用 pt-duplicate-key-checker 一键扫描数据库的重复索引,并像案例中那样,工具不仅能指出 gp_operate_log 表存在冗余索引,还直接给出了可以执行的 DROP INDEX 语句,省去了手动分析的麻烦。接着,通过 pt-online-schema-change 命令,在不锁表的情况下为表添加新列或修改存储引擎,这对于线上业务的平稳运维至关重要。 此外,作者还演示了两个很实用的辅助功能:用 pt-mysql-summary 快速获取数据库的运行状态概览,以及用 pt-visual-explain 将晦涩的 EXPLAIN 执行计划结果,转化成更直观的树状图,方便快速理解查询路径。整篇文章没有空谈理论,而是用一个个具体的命令和输出示例,直观地展现了这套工具在数据库性能优化、结构变更和状态监控中的实际价值。

IT 累计浏览 2,875

MySQL锁问题最佳实践

这篇讲的是 MySQL 锁问题的最佳实践,作者从自身处理的大量实际案例出发,系统性地梳理了在设计、开发和维护三个阶段如何规避锁问题。 文章一针见血地指出,许多严重的锁等待或死锁,根源往往在设计之初就埋下了。比如,继续使用仅支持表级锁的 MyISAM 引擎,会因一个慢查询阻塞所有更新;而索引设计不当,如更新语句触发 index merge,可能导致不同事务以不同顺序锁定索引,直接引发死锁。 在开发阶段,作者通过一个真实案例展示了长事务的危害:一个事务由于包含了其他业务逻辑,迟迟未能提交,导致后续更新同一行记录的事务陷入漫长的锁等待。排查时通过查询 innodb_lock_waits 视图定位阻塞事务,并结合 general log 还原事务上下文,最终发现问题。 文章的价值在于,它没有停留在理论,而是提供了具体的排查命令、日志分析方法和优化建议(如创建组合索引避免 index merge)。对于 DBA、后端开发以及运维人员来说,这些源于生产环境的经验能帮助他们在各自的环节提前预防,避免业务连接堆积或超时等严重故障。

IT 累计浏览 4,071

MySQL防范SQL注入风险

这篇文章讲的是在MySQL环境下,如何系统性地识别并防范SQL注入风险。作者从SQL注入的常见手法与危害讲起,用一段典型的PHP代码示例,直观展示了攻击者如何利用未经过滤的用户输入来构造恶意查询。 核心部分聚焦于实战防范,提供了多层次的建议。在应用层,强调了对用户输入进行严格类型判断的基础作用;在数据库监控层,列举了可用于识别潜在注入攻击的关键函数与关键字(如SLEEP()、INFORMATION_SCHEMA等),并建议通过高频检查活跃SQL来触发告警或自动终止危险查询。此外,文章还涉及了php.ini安全配置、Web服务器WAF规则以及商业防护方案等更广泛的加固思路。 文末附上的几个真实注入案例(例如利用SLEEP函数探测),让理论威胁变得具体可感。整体来看,这是一份从代码到运维的扎实指南,系统性地拆解了攻击手法并提供了对应的工程化防御建议。

IT 累计浏览 1,860

MySQL relay_log_purge=0 时的风险

这篇讲的是当MySQL设置`relay_log_purge=0`时,一个容易被忽略的数据一致性风险。很多DBA为了在高可用切换后能用上relay log补齐数据,会选择禁止自动清除,但官方文档提示这在使用`relay_log_recovery=1`时并非“崩溃安全”。 文章深入剖析了这个“地雷”的成因:在崩溃重启后,由于IO线程位置可能不准,`relay_log_recovery`会从已执行的位置重新拉取binlog并开启新的relay log。若旧的relay log被保留(`purge=0`),就可能在两个场景下出问题。一是崩溃时最后一个relay log未执行完,重启后这部分数据被重新下载,导致重复;二是如果SQL线程追赶过快,可能在IO线程尚未将relay log刷盘时就已读取执行,造成新旧文件间出现一段数据空缺。 因此,若因特殊需求必须保留relay log,在解析时务必通过binlog头信息来校验,确保数据准确无误。文章还附上了配置crash safe复制的相关参考,帮助读者从根源上稳固复制架构。

IT 累计浏览 2,416

MySQL安全策略

这篇讲的是MySQL在关键业务中如何确保数据安全,作者指出单靠数据库应用层面远不够,必须构建从网络、系统到逻辑层的多维度防御体系。 文章详细拆解了四个层面的实操策略。在最基础的网络与系统层,建议包括将MySQL服务器严格限制在内网、设置防火墙白名单、修改默认端口与密码策略,以及将操作日志集中远传。在逻辑应用层,重点在于防范XSS、SQL注入等常见攻击,并对数据库连接凭据进行加密处理。而在MySQL数据库层,文章提出启用safe-update防止误删、延长binlog保存期以便审计、精细划分账户权限(如用UPDATE替代DELETE),以及利用触发器和审计插件进行防护。 最后作者强调,真正的安全是技术机制与全员安全意识的结合。这些建议具体可落地,涵盖了从基础加固到纵深防御的多个关键点,为企业制定自身安全规范提供了清晰的检查清单。