IT技术博客大学习 共学习 共进步

MySQL

共 525 篇文章

IT 2022-06-19 12:01:23 / 累计浏览 5,141

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 2021-05-17 23:26:41 / 累计浏览 1,691

修复 MySQL 编码问题

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

IT 2020-02-05 15:06:55 / 累计浏览 1,812

如何获取 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 2020-02-01 19:46:44 / 累计浏览 1,750

修改重置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 2019-04-08 00:54:00 / 累计浏览 1,566

MGR监控及优化点

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

IT 2019-03-25 23:29:04 / 累计浏览 1,873

删库跑路救命策略

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

IT 2018-07-05 13:43:57 / 累计浏览 3,138

分表优化:千万级数据的插入方法

这篇讲的是对千万级数据进行分表存储时,如何高效地查询和迁移数据。作者没有停留在理论层面,而是直接给出了实操性很强的PostgreSQL SQL片段。 具体来说,文章先展示了两种从数字字段中提取首位字符的查询写法:一种是标准的子字符串函数调用,另一种是更常见的简写形式。核心技巧在于,作者演示了如何利用这类字符串函数作为条件,通过一条 `INSERT INTO ... SELECT` 语句,将特定规则(例如 `adv_id` 首位为‘2’且 `media_id` 首位为‘6’)的数据批量复制到新的分表中。 通过循环执行这样的复制操作,就能相对快速地完成海量数据的拆分。文章虽然简短,但抓住了分表场景中一个非常实际的动作——数据如何根据规则“落库”,并给出了清晰的语法参考。对于正在处理类似数据迁移或分表任务的开发者来说,这种直接可套用的片段往往比长篇大论更实用。

IT 2017-10-15 09:41:14 / 累计浏览 2,312

sqlite3导入到mysql

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

IT 2016-12-22 23:30:22 / 累计浏览 6,738

SQL里是否可以使用JOIN

这篇讲的是一个流传甚广的技术误区:很多公司出于“性能慢”的理由禁止程序员在SQL中使用JOIN。作者从这个常见的约定出发,通过一个查询最新帖子和用户信息的实例进行了直接对比。文章指出,用JOIN完成的操作,如果拆解成两次独立查询和代码层合并,其开销很可能更大,“用JOIN慢”其实是个没有严格论证的人云亦云的结论。 作者进一步点明了真正值得考虑的问题所在——它并非性能,而是系统架构的灵活性。当使用JOIN时,你隐含地假设了相关的表将永远部署在同一个数据库实例上。一旦项目发展,表可能因拆分而“离婚”到不同实例,届时所有用到JOIN的地方都可能需要重构。因此,文章给出的核心建议是:如果相关表未来有独立部署的可能,就要谨慎使用JOIN;否则,完全可以用。 所以,用JOIN慢往往不是问题的本质。下次如果听到别人以性能为由反对JOIN,或许可以指出,真正需要权衡的是对未来数据库架构变更的预判。

IT 2016-05-05 13:07:08 / 累计浏览 2,134

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 2016-04-17 17:46:45 / 累计浏览 2,148

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 2016-04-05 10:30:08 / 累计浏览 2,828

MySQL锁问题最佳实践

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

IT 2016-04-05 10:17:11 / 累计浏览 3,994

MySQL防范SQL注入风险

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

IT 2016-04-02 13:49:03 / 累计浏览 1,805

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 2016-03-22 23:03:24 / 累计浏览 2,388

MySQL安全策略

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

IT 2016-03-21 23:24:03 / 累计浏览 5,775

MYSQL分页limit速度太慢优化方法

这篇讲的是MySQL在大数据量下分页查询的性能瓶颈问题。当表数据达到百万级别时,使用`LIMIT offset, length`进行分页(如`LIMIT 200000, 10`)会导致查询极其缓慢,因为数据库需要扫描并丢弃offset前的所有行,造成了严重的资源浪费。 文章的核心方案是通过改变SQL写法来规避“大偏移量扫描”。例如,不再使用`LIMIT 100000, 20`,而是记录上一页的最大ID,然后查询`WHERE id > last_max_id LIMIT 20`,这样就将扫描行数从十万级降至仅数十行。作者用一个实际例子展示了优化效果:将一条3.21秒的查询,通过子查询改写并建立复合索引后,降低到了0.11秒。 此外,文章还总结了其他几种实用的优化思路,包括子查询优化法、倒排表法、反向查找法以及限制偏移量等。每种方法各有其适用场景和限制,比如子查询法要求数据连续,反向查找法则更适合页数超过一半的情况。这些具体的方法和对比,为开发者在不同场景下选择最佳分页策略提供了清晰的参考。

IT 2016-03-21 13:56:01 / 累计浏览 2,815

获取 MySQL 崩溃时的 core file

这篇讲的是如何让 MySQL 在崩溃时可靠地生成 core file 用于调试。文章作者从一个常见痛点切入:即使运维人员设置了 `ulimit -c unlimited` 并且在配置中开启了 `core-file`,mysqld 在实际 crash 时可能还是不会留下核心转储文件,给故障排查带来很大障碍。 作者点明了问题的关键在于几个容易被忽略的 Linux 系统参数。因为 MySQL 进程通常以 suid 方式运行,系统默认禁止为这类进程生成 core 文件,所以需要将 `/proc/sys/fs/suid_dumpable` 的值设为 2。此外,还需要确保 `core_pattern` 指向一个明确的、有写入权限的绝对路径(例如 `/var/crash/core`),并启用 `core_uses_pid` 以方便识别。 文章没有停留在理论,而是直接给出了一套可执行的修改命令和验证方法:通过 `kill -SEGV` 主动触发崩溃,然后检查目标路径。这套从问题定位、原因剖析到具体操作验证的完整思路,对于需要处理 MySQL 底层故障的开发者和 DBA 来说非常实用。按这个流程配置并验证,就能确保获得崩溃时的诊断数据。

IT 2016-03-20 22:15:56 / 累计浏览 2,817

MySQL如何将两个表名对调

这篇文章解决的是一个在数据库迁移或结构变更中可能遇到的棘手问题:如何在不停服或最小化影响的情况下,安全地对调两个MySQL表的名称。作者从类似`pt-osc`工具的操作场景切入,指出了许多人的第一反应——先后执行两次`RENAME`——其实存在数据写入失败的风险。 核心方案其实非常精巧且直接:利用MySQL的表级锁机制,一次性将两个表都锁定为写模式,然后通过一条临时表(`t3`)作为中转,用连续的`ALTER TABLE ... RENAME`语句完成对调。操作完成后解锁,整个过程对应用层是原子的,不会出现中间状态的脏数据。 这种“同时上锁、中转对调”的方法,用最基础的SQL命令优雅地解决了一致性问题。文章的价值不仅在于提供了一段可直接复用的代码,更在于它提醒我们:在对关键数据表进行重命名这类元数据操作时,思考操作的原子性和并发影响,是保证业务安全的基础。

IT 2016-03-19 22:55:41 / 累计浏览 2,353

MySQL问题之修改my.cnf配置不生效

这篇讲的是 MySQL 中一个常见但容易被忽略的坑:为什么明明修改了配置文件 my.cnf,但配置就是不生效。 核心原因在于你可能修改了“错误”的那个 my.cnf。作者指出,MySQL 系统中存在多个配置文件,比如 /etc/my.cnf、~/.my.cnf 等,程序会按特定顺序(例如 /etc/my.cnf 优先)读取它们。如果你的修改没有落在优先级正确的文件里,配置就不会如你所料地起作用。文章列出了完整的读取顺序清单,并补充了更细致的控制方法——可以通过 -defaults-file 或 -defaults-extra-file 参数来显式指定配置文件。 解决思路很直接:要么确认并修改正确路径(通常是全局的 /etc/my.cnf)下的文件,要么在启动服务时用参数明确指定你的配置文件。对于多实例部署的环境,后者是更规范的做法。

IT 2016-03-18 14:09:18 / 累计浏览 3,913

[MySQL优化案例] — slave延迟很大优化方法

这篇讲的是如何解决MySQL主从复制中常见的从库延迟问题。作者从根因出发,指出核心矛盾在于主库的并发事务提交与从库单线程复制之间的不匹配,以及MySQL传统的异步复制机制本身就会引入延迟。 针对这些痛点,文章梳理了几条切实可行的优化路径。其核心思路是提升从库的并行处理能力和IO效率。例如,推荐使用实现了真正并行复制的MariaDB版本作为从库;强调业务表必须显式定义主键以避免大表全表扫描;在应用层合并写请求以减少数据库压力。 在硬件和系统层面,文章也给出了从高到低的优化排序,包括升级为SSD/PCIe-SSD、增大内存以扩大Buffer Pool、将文件系统更换为XFS或ReiserFS、调整RAID级别为RAID 1+0并开启写缓存,以及将IO调度器改为deadline或noop。这些措施从不同层面缓解了从库的IO瓶颈,组合使用能有效改善复制延迟。