IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / MySQL 中文网 -
IT 2016-05-05 13:07:08 / 累计浏览 2,180

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-05 10:17:11 / 累计浏览 4,060

MySQL防范SQL注入风险

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

本机暂存
IT 2016-03-22 23:03:24 / 累计浏览 2,400

MySQL安全策略

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

本机暂存
IT 2016-03-20 22:15:56 / 累计浏览 2,860

MySQL如何将两个表名对调

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

本机暂存
IT 2016-03-19 22:55:41 / 累计浏览 2,380

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,980

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

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

本机暂存
IT 2016-03-12 22:50:37 / 累计浏览 2,260

MySQL添加自增列失败

这篇文章记录了一位用户升级Discuz论坛时遇到的真实“坑”:试图给一张日志表添加自增主键列,却意外收到了“ERROR 1467”的报错,提示无法读取存储引擎的自增值。 面对这个不常见的错误,作者的第一反应是怀疑数据表损坏。但通过对比更底层的磁盘错误代码,他很快排除了这个方向,并将焦点转向了数据类型本身。关键的根因被锁定:原表中已存储的数据量,已经超出了用户指定的`mediumint`类型所能表示的数值上限,导致自增机制无法为其分配新的有效ID。 解决方法非常直接——将自增列的数据类型从`mediumint`更改为范围更大的`int`或`bigint`。这个案例生动地说明,在进行表结构变更,尤其是涉及主键和自增列时,仔细评估现有数据量与所选字段类型的容量匹配度是多么重要,一个疏忽就可能让一条简单的DDL语句失败。

本机暂存
IT 2016-03-10 00:03:48 / 累计浏览 2,040

MySQL processlist中哪些状态要引起关注

这篇文章针对MySQL DBA日常监控中的实际问题,详细列举了processlist中需要特别关注的12种状态及其背后的含义与优化方向。作者并未停留在表面解释,而是结合实际场景给出了具体建议。 例如,当看到“copy to tmp table”状态时,通常意味着正在进行ALTER TABLE操作,建议将其安排在业务低谷期或使用pt-osc等工具;而“Sending data”状态虽然看起来像是网络发送,实则是从存储引擎读取数据发送给客户端,此时应考虑通过索引或LIMIT减少数据扫描量。对于“Waiting for global read lock”等锁相关状态,文章明确指出这通常由全局读锁引起,应避免在生产环境长时间持有,并提供了执行备份等操作的替代思路。 整体来看,文章将枯燥的官方文档状态翻译成了可落地的DBA行动指南,覆盖了从临时表操作、排序到各类锁等待的典型场景,最后附上了MySQL官方文档链接供深入查阅。

本机暂存
IT 2016-02-29 23:57:29 / 累计浏览 2,020

MySQL事务隔离级别的暗门

你是否知道,在 MySQL 中不加 GLOBAL 或 SESSION 关键字直接设置事务隔离级别,其效果与你想象的可能完全不同?这篇文章就深入剖析了这个容易被忽略的“暗门”。 它对比了三种调整事务隔离级别的场景:使用 GLOBAL 关键字修改全局设置(仅对新连接生效),使用 SESSION 关键字修改当前会话,以及最特别的——两者都不加。作者从官方文档出发,明确指出了核心差异:不加关键字的 SET 语句,其修改仅对当前会话的下一个尚未开始的新事务生效,并且在该事务结束后,隔离级别会自动恢复为当前会话之前的设置。 为了证实这一点,文章通过一个详尽的实验演示进行了验证。实验展示了,在会话内先执行 SET TRANSACTION(不加关键字),随后查询变量显示隔离级别未变,但当新事务启动后,其行为(如行锁阻塞)却符合设置的新隔离级别(如 SERIALIZABLE)。而当该事务结束后,下一个新事务又回到了原先的隔离级别。 基于这个特性,文章给出了实用的建议:如果需要持久化地改变全局隔离级别,应在配置文件中设置;如果只是想在当前会话中临时为一个或几个事务调整级别,那么不加 SESSION 关键字的 SET 方式反而更方便,因为它会自动“复位”,省去了手动改回的步骤。这个细节对于理解 MySQL 事务行为和编写特定逻辑的代码非常有帮助。

本机暂存
IT 2016-02-21 22:55:45 / 累计浏览 2,340

MySQL processlist中最哪些状态要引起关注

排查MySQL性能问题时,盯着processlist看哪些SQL在跑只是第一步。更重要的是,通过连接的状态判断其是否正在经历瓶颈。这篇讲的就是那些需要特别警惕的processlist状态,以及背后对应的优化方向。 文章列举了从“copy to tmp table”、“Sending data”到“Waiting for lock_type lock”等12个关键状态。比如,看到“copy to tmp table”频繁出现,意味着你的ALTER TABLE操作可能在业务高峰锁表,建议使用pt-osc工具或移到凌晨执行。“Sending data”则常因查询扫描数据量过大,核心解法是创建合适的索引并添加LIMIT。而一旦出现各种“Waiting for... lock”,特别是全局读锁或元数据锁,就说明有DDL操作在阻塞整个实例,必须调整维护窗口。 作者将每个状态与具体的数据库行为(如磁盘IO差、临时表溢出、锁等待)和明确的优化动作(如调参数、加索引、换引擎)直接关联起来。下次当你发现数据库响应慢,除了看慢查询日志,不妨也看看processlist里的这些“状态信号灯”,往往能更快定位到问题根源。

本机暂存
IT 2016-02-20 11:26:24 / 累计浏览 4,440

MySQL DBA修炼秘籍

这篇指南从职业发展路径出发,为立志成为MySQL DBA的同行勾勒了一幅清晰的修炼地图。作者结合自身及业内经验指出,现代互联网公司的MySQL DBA远不止是数据库管家,还需深入主机、网络、安全甚至自动化开发,逐步向运维DBA、开发DBA、架构师等专精方向演进。 文章核心在于“如何修炼”。从数据库基础概念与Linux入门讲起,到推荐《MySQL必知必会》、官方手册等学习材料,并强调通过搭建博客等实践来巩固知识。对于在职DBA,则给出了深入学习并发事务、锁机制、存储引擎等关键点的方向。 更吸引人的是,文中描绘了DBA理想的日常工作图景:约10%的时间通过平台处理基础运维,大部分精力投入SQL审核、主动性能优化、监控以及与业务的深度沟通,实现从“救火”到“防火”的转变。文末还附上了官方手册、知名技术博客等一系列实用资源。如果你正徘徊在DBA门口,或想系统规划进阶,这篇过来人的经验总结值得细品。

本机暂存
IT 2016-02-16 22:13:25 / 累计浏览 1,400

MySQL怎么计算打开文件数?

遇到“Can't open file”或“Too many open files”报错,是MySQL DBA的常见噩梦。这篇文章就从这个典型故障切入,系统性地剖析了MySQL打开文件数的多层限制与计算逻辑。 问题的根源在于文件描述符(FD)在MySQL中受到三层限制:操作系统内核级(fs.file-max)、用户进程级(ulimit -n)以及MySQL自身的参数。文章将后者的参数比喻为“电闸”和“电路保险”——open-files-limit是总开关,超限会影响整个实例;innodb-open-files则单独管控InnoDB文件,达到上限时会静默替换,相对柔和。 解决思路是从外到内逐层提升:先调整sysctl和ulimit的系统限制,再精细配置MySQL参数。文章的重点正是对open-files-limit、innodb-open-files、table-definition-cache和table-open-cache这四个参数的深度解读。它详细说明了每个参数在不同MySQL版本下的默认值、计算规则(如open-files-limit在5.6.8后的自动计算公式),以及table cache的LRU淘汰机制。 文章的价值在于,它将分散的知识点整合成一个清晰的“分层限制与解决”框架,并用生动的比喻和具体的版本数据,帮助读者理解“为什么”和“怎么做”,而不仅仅是罗列配置项。

本机暂存
IT 2016-02-16 22:12:05 / 累计浏览 3,000

倡议:MySQL压力测试基准值

这篇讲的是MySQL压力测试的标准化倡议。作者从日常压测的四种典型目的出发——比如对比MySQL版本性能、验证硬件升级效果、评估参数调整影响,或是评估新业务负载——指出了一个现实痛点:缺乏统一的基准,同行之间难以有效对比和借鉴测试结果。 为此,老叶在文中提出了一个具体的MySQL压力测试基准值倡议(2015试行版),并配套提供了数据采集模板。文章的核心价值不仅在于这个标准化提议,更在于一系列扎实的实操建议:如何避免缓存干扰测试(数据量需超过innodb_buffer_pool_size,每轮测试后清理系统缓存)、如何模拟真实线上流量(推荐使用tcpcopy)、以及如何全面解读压测结果(除TPS外,需重点关注iowait、svctm、事务响应时间等关键指标)。此外,文中还分享了提升tpcc_load数据加载效率的并行化技巧。 这篇文章将倡议与方法论结合,既推动了行业内的经验共享,也为工程师们提供了从工具选择到结果分析的完整压测指南。

本机暂存
IT 2016-02-13 22:29:10 / 累计浏览 3,700

MySQL DBA面试全揭秘

这篇讲的是 MySQL DBA 面试中的门道,作者从一位资深面试官的视角出发,详细拆解了面试流程和考察重点。文章指出,优秀的 DBA 人才抢手,面试需要精心设计。流程上,除了基础交流,会重点深挖简历中的技术细节和跳槽经历,以此考察候选人的真实水平、学习方法以及职业规划是否清晰。 在技术考察方面,文章以索引类型为例,展示了面试的深度。问题可能从数据结构(B+树、哈希)、物理存储(聚集与非聚集)到逻辑分类(主键、唯一索引)多个维度展开,要求候选人不仅要知其然,还要知其所以然。作者还提醒,面试是双向选择的过程,候选人也可以从面试官的提问和交流中,评估未来的团队环境和主管风格。这篇文章对准备面试的候选人和需要选拔人才的面试官,都提供了非常具体的行动指南。

本机暂存
IT 2016-02-09 23:33:03 / 累计浏览 2,580

MySQL索引之主键索引

这篇文章厘清了MySQL中主键索引和辅助索引的几处关键区别。 作者从两者的定义出发,指出主键索引是唯一标识记录、不可为NULL的索引,而辅助索引则包括唯一索引和非唯一索引。核心对比在于不同存储引擎下的行为差异:在MyISAM中,一个不允许NULL的唯一索引与主键索引本质相同,性能也相当;但在InnoDB中,主键索引即聚集索引,而辅助索引(无论是否唯一)存储的都是指向主键的指针,因此通过辅助索引查找数据需要额外的转换步骤。 文章用一组测试数据直观地展示了性能区别:在100万行数据的MyISAM表上,普通索引的随机检索效率比主键索引慢了30%以上;而在InnoDB表上,唯一索引比主键索引慢约9%,普通索引的差距则扩大到50%以上。这清楚地说明,理解这些索引机制对于InnoDB的表结构设计与查询优化至关重要。

本机暂存
IT 2016-02-06 23:53:55 / 累计浏览 1,420

MySQL不同复制模式下,如何忽略某些binlog事件

当MySQL主从复制因主键冲突、数据不存在等错误而中断时,如何快速跳过问题事件让复制继续?这篇技术博客给出了清晰的解决方案。 文章首先区分了两种场景。在未启用GTID的传统模式下,方法相对直接:通过`STOP SLAVE`、`SET SQL_SLAVE_SKIP_COUNTER=N`、`START SLAVE`三步,即可跳过指定数量的事件。但在启用GTID的现代架构中,操作则更为精细,需要手动计算并设置`GTID_PURGED`来“抹掉”导致错误的那个事务,让复制从下一个事务恢复。 此外,文章还推荐了Percona Toolkit中的`pt-slave-restart`工具,它能自动监控并忽略特定错误(如1062错误或匹配指定文本的错误),重启复制进程,是DBA手中非常便捷的利器。 整体来看,文章从手动命令到自动化工具,覆盖了处理复制错误的多种思路,对比了不同模式下的操作差异与工具带来的便利性,为数据库运维人员提供了实战性很强的参考指南。

本机暂存
IT 2016-02-06 14:01:40 / 累计浏览 4,880

MySQL B+树索引和哈希索引的区别

这篇讲的是 MySQL 里 B+树索引和哈希索引这两种常用数据结构的根本区别。作者从它们的数据结构图示出发,清晰地揭示了核心差异。 B+树是一个平衡的多叉树,节点间有指针链接,所以它不仅擅长等值查询,也天然支持范围查询、排序以及遵循最左匹配原则的联合索引。而哈希索引通过一次算法运算就能直接定位数据,在等值查询上速度极快,但代价是它破坏了数据的有序性,因此无法用于范围查询、排序和部分模糊查询。 文章还特别指出,只有 MEMORY 引擎能显式创建哈希索引,而 InnoDB 的自适应哈希索引不在此列。同时提醒了哈希索引在数据重复度高时可能遇到的哈希碰撞问题,以及 MEMORY 引擎表重启后数据会丢失的特性。 结论很实用:大多数需要范围查询、排序的通用场景,请坚定地选择 B+树索引。只有在使用 MEMORY 表、数据基数大且仅进行简单等值查询时,哈希索引才是更合适的选择。

本机暂存
IT 2016-02-06 11:25:27 / 累计浏览 2,400

实例解析MySQL性能瓶颈排查定位

这是一篇典型的故障排查实战文章。作者从线上MySQL实例负载告警入手,完整记录了从操作系统层面到数据库内部的定位过程。通过`w`、`sar`、`top`、`iotop`等命令,一步步锁定了高负载源于某个MySQL实例严重的磁盘I/O等待。 深入该实例后,发现瓶颈来自一条低效的SQL查询:它通过正序排序后取最大值,导致每次执行都需要全表扫描500多万行数据。作者将其优化为直接倒序排序取首条记录,将执行时间从上百秒降至毫秒级,性能提升显著。文章最后也总结了此类问题的常见成因,如大单次读写、缺少索引或突发流量等。对于需要处理数据库性能问题的开发者来说,这份从现象到根因的清晰排查路径很有参考价值。

本机暂存
IT 2016-02-06 10:37:53 / 累计浏览 1,060

SLAVE为什么一直不动了

这篇讲的是MySQL复制延迟中一种“假死”现象的排查。作者从一次延迟超大(超过3小时)但SQL线程却“无事可做”的报警出发,展示了如何一步步定位。 初步检查显示,主从IO和SQL线程都在正常运行,但从`show slave status`看,Relay Log的执行位点(Exec_Master_Log_Pos)却纹丝不动。关键的突破点在于检查主库的Binlog内容。作者发现,从卡住的位点(294959)开始,整个事务是一个巨大的`DELETE`操作——它来自Bacula备份系统的自动清理任务,一次性删除过期数据,事务提交耗时超过2000秒,产生的Binlog数据量接近3.9G,几乎填满了整个Binlog文件。 根因就在于此:这个超大事务在主库执行完毕并生成Binlog后,从库需要将其“重放”一遍。由于事务过于庞大,应用这个DELETE操作本身就需要极长时间,导致复制位点看起来一直“卡住”。文章不仅点明了直接原因,还提醒了这类大事务的潜在危害:除了延迟,还可能长时间锁住数据行,引发连锁的锁等待。 对于通用应用,作者给出的解决方案很务实:在代码层面控制事务粒度,比如每删除几千条记录就提交一次,避免生成这种“一镜到底”的巨型事务。这比直接修改第三方软件的源码更可行。

本机暂存
IT 2015-12-26 20:34:04 / 累计浏览 1,320

MySql lower_case_table_names迷思

这篇讲的是从Oracle或SQL Server迁移到MySQL时,一个常被忽略的“大小写敏感”坑。作者从实际迁移项目出发,指出纠结`lower_case_table_names`设置的根源在于不同数据库系统的默认行为差异——MySQL在Linux下默认区分大小写。 他给出的实战建议很明确:优先在代码层面统一表名大小写(全大写或全小写),然后再迁移数据库,这样能保持`lower_case_table_names=0`的默认安全设置。如果时间紧张无法修改代码,只能先妥协设置`lower_case_table_names=1`,但务必在项目后期通过开启`general log`逐步排查和修正不规范的SQL。 文章最后强烈呼吁,在制定数据库规范时就该强制统一表名大小写,避免混合写法带来的无尽麻烦。这个观点对于所有需要跨平台迁移或维护规范的团队,都有直接的参考价值。

本机暂存