news 2026/10/22 11:13:29

RMAN备份进程卡住怎么办?等待事件分析与三级处置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RMAN备份进程卡住怎么办?等待事件分析与三级处置指南

凌晨2点17分,监控告警把我从值班睡梦中捞起来:RMAN备份任务已经运行了4小时17分钟,是预期备份窗口的两倍还多。登录数据库看了一眼,最后一条RMAN日志停在半小时前,备份集进度卡在85/120的位置,会话状态Active,等待事件一动不动。再查归档日志目录使用率,已经冲到89%——照这个速度,早上业务高峰之前ORA-00257(归档日志写满)就会准时出现在告警池里。

这种夜晚,跑过Oracle生产库的人都熟悉。RMAN进程“hold住”——不报错、不退出、不滚动日志,像一辆踩了刹车的卡车停在半坡——是数据库备份运维里最折磨人的故障类型之一。它不像ORA-600那样带着明确的错误栈,也不像坏块那样有清晰的corruption信息,很多时候就是“停住了”,而且你越等,后续连锁反应越重:备份窗口被耗尽、归档日志空间被吃光、日志切换被卡住,整个数据库性能开始滑坡。

这篇文章我把这些年处理RMAN进程卡住的完整思路整理出来——从现场症状判断、等待事件根因分析,到定位进程和阻塞链的实操SQL,再到三级处置流程和根因修复。不管你是刚接手备份运维的新手DBA,还是已经被RMAN折磨过几次的老手,照着这套思路走,至少下次面对RMAN hold住时,不再是一脸懵。

1. 故障现场:RMAN“hold住”的真实样貌与连带风险

1.1 一个典型故障画像:备份进行到85%突然不动了

有一次处理一套核心业务库的备份故障,场景非常典型。备份从晚上10点半开始,全库备份加归档备份,两条磁盘通道,平时两个半小时就能跑完。结果到凌晨一点,备份日志停在了“channel t1: backup set 92/120 complete”和“channel t2: backup set 93/120 complete”,之后两行日志再也没有出现过。检查会话,两个分配通道的服务进程状态都是Active,一个等待事件是backup busy,另一个是sbtbackup,数据库本身的业务查询完全正常,但备份就是死死卡住。

这个画面概括起来有几个共同特征:RMAN客户端进程(前台那个rman命令)看起来没有输出,通道对应的服务进程长时间处于Active状态,日志条目完全停更,系统负载不高,磁盘I/O也没有明显热点。如果你遇到的情况满足其中四条,基本可以判定不是“备份慢”,而是“备份hang”了。备份慢的时候I/O利用率高、日志在推进、sofar和totalwork的数字在变化;hold住的时候一切数字都静止,只有last_call_et在涨。

1.2 从“备份慢”到“数据库告急”:卡住之后的连锁反应

RMAN卡住最阴险的地方在于,它的危害不是瞬间爆发的,而是像温水煮青蛙一样逐步扩散。第一层是备份窗口本身被耗尽,第二天的备份计划跟着积压;第二层是归档日志因为没有被正常清理而持续堆积,文件系统使用率一路向上;第三层是当归档目录满到100%,数据库会触发ORA-00257,日志切换开始失败,此时正常业务的提交都会受影响,因为LGWR无法顺利写入归档日志。

如果这次备份使用了恢复目录(catalog),还有一种容易被忽略的副作用:恢复目录里的备份记录和目标库真实状态不一致,后面做crosscheck或delete obsolete时会遇到各种“幽灵记录”,干扰后续维护操作。所以处理RMAN卡住,不能只盯着进程本身,必须把空间、日志切换、备份一致性这几条线同时拉起来看。我的经验是,进入故障现场后先花30秒看一眼归档目录和快速恢复区使用率,如果已经接近阈值,第一步就不是排查为什么卡,而是先把空间风险按住,再回头慢慢查根因。

2. 回溯根因:从等待事件拆解RMAN进程卡住的几层原因

2.1 第一类根因:数据库内部机制与锁竞争

RMAN的通道是一个直连实例的会话,它同样会被数据库内部机制卡住。最常见的是锁竞争:备份过程中如果有别的会话在做DDL操作,比如重建索引、修改表结构,或者有长事务持有某对象的TM锁,RMAN通道在扫描或写入该对象时就会等锁。这种等锁在V$SESSION里表现为等event是类似enq: TX / TM - contention一类的行锁或表锁等待,阻塞源指向另一个会话。

另一类是内部机制相关的等待,比如control file parallel write明显变慢,说明控制文件写入的I/O路径有问题;比如log file sync持续出现,说明归档/日志切换环节已经卡住。还有一种隐蔽情况:快速恢复区(FRA)空间不足时,RMAN在做archivelog备份过程中需要从快速恢复区读取归档日志,但空间管理正在做文件清理,系统内部会有一些serialization的处理,进程也会“原地等很久”。

2.2 第二类根因:备份介质与外部设备拖后腿

备份介质导致的卡住是我见过最多的类型。走磁盘备份时,如果备份文件落在共享存储上,而该存储同一时段还在承受生产库的在线日志写入和大量业务I/O,通道进程就会在等待direct path write或者更底层的I/O wait上耗着。尤其是一些老旧存储,写缓存不稳定,碰到高并发时单块盘I/O util能冲到100%,备份通道的表现就是“写着写着就不动了”。

走高容量磁带备份时,情况更复杂。RMAN通道通过介质管理库(MML)和外部第三方备份软件交互,备份软件再调度机械臂和磁带驱动器。任何一个环节出问题,比如机械臂抓带失败、驱动器卡带、备份服务进程僵死、网络连接中断,通道进程都会长时间陷在sbtbackup或者backup busy这种SBT相关等待里。这类等待最麻烦,因为它发生在数据库外部,单纯在数据库内部做诊断经常看不到真正的瓶颈。

2.3 第三类根因:网络、客户端与调度平台“假死”

还有一部分RMAN卡住,数据库侧和备份设备侧都查不出问题,最后发现是网络或者调度端出了问题。RMAN客户端是通过Oracle Net连接到实例执行备份命令的,如果客户端和数据库之间的网络出现丢包、延迟甚至链路中断,RMAN进程可能一直等SQL*Net message from/to client这类事件。此时备份并没有真正停止,只是命令来回传递失败,整个会话在原地空转。

另一种场景是备份脚本由调度平台统一触发的,调度平台本身僵死或者cron进程异常挂起,那么RMAN脚本虽然在跑,但它的后续逻辑和日志输出全部被阻塞在平台层。这种问题在数据库侧看往往连状态都查不到完整数据。判断这类根因,需要同时看客户端主机的进程状态、网络连通性和调度的日志,不能只窝在数据库里查。

下表是我这些年总结的等待事件和根因层次的对应关系,排查时可以直接对号入座:

等待事件根因层次首要排查方向
enq: TM/TX contention数据库内部阻塞会话、长事务、DDL
control file parallel write数据库内部控制文件所在存储I/O
log file sync数据库内部归档、重做日志写入路径
direct path write/write cloneI/O与存储备份文件所在文件系统
backup busy备份设备介质管理器、磁带驱动器
sbtbackup / sbtrestore备份设备第三方备份软件、磁带库
SQL*Net message from/to client网络客户端连通性、sqlnet配置

3. 诊断第一现场:三步锁定“卡住”的会话和阻塞源头

3.1 先从视图抓会话:谁在跑、跑了多久、卡在哪个等待事件

处理RMAN卡住,我建议第一件事先把“涉事会话”抓出来。用下面这条SQL可以快速定位实例里所有RMAN相关的会话:

SELECT s.sid, s.serial#, s.username, s.program, s.module, s.status, s.sql_id, s.event, s.wait_class, s.last_call_et, s.machine, s.process, s.final_state FROM v$session s WHERE s.program LIKE '%rman%' OR s.module LIKE '%rman%' OR s.username IN ('SYS','SYSBACKUP') ORDER BY s.last_call_et DESC;

找到会话后,重点看三列:status是不是还是ACTIVE,event停在哪个等待事件,last_call_et已经涨到多少秒。last_call_et表示这个会话最后一次处理请求距今的秒数,一个健康备份会话的last_call_et通常不会超过几分钟;如果看到几千甚至上万秒,那基本就是卡住了。接着用这条SQL确认备份进度:

SELECT sid, opname, target, totalwork, sofar, elapsed_seconds, time_remaining, start_time FROM v$session_longops WHERE opname LIKE '%RMAN%' OR opname LIKE '%Backup%' ORDER BY start_time;

这里的sofar和totalwork是判断卡住的关键:健康状态下sofar会缓慢增长,totalwork不变;如果sofar连续10分钟都不变,说明进程在等待某个资源,没有实际工作。

3.2 再到操作系统层验证:进程是否真的还活着、在干什么

视图诊断只能说明会话的“数据库侧”状态,还不能完全坐实进程真实情况。下一步是从v$process里拿到操作系统的SPID,然后到主机上核实。这个环节是为了区分两种完全不同的场景:进程还活着只是被卡住,以及进程其实已经死了但数据库侧没回收。

SELECT p.spid, p.pid, p.program, p.background, s.sid, s.serial#, s.event FROM v$process p, v$session s WHERE p.addr = s.paddr AND (s.program LIKE '%rman%' OR s.module LIKE '%rman%');

拿到SPID后,到操作系统上看一眼:

ps -ef | grep $SPID

如果进程还在,可以用更细的工具看它卡在哪个系统调用或内核栈:

# Linux下查看进程状态 cat /proc/$SPID/status | grep State # 抓进程栈 pstack $SPID # 或者 gdb -p $SPID -batch -ex 'thread apply all bt'

pstack和gdb的输出对于判断“是否陷入不可中断的D状态I/O”很有价值。如果进程状态显示为D(uninterruptible sleep),说明它正在等某个I/O完成,此时即使你在数据库里执行kill,进程也不会马上退出,必须等I/O超时或恢复。如果进程显示为S但CPU时间完全没有增长,那多半是等锁、等网络或等外部设备响应。

3.3 Alert Log与RMAN日志里的“断点”

视图和进程检查做完,还需要把告警日志和RMAN日志的“断点”找出来。告警日志看的是数据库侧的异常信号:

# 定位最新告警日志并查看最后100行 tail -100 $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log

重点看这几类信息:日志切换是否中断,归档进程(ARCn)是否报错,快速恢复区空间相关的警告,以及是否有ORA-270系列I/O错误。ORA-270错误经常对应底层存储问题,比如磁盘满、权限错误、文件锁冲突,这类错误出现时往往RMAN通道进程会处于等待状态。

RMAN日志本身也不能放过。备份脚本如果带了日志输出,找最后一条成功记录的时间戳,再和当前时间对比,就能推算“停更”了多久。如果备份明显卡在某一个备份集(比如85/120),说明问题很可能集中在该backup set对应的对象或通道上。此时可以查看v$rman_status确认状态:

SELECT session_recid, session_stamp, input_type, status, output_device_type, elapsed_seconds, start_time, end_time FROM v$rman_status WHERE start_time > SYSDATE - 1 ORDER BY session_recid, start_time;

status显示RUNNING但elapsed_seconds持续放大、end_time为空,说明RMAN认为任务还在进行。配合v$backup_piece能进一步看到正在写入的备份片段:

SELECT piece_name, bytes, status, completion_time FROM v$backup_piece WHERE status = 'A' ORDER BY piece_name;

这里如果有个片段的bytes数字长时间不变化,那“卡点”就锁定在这个备份片的物理写入上了,接下来要往存储和设备方向排查而不是继续在库里绕。

4. 现场处置:从软Kill到硬清理的三级方案

4.1 第一级:会话级Kill的适用场景与操作

诊断确认RMAN确实卡住之后,就要考虑处置了。处置的第一级是从数据库侧发起会话级终止,先尝试优雅打断:

ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;

把前面查到的sid和serial#填进去。IMMEDIATE关键字让PMON尽快回滚并清理会话资源,避免普通kill排队等待会话自己处理中断。这一招适用于等锁、等待网络消息这类“可中断”的场景,会话被kill后通常会迅速消失。

但这里有个必须提醒的坑:如果会话正卡在direct path write或者sbtbackup这类I/O相关等待上,KILL SESSION往往会失效。表现为V$SESSION中会话状态变成KILLED,但操作系统进程还顽固地活着,因为底层I/O调用不可中断,PMON想回滚也滚不动。判断方法很简单:kill之后过几分钟再查一次会话,如果还在且显示KILLED,就进入第二级处置。

4.2 第二级:操作系统层kill -9的战术与善后

第二级处置就是到操作系统上直接终止进程。操作前一定要确认SPID归属无误,避免误杀其他进程:

# 再次确认进程确实是RMAN通道 ps -ef | grep $SPID # 终止进程 kill -9 $SPID

kill -9之后,PMON会接管清理工作,但不会瞬间完成。观察几分钟,确认进程消失、告警日志没有新的ORA错误,同时查一下之前的会话是否已经退出V$SESSION。如果在Windows平台,用orakill命令按实例名和SPID终止:

orakill <ORACLE_SID> <spid>

这个阶段的善后工作很重要。强杀进程后,正在写的备份集会留下不完整的备份文件,需要先检查文件系统上是否存在半截文件,再决定是手动清理还是通过RMAN后续统一整理。存在恢复目录时建议执行一次crosscheck来同步状态:

RMAN> CROSSCHECK BACKUP; RMAN> DELETE NOPROMPT EXPIRED BACKUP;

crosscheck会对比恢复目录记录与磁盘/带库实际文件,把“在目录中存在但实际已消失”的备份标记为EXPIRED并清理。强杀造成的“幽灵”备份记录大多能被这步清掉。

4.3 第三级:极端场景下的实例层恢复

如果两个通道都被卡死,而且连实例本身都出现异常,比如归档目录已满导致日志切换失败、系统表空间I/O异常、数据库整体性能严重下滑,这时候不能恋战。我的建议是:先确认当前有可用的备份,评估能否承受重启实例带来的短暂中断,然后联系业务方确认维护窗口,在窗口内重启实例。重启之后数据库会重新初始化所有后台进程,被卡住的RMAN通道自然消失。

RAC环境要更小心一层:确认通道进程挂在哪个节点上,使用对应节点的视图gv$session和gv$process定位,处置时也只动那个节点上的进程。跨节点的强杀动作要谨慎,因为另一个实例的会话可能正在等待同一份备份相关的资源,强行清理一个节点可能会让另一个节点的会话跟着报错。处理完后要检查两个节点的告警日志,确认没有出现节点驱逐的征兆。

重启实例属于“最后手段”,绝大多数RMAN卡住不需要走到这一步。但对值班人员来说,心里有这个预案,遇到极端情况才不会临时抓瞎。

5. 根因修复:根据不同故障点做落地调整

5.1 慢速存储与外部设备:从备份路径上做减法

处置完现场,接下来就要解决“为什么卡住”的根因。如果定位到是备份文件落在慢速存储上,最直接的调整是把备份路径迁移到读写性能更稳的文件系统上。比如把备份目录从和生产库日志文件共享的存储移到独立的备份存储卷,或者从机械盘迁移到SSD/全闪存储。备份文件的写入对延迟不那么敏感,但对持续吞吐有要求,选路径时比的就是这两点。

如果是磁带设备的问题,先检查设备管理软件的控制台是否有报错,机械臂是否停在异常位置,磁带驱动器的状态是否正常。卡带时驱动器灯常亮,备份软件日志里通常会有“device busy”或“cannot open device”一类信息。遇到带库故障,最稳妥的临时方案是先把RMAN备份通道临时切到磁盘:

CONFIGURE DEVICE TYPE DISK PARALLELISM 2; BACKUP DATABASE PLUS ARCHIVELOG;

保住备份窗口永远比坚持用带库重要。等带库恢复正常后再把SBT通道加回来。

5.2 网络与调度层:把“超时保护”做起来

网络导致的RMAN卡住,修复思路不是在数据库里调参,而是回到网络层和客户端配置。sqlnet.ora里可以设置连接超时兜底:

SQLNET.OUTBOUND_CONNECT_TIMEOUT=60 SQLNET.INBOUND_CONNECT_TIMEOUT=60

这两个参数的作用是限制Oracle Net建立连接和读写的等待时间,避免网络异常时进程无限期挂起。修改后需要重启监听生效,这个操作在维护窗口里做。

调度平台侧的“假死”则要靠调度自身来防。我的习惯是在调度命令外层包一层超时控制,给整段备份脚本加上时间上限。比如用系统自带的timeout命令包裹RMAN调用:

timeout 10800 rman target / cmdfile=/backup/scripts/backup.rcv log=/backup/logs/backup_$(date +%Y%m%d).log

timeout到期会向RMAN客户端发送终止信号,客户端退出后数据库侧的服务进程会由PMON回收,比放任不管强得多。不过也要注意,这招有局限性:如果卡住的是不可中断的系统调用,timeout杀不掉底层进程,就需要配合监控而不是单纯依赖超时。

5.3 数据库侧配置:优化RMAN和恢复区设置

数据库内部配置层面的调整,核心是三个方向:减少不必要的等待、避免空间临界、让备份更稳。

第一个方向是控制通道并行度。并行通道数量等于同时开多少个备份流,通道开太多时磁盘I/O反而会被打满,出现互相拖累。通常磁盘备份2-4条通道足够,具体看存储的并发能力。通道分配还可以指定片子大小,避免单个备份片过大导致文件系统层面操作耗时过长:

CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 4G;

第二个方向是开启块变更跟踪,增量备份只读取变更的块,而不是全量扫描数据文件,备份耗时缩短,卡住的概率自然下降:

ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;

第三个方向是快速恢复区的容量管理。FRA空间使用率超过85%就应该告警,超过95%基本处于危险区。日常可以定期清掉已经备份过的归档日志:

DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';

这步要在确认后续还能拿到离线归档的前提下执行,磁盘和磁带备份都要验证过完整再删,别为了腾空间把恢复的退路堵死。

6. 不复发才是真功夫:监控、脚本与巡检三件套

6.1 进程级监控:给RMAN装一个“心跳”

处置一次故障不难,难的是让RMAN不再“静默罢工”。我遇到的大部分严重事故,问题不是没发生,而是发现得太晚。所以我的建议是给RMAN备份日志装一个“心跳监控”——用脚本定时检查日志文件的最后修改时间,如果长时间不更新就告警。

下面是个简单的示例脚本,按分钟检查日志文件是否在持续写入:

#!/bin/bash LOG_FILE=/backup/logs/backup_$(date +%Y%m%d).log STALE_SECONDS=900 if [ ! -f "$LOG_FILE" ]; then echo "ERROR: RMAN log file $LOG_FILE not found" exit 1 fi LAST_MODIFIED=$(stat -c %Y "$LOG_FILE") CURRENT_TIME=$(date +%s) DIFF=$((CURRENT_TIME - LAST_MODIFIED)) if [ $DIFF -gt $STALE_SECONDS ]; then echo "ERROR: RMAN log staleness ${DIFF}s, backup may be hung" # 这里接告警通道,如短信、企业微信机器人、邮件 fi

把它放进crontab每5分钟跑一次,备份日志一旦停止更新超过15分钟,告警就能第一时间拉你起来处理,而不是第二天早上才发现备份没成功。

6.2 备份脚本的防呆设计:窗口保护、重跑与清理

监控是“事后知道”,脚本层还可以做得更前置。备份脚本建议统一加几个防呆设计:窗口保护,脚本启动时先检查同类型的RMAN任务是否已经在运行,避免重复发起两个备份互相竞争:

if pgrep -f "rman target / cmdfile=/backup/scripts/backup.rcv" > /dev/null 2>&1; then echo "Another RMAN backup is already running. Exiting." exit 1 fi

脚本内部分阶段打日志,每完成一个备份阶段就打一个明确的时间戳,后续排查时能快速定位断点在哪个阶段。日志保留策略也要定好,至少保留最近30天,这样比较长的故障周期也能回溯。

重跑策略也得考虑:备份失败后自动重试一次,但重试前必须先确认上次残留进程确实已经清理干净,否则可能造成两个RMAN实例同时写同一批备份文件。我的习惯是重试逻辑放在调度平台而不是脚本内部,这样对重试次数、间隔和告警的管控更统一。

6.3 每月巡检:用一块时间换一整年的安稳

RMAN卡住虽然突发,但多数场景其实是积累出来的问题。比如备份文件所在文件系统空间越来越满、备份片越写越慢、归档日志清理策略失效。这些靠日常巡检就能提前发现。我每月会做几个固定动作:跑一遍crosscheck和delete obsolete,确认备份记录和实际文件一致;做一次backup validate,只校验备份集的可读性不实际恢复,提前发现备份损坏;检查FRA空间使用率和归档日志数量,确认清理策略还在正常工作;再看一眼块变更跟踪是否开启。

RMAN> CROSSCHECK BACKUP; RMAN> DELETE NOPROMPT OBSOLETE; RMAN> BACKUP VALIDATE DATABASE;

这一套下来大概花十几分钟,却能在故障发生前暴露大部分隐患。RMAN备份这个东西很像保险:平时看着没感觉,真到要用的时候才发现备份不可用,那才是真正的灾难。与其把精力全放在“出了故障怎么救”,不如把一部分时间花在“怎么让它尽量不出故障”上。

处理RMAN进程hold住的这些年,我最大的体会是:第一,不要慌,先分清是备份慢还是备份卡;第二,空间优先,归档目录快满了先按住再排查;第三,处置进程时能从数据库侧kill就不要轻易动操作系统,但也不用怕kill -9,关键是要做足确认和善后。备份进程虽然偶尔闹脾气,但它的脾气基本都有规律可循,把这套诊断和处置流程跑熟了,说不定下次半夜你还能在告警响之前多睡半小时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 11:13:27

AI培训学什么?三大方向技术栈与学习路径全拆解

这两年AI岗位的热度大家有目共睹&#xff0c;身边想转行、想进阶的朋友越来越多&#xff0c;问得最多的一个问题就是&#xff1a;“AI培训到底学什么&#xff1f;是不是学完Python再报个班就能上岗&#xff1f;”说实话&#xff0c;这个问题的答案比大多数人想象的复杂。市面上…

作者头像 李华
网站建设 2026/10/22 11:12:05

AI写Rust为何总卡壳?所有权、生命周期与编译器反馈的结构性错配

前几天我拿代码辅助工具写一个异步日志组件&#xff0c;姑且叫它模拟项目X。同一个需求用某动态语言半天就写完了&#xff0c;换到 Rust 之后&#xff0c;光编译阶段就来回磨了十几轮。最让人头大的是&#xff1a;AI 给的代码一眼看过去完全没有语法毛病&#xff0c;函数签名工…

作者头像 李华
网站建设 2026/10/22 11:11:31

2026年SCRM工具实测:10家AI能力横评,首选这一款

2026年好用的SCRM工具评测&#xff1a;10家实测AI应用报告指引&#xff0c;首选这1款 一说做SCRM评测&#xff0c;很多人第一反应是“这年头还有必要吗&#xff1f;不就是把客户塞进企业微信&#xff0c;群发个朋友圈&#xff1f;” 恰恰是因为抱有这种想法的人太多&#xff…

作者头像 李华
网站建设 2026/10/22 11:11:03

WPF 年月选择器实战:TextBox+Popup+Calendar 实现与避坑指南

1. 从原生 Calendar 的局限说起&#xff1a;为什么需要年月选择器 WPF 自带的 Calendar 控件功能确实完整&#xff0c;日期、月份、年份三个视图层级都支持&#xff0c;点一下标题栏就能切换。但真正在业务系统里用过的人都知道&#xff0c;它有两个绕不开的痛点。 第一个痛…

作者头像 李华
网站建设 2026/10/22 11:08:53

2026房源管理系统盘点:四款实测对比与选型指南

上个月帮一位做中介的朋友整理门店的系统选型问题&#xff0c;他手里管着三个门店&#xff0c;系统换了两次&#xff0c;每次换都折腾掉半个多月。我在旁边看完整个人都不好了——市面上房源管理系统确实不少&#xff0c;但真正适合门店业务节奏的&#xff0c;掰着手指头数也就…

作者头像 李华
网站建设 2026/10/22 11:08:53

从1.2万到2万star:AI编程开源教程被AI助手推荐的实战复盘

1. 那天早上&#xff0c;我的教程仓库被 AI 助手点名了凌晨四点多&#xff0c;手机在床头柜上连续震了七八次。我的第一反应是服务器出问题了&#xff0c;或者哪个群又在半夜吵起来了。结果打开消息栏发现&#xff0c;全部来自开源平台的被关注提醒。我睡得迷迷糊糊&#xff0c…

作者头像 李华