1. 升级背景与目标:为什么要动这套核心系统
2026年1月22日凌晨,我在机房盯着迁移进度条一点点往前走,旁边放着一杯已经凉透的咖啡。当天给公司跑了三年多的酷柚易汛ERP做了一次大版本升级,从V5.8直接跳到V6.2,涉及数据库迁移、应用包替换、缓存策略调整和权限模型重构。整个过程从晚上十点停服开始,到凌晨四点二十左右核心单据验证通过,前后折腾了六个多小时。这篇升级日志,算是给自己留个记录,也给正在准备ERP系统升级的朋友们提供一份真实参考。
先说清楚这次升级的动机。酷柚易汛ERP在我们公司承担的是进销存+财务一体化管理,采购、销售、库存、应收应付、成本核算都跑在它上面。老版本V5.8是2023年初上线的,运行两年多,最突出的问题是单据量上来之后性能明显下滑:采购入库单保存要等三四秒,月末成本卷积经常跑到凌晨两点以后。数据库用的MySQL 5.7,单表数据量已经过了亿级,索引命中率开始恶化。新版本V6.2在架构上做了不少调整,包括新的缓存机制、单据号生成策略、多仓协同逻辑,以及移动端报表的重新设计。管理层对这次升级的预期很明确:解决月末结账慢、库存账实不符、多仓调拨流程割裂这三个老大难问题。
升级之前我们做了两轮内部评估。第一轮评估的是业务覆盖范围:V6.2对采购、销售、库存、财务四大模块的数据库表结构都有调整,特别是库存流水表增加了批次关联字段,应收应付表拆分了核销记录表。这意味着升级不只是替换安装包那么简单,数据字典的映射、历史数据的清洗、报表口径的适配都要跟着改。第二轮评估的是风险范围:酷柚易汛ERP的二次开发现状,我们公司之前在V5.8上做过一些自定义报表和接口,升级后这些定制内容能不能平滑兼容,是最不确定的点。
说句实在话,ERP系统升级和普通软件升级完全是两码事。普通软件顶多影响一个人的工作效率,ERP挂了,整个公司的采购下单、销售出库、财务记账全部停摆。所以这次升级我们把安全边界划得很保守,宁可多花时间验证,也绝不允许带着未知问题上线。下面的内容,我会按照准备、实施、验证、排障四个阶段展开,把这次升级过程中所有能复现的操作步骤、参数选型和踩坑经验都整理出来。
2. 升级前的准备:备份、测试与兼容性评估
2.1 双保险备份策略
ERP升级的第一原则就是:没有可恢复的备份,就不要碰生产环境。这句话我重复了无数遍,但每次都能遇到翻车的案例。1月18日(周日)晚上,我们在业务低峰期做了一次全量备份,采用了物理备份+逻辑备份双保险的方式。
物理备份用的是Percona XtraBackup,针对MySQL 5.7实例做在线热备。为什么选它而不是直接停库拷贝数据文件?因为ERP系统不可能接受长时间停机,XtraBackup可以在数据库运行状态下完成备份,通过redo log的连续追踪保证一致性。备份命令大致是这样的:
xtrabackup --backup --target-dir=/data/backup/erp_20260118_full \ --user=backup_user --password=****** \ --parallel=8 --compress # 备份完成后执行prepare阶段,使备份集达到一致性状态 xtrabackup --prepare --target-dir=/data/backup/erp_20260118_full逻辑备份用的是mysqldump,直接导出全库SQL。虽然速度慢、文件大,但它有一个不可替代的作用:作为“最后一道保险绳”。如果物理备份在恢复时出现页损坏或者版本兼容问题,逻辑备份还能通过导入SQL的方式重建库。而且,mysqldump出来的SQL文本,可以用来在测试环境里快速初始化一套旧版本数据,这是物理备份文件做不到的。
mysqldump -uroot -p --single-transaction --set-gtid-purged=OFF \ --routines --triggers --events \ --databases erp_db > /data/backup/erp_db_logic_20260118.sql有个细节值得提醒:mysqldump务必加上--single-transaction,这样InnoDB引擎下可以拿到一致性的快照,同时不影响线上业务的正常写入。备份文件生成后,我顺手用ls -lh确认了文件大小,又抽查了备份文件末尾的“Dump completed”标记,确保备份没有中断。备份完成后,把两组备份文件都拷贝了一份到独立的备份服务器上,物理隔离,防止机房单点故障。
2.2 测试环境全量演练
有备份只是第一步,实际能不能恢复、恢复后能不能跑起来,才是关键。1月19日和1月20日,我们在测试环境里做了两次完整的升级演练。
测试环境配置和生产环境保持一致,数据库同样用MySQL 5.7,应用服务器同样部署酷柚易汛ERP V5.8,然后用1月18日的备份数据初始化,模拟升级全过程。操作步骤固定为:先停应用服务,执行数据库升级脚本,替换V6.2应用包,启动应用,跑自动化冒烟用例。
第一次演练就出了状况:V6.2的数据库升级脚本在执行到库存流水表添加批次字段时,由于测试库中有约180万条历史流水记录的批次号为NULL,导致外键约束校验不通过,整个升级脚本回滚。这个问题在生产环境同样存在,因为历史原因,部分采购入库单没有维护批次信息。后来我们的处理方案是分两步走:先在升级脚本中把存量NULL批次号统一赋值(规则为“LEGACY-”+单据编号),然后再添加非空约束和外键关联。升级脚本修改后,第二次演练顺利通过,整个升级过程压缩到40分钟以内。
这件事给了我们一个很重要的启示:升级脚本在真正执行前,一定要用尽量接近生产数据特征的测试数据跑一遍。很多ERP升级的失败案例,都是死在“测试环境数据太干净”上面,存量数据的脏数据、异常值、边界情况,才是真正考验升级方案的东西。
2.3 接口与三方应用的兼容性排查
酷柚易汛ERP在我们公司不是孤立存在的,它和钉钉审批、企业微信通知、电商平台订单同步、物流接口都有对接。升级前,我们拉了一张完整的接口清单,把每个接口的调用方、调用频率、依赖字段都梳理了一遍。
排查中发现,电商订单同步接口依赖旧版本的一个视图v_order_import,而V6.2把这个视图的字段结构改了——新增了platform_order_no,同时调整了order_status的枚举值。如果不做处理,升级后电商平台推过来的订单会报字段映射错误。解决方案是在新库中创建兼容视图,保留旧版字段名和新版字段名并存,让接口层平滑过渡。
这类兼容性问题其实是ERP升级中最容易被人忽略的部分。很多人只盯着数据库和应用包,忘了外部的集成方也在依赖这套系统。我的建议是,升级前给自己留一张接口清单,逐个确认每个接口的入参、出参在V6.2下是否还有效。对接不了的,提前协调开发排期,用兼容层过渡。
3. 升级实施全流程:从停服到数据迁移再到验证
3.1 停服与切换窗口
2026年1月22日晚上22:00,我们正式启动停服流程。停服前30分钟,通过企业微信和钉钉群向全公司发了通知,要求所有业务人员保存手头单据,避免出现未保存的数据丢失。22:00整,运维同事在应用层面关闭了前台入口——不是直接杀进程,而是先切换Nginx配置,将请求指向一个维护提示页,确保用户访问时看到的是“系统升级中,请稍后”而不是连接错误。
这里有个操作细节:停服要分两步走,先断流量再停服务。因为如果直接停数据库或杀应用进程,用户正在提交的单据请求可能刚写到一半,会造成数据不完整。Nginx切换维护页后,等3到5分钟,让在途请求自然处理完,然后再停应用服务。整个过程在操作文档里提前写好了时间节点,每一步都有指定负责人。
应用服务停止后,最后一件事是关闭定时任务调度器,否则凌晨跑批任务会和升级过程抢资源,甚至产生数据写入冲突。酷柚易汛ERP的定时任务包括库存预警扫描、应收应付账龄提醒、月末成本卷积预处理的调度,全部停掉。
3.2 数据库升级:字符集、存储引擎与脚本执行
停服完成后,进入数据库升级环节,这是整个升级过程中技术风险最高的部分。我们按以下步骤依次推进:
第一步,检查数据库当前状态。执行SHOW ENGINE INNODB STATUS确认没有未提交的长事务,执行SELECT TABLE_NAME FROM information_schema.TABLES WHERE ENGINE != 'InnoDB'检查是否有MyISAM表。这个检查很关键,V6.2要求所有业务表必须是InnoDB引擎,因为事务支持和行级锁是数据一致性的基础。检查发现有两张历史日志表还是MyISAM,先用ALTER TABLE转成InnoDB。
第二步,字符集统一。旧库的默认字符集是utf8mb3(MySQL 5.7默认),V6.2要求utf8mb4,因为要支持生僻字和更多特殊符号(比如商品名称中的emoji)。运行升级前,先修改数据库级别的字符集配置:
ALTER DATABASE erp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;随后对存量表执行字符集转换。这里要注意,ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4会锁表并重建表,数据量大的表会比较耗时。我们按表大小分批执行,优先处理核心业务表(库存、单据、往来单位),日志类的表放到最后。
第三步,执行V6.2的数据库升级脚本。脚本是厂商提供的,一个大的.sql文件,包含DDL变更、索引新增、存储过程和触发器的更新。执行前我先把脚本拆成小块,用sed按DELIMITER分割为多个语句组,逐段执行并记录每个段的耗时,方便定位慢语句。执行过程中出现一次报错:更新sys_user表加department_id外键时,因为表里存在部门已被删除的用户记录(孤儿数据),外键添加失败。处理方式和之前演练时类似——先把孤儿数据的department_id置为默认部门的ID值,再执行外键添加。
第四步,验证数据库完整性。升级脚本全部执行完后,后台运行了几个核心校验查询,包括库存汇总与明细的对账、单据流水的连续性检查、所有存储过程的编译状态。确认无误后,对核心业务表执行ANALYZE TABLE更新统计信息,让优化器能基于新索引生成更合理的执行计划。
3.3 应用包替换与系统配置初始化
数据库升级完成后,开始替换应用层。操作过程如下:
先将旧版应用目录打包备份到/data/app_backup/erp_v5.8_20260122/,然后解压V6.2的安装包到新目录。新版应用使用了独立的部署目录,没有直接覆盖旧目录,这样可以保留旧包随时回退,而且两个目录可以共存,只要Nginx的转发目标切换一下就能实现快速回退。
应用包解压后,修改配置文件。有两个关键配置项需要调整:
第一,数据库连接配置。把连接地址指向升级后的库,同时连接池参数做了调整。V6.2对数据库连接池的管理更激进,最大连接数从原来的200调整为150,因为老配置下经常出现连接数打满导致应用假死的情况。V6.2自身带了更合理的连接复用和超时控制机制,所以可以适当调低上限,避免资源浪费。
第二,缓存配置。V6.2引入了Redis缓存作为热点数据的二级缓存,用于缓存商品信息、往来单位、库存实时数量等高频读取的数据。缓存配置项中,过期时间设置为600秒,失效策略采用LRU(最近最少使用)。为什么要用Redis?以我们公司的业务规模为例,商品资料表有6万多条记录,库存汇总表每天被查询上千次,完全靠MySQL扛的话压力大且响应慢。引入Redis后,查询走缓存,只有缓存未命中时才回源数据库,性能提升非常明显。
配置完成后,初始化V6.2的系统参数和历史数据归档设置。特别要处理的是系统参数表里的几个开关选项:是否启用批次追溯、是否启用多单位换算、单据号生成规则是否采用新版序列。根据业务部门的确认,批次追溯和多单位换算是我们这次升级想要的核心能力,直接打开;单据号生成方式为了兼容旧单据的连续性,选择沿用旧版规则。
3.4 缓存预热与核心单据走查
应用配置完成后,启动应用服务,进入验证阶段。首先是缓存预热,因为刚启动时Redis中没有任何数据,如果用户立即访问,所有请求都会穿透到数据库,可能导致数据库瞬间压力过大。通过写了一个预热脚本,从数据库加载高频查询的商品和客户数据到Redis,预热完成后开始验证。
验证阶段,我带着团队按业务主流程一条一条走查:采购订单录入→采购入库→库存增加→销售订单→销售出库→库存减少→应收应付生成→成本卷积计算。每条流程都实际录入了真实业务数据(从旧系统导出的一批单据编号接着往下走),确保单据流程顺畅、库存数量准确、金额计算正确。
走查中发现的第一个问题是:新版库存查询界面默认按“批次维度”展示库存,而我们公司有一部分商品没有批次管理概念,导致这部分商品的库存数被归入一个默认批次(batch_code为LEGACY)下,和旧系统界面展示方式不一样。虽然数据本身没错,但业务人员不习惯。后来在系统参数中把默认流派切换为“按商品维度汇总展示”,与旧系统保持一致,同时保留按批次钻取查询的能力。
第二个问题是销售出库单保存时,调用库存占用校验的接口。旧版校验的是“商品总库存够不够”,新版校验的是“指定仓库的可用库存够不够”。如果只看总库存,不考虑仓库维度,就会出现“系统显示有货,但部分仓库发不出货”的情况。这个逻辑严格讲是更合理的,但在升级初期,业务部门还需要时间适应,我们在测试环境里模拟了跨仓调拨后的出库流程,确认调拨单流转正常,把操作手册发给了对应岗位的人员。
核心单据走查持续到凌晨一点半,所有流程通过。
4. 升级后的功能变化与业务影响
4.1 库存账实不符与批次追溯
这次升级最核心的业务改进,就是库存管理的重构。旧版的库存流水只有“入库/出库/盘盈/盘亏”四种类型,但缺少批次维度,导致同一商品不同批次入库后,出库时没法指定发哪个批次的货。对于食品、化工这类有保质期要求的行业,这个问题是致命的。V6.2引入了完整的批次管理能力,每一笔入库都会生成批次号,出库时可以选择批次或按先进先出(FIFO)规则自动分配。
升级后我们用实际场景测试了一把:某批次原料1月10日入库1000公斤,1月20日又入库同款原料2000公斤,现在需要出库1500公斤,系统按先进先出自动扣减1月10日批次的1000公斤+1月20日批次的500公斤。库存汇总表按批次展示结余,清清楚楚。这个功能的引入,直接解决了月度盘点时经常出现的账实差异——以前差异的来源就是“同质商品混在一起,说不清楚出的是哪一批”。
4.2 性能优化:查询速度与月末结账时间
性能是这次升级的重点目标之一。升级完成后,我们对核心业务场景做了压测对比,结果非常明显。
| 业务场景 | V5.8耗时 | V6.2耗时 | 提升幅度 |
|---|---|---|---|
| 采购入库单保存(100行明细) | 3.8秒 | 0.6秒 | 84% |
| 库存流水查询(按商品+时间范围) | 5.2秒 | 0.8秒 | 85% |
| 销售出库单审核 | 2.9秒 | 0.4秒 | 86% |
| 月末成本卷积(全月数据) | 2小时15分 | 39分钟 | 71% |
| 应收应付账龄报表 | 8.5秒 | 1.2秒 | 86% |
提升的原因主要是三方面:数据库索引重新设计、热点数据缓存引入、单据号生成从“表锁自增”改为“内存序列预申请”。举个例子,旧版生成一张采购入库单的单据号,需要在单据号表中执行UPDATE ... SET number=number+1,这个操作会锁行,并发单据多时就是串行瓶颈。新版改为Redis取号+数据库落盘确认,生成一张单号几乎不耗时。
4.3 移动端适配与多仓协同
V6.2对移动端的升级也很明显。之前业务员在外面用手机访问ERP,界面是为PC设计的,放大缩小操作极不方便。新版的移动端页面重新做了响应式适配,采购员在外地可以用手机直接提交采购订单,仓库管理员可以用手机扫码完成入库确认。
多仓协同方面,V6.2支持仓库间调拨的全程跟踪。举个例子,从上海仓调拨一批货到北京仓,系统自动生成调拨出库单和调拨入库单,两张单据的关联关系贯穿全程。调拨过程中,如果发生货损(验证数量少于发出数量),可以直接在调拨单上登记损耗原因,系统自动调整两个仓的库存。这个功能在旧版是做不到的——旧版调拨就是简单的出库+入库,中间损耗没人管,月底对账时才发现问题。
4.4 权限模型重构与数据安全
V6.2在权限管理上引入了“数据权限范围”的概念。旧版权限只控制“能不能访问某个菜单”,新版可以细分为“只能看自己创建的单据”“能看到本部门的单据”“能看到全公司的单据”。举个例子,销售一部的业务员登录后,在客户查询界面只能看到自己名下客户的订单;销售经理可以看到整个部门的数据;财务和总经理可以看到全公司数据。
这个变化对公司来说尤其重要,因为之前销售员之间偶尔会发生抢单情况——A业务员录入了客户的询价单,B业务员在客户列表里能看到并跟进。升级后数据隔离生效,业务归属清晰了,避免了内部摩擦。权限模型升级后,我们同步刷新了用户角色和权限模板,由各部门负责人确认各自部门的数据权限范围。这个环节务必谨慎,权限给多了是数据安全风险,给少了影响正常工作。
5. 日志体系升级:从升级过程到日常运维的追踪
5.1 升级过程日志:每一步都有迹可循
这次系统升级,我自己对“日志”这件事的重视程度又上了一个台阶。升级过程中的每一个关键步骤,我都用脚本记录到了独立的日志文件中。比如停服通知、Nginx切换、应用停止、数据库备份校验、升级脚本执行、缓存预热、流程走查,都有对应的日志记录和时间戳。
具体实现方式不复杂:在操作服务器上,用script命令把整个操作过程的终端输出保存到时间戳命名的日志文件中。升级结束后,这份操作日志归档保存,后续如果有人问“当时执行了什么操作、为什么这个步骤用了这么长时间”,可以直接翻阅。
升级脚本执行时,花了一点时间把SQL执行结果和错误信息都输出到了日志中。虽然升级过程很顺利,只有一个孤儿数据导致的外键报错,但日志完整记录了这个报错的定位过程——具体是哪条SQL、报错内容是什么、我们怎么定位到脏数据并在业务表中确认、最后如何修复。这套操作日志对于复盘升级过程中的决策,价值非常大。
5.2 日常监控日志配置与采集
升级完成后,我们对日志系统做了一次全面的重新配置。以前日志都是散落在各台服务器的本地文件中,出了问题需要登录服务器手动查看。这次升级后,我们把应用日志和数据库日志统一采集到ELK(Elasticsearch + Logstash + Kibana)平台,实现日志的集中检索和监控告警。
应用日志方面,酷柚易汛ERP的日志文件按级别分为error.log、warn.log、info.log三种,按天切割,保留最近30天。Logstash采集配置里,重点把error级别日志单独建索引,配合告警规则,一旦出现“数据库连接失败”“库存扣减异常”等关键错误,立刻通过企业微信机器人推送到运维群。
数据库日志方面,主要关注三类日志:慢查询日志、错误日志、binlog日志。升级后我们打开了慢查询日志,并设置long_query_time=2,记录所有执行时间超过2秒的SQL语句。每周定期分析慢查询日志,找出需要优化的SQL。
-- 开启慢查询日志 SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2; SET GLOBAL slow_query_log_file = '/var/log/mysql/erp_slow.log';binlog日志是数据恢复的“后悔药”。升级前,我们将binlog格式设置为ROW模式,因为ROW模式记录的是每一行数据的变化,恢复数据时最精确,不会出现STATEMENT格式下因为时间函数、存储过程执行结果不一致导致的恢复偏差。binlog保留时间设置为7天。7天内的数据如果出现误删误改,可以通过binlog做时间点恢复。
5.3 日志排障速查:随时能用到的问题定位清单
日志配置好了,最关键的是会用。我整理了这份日常运维中高频使用的日志排障速查清单,也是这次升级后我们团队内部培训的教材:
- 用户反馈“保存单据很慢”:查应用日志中的事务耗时,再查MySQL慢查询日志中是否有对应SQL,看执行计划是否走索引。
- 用户反馈“打开报表空白”:先查应用日志有无异常堆栈,再查ES中该报表接口的响应时间,确认是否是缓存击穿导致数据库压力过大。
- 定时任务没有执行:查定时任务调度日志,确认调度器是否启动,任务执行是否报错。
- 库存数量不对:查库存流水日志,按时间范围拉出相关单据的库存变动记录,对比业务操作和库存更新的时序。
- 接口对接数据异常:查应用日志中接口入参和出参,再查第三方回调日志,确认数据推送/拉取是否有丢包或格式错误。
这些排障场景的日志分析方法,核心思路都是“顺着一条业务单据的完整流转链路,逐个环节翻日志”,从用户操作入口到数据库事务提交,在日志中找到一条完整的链路记录。
6. 常见问题与排查技巧实录
6.1 升级后问题速查表
整理一下这次升级过程中遇到的和行业内常见的典型问题,供参考:
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 升级脚本执行到一半卡住 | 大表DDL锁等待 | 查SHOW PROCESSLIST,观察Waiting for table metadata lock | 先停止相关业务端查询,或分批执行DDL |
| 库存查询界面显示异常 | 新版默认展示批次维度,旧数据批次为空 | 查库存汇总表,确认是否有默认批次 | 统一初始化存量数据的批次号,或调整系统参数切换展示维度 |
| 单据号重复 | 取号规则切换导致序列冲突 | 查单据号表的当前值和新版序列的起始值 | 手动对齐序列起始值,确保大于存量最大单据号 |
| 登录后页面白屏 | 浏览器缓存了旧版JS/CSS | 强制刷新或清缓存 | 升级后通知用户在无痕模式或清缓存后访问 |
| 第三方接口报字段错误 | 接口依赖的视图或字段结构变更 | 查接口调用日志和数据库视图定义 | 创建兼容视图,或调整接口调用方字段映射 |
| 月末结账还是慢 | 索引没有完全生效或统计信息过期 | 查慢查询日志,看执行计划 | 执行ANALYZE TABLE,针对性补充复合索引 |
| 应用启动后内存持续上涨 | 缓存配置过大或连接池溢出 | 查JVM/应用内存监控、连接池状态 | 调整堆内存参数或减少连接池上限 |
6.2 升级后的48小时:盯紧三个关键点
升级完成并不意味着结束,在我看来,上线后的48小时才是真正的考验。这段时间我重点关注三个指标:
第一,数据库连接数和连接等待时长。升级后新版本对连接池的使用更活跃,如果出现连接数打满,会导致大量请求排队,表现为“系统变慢但CPU不高”。通过监控面板盯住Threads_connected和Threads_running,一旦超过100就需要排查慢SQL和连接泄漏。
第二,定时任务执行情况。升级后不少定时任务(库存预警、应收应付提醒、数据归档)的调度逻辑有变化,需要逐个确认是否正常触发、正常执行、正常结束。我连续观察了两天的任务执行日志,确认所有任务都按预期时间完成。
第三,用户反馈响应速度。升级后业务人员使用习惯会有调整期,经常出现“找不到界面”“操作方式和以前不一样”的反馈。为了减少这部分噪音,我提前准备了操作手册的速查版,截图标注新旧界面对应关系,发给各部门群。有反馈说“库存查询没有仓库筛选条件”,最后发现是权限设置里没有勾选仓库存取权限,调整后恢复正常。
6.3 回退预案:不到万不得已不动用
虽然这次升级准备得很充分,但回退预案还是提前写好并演练过一遍。回退预案的核心思路是:不直接把生产环境打回旧版,而是保留一份与旧版完全一致的“安全副本”,一旦新版出现无法修复的严重问题,直接切换到这份副本。
具体做法是,升级前用XtraBackup备份的物理文件,在新服务器上恢复出一套完整的V5.8环境,确保这套环境可以独立启动、独立登录。如果升级后新系统出现严重故障,只需要把Nginx的转发切换到恢复的旧环境上,业务就能继续跑,不会影响数据(旧环境的数据是1月18日备份,最多丢失几天的新增数据)。但万幸的是,这次升级到最终验证全部结束,回退预案没有派上用场。不过我心里清楚,没有这套预案,我在操作的时候不可能这么从容。
7. 写在最后:升级的经验沉淀
2026年1月22日凌晨四点半,当我在测试环境里把最后一笔采购入库单审核通过的那一刻,系统显示库存数量、金额、批次全部正确,我才真正松了一口气。这次酷柚易汛ERP升级,从准备到实施到验证,前后花了将近一周时间,实际操作六个多小时,带回来的经验比教训多。
我个人最大的体会是:ERP系统升级,永远不是“插上安装包点下一步”的事情。提前把数据备份做扎实,把升级脚本在贴近生产的数据上反复演练,把接口兼容性一个个确认清楚,把日志体系配置到位,把回退方案想清楚,这些前期工作能不能做到位,直接决定了升级当天是否从容。
最后再分享一个小技巧:升级时把所有操作步骤和输出日志都记下来,即使没出任何问题,这份日志也是宝贵的资产。半年后如果你要再做一次升级、或者遇到类似问题,翻开这份日志,能帮你节省大量的排查时间。好记性不如烂笔头,系统升级日志的价值,往往在升级完成之后才真正体现出来。