想在 SQL Server 里直接查 Oracle 数据最常用的做法就是配置链接服务器Linked Server。这个功能很多人听过但真到自己配的时候一会儿 7399 一会儿 ORA-12154一个下午就耗进去了。我这几年在 Windows 服务器上反复配过不同的 Oracle 版本踩过的坑都还在这篇就把原理、搭建步骤、查询写法、性能取舍、常见报错一次性讲清楚适合正在做跨库取数或者联调接口的 DBA、开发、运维参考。配置链接服务器本质上就是让 SQL Server 把 Oracle 当成一个“远程数据源”来访问它不是你想象中的同步工具也不是数据仓库方案而是一条临时取数的管道。管道架好了写 SQL 就跟查本地表一样方便但管道没架好光看报错根本不知道是 SQL Server 的问题还是 Oracle 的问题。所以这篇文章我不打算只给结论每一步都会解释为什么这么做。1. 链接服务器的原理与方案选型1.1 链接服务器是怎么工作的SQL Server 并没有内置 Oracle 驱动它通过 OLE DB Provider 这个中间层去访问其他数据库。你可以把 Provider 理解成“翻译官”SQL Server 把 T-SQL 请求交给翻译官翻译官调用 Oracle 客户端接口把请求转成 Oracle 能懂的 SQL再把 Oracle 返回的结果转回成 SQL Server 能处理的行集。这个过程决定了两个特性。第一链接服务器的性能瓶颈往往不在网络而在“翻译”阶段。如果 SQL 能被完整地下推给 Oracle 执行那查询效率还行如果下推不完整SQL Server 可能把 Oracle 整张表拉回来再本地过滤这种情况一旦碰上大表就是灾难。第二一切依赖 Oracle 客户端的组件都必须存在且可用否则你看到的错误会五花八门。理解了这个流程再回头排查问题就简单得多报错发生在 Provider 层还是 Oracle 客户端层还是 Oracle 服务端层面每一步都有对应工具去验证。1.2 两种 OLE DB 接口怎么选很多人第一次配的时候会在“访问接口”下拉框里犹豫因为能看到两个和 Oracle 相关的选项接口提供方是否需要安装 Oracle 客户端推荐度Microsoft OLE DB Provider for OracleMSDAORA微软理论上不需要但实际不装客户端很难工作低Oracle Provider for OLE DBOraOLEDB.OracleOracle需要安装 Oracle Client64 位高我的建议是直接选 OraOLEDB.Oracle。微软的 MSDAORA 已经很多年没有实质更新对 Oracle 10g 之后的新特性兼容性很差而且它在 64 位环境下的表现很不稳定很多人配了半天查数据报错换成 OraOLEDB 立刻就好了。Oracle 官方提供的 OraOLEDB 也不是装完 Oracle 数据库就自动有它属于客户端组件。你在 Windows 服务器上装完整 Oracle Client安装类型选“Administrator”或“Runtime”默认会带上 Oracle Provider for OLE DB。如果是用 Instant Client 精简包需要确认里面是否包含该组件我建议干脆下载完整客户端省得后面出幺蛾子。1.3 什么场景真的适合用它链接服务器适合四类场景报表系统定期从 Oracle 拉取小数据量数据、开发联调时临时查一下远程库、运维排查问题时做数据对比、以及那种“数据只在 Oracle 里但业务方死都不肯给接口”的短期需求。不适合的场景也很明确。第一百万级以上的数据同步别走链接服务器性能扛不住也容易把两端数据库拖垮。第二高频实时访问比如每次请求都查远程这种应该考虑中间层或者同步到本地库。第三跨库事务更新它天然要依赖 MSDTC 分布式事务协调器配置复杂不说一旦网络抖动还会出现“分布式事务已完成”这种莫名其妙的状态。我通常的建议是用链接服务器解决“查询问题”不要用它解决“数据搬运问题”。数据搬运老老实实用 SSIS、CDC 或者定时导出导入每条路都比硬刚链接服务器靠谱。2. 搭建前的环境和依赖准备2.1 SQL Server 侧三件基础检查动手配置之前先在 SQL Server 实例上确认三件事。第一SQL Server 的位数。执行SELECT VERSION;看结果里有没有 x64。注意64 位的 SQL Server 进程只能加载 64 位的 OLE DB Provider后面装 Oracle 客户端时千万别装成 32 位这是最容易被忽略的坑。第二服务账号的环境。SQL Server 服务默认以系统账号运行它不会加载普通用户的环境变量。这意味着如果你把 TNS_ADMIN 配在用户变量里SQL Server 服务根本读不到。要把 TNS_ADMIN 配到系统环境变量或者干脆在配置链接服务器时用完整连接串绕过 TNS 解析。第三远程访问的开关。在“服务器对象 → 链接服务器 → 访问接口”里找到你用的 Provider右键属性确认“允许进程内”是勾选的。这个选项没勾你会遇到类似“无法创建 OLE DB 提供程序实例”的报错。2.2 Oracle 客户端、TNS 和连接串环境准备的核心是让 SQL Server 这台机器具备“直接连 Oracle”的能力。建议按这个顺序来从 Oracle 官网或企业内部镜像下载 Windows x64 版 Oracle Client版本建议 19c 或 21c至少也要 11g 以上。安装时选择“Runtime”或“Administrator”确保组件列表里有 SQL*Plus、Oracle Net、Oracle Provider for OLE DB。安装完成后配置 tnsnames.ora。该文件默认在%ORACLE_HOME%\network\admin下内容类似ORCLPDB (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.10)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED)(SERVICE_NAME orclpdb)) )先在命令行里验证连接sqlplus report_user/Report2024orclpdb这一步能通过说明 Oracle 客户端、网络、账号密码都没有问题。这里如果失败后面配置链接服务器必然失败。如果你不想维护 tnsnames.ora配置链接服务器时可以直接在“数据源”里填完整的 Oracle 连接串。我平时排查 TNS 问题时特别喜欢这种方式它能把“配置文件的锅”和“数据库本身的锅”快速分开。完整连接串写法(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST192.168.1.10)(PORT1521))(CONNECT_DATA(SERVICE_NAMEorclpdb)))2.3 64 位 Oracle 客户端是个大坑这里必须展开说因为我在这个坑里浪费过两个小时。SQL Server 是 64 位进程它调用的 OraOLEDB.Oracle 也必须是 64 位。你如果装了 32 位的 Oracle Client配置链接服务器界面一切正常但一执行查询就报“链接服务器无法启动 OLE DB 提供程序”或者 7303 错误。判断方法很简单安装目录里带(x86)字样的百分之百不对。判断客户端位数可以先看 SQL*Plus 的启动路径也可以直接看注册表。HKEY_LOCAL_MACHINE\SOFTWARE\Oracle下是 64 位的 Oracle 键HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Oracle下是 32 位的。如果你发现 64 位注册表里没有 OraOLEDB 而 32 位里有说明装反了卸载重装 64 位版本。另外提醒一个容易被忽略的细节每次装完 Oracle 客户端或修改 Provider 注册信息后必须重启 SQL Server 服务。因为 Provider 的注册信息是在 SQL Server 进程启动时加载的你不重启它就一直用旧的缓存装了半天新驱动也没用。3. 创建链接服务器的完整流程与脚本3.1 图形界面创建步骤拆解用 SSMS 创建的路径是“服务器对象 → 链接服务器 → 右键 → 新建链接服务器”。常规页面里链接服务器名称填一个你自己好记的名字比如 ORACLE_LINK。服务器类型选“其他数据源”访问接口选“Oracle Provider for OLE DB”。这里需要注意的是产品名称要填Oracle数据源填的是 tnsnames.ora 里的网络服务名比如orclpdb如果你不想依赖 TNS 文件也可以把第二节那个完整连接串直接填进去。服务器选项页面把“RPC Out”勾上。这个选项的作用是允许通过链接服务器执行远程存储过程。如果你的目标只是查询其实可以不勾但万一后面要调 Oracle 的过程回来改配置又是一轮折腾建议直接勾上。“允许进程内”一般默认就是勾选确认一下没被改掉就行。安全性页面是大多数人迷糊的地方。“使用此安全上下文”是最简单且最不容易出错的模式意味着所有通过该链接服务器的查询统一用你填写的远程账号去连接 Oracle。我一般填一个只读账号权限最小化别拿 scott 这类 DBA 账号天天挂着。希望 SQL Server 当前登录用户直接映射到 Oracle 同名用户才会去考虑“使用登录名的安全上下文”跨库环境下我很少这么干。3.2 用 T-SQL 脚本一键创建图形界面点的每一步底层都是调用系统存储过程所以把脚本贴出来反而更容易复用。这是我自己常用的模板EXEC sp_addlinkedserver server NORACLE_LINK, srvproduct NOracle, provider NOraOLEDB.Oracle, datasrc Norclpdb; GO EXEC sp_addlinkedsrvlogin rmtsrvname NORACLE_LINK, useself NFalse, locallogin NULL, rmtuser Nreport_user, rmtpassword NReport2024; GO EXEC sp_serveroption ORACLE_LINK, rpc out, true; GO这些参数分别是什么意思srvproduct填Oracle表示该链接服务器指向 Oracle 数据库provider指定 OLE DB 接口名就是 OraOLEDB.Oracledatasrc是 Oracle 网络服务名sp_addlinkedsrvlogin中useself NFalse表示不沿用 SQL Server 本地登录身份而是固定用下面的rmtuser和rmtpassword去连接远程库locallogin NULL表示这个映射对 SQL Server 里所有登录都生效。这套脚本放 SQLCMD 或者 SSMS 里执行完再执行一条最简单的查询验证SELECT 1 FROM OPENQUERY(ORACLE_LINK, SELECT SYSDATE FROM DUAL);能返回日期说明管道已经通了。3.3 登录映射和权限设计链接服务器创建成功不等于权限没问题远程账号能不能查到数据是另一码事。我强烈建议在 Oracle 侧新建一个专用账号而不是直接拿业务账号用CREATE USER report_user IDENTIFIED BY Report2024; GRANT CONNECT TO report_user; GRANT SELECT ON scott.emp TO report_user; GRANT SELECT ON scott.dept TO report_user;SQL Server 侧创建链接服务器需要sysadmin角色或者具备ALTER ANY LINKED SERVER权限。平时巡检我都是用只读账号跑查询只有真正需要变更链接服务器配置时才会登 sysadmin。权限设计上还有一个需要注意的点如果你在sp_addlinkedsrvlogin里对特定locallogin配置了映射那么该本地登录查询时会走这条映射如果locallogin是 NULL则所有本地登录默认走全局映射。实际工作中很容易出现一种情况测试账号能查业务账号不能查最后发现是登录映射漏配了。所以维护文档里一定要写清楚谁映射谁。4. 四类查询方式的实战和性能对比这一节说查询写法。为了演示方便假设 Oracle 侧有用户SCOTT表EMP主要有EMPNO、ENAME、HIREDATE、DEPTNO、SAL这些字段。我每次给新人讲链接服务器都会用一张足够典型的表来演示这样四种方式的差异会非常直观。4.1 四段名直查写法最短但要小心性能四段名指的就是服务器名.数据库名.架构名.对象名的完整引用方式。因为 Oracle 的 database 概念和 SQL Server 不同所以中间那段留空写两个点SELECT EMPNO, ENAME, HIREDATE, DEPTNO, SAL FROM ORACLE_LINK..SCOTT.EMP WHERE DEPTNO 30;语法上ORACLE_LINK是链接服务器名SCOTT是 Oracle 的 SchemaEMP是表名。Oracle 默认把不加引号的表名转成大写所以这里写EMP没问题。这种写法最直观和查本地表几乎一模一样但也是最容易踩性能坑的。SQL Server 优化器会把 T-SQL 转换成发给远程的 SQL简单谓词如DEPTNO 30通常能下推也就是 Oracle 那边执行完过滤再返回但如果查询里出现函数包裹列、多个 JOIN 嵌套复杂、或者无法判断远程约束优化器可能直接把整表拉回来做本地过滤。怎么判断看执行计划。如果“远程查询”这个算子扫描的行数远超最终返回的行数就说明下推失败了。性能敏感场景里我一般优先用 OPENQUERY而不是四段名。4.2 OPENQUERY把 SQL 留给 Oracle 自己执行OPENQUERY 的核心价值是SQL Server 不解析里面的内容原样把字符串发给 Oracle 执行。这意味着 Oracle 优化器能拿到完整的原生 SQL过滤、排序、分页、ROWNUM 限行这些都能在远端完成不会出现整表拉回的问题。SELECT EMPNO, ENAME, TO_CHAR(HIREDATE, YYYY-MM-DD) AS HIREDATE, DEPTNO, SAL FROM OPENQUERY(ORACLE_LINK, SELECT EMPNO, ENAME, TO_CHAR(HIREDATE,YYYY-MM-DD) AS HIREDATE, DEPTNO, SAL FROM SCOTT.EMP WHERE DEPTNO 30);注意两个使用细节。第一OPENQUERY 不支持:var这种参数化写法如果查询条件依赖 SQL Server 端的变量必须拼接动态 SQL。第二字符串里有单引号时要用两个单引号转义。上面这个例子里TO_CHAR(HIREDATE,YYYY-MM-DD)就是最典型的格式。动态拼接的标准套路长这样DECLARE deptno int 30; DECLARE sql nvarchar(4000); SET sql NSELECT EMPNO, ENAME FROM OPENQUERY(ORACLE_LINK, SELECT EMPNO, ENAME FROM SCOTT.EMP WHERE DEPTNO CAST(deptno AS varchar(10)) ); EXEC(sql);但千万注意动态拼接如果直接接受外部输入很容易产生 SQL 注入哪怕是内部系统也别这么干。子查询里有单引号要转义有特殊字符要处理我个人习惯把这种拼接逻辑封装在存储过程里明确参数类型再转换。4.3 OPENROWSET临时查询救急用OPENROWSET 适合那种“没有创建链接服务器但想临时远程查一次”的场景。写法上把连接信息全部放在函数里SELECT * FROM OPENROWSET( OraOLEDB.Oracle, User IDreport_user;PasswordReport2024;Data Sourceorclpdb, SELECT EMPNO, ENAME FROM SCOTT.EMP WHERE ROWNUM 10);默认情况下 SQL Server 会把即席分布式查询关掉第一次用会报权限错误需要管理员打开EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure Ad Hoc Distributed Queries, 1; RECONFIGURE;OPENROWSET 的缺点也很明显连接字符串里直接暴露明文密码不适合长期使用每次查询都要写一长串维护成本高而且它的执行计划优化能力比链接服务器还要弱。我的用法很明确验证环境、临时拿几个数、做故障排查时救急其他情况不用。4.4 EXEC AT调用 Oracle 端过程链接服务器不仅能查表还能调 Oracle 的存储过程。前提是创建链接服务器时勾选了 RPC Out然后这样写EXEC (BEGIN HR_PKG.CALC_BONUS(30); END;) AT ORACLE_LINK;这条语句的含义是把括号里的整段 PL/SQL 字符串发送到 Oracle 侧执行。可以理解成远程的EXECOracle 进程里跑这段代码SQL Server 只负责发送和等待结果。如果存储过程有大量输出参数或者要返回结果集用 EXEC AT 会比较别扭。真要在 SQL Server 里拿 Oracle 过程的结果集我建议在 Oracle 侧把取数逻辑封装成视图或函数SQL Server 端用 OPENQUERY 去查。你非要用 EXEC AT 接 REF CURSOR整套代码写出来非常绕而且调试体验很差。如果过程名或参数要从 SQL Server 变量里传动态拼接同样是套路DECLARE sql nvarchar(500); SET sql NBEGIN HR_PKG.CALC_BONUS(30); END;; EXEC (sql) AT ORACLE_LINK;注意AT ORACLE_LINK后面的链接服务器名称不能用变量代替变的是括号里的 SQL 文本。4.5 性能和写法选择的一张表方式示例适用场景主要注意点四段名ORACLE_LINK..SCOTT.EMP简单过滤、小表、日常联查谓词可能不下推大小写和类型映射容易出问题OPENQUERYOPENQUERY(ORACLE_LINK, ...)大数据量、复杂 SQL、分页排序不支持参数化动态 SQL 要处理好单引号OPENROWSETOPENROWSET(OraOLEDB.Oracle, ..., ...)一次性取数、环境验证需要开启 Ad Hoc 查询密码明文EXEC ATEXEC (BEGIN ...; END;) AT ORACLE_LINK调用 Oracle 存储过程依赖 RPC Out取结果集不方便这张表我基本贴在自己这边的知识库里每次给新同事讲跨库查询都会拉出来看一眼。选择原则就两条查询用 OPENQUERY 最省心要调过程就用 EXEC AT四段名适合走简单查询时的快速写法。5. 高频错误实战排查与避坑记录5.1 消息 7399Provider 返回错误的完整排查最典型的一条报错长这样消息 7399级别 16状态 1第 1 行 链接服务器 (null) 的 OLE DB 访问接口 OraOLEDB.Oracle 返回了错误。刚接触的朋友看到 7399 就懵了。其实 7399 只是一个“总错误”它提示 Provider 在执行过程中出了问题真正的详细原因在后面的省略号里。不同的环境、不同的客户端版本后面的描述都不一样可能是“未找到 Oracle 客户端和网络组件”可能是“ORA-12154”也可能是“ORA-12518”。我的排查流程固定是这几步在 SQL Server 主机上用 SQL*Plus 跑一遍连接验证 Oracle 侧到底正不正常。这一步能过滤掉一半问题。如果是 TNS 相关错误先确认链接服务器数据源里填的是不是 tnsnames.ora 里的服务名再确认 TNS_ADMIN 系统环境变量是否指向配置文件所在目录。确认 Provider 名称没写错。OraOLEDB.Oracle 中间的点别丢也别脑补成“Oracle Provider for OLE DB”。打开访问接口配置确认“允许进程内”勾选是打开的。如果用了 MSDAORA 报 7399我一般直接换 OraOLEDB。微软那个 Provider 在 64 位环境里的表现实在不行。检查链接服务器本身的“数据访问已启用”选项如果被关掉也会出现类似问题这个选项在链接服务器属性页里。改完以上任一项重启 SQL Server 服务再测。我也遇到过一种情况SQL*Plus 能正常连接但链接服务器就是报 7399最后发现是 SQL Server 服务账号对 Oracle 安装目录没有读取权限。这是一个容易被忽略的点Windows 服务以特定账号运行时如果该账号对%ORACLE_HOME%\network\admin目录没有读权限TNS 文件就加载不上。临时验证方法给服务账号临时授权再测。5.2 ORA-12154 和 ORA-12518TNS 与监听器ORA-12154: TNS:could not resolve the connect identifier specified这条错误在链接服务器里出现的频率极高。字面意思是 Oracle 客户端解析不了你给它的连接标识符。常见原因有三个tnsnames.ora 里没有对应的网络服务名和数据源里填的值不一致TNS_ADMIN 环境变量没配到正确目录导致客户端根本找不到 tnsnames.ora客户端没装完整缺少 Oracle Net 组件。处理办法就是按顺序排查先用tnsping orclpdb测试确认 tnsnames.ora 在正确目录把 TNS_ADMIN 配到系统环境变量并重启 SQL Server 服务或者干脆用完整连接串绕开 TNS。我遇到 TNS 问题基本都是最后一条方案最省事尤其是那种服务器上装了多个 Oracle 客户端的环境。ORA-12518: TNS:listener could not hand off client connection这条错误我之前遇到过好几次。它的含义是监听器收到了连接请求但没办法把连接转交给数据库服务进程。最常见的原因是 Oracle 实例的processes参数已经满了也就是并发连接数达到上限。还有一种可能是监听器的问题比如连接队列满了。处理步骤一般是登录 Oracle 服务器sqlplus / as sysdba看上限show parameter processes;看当前连接SELECT COUNT(*) FROM v$session;杀空闲会话ALTER SYSTEM KILL SESSION sid,serial#;如果确实是 processes 参数太小调大ALTER SYSTEM SET processes300 SCOPEspfile;重启数据库后生效。有些环境里应用侧连接池没释放导致会话占满也会报 ORA-12518这时候光调参数没用得先找到是哪个应用拿走了大量会话。5.3 中文乱码、类型转换和权限那些事链接服务器查 Oracle中文乱码的案例很多。表现一般是四段名查询出来的中文是问号或者乱码但 SQL*Plus 里一切正常。这个问题本质上是 OLE DB 接口在字符集转换上的兼容问题Oracle 端字符集和 SQL Server 排序规则不一致时最容易出现。我的习惯是对关键字段用 OPENQUERY并在 Oracle 侧用TO_CHAR或字符函数预处理避免让 OLE DB 层去做复杂的编码转换。同时确认 Oracle 端NLS_CHARACTERSET和 SQL Server 的排序规则尽量匹配。如果临时只需要看数据还可以在 Oracle 侧写视图把乱码字段转成VARCHAR2并指定长度SQL Server 只查视图也能减少很多麻烦。类型转换问题同样集中在四段名查询里。Oracle 的DATE类型在 OLE DB 映射里可能被转成 SQL Server 的datetime或varchar如果两端版本不一致可能出现“算术溢出”或“转换失败”。Oracle 的NUMBER(38,0)大数值也可能让 SQL Server 端出现精度问题。正规做法就是把不需要的字段排除掉必要字段在 Oracle 侧转成明确类型。比如SELECT EMPNO, TO_CHAR(HIREDATE, YYYY-MM-DD) HIREDATE, SAL FROM OPENQUERY(ORACLE_LINK, SELECT EMPNO, TO_CHAR(HIREDATE,YYYY-MM-DD) HIREDATE, SAL FROM SCOTT.EMP);权限问题比较隐蔽。遇到ORA-00942: table or view does not exist第一反应不要觉得是表真的不存在很可能就是远程账号没有该对象的 SELECT 权限也可能是表名大小写的问题。用 SQL*Plus 用同一个账号登录试试查这张表能查到说明远端不缺权限查不到就要回 Oracle 侧授权而不是改链接服务器配置。5.4 报错速查表错误信息现象特征最常见原因优先排查方向消息 7399Provider 返回错误客户端缺失、TNS 配置、权限等具体原因要看细节先用 SQL*Plus 验证远端连接消息 7303无法启动 OLE DB 提供程序的数据源Oracle 客户端未装或位数不匹配检查客户端位数重装 64 位重启 SQL Server消息 7302无法创建 OLE DB 提供程序实例Provider 未注册或“允许进程内”未勾选检查注册表和访问接口属性勾选允许进程内ORA-12154TNS 无法解析连接标识符tnsnames.ora 或 TNS_ADMIN 配置有误用 tnsping 测试或改用完整连接串ORA-12518监听器无法分发连接processes 满或监听器资源不足查 v$session调 processes杀空闲会话ORA-00942表或视图不存在远程账号无权限或大小写不对用 SQL*Plus 同账号验证授权中文乱码查询返回中文异常客户端字符集和 SQL Server 排序规则不匹配使用 OPENQUERY 并在 Oracle 侧转换这张表不是万能药但它能帮你把排错范围迅速缩小。我自己的习惯是任何链接服务器报错选一个能直接连通 Oracle 的工具SQL*Plus 或者 DBeaver先验证远端再回 SQL Server 侧看配置。这样把“Oracle 本身的锅”和“SQL Server 配置的锅”分开排查效率能提升一大截。6. 几个我坚持使用的排错习惯最后分享几个我长期维护链接服务器后沉淀下来的习惯不是大道理都是救命细节。第一条每次配置完或修改完 Provider一定记得重启 SQL Server 服务。很多人改了配置不重启然后花半小时怀疑自己智商最后发现服务没重启旧状态一直在。第二条链接服务器的远程登录映射要专门记文档。哪个 SQL Server 登录对应哪个 Oracle 账号能查哪些表写清楚。不然安全审计的时候谁也说不清这个链接到底连到哪、权限多大。第三条长期使用的链接服务器建议在 Oracle 侧包一层视图。比如把SCOTT.EMP里常用字段封装成V_EMP_REPORTSQL Server 端只查视图这样 Oracle 表结构变更时只需要调整视图定义SQL Server 端的查询脚本不用跟着改。第四条别在存储过程里大量拼接 OPENQUERY 动态 SQL。短期用可以长期维护会崩溃。该在 Oracle 侧写过程、视图就在 Oracle 侧解决SQL Server 端只负责简单调用。链接服务器说到底就是一根管道。管道本身不难架难的是你知道管道另一端连的是谁、权限到哪、怎么让它稳定不炸。把这几个习惯保持住跨库查 Oracle 这件事就能从“每日踩坑”变成“一次配置长期使用”。