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

数据库

共 1083 篇文章

IT 2016-03-10 00:02:24 / 累计浏览 1,809

关于RDS只读实例延迟分析

这篇讲的是RDS只读实例延迟的深度排查与实战解决。作者开篇即点明,延迟是只读架构(基于原生Binlog复制)与生俱来的挑战,会导致数据不一致甚至触发Binlog堆积,最终可能引发只读实例被锁、业务读操作失败。 文章系统梳理了导致延迟的五大典型场景,并给出了具体判据。例如,只读节点IOPS耗尽可能源于规格过小(对比主库配置);主库TPS过高但只读节点是单线程同步时,延迟难以避免;耗时长的DDL操作(如ALTER TABLE)会原样在只读节点执行,造成秒级甚至分钟级的同步卡顿;而大事务(如INSERT…SELECT)则会产生海量Binlog,使只读节点的SQL线程长时间处于“追赶”状态。 文章最后归纳了一套实用的“四看”排查法:一看只读节点IOPS是否触顶,二看其Binlog增长是否异常(定位大事务),三对比主库的ComDML指标(判断写入压力),四检查是否存在“Waiting for table metadata lock”等连接阻塞。这套方法能帮助用户快速定位问题根源,无论是优化配置、调整业务还是拆分事务,都能让读写分离架构运行得更顺畅。

本机暂存
IT 2016-03-07 23:42:18 / 累计浏览 3,152

[JavaWeb教程]第四章-java数据库开发

这篇教程从关系型数据库的基本概念切入,解释了数据持久化的重要性,并聚焦于Java Web开发中常用的MySQL数据库。作者没有停留在理论层面,而是手把手地演示了从安装MySQL、配置客户端Navicat,到创建数据库和表的全过程。 文章的核心部分在于通过一个“学生信息表”的实例,详细拆解了SQL语言的五种核心操作:使用`CREATE TABLE`定义包含自增主键、时间戳和备注的表结构;用`INSERT INTO`添加数据并讲解了`now()`函数的用法;通过`SELECT`进行单表与多表查询,展示了模糊匹配`LIKE`和表关联`JOIN`的应用;利用`UPDATE`修改特定记录;以及用`DELETE`按主键清理数据。每个操作都附带了语法要点和注意事项,例如更新和删除时务必使用`WHERE`子句限定范围。 教程最后延伸到开发实践,介绍了如何通过JDBC在Java代码中连接数据库,并提供了示例代码框架。整体来看,这是一篇面向初学者、步骤详实的实战指南,涵盖了从环境搭建到基础操作的全链路。

本机暂存
IT 2016-03-03 14:22:31 / 累计浏览 1,964

MySQL Binlog Server

这篇讲的是如何用原生工具为MySQL构建一个实时、安全的binlog备份服务器。 文章从数据安全备份的重要性切入,指出在MySQL 5.6之后,DBA们终于有了官方支持的便捷方案,无需再自行编写程序来拉取日志。核心方案是利用`mysqlbinlog`命令的几个关键参数:`-R`允许从远程服务器读取,`-raw`保持binlog原格式便于后续使用,而`-stop-never`则确保服务器会持续连接并同步,直到远端关闭。 作者用具体的命令示例,演示了如何从指定日志文件开始,搭建一个持续运行的binlog server,并且特别说明了如何通过`--stop-never-slave-server-id`参数,为多个服务器实例分配不同的ID以避免冲突。文章末尾抛出了一个实践中的重要问题:这样的binlog server,究竟该如何安全关闭?

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

MySQL事务隔离级别的暗门

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

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

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-21 22:50:46 / 累计浏览 2,690

教你如何查询当前主流数据库及其排名?

查询数据库流行度排名有捷径吗?作者直接指向了db-engines.com这个权威榜单。这篇文章带我们快速浏览了2015年6月的数据库流行度前十名,像Oracle、MySQL、SQL Server这些巨头稳居前列,但有意思的是,微软的Access依然高居第七,让不少开发者感到意外。同时,Redis作为新贵闯入了前十,而国产的巨杉数据库排名则从186位滑落至235位,引发了讨论。 榜单的排名并非凭空而来,它综合了277个数据库在资讯网站、谷歌搜索、技术讨论、招聘市场以及社交网络上的热度数据。通过这些多维度的积分统计,这个榜单真实反映了当时各类数据库在开发者社区和行业中的实际关注度与应用情况。对于需要了解数据库技术趋势或进行技术选型的人来说,这提供了一个非常直观的参考视角。

本机暂存
IT 2016-02-21 22:46:50 / 累计浏览 3,145

一次临时表空间大量占用问题的处理

这篇讲的是如何诊断和解决一个核心交易系统临时表空间暴涨至600GB的问题。作者从实际案例出发,发现占用临时空间的大量排序段,并非由当前执行的SQL产生,而是源于大量会话打开了需要复杂排序的查询游标后,一直没有关闭,导致Oracle必须维持这些游标的状态和已排序的数据,从而长期占用临时段。 文章详细展示了排查过程:通过v$sort_usage定位到大量会话关联同一个SQL_ID,但发现该SQL本身并不需要排序。真正的“元凶”是这些会话中打开的另一个游标——一条对千万级数据进行排序的业务查询。由于应用在取数后未正确关闭游标,使得排序段无法释放。作者甚至用PL/SQL代码复现了这一过程,清晰演示了临时空间是如何被一个未关闭的游标“泄漏”出去的。 这篇案例的精彩之处在于,它纠正了一个常见误区,并提供了一套实用的诊断思路:当遇到临时表空间异常时,应重点检查会话的打开游标,特别是那些有大量排序操作且未完成处理的SQL,而不仅仅是看当前正在执行的语句。

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

MySQL DBA修炼秘籍

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

本机暂存
IT 2016-02-16 23:00:07 / 累计浏览 2,029

更好的 SQL 模式的 10 条规则

这篇讲的是数据库模式设计中常被忽视、却会影响长期维护效率的细节。作者从大量实际数据库的读写经验出发,总结了十条黄金法则,帮助开发者从源头避免未来的“痛苦”。 它核心强调命名与结构的清晰性。例如,对象名只用小写字母、数字和下划线,避免使用点、空格和大写,这能消除查询时的引号依赖和大小写混淆。列名和表名应具备自说明性,避免使用晦涩缩写或保留字。外键命名需保持全局一致。 此外,文章给出了具体的数据类型建议:主键推荐使用自增整数而非UUID,以简化查询和数据清理;时间数据应存储为统一的DATETIME类型,并始终使用UTC时区,而非字符串或Unix时间戳。它还指出应追求单一数据源,谨慎使用JSON列进行分析,并避免过度规范化(例如无需为邮编等简单值单独建表)。 遵循这些规则,能让你的数据库结构在未来需求变化和团队扩张时,依然保持清晰、高效且易于维护。

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

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 / 累计浏览 2,953

倡议:MySQL压力测试基准值

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

本机暂存
IT 2016-02-16 21:18:29 / 累计浏览 2,868

mysql索引合并:一条sql可以使用多个索引

很多开发者可能还固守着“一条SQL只能使用一个索引”的旧观念,其实MySQL的索引合并特性早已支持更灵活的索引使用。这篇技术文章就详细拆解了这个特性。 文章首先厘清了概念:索引合并并非新事物,它能让MySQL对**同一个表**的多个索引进行范围扫描,并将结果通过并集、交集等方式合并,最终返回数据。要判断查询是否利用了索引合并,只需在`EXPLAIN`结果中看`type`列是否为`index_merge`,以及`key`列是否列出了所有被使用的索引。 作者通过一组精心设计的数据和查询进行演示。例如,当执行`WHERE (key1_part1=4 AND key1_part2=4) OR key2_part1=4`时,`EXPLAIN`显示成功使用了索引合并(`Using sort_union(key1,key2)`)。但另一个结构相似的查询却导致全表扫描。文章指出,这揭示了一个核心事实:**优化器是否选择索引合并,根本上取决于对数据统计的分析和成本估算**,单纯讨论SQL写法是否“能用”索引并不全面。 此外,文章还提到了一个关键的版本差异细节:在MySQL 5.6.7之前的版本中,存在“range优先”原则,可能会抑制索引合并的使用,即使后者理论上更优。这提醒我们,在考虑索引策略时,数据库版本也是不可忽视的因素。

本机暂存
IT 2016-02-16 20:25:32 / 累计浏览 2,466

Oracle 11g大对象数据新技术

这篇内容专门针对 Oracle 数据库中令人头疼的 ORA-00600 内部错误,提供了一套从定位到解决的系统化诊断手册。它首先点明,这类错误本质上是 Oracle 软件遇到了不一致的低级异常,成因可能涉及 Bug、操作系统或硬件。 文章的核心价值在于其清晰的排查路径:第一步永远是检查 alert.log 和 trace 文件;第二步是利用 Metalink 提供的专用诊断工具,通过输入错误的第一个参数和数据库版本号快速检索知识库;第三步则是整理必要信息,向 Oracle Support 提交 SR。 作者特别强调了 trace 文件的完整性和参数信息的关键作用,并用“ORA-00600 [729]”空间泄漏的实例,演示了如何通过设置特定事件参数来规避这类可忽略的内存泄漏告警。整体而言,文章将复杂的内部错误排查流程,拆解成了可操作的步骤,对 DBA 构建故障处理预案很有参考价值。

本机暂存
IT 2016-02-16 12:07:56 / 累计浏览 3,208

那些常见的Oracle错误

这篇讲的是Oracle数据库运维中那些高频出现的“拦路虎”。作者从DBA经常面临的实际故障现场出发,梳理了ORA-00600、内存耗尽、空间不足等几类典型问题。文章不止于罗列现象,而是深入到了问题的“肌理”——比如ORA-00600这类内部错误,其第一个参数和数据库版本就是定位根因的钥匙;ORA-04030则往往与PGA内存分配和操作系统限制有关。 更实用的部分在于诊断思路。文章引导读者从检查alert.log和trace文件入手,还指出了Oracle官方在Metalink上提供的600/7445诊断工具这个利器。针对具体案例,如ORA-00600[729]“UGA空间泄露”,给出了设置事件参数“10262”来屏蔽小泄露的明确解决方案。这种“故障现象-诊断方法-官方工具-具体参数”的完整链条,为运维人员构建了一套可复用的排查预案,能有效降低面对突发故障时的手足无措感。

本机暂存
IT 2016-02-14 00:06:24 / 累计浏览 2,604

Oracle字符类型存数字及查询数字时使用单引号走不走索引的问题

这篇文章解决的是一个在实际数据库开发中容易产生争议的问题:用varchar2类型存放的数字字段,在查询条件中给数字加上单引号,到底会不会导致索引失效?作者从团队内部的实际分歧出发,通过在Oracle 11.2.0.4.0版本上进行测试来验证结论。 文章首先通过建表和数据准备,复现了讨论的场景。核心对比点在于两种常见的错误认知:一种是认为“char类型存数字,查询不加单引号不走索引”;另一种则想验证“varchar2类型存数字,查询加单引号是否还会走索引”。作者通过具体的执行计划截图(文中虽未显示但提到测试信息),清晰地展示了不同写法下的索引使用情况。 最终得出了明确的结论:对于varchar2类型字段,无论在查询时是否为数字加上单引号,都能正常走索引。这个结果厘清了一个常见的误解,并为后续将varchar2字段改为number类型的设计决策提供了数据支持。对于DBA和开发人员而言,理解数据库在处理隐式类型转换时的具体行为,有助于编写出既准确又高效的SQL语句。

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

MySQL DBA面试全揭秘

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

本机暂存
IT 2016-02-10 23:11:17 / 累计浏览 2,484

MySQL drop database恢复(恢复方法同样适用MySQL drop table,delete,truncate table)

这篇讲的是一个真实的数据库灾难恢复案例。作者从一起线上事故切入:有人误点了产品软件的“清空数据”功能,导致一个MySQL数据库被直接执行了drop database操作,且事前没有任何备份。情况很紧急,但处理思路很清晰——立刻封存现场,将核心的InnoDB表空间文件ibdata1备份了出来。 接下来,作者借助专业的MySQL recovery工具,对这个18MB的ibdata1文件进行了深度解析。文章中展示了使用stream_parser工具扫描和提取数据的命令行过程,这是恢复的关键第一步。经过6个小时的分析和处理,最终的核心成果是:实现了核心数据的零丢失。 这个案例的价值不仅在于给出了drop database后的具体恢复路径,也印证了这类误操作在数据库管理中并非个例。它提醒我们,即便在高度自动化的系统中,对“清空数据”这类高危功能的设计和权限控制需要格外谨慎,而及时、有效的应急响应和文件级备份(而非仅依赖逻辑备份)在极端情况下可能是最后的救命稻草。

本机暂存
IT 2016-02-10 22:53:20 / 累计浏览 4,510

SQLIte这么娇小可爱,不多了解点都不行啊

这篇以轻松比喻开篇的文章,将SQLite与MySQL、Oracle这些“壮汉”数据库对比,形象地突出了SQLite“轻量嵌入式”的核心定位。作者没有停留在简单的介绍,而是深入剖析了SQLite的设计哲学与技术细节。 文章系统梳理了SQLite的关键特点:零配置、无服务器、单文件存储、跨平台且体积极小(可低于300KiB),同时也坦诚指出了它在并发写入、存储过程和用户权限管理上的局限。其核心价值在于,对于移动设备等特定场景,这些缺点往往可以接受,而其优点则非常突出。 更深入的部分在于对SQLite事务与锁机制的解析。文章详细阐述了其5种锁状态(UNLOCKED到EXCLUSIVE)和3种事务类型(DEFERRED、IMMEDIATE、EXCLUSIVE)如何协同工作,并解释了潜在的死锁问题。特别针对SQLite 3.7.0引入的WAL(Write-Ahead Logging)机制,文章对比了传统的回滚日志方式,说明了WAL如何通过将修改写入单独文件来实现“读写并发”,显著提升了性能,同时也指出了其适用条件和潜在缺点。 总体来看,文章从形象类比到特性清单,再到深层机制剖析,层层递进。它告诉读者,SQLite并不仅仅是一个“简单”的数据库,其内部有着精巧的事务控制逻辑,理解这些是用好它的关键。

本机暂存
IT 2016-02-10 22:48:58 / 累计浏览 2,386

MySQL异常恢复之恢复数据字典表讲解

当InnoDB存储引擎崩溃或系统表空间损坏后,要从底层恢复用户数据,理解核心的数据字典表是关键的第一步。这篇文章深入剖析了MySQL(特指早期版本)InnoDB内部四个用于记录表与索引元信息的系统表:SYS_TABLES、SYS_INDEXES、SYS_COLUMNS和SYS_FIELDS。 作者从数据恢复的实际需求出发,没有停留在表面定义,而是清晰地拆解了每个表的核心字段及其在恢复流程中的具体作用。例如,指出了恢复时最依赖的是记录表信息的SYS_TABLES和记录索引B+树根页位置的SYS_INDEXES,而列信息表(SYS_COLUMNS)与索引列分布表(SYS_FIELDS)则在需要精确还原表结构时提供支持。文章还解释了这些表各自默认存储在哪个系统索引ID中(如SYS_TABLES在index_id 1,根页为8号页),这对于手工定位和抽取字典至关重要。 作者对每个表的核心字段都做了拆解,比如强调SYS_INDEXES中的PAGE_NO字段直接指向索引的根页,这是恢复数据的入口。通过理解这些底层元数据,DBA在面对无法正常启动的MySQL实例时,就能理清恢复思路,利用工具定向提取关键信息,为抢救数据奠定基础。

本机暂存
IT 2016-02-10 22:35:12 / 累计浏览 1,125

MySQL 5.7 传统复制到GTID在线切换

这篇文章详细讲解了如何将 MySQL 5.7 的传统复制架构,在线、平滑地切换至基于 GTID 的复制模式。它首先明确了两个前提条件:版本需在 5.7.6 及以上,且初始所有节点必须处于 `gtid_mode=off` 状态。 核心方案是一套环环相扣的九步操作流程。文章特别强调了第一步设置 `enforce_gtid_consistency = warn` 时,必须确保所有节点都没有警告输出,这是后续切换成功的关键。切换过程通过逐步调整 `enforce_gtid_consistency` 和 `gtid_mode` 两个全局变量来实现,并建议在设置 `gtid_mode=on_permissive` 时,先从 slave 节点执行再操作 master,以确保新产生的日志立即带有 GTID。 整个流程中,一个重要的验证点是反复查询 `ongoing_anonymous_transaction_count` 状态值,必须在所有节点确认为“0”后,才能进行最终的 `gtid_mode=on` 设置。最后,文章还提醒需要将配置固化到配置文件,并重启从库复制服务以启用自动位置追踪(`master_auto_position=1`)。 整套方案无需停服,通过精细的状态控制与验证,实现了从传统复制到 GTID 复制的在线无损切换,是数据库管理员维护高可用集群时一份非常实用的分步指南。

本机暂存