简介:这是Oracle 11.2.0.4客户端Windows 64位分卷压缩包(标签中的sql2017系误标,实际与SQL Server无关),面向使用PL/SQL Developer等工具连接和管理远程Oracle数据库的开发人员与DBA。压缩包共包含1153个文件,整体大小约600.71MB,其中以jar、xml、dll等核心组件为主,并配有exe可执行程序、bat配置脚本、nls语言资源以及若干properties配置文件,这些文件共同构成完整的客户端工具链,可用于安装、配置和连接Oracle数据库服务。目前已有1430人学习下载。解压后可直接安装Oracle客户端,通过tnsnames.ora配置服务名即可远程连接数据库,执行SQL查询、PL/SQL代码调试、存储过程编译以及数据导入导出等操作。对于希望快速搭建Oracle开发与运维环境的中高级技术人员,这份完整的客户端包能省去逐一下载组件的麻烦,同时支持多语言和多种连接受限场景,是日常数据库管理与开发的高效辅助材料。
1. 4of7 结尾的补丁包:它是什么,又为什么不能直接解压
第一次见到p13390677_112040_MSWIN-x86-64_4of7.zip这种文件名,很多人会以为下载漏了单个文件。实际上这是一个 Oracle 数据库补丁包的第 4 个分卷,完整文件一共 7 个,单独任何一个分卷都没法解出完整的补丁内容。文件名里p13390677是补丁编号,112040对应数据库版本 11.2.0.4.0,MSWIN-x86-64表示 Windows 64 位平台,4of7是分卷序号。你要做的不是直接解压这个 zip,而是把 7 个分卷分别解压到同一个补丁目录,再用 OPatch 工具把补丁装进数据库。下面按实际操作顺序,把环境核对、分卷解压、补丁应用、典型坑和回滚验证一次讲完,新手能照着做,老手也能核对一些边界细节。
2. 动手前先把环境对齐:补丁号、平台与 opatch 版本核对
补丁应用翻车,多半不是补丁本身的问题,而是环境没对齐。文件名能读出很多东西,但还不够。你需要确认数据库版本、OPatch 工具版本、分卷文件完整性,三者都对了再动手。
2.1 文件名拆解与平台匹配
Oracle 的补丁包命名遵循p<补丁号>_<版本>_<平台>_<分卷序号>.zip的规则。以p13390677_112040_MSWIN-x86-64_4of7.zip为例:
| 字段 | 示例 | 含义 |
|---|---|---|
| 补丁号 | p13390677 | 该补丁的唯一编号,用于opatch识别 |
| 版本号 | 112040 | 11.2.0.4.0,注意 11g 版本缩写少了点 |
| 平台 | MSWIN-x86-64 | Microsoft Windows x86-64,即 64 位 Windows |
| 分卷 | 4of7 | 总共有 7 个分卷,这是第 4 个 |
112040是11.2.0.4.0去掉点号后的写法。看到这个就知道该补丁只能装在 11.2.0.4 的数据库上,其它小版本如 11.2.0.3 装了会报版本不符合预期。MSWIN是 Oracle 对 Microsoft Windows 的缩写,后面紧跟架构。如果你的数据库是 32 位 Windows,那你要找的平台串是MSWIN-x86-32,而不是MSWIN-x86-64。下载之前,一定要确认操作系统是 64 位还是 32 位,以及数据库是 64 位还是 32 位。曾经有人把 32 位数据库硬套 64 位补丁,结果 OPatch 预检查直接提示平台不匹配,白折腾一晚上。
怎么确认操作系统位数?在 Windows 命令行执行:
:: 查询操作系统架构 wmic os get osarchitecture输出64-bit或32-bit。数据库是否 64 位,则看sqlplus / as sysdba进入后的 banner,或者用file命令查看oracle.exe(如果有 GNU tools 的话)。更直接的方法:执行%ORACLE_HOME%\bin\oracle.exe -v看输出里的位数标识。
2.2 核对 ORACLE_HOME 与数据库版本
OPatch 操作的是 ORACLE_HOME 下的文件,所以环境变量必须指向正确的目录。很多人电脑里装了不止一套 Oracle,如果用错 HOME,轻则补丁装错位置,重则污染另一套环境。
在命令行里检查:
:: 检查环境变量 echo %ORACLE_HOME% echo %ORACLE_SID%ORACLE_HOME应该指向你打算打补丁的那套数据库的安装根目录,比如C:\oracle\product\11.2.0\dbhome_1。ORACLE_SID对应实例名,比如ORCL。如果这些变量没设置,在当前 cmd 窗口里临时设置:
set ORACLE_HOME=C:\oracle\product\11.2.0\dbhome_1 set ORACLE_SID=ORCL set PATH=%ORACLE_HOME%\bin;%ORACLE_HOME%\OPatch;%PATH%然后确认数据库版本真的就是 11.2.0.4:
sqlplus / as sysdba在 SQL*Plus 里执行:
select version, banner from v$version where rownum = 1;如果输出Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production,那就对了。如果版本是 11.2.0.3 之类,不要往下走,先做数据库升级。
2.3 用 opatch version 确认补丁工具版本
OPatch 是 Oracle 用来安装补丁的工具,它本身也在持续更新。补丁包对 OPatch 有最低版本要求,如果手里的 OPatch 太老,opatch apply会直接在预检查阶段报OPatch version older than required。
Windows 上 OPatch 的位置在 ORACLE_HOME 下的OPatch目录。执行:
"%ORACLE_HOME%\OPatch\opatch.bat" version正常会输出类似:
OPatch Version: 11.2.0.3.34拿到这个版本号后,去补丁包里的README.txt搜OPatch Version,对比是否满足最低版本要求。如果低了,下载对应 OPatch 工具版本,先备份旧的OPatch目录,再解压覆盖。注意覆盖时要确保数据库处于关闭状态,因为 OPatch 工具可能在数据库进程运行时被占用。
2.4 校验分卷完整性:MD5/SHA 与文件大小核对
这一步很多人跳过,但恰恰是最便宜的后悔药。分卷下载过程中可能损坏,损坏的分卷解压时会报 CRC 错误,更隐蔽的是解压能成功但某个二进制文件损坏,直到应用补丁时才报错,那时排查成本就大了。
Oracle 下载页通常会提供每个分卷的 MD5 校验值。在 Windows 上用系统自带的certutil就能算 MD5:
:: 计算单个分卷的 MD5 值 certutil -hashfile "C:\temp\patch\p13390677_112040_MSWIN-x86-64_4of7.zip" MD5输出的 32 位十六进制字符串需要和官网给的值比对。7 个分卷都要算,不要觉得只算第 4 个就够。另外核对各分卷大小,通常每个分卷大小是固定约 2GB,如果某个分卷只有几百 MB,那基本是下载中断。
如果分卷多,用 PowerShell 批量计算:
# 遍历所有分卷,计算 MD5 $files = Get-ChildItem "C:\temp\patch\p13390677_112040_MSWIN-x86-64_*.zip" foreach ($f in $files) { $hash = (Get-FileHash -Path $f.FullName -Algorithm MD5).Hash Write-Output "$($f.Name) - $hash" }Get-FileHash是 PowerShell 4.0 自带命令,不需要额外安装。看到输出后和官网校验值逐条比对,全部一致再进下一步。如果某个分卷不一致,重新下载那一个分卷即可,不需要全部重下。
2.5 检查已安装补丁与 inventory 状态
在 apply 之前,请先摸清当前 ORACLE_HOME 里已经有哪些补丁。执行:
"%ORACLE_HOME%\OPatch\opatch.bat" lsinventory -oh "%ORACLE_HOME%"如果输出里有一堆已应用的补丁列表,说明这个环境不是干净的。你需要关注的是这些已装补丁的Patch description是否和你要装的补丁有重叠。重叠的冲突在 apply 阶段会报出来,提前知道可以少走弯路。
还可以查看 inventory 文件是否存在:
dir "%ORACLE_HOME%\cfgtoollogs\opatch\lsinventory"如果这里没有记录,可能是 inventory 损坏。修复 inventory 是一个专门流程,这里不展开,但至少你要确认它的状态,别等到 apply 时才报invalid inventory。
3. 把 7 个分卷合成一个可用的补丁目录:解压的三种方法与参数
下载完、校验完,接下来就是解压。但你可能会困惑:7 个分卷一个一个解压到同一个目录,会不会互相覆盖?到底应该怎么“合并”?
3.1 分卷合并的底层逻辑:不是拼接 zip,而是解压后合并目录
很多人以为4of7表示 7 个分卷需要像老式软盘那样,先把所有分卷拼成一个大 zip 再解压。实际上 Oracle 的这种分卷不是 split archive,而是每个分卷都是独立的 zip 文件,内部只包含补丁树的一部分文件。官方文档通常会说 “Download all zips and extract them into the same directory”。
理解了这一点,就不要用二进制拼接命令,比如copy /b *.zip all.zip,这样拼出来的是一个损坏的 zip,7-Zip 根本打不开。正确的做法是:把 7 个分卷分别解压到同一个目标目录,让解压出的文件合并成完整补丁目录。
为什么能合并?因为每个分卷内部的文件路径大多是独立的,比如1of7放files/1/,2of7放files/2/,或者按子目录区分。即便有相同路径,内容也是同一个文件的不同部分,理论上应该一致。为了稳妥,我一般让解压工具遇到重名时先询问,确认没有非预期覆盖。
3.2 用 7-Zip 批量解压:命令与参数
Windows 自带的资源管理器右键解压,遇到这种多分卷 zip 时会为每个分卷单独解压,它不会自动把所有分卷的内容合并到同一目录。所以推荐用 7-Zip,免费且命令行好用。假设分卷都放在C:\temp\patch\,解压目标统一到C:\temp\patch_extract\:
$src = "C:\temp\patch" $dst = "C:\temp\patch_extract" # 确保目标目录存在 New-Item -ItemType Directory -Force -Path $dst # 循环解压所有 7 个分卷到同一目录 Get-ChildItem -Path $src -Filter "p13390677_112040_MSWIN-x86-64_*of7.zip" | Sort-Object Name | ForEach-Object { & "C:\Program Files\7-Zip\7z.exe" x $_.FullName -o"$dst" -aoa }参数说明:
x:解压到指定目录并保留内部目录结构。不要用e,e会把所有文件摊平,补丁目录树就乱了。-o"$dst":指定输出目录。注意-o和路径之间没有空格。-aoa:覆盖已存在的文件。因为分卷间可能有同一个README.txt,内容可能相同,覆盖无害;如果不同,你会看到解压过程有覆盖警告,这时要停下来想想是不是分卷错了。Sort-Object Name保证按 1of7、2of7 的顺序处理,顺序不是必须的,但乱了不方便排查。
如果你平时用图形界面,选中全部 7 个 zip,右键 7-Zip 里的“解压到当前文件夹”,效果一样。但图形界面遇到重名会弹框,大型补丁解压时不要守着电脑点几百次“是”,命令行批量处理更省心。
3.3 验证解压结果:目录结构与文件清单
解压完成后,目标目录下应该出现以补丁号命名的子目录,比如C:\temp\patch_extract\13390677\。打开它,里面应该有etc、files、patches等子目录,以及README.txt和bundle.xml这类元数据文件。
用下面的命令快速确认关键文件齐全:
dir "C:\temp\patch_extract\13390677"重点关注:
README.txt是否存在。OPatch 会读取它获取补丁元数据。etc\目录里是否有config和inventory相关文件。files\目录是否存在且非空,这是补丁实际要替换的二进制。
一个典型的补丁目录结构大致是这样的:
C:\temp\patch_extract\ └─ 13390677\ ├─ README.txt ├─ bundle.xml ├─ etc\ │ ├─ config\ │ └─ inventory\ └─ files\ ├─ ...如果缺了这些,基本能确定有分卷没解压进去,或者解压到了不同目录。重新检查通配符*of7.zip是不是漏了1of7或7of7。文件名里的_下划线有没有写对。
注意:有些补丁解压后不是以补丁号命名,而是一个长目录名,比如
33182768/32904851/。这取决于具体补丁类型。无论名字是什么,只要目录下能找到README.txt,就说明至少解压出了一套结构的一部分。最后在opatch命令里指向包含README.txt的最终目录即可。
3.4 解压报错的快速排查
解压过程中最常遇到两类报错。第一是CRC Failed,说明这个分卷损坏,回到第 2.4 节重新校验并下载对应分卷。第二是Can not open file as archive,说明你可能选错了文件——如果 7-Zip 不识别某个分卷,检查它是不是被改名了,或者干脆不是 zip 格式。
还有一类诡异问题:解压中途卡住不动,进程占满 CPU。这通常发生在杀毒软件扫描时,可以先把解压目录加入杀毒白名单,或者暂时关闭实时防护,解压完成后再打开。
4. 用 opatch apply 把补丁打进数据库:完整命令与参数说明
解压出补丁目录,只是万里长征走完一半。接下来才是关键动作——把补丁应用到 ORACLE_HOME。这一步有很多参数和前置条件,不要一上来就opatch apply。
4.1 停库前的检查清单:内存、磁盘与监听
在动 ORACLE_HOME 之前,环境一定要干净。我的习惯是先跑一遍检查清单,全绿再继续。
先确认数据库状态和监听状态:
:: 查看监听状态 lsnrctl status :: 进入 SQL*Plus sqlplus / as sysdba在 SQL*Plus 里查看当前实例:
select status from v$instance;如果实例是OPEN状态,需要执行shutdown immediate关闭数据库。补丁会替换 ORACLE_HOME 里的二进制文件,如果数据库进程还运行着,文件被占用无法替换,Windows 下会直接报共享冲突。监听进程同样会占用动态库,所以监听最好也停掉:
lsnrctl stop然后在 SQL*Plus 里:
shutdown immediate磁盘空间检查也在这时做。Windows 下用dir或 PowerShell 的Get-PSDrive查看剩余空间:
Get-PSDrive C | Select-Object Used, FreeOracle 补丁应用时需要把原二进制文件备份到%ORACLE_HOME%\.patch_storage,这个备份体积通常是补丁包大小的 1.5 到 2 倍。如果补丁解压后是 5GB,那磁盘上至少要有 10GB 以上空闲才稳妥。
然后做一次预检:
"%ORACLE_HOME%\OPatch\opatch.bat" prereq CheckApplicable -oh %ORACLE_HOME% -ph "C:\temp\patch_extract\13390677"-ph指向补丁目录。预检会检查数据库版本、已安装补丁、依赖等,输出CheckApplicable - Passed才能继续。
4.2 opatch apply 的核心命令与关键参数
补丁目录确认没问题后,执行应用命令。单机环境最常见的命令是:
"%ORACLE_HOME%\OPatch\opatch.bat" apply "C:\temp\patch_extract\13390677" -oh "%ORACLE_HOME%"参数说明:
apply后面跟补丁目录的绝对路径,用引号包住,避免路径中有空格。-oh显式指定 ORACLE_HOME,避免 OPatch 从环境变量读到错误路径。-jre可以指定 Java 运行时目录,Windows 下常见用法是-jre "%ORACLE_HOME%\jdk\jre",但大部分环境不需要加。-tmpdir指定临时目录,当默认临时目录空间不足时使用,例如-tmpdir "D:\opatch_tmp"。
OPatch 执行过程中会做这些事:
- 读取补丁目录里的
README.txt和bundle.xml获取元数据。 - 检查当前 inventory 中已安装的补丁,确认没有冲突。
- 将需要覆盖的文件先复制到
%ORACLE_HOME%\.patch_storage做备份。 - 执行脚本替换文件。
- 更新 inventory 中的补丁记录。
整个过程可能持续 10 到 40 分钟。日志会打到控制台,也会写入%ORACLE_HOME%\cfgtoollogs\opatch\目录。看到以下输出说明成功了:
The apply operation for patch 13390677 was successful.4.3 冲突处理:-resolve 参数与 precheck
如果 ORACLE_HOME 里已经装过别的补丁,尤其是同一个子系统的累计补丁,opatch apply会报:
Following patches are overlapping with this patch: ...OPatch 会中断操作,防止破坏已有补丁。处理方式:一是先把冲突的其他补丁移除,再装新补丁;二是用-resolve参数让 OPatch 自动分析冲突影响范围。在 11g 时代,-resolve不是万能药,它只会列出冲突,不会自动绕过。
我的一般做法是,先看冲突列表里的补丁是否已经被当前补丁包含。如果 README 里写着 “supersedes patch xxxxx”,那意味着旧补丁可以卸载。卸载旧补丁:
"%ORACLE_HOME%\OPatch\opatch.bat" rollback -id 12345678 -oh "%ORACLE_HOME%"卸载后再重新apply新补丁。如果冲突无法解决,不要硬来,停下来评估补丁依赖关系。
另外注意-force参数。很多教程在报错时建议加-force强行应用,我强烈不建议在正常操作中使用。-force会跳过冲突检查,可能导致运行中的数据库行为异常。那是没有后悔药的路。
4.4 apply 后确认日志与遗留任务
apply 成功后,OPatch 会在补丁目录下生成一个Apply_<时间戳>.log文件。打开它,搜索WARNING和ERROR,重点看有没有The patch may not be fully applied之类的警告。
另外,有些补丁包含 SQL 脚本,需要数据库启动后手动执行。README.txt 会明确列出这些后续步骤。常见的有执行@?/rdbms/admin/catbundle.sql或@?/sqlpatch/...。这种“补丁已 apply,但数据库字典还没升级”的情况,很多人漏掉,导致补丁看似成功,实际组件版本没变。所以养成习惯:apply 后启动数据库,再查一遍组件版本。
5. 分卷补丁的避坑指南:从解压失败到 opatch 报错的 5 个真实案例
补丁应用过程里,我踩过不少坑,也看别人踩过。下面 5 个案例覆盖面比较广,每个按「现象 → 原因 → 解决」来写。
5.1 只解压了一个分卷导致「找不到 inventory」
现象:执行opatch apply时,OPatch 报Patch location C:\temp\patch_extract\13390677 does not exist或Unable to read the inventory from the patch location。
原因:补丁目录看起来存在,但里面缺少 OPatch 所需的元数据。多数情况是只解压了第 4 个分卷,因为补丁的元数据文件在1of7里,没解压时目录结构残缺,OPatch 识别不了。
解决:回到第 3 步,把 7 个分卷全部解压到同一个目录。排查技巧:在补丁目录下执行dir /s README.txt,看能找到几个 README。正确结果通常是一个补丁根目录下有一个README.txt,可能还有 README.html。如果找到 0 个或一堆残缺文件,基本可以确定分卷没解全。
5.2 路径含中文或空格导致 opatch 无法识别
现象:命令执行后没有任何响应,或报The system cannot find the file specified,但文件明明在。
原因:补丁解压路径包含中文、特殊字符或过长的子目录。OPatch 底层调用 Java,11g 时代的 OPatch 对非 ASCII 路径支持非常差。比如路径D:\补丁\p13390677\可能让 Java 的 zip 库直接罢工。
解决:把分卷和解压目录都放在纯英文短路径下,例如C:\temp\patch\。已经解压到中文目录的,把整个目录复制到英文路径再试。另外,Windows 用户账号如果包含中文名,temp目录默认在C:\Users\中文名\AppData\Local\Temp下,OPatch 的临时文件也可能受影响。手动设置TEMP和TMP系统环境变量指向C:\Windows\Temp或C:\temp,然后重开 cmd 窗口执行。
5.3 32 位 JDK 与 64 位补丁不兼容
现象:执行opatch.bat version或apply时,窗口一闪而过,或报Error: could not open ... jvm.dll。
原因:ORACLE_HOME 里自带的 JRE 是 32 位的,但补丁平台是MSWIN-x86-64,OPatch 需要 64 位 Java 才能操作 64 位 Oracle 文件。也可能是JAVA_HOME指向了 32 位 JDK。
解决:先确认有没有 64 位 JDK。命令行执行java -version,看输出里有没有64-Bit。没有就安装一个 64 位 JDK,然后在执行 opatch 的同一个 cmd 窗口里设置:
set JAVA_HOME=C:\jdk1.8.0_311_x64 set PATH=%JAVA_HOME%\bin;%ORACLE_HOME%\OPatch;%PATH%再执行opatch version确认正常。注意,OPatch 对 JDK 版本有要求,11g 补丁通常要求 JDK 1.6 以上,用 1.8 也可以,但不要用太新的 JDK,有可能不兼容 OPatch 的类库。
5.4 磁盘空间不足但 opatch 报错很晚
现象:opatch apply走了很久,到备份步骤时突然报No space left on device或java.io.IOException: There is not enough space on the disk。
原因:很多人只关注补丁包解压空间,忽略了%ORACLE_HOME%\.patch_storage备份目录。备份体积随补丁大小增加,最坏情况是补丁包体积的两倍以上。如果数据库所在盘剩余空间不够,备份写一半就会失败。
解决:动手前用Get-PSDrive C看 ORACLE_HOME 所在盘符的空间。如果紧张,可以清理临时文件和回收站;或者用-tmpdir参数把备份和中间文件重定向到另一个盘:
"%ORACLE_HOME%\OPatch\opatch.bat" apply "C:\temp\patch_extract\13390677" -oh "%ORACLE_HOME%" -tmpdir "D:\opatch_tmp"-tmpdir在部分 11.2.0.4 OPatch 版本上才支持,如果报参数错误,只能清理磁盘。
5.5 杀毒软件静默隔离 opatch 的临时文件
现象:opatch apply执行到 30% 左右,突然报FATAL ERROR: There are no files found in the patch directory,但补丁目录明明完整。
原因:Windows Defender 或第三方杀毒软件在实时监控时,把 OPatch 解压出来或备份的某些.dll、.exe文件判定为可疑程序并隔离了。补丁目录里的文件被移除,OPatch 执行时发现文件缺失。
解决:补丁应用前,把以下目录加入杀毒白名单:
- 补丁解压目录,如
C:\temp\patch_extract\ - ORACLE_HOME 下的
OPatch目录 %ORACLE_HOME%\.patch_storage%ORACLE_HOME%\bin
如果已经发生隔离,先去隔离区恢复文件,再重新解压分卷,然后关掉实时防护或用白名单方式重新apply。补丁应用完成后可以重新打开杀毒软件,但操作期间保证文件不被删除,这是属于“玄学”问题,等排查一整天发现是杀毒软件干的,你会很崩溃。
6. 补丁装完不算完:验证生效与回滚的实操技巧
opatch apply输出 success 不代表一切正常。数据库要起来跑,组件要能用,确认补丁真的生效了再收工。
6.1 用 opatch lsinventory 确认补丁 ID
补丁应用成功后,先查 inventory:
"%ORACLE_HOME%\OPatch\opatch.bat" lsinventory -oh "%ORACLE_HOME%"输出里会列出所有已应用的补丁列表。查找13390677这一行,确认状态是successfully applied。如果不放心,加-detail查看每个补丁的说明和安装时间:
"%ORACLE_HOME%\OPatch\opatch.bat" lsinventory -detail -oh "%ORACLE_HOME%"一个小技巧:lsinventory 输出的最后部分会包含OPatch succeeded字样,如果只看到OPatch failed,说明 inventory 记录有问题,先解决记录再继续。
6.2 从 SQL 层验证组件版本
补丁替换的很多是数据库内部组件,光看文件可能不够。SQL 层验证可以确认补丁是否真正生效。启动数据库:
sqlplus / as sysdba startup然后查询补丁注册历史:
select action_time, action, namespace, version, comments from sys.registry$history where action = 'APPLY' order by action_time desc;如果补丁成功应用,会看到一条新记录,comments字段里包含补丁号13390677。同时查组件版本:
select comp_id, version, status from dba_registry where comp_id in ('CATALOG', 'CATPROC');注意,补丁应用后有些组件需要执行@?/rdbms/admin/catproc.sql之类的脚本才能更新数据字典版本。如果dba_registry里的版本没变化,按 README 里的 SQL 步骤执行。
6.3 把补丁卸掉:opatch rollback 的正确姿势
补丁应用后如果出现严重性能问题或功能异常,卸载是基本操作。回滚命令:
"%ORACLE_HOME%\OPatch\opatch.bat" rollback -id 13390677 -oh "%ORACLE_HOME%"这条命令会根据%ORACLE_HOME%\.patch_storage里的备份文件恢复原二进制,并更新 inventory。回滚同样需要停库、停监听,和 apply 时的环境要求一致。
回滚完成后,还要重新编译失效对象。执行:
@?/rdbms/admin/utlrp.sql然后再次用lsinventory确认补丁已经不在列表里。
最后说一个习惯:我见过最典型的翻车,是有人为了省时间不停监听,结果 apply 过程中动态库句柄被占用,Windows 直接报The process cannot access the file because it is being used by another process,补丁只应用了一半,最后只能重装数据库才救回来。从那以后,我每次打补丁都老老实实执行“停监听 → 关实例 → 检查空间 → 再 apply”这一套流程。补丁应用不是秀操作,越按部就班越不容易出错。希望这篇笔记能帮你绕开这些坑。
本文还有配套的精品资源,点击获取