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

数据库

共 1083 篇文章

IT 2012-05-28 13:32:30 / 累计浏览 2,061

MariaDB与Percona XtraDB的Group Commit实现原理分析

这篇从MySQL InnoDB存储引擎一个长期存在的bug切入:开启binlog后,由于要保证事务日志与mysqlbinlog的顺序一致性,导致无法进行group commit,这严重影响了高并发写入性能。文章详细剖析了MariaDB与Percona XtraDB这两个主流分支是如何解决这个“老大难”问题的。 核心对比在于它们各自的实现思路。MariaDB通过引入逻辑时钟(lc)来统一排序binlog与InnoDB日志,巧妙地将group commit的决策提前到binlog阶段完成,打破了原本的依赖链。而Percona XtraDB则采取了更为集中的“协调者”模式,在存储引擎层进行统一协调,确保两阶段提交的原子性与性能。两者都通过精巧的设计,在无需改变原有复制逻辑的前提下,恢复了group commit的能力。 文章没有停留在原理对比,还结合代码路径和关键变量,点明了不同实现对复杂度和性能的权衡。对于想深入理解MySQL事务提交内部机制,或者在面临高并发写入瓶颈时做技术选型的读者来说,这篇对底层实现的拆解提供了扎实的参考。

本机暂存
IT 2012-05-28 13:30:22 / 累计浏览 3,104

全表扫描却产生大量db file sequential read一例

这篇文章讲的是开发团队在新系统上线前的数据校验阶段,遇到的一条SQL执行超过一小时仍未结束的典型故障。SQL本身语法很简单,看似只是对一张表进行全表扫描,但实际执行时却产生了大量“db file sequential read”等待事件,这显然与通常全表扫描对应“db file scattered read”的预期相悖,性能问题便由此而来。 作者深入剖析了这一现象。根因在于,表上的索引结构或统计信息存在问题,导致优化器错误地为这条全表扫描SQL选择了通过索引来读取数据的执行计划(Index Full Scan)。每一次通过索引回表读取数据行,都触发了一次“db file sequential read”,数据量一大,I/O开销和响应时间便急剧飙升。 文章不仅揭示了问题本质,还给出了具体的排查步骤与解决方案,例如检查执行计划、更新统计信息或重建索引。对于常与数据库性能问题打交道的开发者和DBA来说,这个案例提醒我们:执行计划的选择有时会很“意外”,全表扫描的性能瓶颈背后,可能隐藏着索引的异常使用。

本机暂存
IT 2012-05-28 13:24:33 / 累计浏览 1,482

MySQL driver(驱动) liblbmysql for Go1

Go 1.0发布后,许多原有MySQL驱动出现了兼容性问题。作者因此编写了liblbmysql这个简易驱动来解决迁移需求。它虽然暂不支持prepare语句,也未完全实现标准sql/driver接口,但足以应对基本的连接与查询场景。 文章以具体示例展示了如何集成该驱动到Go项目中,包括初始化连接和执行简单SQL操作。对于急需在Go 1.0环境下使用MySQL的开发者而言,这是一个轻量且可直接上手的过渡方案。 作者选择分享这个尚未完全开发的工具,是考虑到社区中可能存在相同的迫切需求。如果项目对数据库交互要求不复杂,这个驱动或许能帮上忙。

本机暂存
IT 2012-05-28 13:21:29 / 累计浏览 2,161

使用exp/imp 导入11g数据到9i

这篇讲的是如何用最直接的工具exp/imp,解决一个典型的Oracle版本兼容性难题:将11g数据库的数据导入到老旧的9i环境。核心在于一个容易被忽略的Oracle原则:高版本服务端通常兼容低版本客户端。作者从这里切入,最终发现只需在9i客户端环境下操作就能顺利完成迁移。文章梳理了面对此类需求时常见的几种思路,并验证了这一最有效的方法。没有复杂的格式转换或中间步骤,直接抓住了问题的本质。对于遇到类似跨大版本迁移需求的人来说,这个思路提供了一条清晰、简单的路径。

本机暂存
IT 2012-05-28 12:36:17 / 累计浏览 1,482

sql_id和hash value的部分转换

这篇讲的是 Oracle 数据库中如何“看懂”并关联两种 SQL 标识符。作者从 9i 和 10g 版本演进出发,解释了老牌的 HASH_VALUE 和新贵 sql_id 其实同宗同源——都源于对 Library Cache 对象进行的 MD5 哈希。 关键差异在于截取方式:Oracle 将生成的 128 位哈希值的低 32 位作为 HASH_VALUE 展示,而 sql_id 则巧妙地取了其后 64 位。理解了这个生成逻辑,就明白了两者之间存在可计算的映射关系,但因为最终保留的位数不同,所以转换只能是“部分”的,而非完全互转。 文章最大的价值在于,它没有停留在概念解释,而是明确指出可以通过自定义函数,在一定范围内实现这两者的相互推导。这对于需要在不同监控视图或日志文件间交叉分析 SQL 性能问题的 DBA 来说,提供了一个非常实用的技巧,能更灵活地锁定目标语句。

本机暂存
IT 2012-05-28 12:35:52 / 累计浏览 2,560

MySQL数据库InnoDB存储引擎 innodb_buffer_pool_size初始化详解

这篇讲的是 MySQL InnoDB 存储引擎中一个核心但细节容易被忽视的部分:innodb_buffer_pool_size 参数的初始化过程。作者从 Buffer Pool 在 InnoDB 中的基础作用入手,但并未停留在概念层面,而是直接深入到源码实现中,剖析了当数据库启动时,这个内存池是如何被逐步计算、申请和初始化的。 文章的重点在于揭示这个过程的“非直观”之处。例如,它详细解释了初始化阶段如何根据配置值计算出实际需要申请的内存块数量,以及这个计算中隐含的内存对齐和页结构考量。更关键的是,文章分析了在不同操作系统和硬件环境下,这个初始化过程可能遇到的实际问题,比如因透明大页(THP)或 NUMA 架构配置不当,导致内存分配失败或性能大幅下降的具体场景。 通过逐步拆解从参数读取到内存真正就绪的代码路径,文章不仅帮助读者理解了“为什么我的 buffer pool 配置没有生效”这类常见问题,更提供了检查系统配置、优化初始化参数的思路。对于希望从底层理解 MySQL 内存管理并进行精细化调优的 DBA 和开发者来说,这些源码级的细节提供了坚实的依据。

本机暂存
IT 2012-05-24 22:59:19 / 累计浏览 3,201

MySQL闪回方案讨论及实现

这篇讲的是如何为MySQL数据库实现类似Oracle的“闪回”功能,以应对主从复制环境下无法阻止的误操作,比如误删表或全表更新。 作者从一个实际痛点出发:即使搭建了主从,实时备份也无法恢复逻辑误操作。文章核心方案是利用row-based格式的binlog来实现闪回,因为只有在这种格式下,binlog才会记录数据变更前后的完整行信息。 对于常规的增删改操作,思路很巧妙:通过反转binlog事件的类型和内容——把INSERT事件变成DELETE,把DELETE事件变成INSERT,再把UPDATE事件中的新旧行数据对调——就能生成可以“逆操作”的闪回日志。而对于ALTER TABLE、DROP TABLE这类DDL操作,仅靠binlog的语句记录则无能为力。文章提出的补充方案是,在执行这类可能删除数据的DDL前,先将原表数据备份到一个历史表中,并自定义一种FLASHBACK_EVENT事件来记录恢复步骤。 最终,通过修改mysqlbinlog工具并添加这种事件类型,就能按表、按时间点反向执行这些操作,安全地恢复数据。方案最大的优点是,这些修改不会影响原生的binlog工具使用,也不会对线上正常操作的性能带来额外负担。

本机暂存
IT 2012-05-24 22:35:14 / 累计浏览 1,841

Oracle 11g全表扫描以Direct Path Read方式执行

这篇文章聚焦Oracle 11g引入的一个性能优化特性:全表扫描通过Direct Path Read执行。作者从实际的性能调优场景出发,剖析了这一设计变更背后的考量。 核心观点是,当执行偶发性的、需要读取大量数据的全表扫描时,绕过Buffer Cache(缓冲区缓存)的直接路径读是一种更优解。传统全表扫描会将数据块读入缓冲区,这在频繁访问时可以加速,但若数据量巨大且仅为一次性或低频读取,则会将缓冲区中大量的“热”数据替换出去,造成整体性能抖动。Direct Path Read则通过直接读取数据文件,避免了对共享缓存的冲击,保护了日常交易的响应速度。 文章清晰地界定了两种方式的适用边界:对于小表或频繁访问的表,传统的缓存机制依然高效;而对于偶发的大表分析型查询,直接路径读则能提供更稳定、可预测的性能。这种对数据库内部机制取舍的讲解,帮助读者在面对类似场景时,能更深刻地理解系统行为并做出合理的设计选择。

本机暂存
IT 2012-05-22 13:21:56 / 累计浏览 4,442

MySQL数据库InnoDB存储引擎 Insert Buffer实现机制详解

这篇深度解析InnoDB核心优化机制——Insert Buffer的内部实现。文章以MySQL 5.5至5.6版本为基础,从一张预插入5万条数据的测试表出发,逐步拆解了当执行插入操作时,InnoDB如何判断并利用Insert Buffer来延迟非唯一索引页的更新。 作者详细追踪了从`write_row`到`ibuf_insert_low`的完整函数调用链,重点揭示了两个关键决策点:一是通过`ibuf_should_try`判断索引是否适用缓冲(主键和唯一索引被排除),二是利用`Ibuf Bitmap Page`中的2-bit编码,精确评估目标索引页的剩余空间是否足够、是否会引发页面分裂,从而决定是否能将修改记录先写入系统表空间内的`SYS_IBUF_TABLE` B-tree。 文章还剖析了两个精巧的设计:一是Insert Buffer记录本身的结构,通过组合`space_id`、`page_number`和操作计数器,确保了同一页面的操作有序存储与合并;二是整个缓冲区管理的“巧妙”之处——在系统表空间中使用固定的第5号页面(page_no=4)作为B-tree根节点,这使得崩溃后能无需数据字典即可快速恢复缓冲功能。整个实现展现了InnoDB为提升I/O性能所做的底层权衡与工程智慧。

本机暂存
IT 2012-05-22 13:21:01 / 累计浏览 3,182

Solr调优参考

这篇Solr调优指南清晰地划分了两大应用场景:通用优化与特定环境下的精准调优。作者将实践经验归纳为三个层次,其中前两部分构成了核心——常规处理提供了普适性的性能提升框架,而针对性处理则强调了在特定业务模式与数据特征下进行参数微调的必要性。 文章的价值在于它并非一份泛泛的参数清单。它直接点明,脱离具体应用特性的调优是低效的,真正的性能提升必须建立在“具体调节参数”并“对比性能”的闭环验证之上。第三部分虽未展开,但从结构上看,旨在引导读者从通用方法过渡到定制化策略。 对于正在处理搜索性能瓶颈、或是计划重构Solr集群的工程师来说,这篇文章提供了一个从面到点的优化思路。它提醒我们,最佳实践永远是动态的,必须与自身的负载场景紧密结合,才能将调优的效果真正落地。

本机暂存
IT 2012-05-22 13:20:37 / 累计浏览 2,781

为什么binlog大小会大于max_binlog_size?

这篇讲的是MySQL中一个看似违反直觉的现象:即使你设置了 `max_binlog_size`,binlog文件还是可能更大。 作者从这个配置参数的真实行为出发,解释了背后的核心机制。关键点在于,MySQL不会在单个事务的写入过程中切割binlog文件。也就是说,如果一个大事务产生了大量日志,这些日志会完整地写入当前文件,即使总大小超过了阈值。只有当该事务提交后,MySQL才会关闭当前binlog文件,并开启一个新文件。所以,`max_binlog_size` 实际上是一个软限制,旨在控制文件增长的节奏,但无法强制进行事务级的文件切割。 文章清晰地指出了这种设计的合理性:它优先保证了单个事务日志的完整性,避免了跨文件可能带来的复杂状态管理(比如恢复操作时)。对于DBA而言,理解这一点非常重要。它能帮助你准确预估磁盘空间占用,并在设计清理策略时,考虑到因大事务导致的偶尔超限情况,而不是误以为配置失效。

本机暂存
IT 2012-05-22 13:16:05 / 累计浏览 5,305

Mondrian中聚合表的应用

这篇讲的是作者在实际项目中应用Mondrian聚合表优化多维分析系统的经验。在项目后期,系统面临查询性能瓶颈,尤其处理大规模多维数据时响应缓慢,作者引入了Mondrian提供的聚合表机制来加速查询。聚合表的核心思路是通过预先计算和存储常见维度组合的聚合结果,减少实时计算开销,特别适合高频访问的场景,比如销售数据分析中针对时间、产品和区域维度的汇总。 文章从聚合表的基本概念出发,解释了它在多维分析中的关键作用:预先生成的聚合数据能显著降低数据库负载,提升查询效率。作者结合官方资料和个人实践,总结了聚合表的典型应用,例如在月度销售报表或区域趋势分析中,设置聚合表可以将查询响应时间缩短数倍。在具体使用上,详细介绍了如何在Mondrian模式文件中配置聚合表、选择合适的聚合粒度(如按月或按产品类别),以及

本机暂存
IT 2012-05-22 12:36:39 / 累计浏览 2,803

MySQL数据库InnoDB存储引擎 异步IO(AIO)实现机制详解

这篇讲的是 InnoDB 存储引擎中异步 I/O 的实现机制。作者从数据库高性能 I/O 的需求出发,深入剖析了 InnoDB 如何利用操作系统的异步 I/O 能力来突破传统同步 I/O 的性能瓶颈。 文章核心揭示了 InnoDB AIO 的实现架构:它并非简单地调用系统调用,而是通过一个专门的后台线程(io_threads)来管理和分发 I/O 请求。这个设计巧妙地将用户线程从等待 I/O 完成的阻塞中解放出来,允许它们继续处理其他任务,从而大幅提升并发性能。作者还详细拆解了请求是如何被提交、如何通过回调函数处理完成事件,以及这个机制在不同场景(如读写操作)下的具体工作流程。 对于想理解数据库如何“压榨”底层硬件性能的技术人员来说,这篇文章提供了清晰的逻辑脉络和关键实现细节,解释了 InnoDB 能够高效处理海量数据读写的核心设计思想之一。

本机暂存
IT 2012-05-17 23:49:34 / 累计浏览 2,982

DRBD使MooseFS跑得更安全

这篇技术文章聚焦于分布式文件系统MooseFS的安全性提升方案。作者从MooseFS的实际优势说起,比如通过多份数据副本确保存储可靠性,并且相比ext3能节省空间。然而,文章很快指出一个核心隐患:主控server存在单点故障风险,即便有metalogger server作为备份角色,问题依然未完全解决。 针对这一痛点,文章详细介绍如何集成DRBD(分布式复制块设备)技术来加固MooseFS。DRBD能够在两个服务器节点间实时同步块设备数据,当主控节点发生宕机时,备用节点可以迅速接管服务,从而消除单点瓶颈。作者分享了具体的配置经验和故障转移机制,并通过前后对比,展示了引入DRBD后系统可用性的显著提升。 最终结论是,这一方案让MooseFS的整体运行更安全、更稳健,为工程师提供了一个实用的高可用优化思路。

本机暂存
IT 2012-05-17 23:34:55 / 累计浏览 2,665

HBase中如何开发LoadBalance插件

这篇讲的是如何在HBase中开发自定义的LoadBalancer插件。作者从HBase早期版本的痛点出发:在0.92版本之前,控制Region分配与负载均衡的策略被硬编码在Master内核中,开发者想要定制自己的负载均衡逻辑,只能去“黑”源码,并且每次版本升级都得艰难地移植这些修改。 HBase 0.92版本带来了一个重要的架构改进——将LoadBalancer策略从Master中解耦,开放了标准的LoadBalancer接口。这意味着开发者现在可以像实现一个Java接口那样,编写符合自己业务集群特性的负载均衡插件,而不再需要侵入HBase核心代码。这篇文章详细介绍了这个接口的定位和扩展方法,为那些需要对集群Region分布进行精细、定制化控制的场景提供了清晰的实现路径。通过这种方式,插件与HBase核心得以解耦,便于维护和升级。

本机暂存
IT 2012-05-17 23:30:39 / 累计浏览 3,765

弃用NoSQL数据库 CouchDB再见了

这篇讲的是一个技术团队告别 CouchDB 的心路历程。文章从团队原有的业务场景出发,回顾了为何曾选择这款文档数据库,以及在实际生产中,特别是在 Kubernetes 云原生环境下,逐渐遇到了哪些痛点。比如,在需要强事务支持和复杂关联查询的场景下,CouchDB 基于键值存储的设计就显得力不从心,运维复杂度也随着规模增长而提升。 作者没有停留在抱怨上,而是清晰地梳理了技术选型的决策过程。他们对比了包括 PostgreSQL 在内的多种方案,最终选择了更适合自身业务混合负载的云原生数据库,并详述了数据迁移与切换过程中,如何保障服务平稳过渡。结尾部分总结了从这次“数据库分手”中学到的宝贵经验,强调技术选型需要与业务发展阶段和基础设施演进紧密结合,对正在面临类似困扰的团队很有参考价值。

本机暂存
IT 2012-05-15 23:44:18 / 累计浏览 3,124

利用sql load加载txt,csv及图片到数据库

这篇讲的是如何利用SQL*Loader工具,将MySQL导出的文本文件以及图片批量导入Oracle数据库。作者从一位朋友的求助电话出发——朋友想进行数据迁移,但在电话里始终说不清楚具体操作,于是作者直接通过几个实例来演示解决方案。 核心在于编写一个控制文件(.ctl),来精确定义加载规则。例如加载CSV时,文件里指定了源数据路径、目标表名、使用逗号作为字段分隔符,并明确了数据列(如GRADE, LOSAL, HISAL)与表字段的映射关系。通过类似`LOAD DATA`、`INFILE`、`FIELDS TERMINATED BY`这些关键指令,就能告诉Oracle如何解析和装填数据。文章不仅覆盖了标准的txt和csv文本,还提及了对图片等二进制文件的加载思路。 通过这种“直接上代码”的实战分享,作者把数据库导入这个常见但繁琐的运维操作,拆解成了可复制的步骤。对于需要处理跨平台数据迁移的DBA或开发者来说,这种基于控制文件的方案提供了清晰、可扩展的模板。

本机暂存
IT 2012-05-15 23:41:40 / 累计浏览 4,743

如何正确安装ORACLE使ORACLE状态最优

很多DBA在安装Oracle时习惯一路“下一步”,这种偷懒可能在未来埋下性能隐患和维护负担。这篇文章从安装实践出发,强调“正确安装”对数据库长期健康运行的重要性。 作者建议避免使用基本安装和模板建库,推荐选择“高级安装”并分步进行:先单独安装Oracle软件(尤其是企业版),后续再通过DBCA定制创建数据库。这样做的好处是,未来升级或打补丁时只需处理软件层,流程更简洁,无需在漫长的数据迁移中等待。 在数据库创建环节,文章特别指出了两个关键配置:慎用Enterprise Manager(OEM),因其本身可能引入性能开销;同时可在此步骤提前规划自动备份策略。整体思路在于,通过精简不必要的组件、分离软件与数据库安装,从源头上让Oracle环境更轻量、更易于管理。这样安装后的数据库确实更“健康”。

本机暂存
IT 2012-05-15 23:37:21 / 累计浏览 7,946

三种东西永远不要放到数据库里

这篇讲的是数据库设计中那些容易被忽略、但会埋下长期隐患的常见错误。作者从多年的咨询经验出发,指出改进系统往往始于避免“蠢事”——并非指开发者本身,而是那些看似无害却为后续维护和升级带来巨大麻烦的决策。他特别强调,自己从未见过做出此类选择的人得到好结果。 文章具体分析了三种绝不该塞进数据库的内容(虽然这里没有展开,但标题和开头已强烈暗示了其严重性)。核心观点很清晰:数据库不是万能收纳盒,有些数据放进去反而会拖累系统性能、增加复杂度和未来的迁移成本。作者的观察基于大量实际案例,意在提醒技术人员,在系统设计时多一层审慎思考,能避免后期付出高昂代价。 对于正在规划数据存储方案或已陷入维护困境的工程师,这篇文章提供的不是抽象理论,而是基于实战教训的具体告诫,能帮助避开那些隐蔽却代价不菲的“设计陷阱”。

本机暂存
IT 2012-05-15 23:30:12 / 累计浏览 4,003

MySQL源代码的海洋中游弋 初探MySQL之SQL执行过程

这篇讲的是搜狐DBA团队技术沙龙分享中,如何从MySQL源码层面探查一条SQL语句的真实执行轨迹。 文章以几个典型查询(如GROUP BY、两表JOIN)为例,深入其底层逻辑:当执行`GROUP BY`且未命中索引时,MySQL会如何通过临时表的写入、重复键检测与最终排序来完成操作;而一旦GROUP BY的列上存在有序索引,执行流程又如何被优化,跳过临时表和filesort。作者还进一步剖析了Nested Loop Join(嵌套循环连接)的算法图示,以及派生表、依赖子查询等复杂结构的内部处理。 最巧妙的部分在于,文章通过跟踪源码中临时表创建、join buffer使用等“痕迹”,将EXPLAIN输出里诸如“Using temporary”或“Using join buffer”这样的抽象结论,还原成了具体的数据流转步骤。这正呼应了其核心观点:阅读手册概念易有“空中楼阁”之感,而深入源码才能获得“脚踏实地”的理解,最终目标是看懂并利用好EXPLAIN的每一次输出。

本机暂存