尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MySQL事件调度器实战:从定时清理到自动化任务管理
1. 事件功能到底解决什么问题先讲一个特别常见的业务场景每天凌晨要把三个月前的操作日志清理掉或者要把订单表里超过一小时未支付的记录改成“已超时关闭”再比如每天早上九点给运营同学提前算好前一天的销售汇总。这些活儿有个共同点——它们都发生在“某个固定时间”而且本质上都是在数据库里做 SQL 操作。我见过不少团队早期是用跳板机上的 crontab 挂命令每天定时去执行一个 .sql 脚本或者 python 脚本连库操作。crontab 本身没什么问题但一旦服务器变多、环境变复杂麻烦就来了脚本散落在不同的机器上权限管理混乱有的脚本忘记同步导致凌晨跑的是旧版本某个服务器重启后 crontab 没自动拉起数据没定时清理把磁盘撑爆诸如此类。后来开始用 MySQL 自带的事件功能这些单库内部的“定时 SQL 任务”基本都收编到数据库里让数据库自己调度自己执行至少不用再操心脚本放哪、机器有没有开机。MySQL 事件说白了就是数据库内部的一种定时任务机制。你写一条 CREATE EVENT 语句定义好什么时间执行、隔多久执行一次、执行什么 SQL剩下的就交给 MySQL 自己。从实现上看MySQL 启用事件调度器后会有专门的事件调度线程盯着任务表到了时间点自动执行对应语句整个过程不依赖操作系统自带的那套 cron也不依赖外部应用。对只需要在单实例内部干活的任务来说这可能是最省心的方案。1.1 事件调度的本质数据库内部“挂钟”要理解事件功能先记住一个角色事件调度器线程event_scheduler thread。MySQL 在后端维护了一个常驻线程专门负责检查事件任务是否到期。你可以把它理解成厨房里那个专门看烤箱计时器的人不等你提醒他自己就知道到点关火。事件定义会持久化在系统表里调度器从表中读取任务、计算下一次运行时间到点触发执行。这里需要纠正一个常见误解事件不是由 MySQL 客户端发起也不是由触发器等外部机制触发它完全跑在数据库服务端。即便没有任何客户端连接只要服务在启动、调度器是开启状态到点照样执行。这一点在生产环境里非常关键——你不需要依赖任何应用服务进程的稳定性数据库本身就是执行载体。事件执行的具体形式有两种直接执行一条 SQL或者调用一个已存在的存储过程。我在实际项目里更推荐后者因为存储过程可以把多步操作包在一个事务里出错时也更容易统一记录日志。事件体内部也可以包含复合语句比如 BEGIN...END 块里写多条 SQL只是语法要求相对严格后面会展开。1.2 三类最典型的落地场景事件功能最常见的落脚点第一个是数据清理。业务表只保留最近 N 个月数据历史数据移到归档表或直接删除这个动作按天执行完全符合事件的使用边界。第二个是状态自动流转比如支付超时自动关闭订单、会员过期自动改为非会员状态、优惠券到期自动失效。这类任务特点是单表更新、逻辑简单、频率不需要太高每天跑一次或每小时跑一次足够。第三个是周期性汇总预计算把前一天的数据在凌晨算好写入汇总表白天查询直接读汇总结果减少实时计算的性能压力。举个例子一个电商后台的订单表用户下单后三十分钟内不支付就自动取消最朴素的做法CREATE EVENT ev_cancel_timeout_orders ON SCHEDULE EVERY 1 MINUTE DO UPDATE orders SET status cancelled, updated_at NOW() WHERE status pending_payment AND created_at NOW() - INTERVAL 30 MINUTE;这条事件把扫描取消动作固定成每分钟执行一次数据库自己判断哪些订单超时。相比每天只跑一次每分钟执行能更及时释放库存和用户直接下单抢库存的场景兼容得更好相比用户请求时实时判断又能把压力错峰掉。这类“低频、单表、单条语句”的任务最适合用事件来做。数据清理类似只是更新的语句换成了 DELETE对于超大表要注意加条件限制避免一次删太多影响主库性能后面我会详细讲。1.3 什么时候不要用它事件功能虽然好用但边界很清楚。凡是需要“顺序依赖”的任务比如 A 步骤跑完才能跑 BB 失败要告警并重试这种属于工作流编排不是 MySQL 事件的强项。事件内部虽然能用存储过程和条件判断做出一定逻辑但它没有内置的重试机制出错后默认只写一条错误日志要么等下一次调度窗口要么人工介入。凡是要跨多个数据库、多个业务系统协作的任务也不适合塞进事件因为事件写死了只能操作当前实例而且没有跨机分布式协调能力。更实用的建议是这样如果任务只是“围绕当前数据库做数据加工”优先考虑用事件如果任务涉及外部服务调用、多系统数据一致性或者执行频率高到秒级就应该交给独立的调度平台、消息队列或者专业任务编排工具来做。有些团队图省事把发短信、调第三方接口这种事也塞进事件里一旦接口超时就会拖住 MySQL 的事务和线程这是我实际踩过并且强烈不建议的坑。2. 调度器开关与会话参数灯不亮一切白搭很多第一次用事件功能的开发者建好了事件却发现它纹丝不动十有八九是忘了把全局调度器打开。MySQL 的定时调度能力默认不是关闭状态但部分发行版或云数据库实例为了节省资源确实会默认关闭。所以在写任何 CREATE EVENT 之前先做下面这件事。2.1 三种状态ON、OFF 和 DISABLED查询当前状态用一条 SQLSHOW VARIABLES LIKE event_scheduler;返回的值有三种可能ON、OFF、DISABLED。ON 表示事件调度线程在跑事件到点会正常触发OFF 表示调度线程已停止所有事件即使定义完好也不会执行DISABLED 比较特殊表示在 MySQL 启动时就被显式禁止而且不能在运行时改成 ON必须修改配置文件重启实例才能恢复。你可能要问ON 和 OFF 直接切换行不行可以在服务运行期间直接执行SET GLOBAL event_scheduler ON;这条语句即时生效不需要重启实例。生产环境临时开启事件一般就是这么干。但要注意的是SET GLOBAL 只影响当前运行实例如果实例重启了配置会回到配置文件里的设置。想让事件调度器每次启动就自动开启需要在配置文件 my.cnf 的 [mysqld] 段加一行event_schedulerON或者在用 mysqld 启动时加参数 --event-schedulerON。这里有个容易踩坑的细节如果配置里写成 DISABLED那么实例启动时会直接停止调度线程并且你连 SET GLOBAL event_scheduler ON 都会报错必须先改配置再重启。所以我建议生产环境直接写 ON宁可事件暂时没定义也不要搞成一个启动后没法动态开启的状态。2.2 验证事件线程是否真的在跑全局开关为 ON不代表事件系统就健康运行了。我一般习惯顺手看一下线程状态SHOW PROCESSLIST;在输出结果里能看到一个用户名为 event_scheduler、状态为 “Waiting for next activation” 的线程。如果这个线程还在说明调度器是活跃的事件能正常扫描触发。如果看不到这个线程即使 SHOW VARIABLES 显示 ON也可能是线程异常退出了此时优先查错误日志并检查是否有版本 bug 导致事件线程崩溃。对于已经有事件定义的系统还可以直接查系统库确认事件状态和最后执行时间SELECT name, status, last_executed, next_executed FROM mysql.event;mysql.event 是 MySQL 内部用于存储事件定义的系统表普通查询能看到关键字段。需要注意从规范化管理的角度业务上更推荐查询 information_schema 里的 EVENTS 视图后面会专门讲。2.3 权限和时区相关的隐藏参数事件能跑起来通常还依赖两个基础条件执行者的权限和系统时区设置。权限方面一个事件有自己的定义者definer和权限校验方式默认情况下事件体里的 SQL 会用定义者的身份执行如果定义者在事件创建后被删了或者权限被回收事件就会开始报错。时区方面事件调度“下一次执行时间”的计算与 MySQL 的 time_zone 时区设置直接相关。服务器时区默认是 SYSTEM也就是跟随操作系统时区如果操作系统时区变化或者本身配置不对事件触发时间会和业务预期出现几个小时的偏差。这块坑很多我放到第五部分专门展开。3. 一条完整的事件从创建到管理有了前面的准备现在可以创建事件了。事件语法看起来不复杂但有几个子句必须理解透了再写不然后期维护会很难受。3.1 六段式语法结构拆解一个标准的 CREATE EVENT 长这样CREATE [DEFINER user] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [PRESERVE] | [NOT PRESERVE]] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 描述信息] DO event_body;拆开看核心是四个部分定义者、调度计划、生命周期策略、事件体。定义者决定执行身份的归属默认是创建事件的当前用户这部分对权限影响很大。调度计划很灵活可以写一次性任务也可以写循环任务具体写法第四个部分专门说。生命周期策略里有两个最常用的关键词ON COMPLETION PRESERVE 表示事件执行完之后保留定义方便下次手动重新启用如果省略或写 NOT PRESERVE一次性事件执行完就会自动删除。至于 ENABLE 和 DISABLE就是创建后立即启用还是先停着备用 DISABLE ON SLAVE 则用在主从复制环境防止事件在主库执行后再在从库重放一遍导致重复执行。事件体 DO 后面跟的就是要执行的 SQL。它可以是单条语句也可以是一个存储过程调用或者是 BEGIN...END 块包起来的多条语句。注意事件体里不能直接包含动态 SQL 或预处理语句之外的特殊语法要提前用存储过程把复杂逻辑包裹住再在事件里调用它。这是实际开发中最常用的模式因为纯写在事件体里的多语句块语法检查不如存储过程严格管理也麻烦。3.2 实操案例按月清理日志表假设业务库有一张操作日志表 op_log数据量涨得很快需要保留最近 90 天超出部分每天凌晨三点删一次。初次创建我会用一个存储过程保证删除语句按批量执行避免一次性删几十万行锁表时间过长DELIMITER $$ CREATE PROCEDURE sp_clean_op_log() BEGIN DECLARE v_batch_size INT DEFAULT 5000; DECLARE v_deleted INT DEFAULT 1; WHILE v_deleted 0 DO DELETE FROM op_log WHERE created_at DATE_SUB(CURDATE(), INTERVAL 90 DAY) LIMIT v_batch_size; SET v_deleted ROW_COUNT(); SELECT SLEEP(0.1); END WHILE; END$$ DELIMITER ; CREATE EVENT ev_clean_op_log ON SCHEDULE EVERY 1 DAY STARTS 2024-05-01 03:00:00 ON COMPLETION PRESERVE ENABLE COMMENT 清理90天前的操作日志 DO CALL sp_clean_op_log();这里有一个很多人容易忽略的细节SLEEP(0.1)。不加它循环删除虽然能跑但可能在极短时间把主库的 IO 打到很高加一个小短睡能让磁盘压力平缓一点。批量删除配合短睡本质上是把大事务拆成小事务单次删除 5000 行对 InnoDB 更友好。事件本身只负责“到点调用”事务粒度由存储过程控制这也是为什么我强调用存储过程包装。创建事件之后验证状态和执行时间SELECT event_name, status, last_executed, next_executed, execute_count FROM information_schema.EVENTS WHERE event_schema your_db;建议养成定期查看这个视图的习惯尤其是 last_executed 和 next_executed 两个字段。只要 next_executed 在正常推进胃事件调度基本没问题。3.3 改、停、删DBA 的日常三板斧事件创建后不会一成不变业务调整时经常需要临时停用、修改调度时间或者彻底删除。临时停用一条事件用 ALTER 改状态即可ALTER EVENT ev_clean_op_log DISABLE;这个操作不会删掉事件定义后续重新启用只需要把 DISABLE 改成 ENABLE。修改事件体或者调度周期直接写新的 ALTER EVENT 语句MySQL 允许你用完整事件定义覆盖旧定义。删除一条事件DROP EVENT IF EXISTS ev_clean_op_log;补充一点多个事件如果在同一时间点调起MySQL 会对事件进行优先级排序但没有显式的“事件优先级”参数。如果存在多个事件竞争执行资源较慢的事件可能会延迟到下个执行窗口这也是排查事件执行延迟时需要考虑的点。4. 调度窗口设计AT、EVERY、STARTS/ENDS 怎么选事件调度写法直接影响业务效果。定时任务最怕两种情况执行太频繁造成浪费执行太稀疏导致数据不及时。下面把事件调度的几种模式理一遍。4.1 一次性任务的 AT 写法如果某个任务只想在未来的一个固定时间点执行一次用 ATCREATE EVENT ev_one_off ON SCHEDULE AT 2024-05-01 00:00:00 ON COMPLETION NOT PRESERVE DO UPDATE report_summary SET status closed;这里注意 ON COMPLETION NOT PRESERVE一次性任务执行完如果还保留定义会导致系统里堆积一堆历史事件定义不建议这么做。我实际开发的习惯是一次性任务统一用 NOT PRESERVE让 MySQL 执行完自动清理自身定义减少系统表归档压力。如果你确实需要保存事件履历也可以加 PRESERVE 并配合 DISABLE但这就需要额外的维护精力了。4.2 循环任务的 EVERY 与 STARTS/ENDS循环任务的核心是 EVERY 关键字后面跟时间间隔EVERY 1 DAY EVERY 1 HOUR EVERY 30 MINUTE EVERY 1 WEEK语法层次上EVERY 后面可以唯一地跟一个时间单位。如果想指定第一次执行时间和结束时间在 EVERY 后面加 STARTS 和 ENDSON SCHEDULE EVERY 1 DAY STARTS 2024-05-01 02:00:00 ENDS 2024-06-01 00:00:00这里有一个重要规则STARTS 只是决定“第一次执行的时间”之后的任务周期是从 STARTS 时间开始累加间隔计算的。比如 STARTS 设为 2024-05-01 02:00:00EVERY 1 DAY那么第二次执行就是 2024-05-02 02:00:00不是意义上的“每天零点”。我见过不少同事初学时在这里栽了跟头反复确认后才发现不是事件没执行而是自己对 STARTS 的理解偏了。要设计午夜任务STARTS 就得直接写当天凌晨零点。ENDS 用来停止循环任务。到了 ENDS 时间点MySQL 不会立即再执行一次而是直接停止调度事件状态会变成 DISABLED。这个字段在临时排期任务里特别有用比如持续一周每天同步数据到期自动停。4.3 间隔选多大合适用业务真实需求反推间隔设置没有标准答案完全取决于业务容忍度。库存释放、订单超时这类需要快速响应的场景间隔设置成 1 分钟没问题报表统计、日志清理这类天然的 T1 任务每天一次就够状态扫描类的任务建议先评估数据量再定频率。我见过最夸张的案例是有人设成 EVERY 1 SECOND 做实时状态更新结果把数据库 CPU 打满。判断标准很简单如果下一次执行还没结束时间又到了MySQL 会等上一次结束再执行下一次所以高频任务反而可能堆积成连环延迟。另一个值得注意的点是任务窗口。很多人喜欢把批量任务固定到午夜零点这本身没错但如果系统中很多定时任务都堆在零点配合其他夜间备份任务容易扎堆造成 CPU 和 IO 峰值。我通常会把事件分散到凌晨 1 点到 5 点之间的不同时间点错开备份窗口。比如清理日志放 02:30报表汇总放 03:30各任务之间留足缓冲时间避免周期任务相互拖累。5. 时区、权限和日志不显眼但能要命的三个细节事件功能用久了就会发现任务本身写错反而容易排查真正让人头疼的是这些边缘设置。5.1 时区执行时间可能和你以为的差了好几个小时MySQL 的 time_zone 设置决定事件下一次执行时间的计算方法。系统安装时默认时区通常是 SYSTEM表示跟随操作系统时区。如果操作系统时区被运维调过或者你的 MySQL 时区设置和业务时区不一致事件触发时间就会整体偏移。查询当前时区SELECT global.time_zone, session.time_zone;解决方法分两层。第一层统一服务端时区比如明确设置default-time-zone08:00第二层在创建事件时如果业务允许直接在 STARTS 里写绝对时间比如STARTS 2024-05-01 02:00:00。这样即使时区有偏移事件首次触发的绝对时间也写死了。但后续的 EVERY 间隔计算仍然依赖时区所以最彻底的办法还是先统一数据库时区这是在事件维护中优先级最高的一项建议所有接入事件功能的数据库实例都先在配置里固定时区。5.2 权限和 DEFINER 的连锁反应事件能创建成功不代表一定能执行成功。默认情况下事件体里的 SQL 以 DEFINER 身份执行。所谓 DEFINER就是事件头部指定的一个用户它的作用类似于定义事件时的“执行所有者”。如果 DEFINER 指向的用户被删除、权限被修改或者密码策略变更导致该账号身份失效事件执行就会报错。这里有一个比较隐蔽的现象事件在执行到期日志时MySQL 只会记录失败信息不会主动发消息通知任何人。你如果不主动看错误日志可能几天后业务发现问题了才发现事件已经挂了很久。所以创建事件时我建议指定一个专用的服务账号作为 DEFINER并且只给这个账号授予最小必要权限。比如清理日志的事件只需要 DELETE、SELECT 权限就别给它 GRANT ALL。具体写法CREATE DEFINER dc_cleanlocalhost EVENT ev_clean_op_log ...这样可以做到事件间的权限隔离某个事件被恶意改写或误操作时也不会拖累库里其他数据。5.3 怎么知道事件跑没跑全流程监控思路事件是不可见的异步任务没有界面让你一眼看出问题所以必须建立监控习惯。最简单的一层是查询 last_executed 和 next_executedSELECT event_name, status, last_executed, next_executed, execute_count FROM information_schema.EVENTS WHERE event_schema DATABASE();如果 last_executed 长时间停在某个时间不前进事件很可能已经被禁用或调度器异常。第二层是看 MySQL 错误日志。事件执行失败时错误信息通常会记录在日志中包括 SQL 错误号、错误信息、出错时的事件名。在事件函数里也可以故意写一些时间戳日志比如在事件体里调用存储过程时往一个专门的日志表插入执行结果和影响行数用作业务层面的审计追踪。我一般会这么做这比事后查 MySQL 日志更快定位问题。第三层是关注并发和重复执行。事件执行是异步的同一时间点如果前一个执行还没结束新的激活循环会跳过并等待下一轮。这个行为本身是合理的但如果你在事件里写了事务而某次执行因为锁等待超时事件可能在下个周期又重来一遍。因此事件体中的 SQL 尽量写幂等操作比如用 UPDATE 而非 INSERT用 DELETE 条件而非全删用“存在则更新”而非一味插入。这样即使执行重复了几次也不会产生脏数据。6. 实战排错事件不执行、重复执行怎么查最后这部分是大家问得最多的地方。我把这些年排查事件问题的方法整理成一套固定流程遇到问题照着查比随机猜测效率高得多。6.1 事件不执行的六个排查方向第一确认全局开关。执行 SHOW VARIABLES LIKE event_scheduler不是 ON 就先把开关打开。第二确认事件本身没有被 DISABLE。查 information_schema.EVENTS 的 status 字段如果是 DISABLED用 ALTER EVENT ... ENABLE 重新启用。第三看 last_executed 是否被更新。如果一直不更新问题可能在调度器线程本身。第四查错误日志。事件执行失败时 MySQL 会把错误写进日志文件重点看是否有权限相关报错、SQL 语法报错、存储过程调用失败。第五检查时区。如果 STARTS 时间写在未来但因为时区偏移实际触发时间和预期相差很大看起来就像“没执行”。第六检查事务锁。如果事件体里访问的表正被其他长事务锁住MySQL 会等待锁超时事件执行被卡住表现为执行时间异常延长。排查顺序我建议固定下来开关、状态、调度线程、错误日志、时区、锁。按这个顺序九成以上的问题能在十分钟内定位。6.2 重复执行、乱序执行和幂等设计主从复制环境里事件的重复执行是个经典坑。如果主库上启用了事件从库作为只读副本事件不该也从库执行否则两边会各跑一遍。正确做法是主从模式的事件定义加上 DISABLE ON SLAVECREATE EVENT ev_clean_op_log ON SCHEDULE EVERY 1 DAY DISABLE ON SLAVE DO CALL sp_clean_op_log();这样事件定义会自动同步到从库但从库不会执行它。另一个重复执行场景是应用侧也在跑定时任务比如你既有 MySQL 事件又有应用定时器在跑同一个清理逻辑两边不协调就会出现数据重复删除或重复更新。这个问题没有数据库层面的解决方案只能从设计上收敛任务入口明确责任边界最好全库始终保留一个事件入口。业务逻辑层面的幂等我用得最多的是先软处理再硬删除。比如清数据前先通过 UPDATE 给记录打标记事件只处理打标记的数据这样即使重复调度也不会误删新写入的记录。6.3 事件备份迁移时常见的遗漏事件定义存在系统表 mysql.event 里它不是业务库的数据。用常规 mysqldump 备份业务库时注意是否导出事件、触发器。mysqldump 有专门参数控制mysqldump --events --triggers --routines your_db backup.sql如果不加 --events备份文件里就不会包含事件定义恢复时业务库数据回来了但定时任务全部丢失这种情况在生产上很模型。另外还要注意事件定义里的 DEFINER 是一个授权的用户。如果迁移到新环境后这个用户不存在事件会处于无法执行的状态需要提前确认 DEFINER 用户在新环境里已创建并授权。迁移后验证动作也别忘了。在新环境里创建完事件后至少手动检查一遍 information_schema.EVENTS再看调度线程最后可以手动 SET GLOBAL event_scheduler OFF 再 ON强制调度器重新加载事件定义确认系统启动后事件列表是完整的。7. 一点个人经验与写在最后的建议事件功能在 MySQL 里算不上新特性但很多团队迟迟没用起来原因往往不是技术难度而是“没几个人搞清楚调度器开关、时区、权限这些边缘细节”。说实话事件功能用起来很简单真正难的是把它设计和维护好尤其是在多环境和主从架构下稍不注意就会踩到重复执行、时区和权限的坑。我的习惯是每一套环境从建库开始就规范化统一时区开启调度器所有事件用独立账号作为 DEFINER通过查询 information_schema.EVENTS 做定期巡检事件执行统一写审计日志。这样坚持下来事件功能就能成为一个相当省心的“数据库自动化小帮手”。如果你刚接触这个功能我建议先搭一个测试实例用 ONLINE 调试模式写一条每分钟执行一次的小事件配合 SELECT 观察执行效果多试几次 AT、EVERY、STARTS、ENDS 的组合比阅读任何文档都来得快。当你真正把事件纳入日常运维体系后你会发现很多曾经需要专门的调度框架处理的简单任务数据库自己就能信手拈来地搞定而且省下的不只是部署和维护成本还有排查问题的时间和精力。
RELATED

相关推荐

EasyOCR离线OCR系统:中日韩混合文本识别与结构化提取

EasyOCR离线OCR系统:中日韩混合文本识别与结构化提取

简介:本资源是一个基于EasyOCR构建的轻量级OCR文字识别系统实现包,面向Python初学者、机器学习入门者及课程设计实践者,解决图像中文字自动提取与结构化输出的实际问题,适用于文档数字化、截图转文本、多语言信息采集等典型场景。…

📅 2026/10/11 20:27:03
工业乱堆物料检测:VOC与YOLO双格式校验闭环实战

工业乱堆物料检测:VOC与YOLO双格式校验闭环实战

简介:本资源是面向计算机视觉初学者与工业检测算法研发者的单类别乱堆物料检测专用数据集,聚焦沙堆、混凝土堆等典型散料场景,解决目标检测模型在非结构化堆体识别中的数据匮乏问题。压缩包共2000个文件,主体为1143张JPG图像及配套…

📅 2026/10/11 20:27:03
箔条干扰Matlab仿真:从物理原理到烧穿距离验证的完整实现

箔条干扰Matlab仿真:从物理原理到烧穿距离验证的完整实现

简介:箔条干扰是雷达电子对抗中重要的无源干扰手段,这份Matlab代码正是围绕其仿真而设计。代码采用参数化编程,兼容MATLAB 2014、2019a、2024a等版本,并内置可直接运行的案例数据,运行后即可观察仿真效果;核…

📅 2026/10/11 20:27:03
MORE NEWS

更多资讯

📰

从无标题文档到正式发布:先定内核再取标题的创作流程

很多人打开文档软件时,都会看到一个小尴尬:新文档默认名不是“未命名”,就是“无标题”。我自己电脑里,这种文件常年躺了一排,里面有的是灵感碎片,有的是写到一半的草稿,还有的干脆就是空白。但…

📰

斯纳克图书馆管理系统PHP版v6.0实战部署与优化指南

简介:斯纳克图书馆管理系统PHP版v6.0是一套面向中小型图书馆、高校院系资料室及数字资源管理场景的成熟Web应用系统,专为具备PHPMySQL开发基础的IT人员或信息化管理员设计,用于快速部署图书编目、借阅流通、标签打印与多终端认证一体化管理。…

📰

易支付运营版源码部署与支付通道轮询、投诉进件实战解析

简介:面向需要自建聚合支付平台的开发者与站长,这份运营版易支付系统源码提供支付宝、微信、QQ钱包、银联等多渠道免签约接入能力,支持PC扫码、H5、公众号等多种支付场景。系统基于PHP 7.4与MySQL开发,内置轮询投诉、进件管理等运…

📰

基于调频能力裕度的风电场一次调频策略解析

风电场参与电网一次调频这件事,这几年已经从不做不行,变成了怎么做得更稳、更准的问题。早些年并网要求宽松,风电场的态度基本是“有功发满就行,频率的事交给同步机”。现在新能源占比上来以后,电网对风电场调频能力的…

📰

HDFS存储优化实战:纠删码、压缩与小文件治理策略

大数据项目的存储层里,HDFS 通常是最先被塞满、却最后一个被优化的组件。大多数团队在容量告警触发之前,并不会认真考虑副本数、文件格式、冷数据沉降这些事,等磁盘真的快满了,第一反应往往是再加节点。这篇文章是我在生产环境里做…

📰

Oracle 12c SQL查询实战:从v$session到AWR追溯历史执行记录

刚接手一个Oracle 12c库,最常被问到的问题就是:“你帮我看看现在数据库里在跑什么SQL?”或者“这个SQL昨天跑了多少次?”说实话,这类需求我处理过太多回了,但每次在技术群里看到答案还是有人只会贴一个v$se…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬