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

数据库

共 1083 篇文章

IT 2026-06-03 09:03:24 / 累计浏览 12

Neko Master: 从 0 到 1K+ Star 的 Vibe Coding 实践

本文以开源自部署网络流量分析面板 Neko Master 为例,深入复盘了一次从零到一的“Vibe Coding”实践。项目始于作者对现有流量监控工具直观性与美观性的不满,旨在为家庭网络环境提供清晰的“流量感知”视角。开发初期,作者借助 Kimi K2.5 模型进行快速原型构建,一小时内便完成了核心功能的 MVP。项目上线后迅速获得社区关注,但也随之面临真实流量带来的严峻挑战。 文章的技术剖析聚焦于从“玩具”走向生产级的关键优化。首要难题是 SQLite 的磁盘 I/O 爆炸,原生每条记录单次写入导致日写入量高达 200GB。解决方案包括引入内存缓冲队列实现批量落盘、先聚合再写入以及写入限流,最终将写入量降至 1.6GB。在架构扩展上,为应对多网关、多 Agent 场景,项目引入了 ClickHouse。通过设计统一的批量写入窗口、按时间分区与常用维度排序、以及建立预聚合层,显著提升了查询的稳定性与响应速度。 作者系统总结了 Kimi、Claude Opus、CodeX 等 AI 工具在项目各阶段(原型搭建、性能调优、架构重构)的角色分工,并强调了通过提供视觉参考图(如 Dribbble 截图)来提升 AI 生成 UI 审美水平的方法。最终得出结论:Vibe Coding 极大地压缩了从 0 到 1 的开发时间,但将产品从 1 推向 100,诸如性能边界把控、架构决策、审美判断和用户需求理解等核心环节,依然依赖于人类工程师的经验与判断。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 12

第六章:分区

传统主备复制架构存在扩展性瓶颈、单点故障和数据隔离等问题。为应对这些挑战,系统扩展分为垂直扩展与水平扩展。垂直扩展通过升级单机硬件实现,具有简单、一致性高的优点,但受限于物理上限且存在单点故障。水平扩展则通过增加服务器集群节点来分担负载,具备理论上的无限扩展性、高可用性和弹性伸缩能力,但引入了架构复杂性、数据一致性挑战及网络延迟等新问题。 因此,分布式系统常采用水平扩展中的“分区”策略,即将数据分摊到多个节点上,而非由所有节点存储全量数据。分区通常与复制技术结合,在保障数据分片的同时通过多副本提升容错性。引入分区后,系统需解决数据请求如何路由到正确分区、分区数据再平衡以及全排序操作支持等新挑战。后续内容将进一步探讨具体的分区策略、请求路由机制以及分区热点问题。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 15

第七章 事务

本文探讨了分布式系统中复制、分区与事务三种核心技术的区别与协作。复制技术通过数据冗余实现高可用性,分区技术通过水平拆分提升系统可扩展性,二者主要解决数据层面的物理分布问题。然而,仅靠这两者无法保障数据操作在并发、故障场景下的逻辑正确性,这正是事务技术的核心作用。 事务旨在确保一系列操作要么全部成功,要么全部失败,从而维护数据的正确状态。文章通过转账操作、商品超卖及系统崩溃等典型场景,阐明了事务四大特性(ACID)的必要性:原子性保证操作全有或全无;一致性确保数据始终处于合法状态;隔离性防止并发事务相互干扰;持久性则确保已提交的数据在故障后不丢失。 在分布式环境下,由于网络不可靠、节点可能故障,跨多个服务的事务面临更大挑战。事务技术通过封装复杂性,为开发者提供了简洁的编程模型,将业务逻辑与底层的一致性、容错机制解耦,极大地提升了应用的可靠性与开发效率。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 12

如何在本地打包 StarRocks 发行版

本文针对 StarRocks 用户在等待官方版本发布周期时,需要快速应用修复 PR(如物化视图重启导致全量刷新、excluded_refresh_tables 参数跨数据库失效等)的场景,介绍了本地打包发行版的完整流程。核心方法是利用社区提供的统一 Docker 镜像(starrocks/dev-env-ubuntu)简化构建环境,避免复杂的本地环境配置。具体步骤包括:拉取对应版本的 Docker 镜像,克隆 StarRocks 仓库并手动合并修复代码到分支,将宿主机源码目录挂载到容器中运行构建脚本(build.sh)生成前端(FE)和后端(BE)的产物。构建完成后,推荐使用更稳妥的方式替换镜像:以官方 FE 镜像为基础,仅替换新生成的 starrocks-fe.jar 文件来构建修复版本的 Docker 镜像,从而确保运行时的兼容性和最小化镜像修改。整个过程依赖官方文档和 GitHub 资源,适用于需要紧急部署定制修复版本的运维和开发场景。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 13

StarRocks 物化视图创建与刷新全流程解析

本文详细解析了StarRocks物化视图从创建到刷新的完整技术流程。在创建阶段,系统首先对SQL语句进行语义分析与校验,随后通过本地元数据服务完成一系列核心操作,包括验证数据库与视图的存在性、初始化列定义与刷新策略(如异步定时刷新)、根据存算一体或分离架构创建对象、处理分区映射逻辑,以及将关键数据序列化至元数据中以支持重启恢复。元数据通过FE集群的checkpoint机制定期快照,确保一致性。创建完成后,刷新流程会立即触发,其核心步骤在于同步物化视图与基础表的分区状态。对于常见的Range分区,系统通过特定分区器计算分区差异,并执行删除旧分区与添加新分区的操作,以确保物化视图的数据范围与基础表保持一致,随后基于此差异计算并执行具体的数据刷新任务。整个流程紧密围绕分区管理和元数据持久化展开,是理解StarRocks物化视图机制的关键。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 9

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

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

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 10

扒一扒h2database远程代码执行

H2 Database Web Console存在通过JDBC注入实现远程代码执行的安全漏洞。该漏洞主要影响1.4.198之前的版本,攻击者可利用其控制台接口构造恶意的JDBC URL,通过特定语法执行系统命令。此漏洞的核心在于H2数据库的JDBC驱动允许在连接字符串中执行内嵌的SQL代码块,从而实现任意命令执行。 在1.4.198版本中,官方添加了`-ifNotExists`选项,默认禁止远程创建数据库。这一改动显著提高了攻击门槛,因为攻击者必须事先能够访问或控制一个已存在的H2数据库实例,无法再通过远程新建数据库的方式直接发起攻击。因此,对于暴露在公网且未及时更新的H2控制台,风险依然存在。 针对该漏洞,最有效的缓解措施是及时升级至安全版本,并遵循最小权限原则,避免将H2控制台直接暴露于不受信任的网络。同时,应对数据库连接请求进行严格的输入校验,防止恶意JDBC URL的注入。该案例凸显了数据库组件安全配置与及时更新的重要性。

本机暂存
IT 2022-06-19 12:01:23 / 累计浏览 5,145

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-28 08:35:26 / 累计浏览 2,523

这几年在存储上犯的错

这篇讲的是作者从亲身经历出发,分享这些年在存储和运维上踩过的真实大坑。文章从一起线上数据误删事件切入,没有说教,而是直接讲述了几个让作者“想死的心都有”的故障现场:比如用错误配置上线,瞬间拖垮了整个数据库集群;在恢复误删数据时,不慎将 DROP TABLE 命令也一并执行,导致只恢复出了一个豆列;以及在进行数据库主从切换时,因与同事短暂交谈分心,在从库同步未追平的情况下就进行了操作,最终引发数据冲突。 每个案例都像一部微型灾难片,详细描述了错误的决策瞬间、连锁反应以及在巨大精神压力下的补救过程。作者坦诚地剖析了背后的直接原因,例如对配置项的误解(SET GLOBAL SQL_LOG_BIN)、脚本操作的风险以及流程中的侥幸心理。 文章的结尾给出了沉痛而实用的教训:“备份不做,日子甭过”,并强调了任何危险操作都应确保可回滚,工具应该比人更可靠。它并非一篇技术方案,而是一面镜子,照见了运维工作中那些不可避免的“人为因素”,也体现了团队在危机中相互支持的宝贵文化。对于每一位需要和线上系统打交道的工程师,这都是一次难得的经验共情。

本机暂存
IT 2021-05-27 22:26:51 / 累计浏览 2,544

Oracle 各种删除操作对空间返还的说明

DBA们常常遇到这样的困惑:对Oracle表执行DELETE、DROP还是TRUNCATE?这些操作对空间到底有何影响?这篇技术说明正是为厘清这些差异而写。 文章将三种常见删除操作(DELETE SQL、DROP TABLE、TRUNCATE TABLE)放在一起对比,从多个维度拆解其不同。关键差异点包括:DELETE操作不会将空间归还给表空间或文件系统,空间仅能被原表重用,但可能产生“高水位”;而DROP和TRUNCATE默认都会释放表空间,但依然不会自动收缩数据文件。此外,在本地管理表空间下,这些操作基本不会造成表空间碎片,但在老旧的字典管理表空间中,DROP和TRUNCATE则可能导致碎片。 对于追求“干净”释放空间的场景,文章也给出了务实建议:例如使用`shrink space`整理表,或对索引执行`coalesce`。最终目的是帮助DBA们根据实际需求(是彻底删除、快速清空还是谨慎释放)选择合适的操作,并管理好预期——Oracle默认不会自动将空间返还给操作系统。

本机暂存
IT 2021-05-26 23:07:42 / 累计浏览 1,582

按照重要程度划分数据库级别

这篇讲的是一个为数据库重要性分级的实用框架。作者没有空谈理论,而是直接给出了从S级到D级的清晰划分,并为每个级别匹配了具体的业务场景、潜在影响范围以及相应的灾难恢复成本。 比如,一个仅影响几十人的测试系统(D级)与像12306这样的大型公共应用(S级),在业务类型、灾难救援价格(从几千元到50万元以上)以及需要的备份与灾备设施(从“几乎无任何有效备份”到“全冗余部署”)上,有着天壤之别。 这套体系的价值在于,它让技术团队能清晰地评估和沟通数据库资产的业务价值,并据此决定投入多少资源来保障其数据安全与业务连续性。文章用一个简洁的表格呈现了这种对应关系,对于需要制定数据保护策略的团队来说,这是一个非常直观的决策参考。

本机暂存
IT 2021-05-17 23:26:41 / 累计浏览 1,684

修复 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,823

如何获取 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,744

修改重置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,883

删库跑路救命策略

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

本机暂存
IT 2019-01-01 20:44:30 / 累计浏览 2,563

图数据库简介

这篇讲的是图数据库的核心概念与适用场景。作者从NoSQL的大家族中引出图数据库,指出它用节点和边来存储高度关联的数据,比如社交网络中用户之间的关注关系。文章重点解释了当前流行的“带标签的属性图”模型,节点和边都可以拥有多个属性和标签,这使得数据建模非常灵活。 文章将图数据库与传统关系数据库进行了对比。核心差异在于:关系数据库擅长处理结构规整的事务,但在进行多层、反向的关联查询(比如“谁的朋友的朋友买了什么”)时,会产生大量表连接,导致性能骤降。而图数据库将节点和关系视为一等公民,采用原生存储和双向指针,使得这类复杂关系遍历的查询速度能保持在很高水平。 因此,作者得出的结论是,图数据库并非要取代关系型数据库,而是为社交网络、推荐系统等依赖复杂关系图谱的场景提供了更高效的解决方案。它的优势在于更自然的数据建模、更快的关联查询性能以及更灵活的Schema调整。

本机暂存
IT 2018-07-05 13:43:57 / 累计浏览 3,145

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

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

本机暂存
IT 2018-07-04 12:06:56 / 累计浏览 2,322

用户模型之三户模型

这篇讲的是电信与互联网系统中常用的“三户模型”。作者从eTOM框架出发,梳理了客户(Customer)、用户(User)和账户(Account)这三个核心实体如何以“以客户为中心”的理念进行构建与区分。 关键在于厘清三者的边界:客户体现社会域信息,是自然人或法人的实体身份,即使不使用业务也客观存在;用户体现业务域信息,是客户登录和使用产品的账号实例;账户则体现资金域信息,负责交易记账。它们之间是归属与映射关系,但各自独立。 文章以电信业务为例具体说明:一个客户(张三)可以开通多个用户(如手机和宽带),这些用户又由一个或多个账户来付费,形成了灵活的映射。在互联网实践中,客户归并(如通过身份证号识别同一人)、用户的生命周期管理(从注册到销户的复杂流程)、以及账户的多样化建模(支付、结算、风控等需求),都围绕这套模型展开,以支撑起以客户为中心的业务管理与数据统计。

本机暂存
IT 2018-06-26 12:28:00 / 累计浏览 1,363

如何在命令行中整理数据

数据审计中常遇到格式错误、乱码、控制字符等棘手问题,而许多人却执着于寻找昂贵的专用工具或编写复杂脚本。这篇文章作者结合自身兼职数据审计的经验,提出了一个返璞归真的解决方案:直接使用命令行工具链。 作者处理过十万至百万行、包含多达两百个字段的导出表格,发现混乱无处不在。他指出,人们往往陷入“数据悲伤”的五个阶段,最终才承认需要帮助,并误以为必须依赖特定软件。实际上,Bash shell本身就是一个强大的工具箱。grep、cut、awk这些经典的文本处理器,在应对脏数据时既可靠又高效。 文章用一个具体例子展示了威力:如何用一行组合命令(tail、cut、awk),在短短4秒内从超过112万条记录中精准找出某个字段的最长数据项,并封装成可重复使用的函数。作者强调,这种方法的安全优势尤为突出——所有操作都在数据库外部进行,使用的是导出后的纯文本副本,因此完全不影响原始数据库的结构与安全。 对于受过Unix训练的读者,这或许是一次怀旧;但对于更多人,它是一个实用提醒:在追求复杂方案前,不妨先“保持冷静,打开一个终端”。

本机暂存