尧图精选

Oracle单机多实例部署指南:从规划到运维的完整实践

🕒 发布时间:2026/10/2 9:11:16 📁 来源:尧图网络
1. 单机多实例部署的第一课先搞明白你为什么要这么做很多刚接触Oracle的同学第一次听到一台服务器上部署多个实例这个说法脑子里冒出来的画面往往是装两套数据库软件跑两个进程。这个理解不算错但离真正该有的认知还有一段距离。我在工作里遇到多实例需求最常见的是这几种场景。第一种是测试环境资源紧张一台服务器只有那么一台但你手头同时维护着三四个不同版本、不同业务的库又不想因为做个测试就额外申请物理机。第二种是有些客户的历史包袱重同一台机器上既要跑生产库又要跑报表库、归档库DBA又不能随便动生产环境只能在旁边再开一个实例来承接新业务。第三种是最纯粹的——学习。你在自己的台式机上装了一套Oracle想模拟主库备库两套独立业务库隔离的效果但你不想装虚拟机、不想搞容器那就必须走多实例路线。这里必须先明确一个容易混淆的概念多实例、多租户CDB/PDB、RAC 是三件事。RAC是一套数据库文件被多个实例同时加载实现高可用CDB/PDB是Oracle 12c之后推出的插接式架构一套实例里装多个数据库而本文说的多实例是一套Oracle软件对应多个独立的实例SID每个实例拥有自己独立的参数文件、控制文件、数据文件、监听端口和环境变量。它们互不干扰就像同一栋楼里住了好几户人家水电管线各自独立只是共用了一个门厅服务器资源。在动手之前你还要做一个判断——你真的需要多实例吗如果你的需求只是同一个库给不同应用用那其实一个实例建多个用户就够了如果是想在开发库上模拟生产环境那CDB/PDB可能更合适只有当你确确实实需要多个完全隔离的数据库环境、各自有独立的数据文件和独立的启停控制时才值得付出多实例这套运维成本。否则后面每一次打补丁、调参数你都要在所有实例上重复一遍这些都是隐性成本。我见过最典型的反面案例是有人图省事把两个业务库塞进同一个实例的不同schema里结果某个业务的会话把共享池挤满全库性能雪崩。这就是把隔离需求强行压给了共享架构最后买单的是整个团队。2. 部署前必须确认的三件事系统参数、目录规划与字符集多实例部署的第一步不是执行安装命令而是把环境规划好。这一步没做扎实后面建库、启动、连监听的时候会连环踩坑。2.1 内核参数与资源限制多实例是共享 host 资源不能按单实例思维去配单实例部署时很多人习惯按官方文档推荐值把kernel.shmmax、kernel.shmall拉满省事。但多实例场景下你的/dev/shm、共享内存段、信号量、进程数上限nproc、文件句柄上限nofile都是多套实例共用的不能再用单实例跑满的逻辑。以/dev/shm为例。Oracle 的共享内存文件系统用于 MEMORY_TARGET 自动管理默认挂载在/dev/shm上大小通常是物理内存的一半。如果你有两个实例每个实例的MEMORY_TARGET都设成物理内存的 60%那/dev/shm瞬间就被打爆实例启动时会报ORA-00845: MEMORY_TARGET not supported on this system。这个错误我见过太多次了十有八九都是因为规划内存时压根没考虑两个实例加起来这件事。所以多实例部署前的内存规划我的建议是先盘清楚预期内可能同时运行的实例数量再决定每个实例可用内存值。比如一台 64G 内存的测试机你想跑两个 Oracle 19c 实例一个模拟 OLTP 业务一个模拟 DSS 分析业务那么比较合理的分配是 OLTP 实例SGA_TARGET8G、PGA_AGGREGATE_TARGET4GDSS 实例SGA_TARGET12G、PGA_AGGREGATE_TARGET6G。剩下的内存留给操作系统、文件缓存和其他进程别想着把内存榨干——多实例环境最怕的就是内存叠加超卖。与之配套的操作系统参数检查点至少要看这几项参数检查值建议作用fs.file-max大于 512 * 实例数保守可设 1048576 以上系统级文件句柄上限kernel.shmall/kernel.shmmax统一按最大单实例 SGA 冗余来设共享内存总量上限ulimit -n65536 或更高单进程文件描述符上限ulimit -u16384 或更高单进程可创建的线程/进程数上限vm.nr_hugepages如果用大页 HugePages必须按多实例合计大页内存页数大页是最容易忽略的一项。如果你给两个实例各自开了 10G 的大页但系统只配了 15G 的大页总量第二个实例启动时一样会报内存不足。这类问题系统日志里会有明确记录但排查链路很长规划阶段就别给自己留这个隐患。2.2 目录规划一套软件多套数据目录命名规范必须一上来就定死Oracle 的 Inventory中央清单目录只有一个不管你这台机器上装了几套软件都归它管。但实例的数据文件、控制文件、重做日志、闪回区、监听日志这些必须按实例各自规划路径不能混在一起。我惯用的目录结构是这样组织的/u01/app/oracle/product/19.0.0/dbhome_1 # Oracle 软件主目录一套 /u01/app/oracle/oradata/ORCL # 实例 ORCL 的数据文件 /u01/app/oracle/oradata/TESTDB # 实例 TESTDB 的数据文件 /u01/app/oracle/fast_recovery_area/ORCL # 实例 ORCL 的闪回区 /u01/app/oracle/fast_recovery_area/TESTDB # 实例 TESTDB 的闪回区 /u01/app/oracle/admin/ORCL/{alert,cdump,dpdump,trace} # 每个实例有自己的告警日志目录 /u01/app/oracle/admin/TESTDB/{alert,cdump,dpdump,trace}为什么要把 admin 目录也按实例拆开因为 Oracle 的诊断信息告警日志、跟踪文件是按DIAGNOSTIC_DEST和ADR_HOME组织的不同实例如果共用同一个目录日志会互相覆盖排查问题的时候你根本分不清哪条告警对应哪个实例。目录规划的同时强烈建议用ORACLE_BASE和ORACLE_HOME两个环境变量把软件层和数据层分开。这样做的好处是将来如果某个实例数据膨胀需要迁移存储你可以只搬迁oradata/实例名这个目录不用碰软件目录打补丁升级时也只需动dbhome_1对数据目录零影响。2.3 字符集与库名规则两个实例的字符集可以不同但库名不能撞车多实例部署在早期规划阶段最容易被低估的是字符集。你可能以为所有库都设 AL32UTF8 就完事了但实际场景里历史库可能是 ZHS16GBK新库按规范必须设 AL32UTF8两边数据还有交互需求——这个时候你必须在建库前就定好到底是统一所有实例的字符集还是允许各实例按业务需要独立设置。我的建议是除非有强制的迁移兼容要求否则新建实例统一用 AL32UTF8。ZHS16GBK 在中文场景下存储效率高但遇到生僻字、emoji、多语言混存就会出问题长远看 AL32UTF8 是趋势。如果你确实要保留一个 GBK 的老实例做兼容测试那在建库时就要把这个实例标记清楚别让后人误以为全库统一标准。库名和 SID 的规划同样要提前定死。SID 是实例的唯一标识Oracle 内部区分实例靠它DB_NAME 是数据库的名字控制文件里记录的就是它。单实例时两者通常一致多实例时也必须保证全局唯一。比如你规划两个实例一个叫 ORCL一个叫 TESTDB那监听端口、环境变量、目录名全都围绕这两个名字展开看起来规整运维时不烧脑。最怕的是有人起名叫 ORCL1、ORCL2时间一长你自己都记不清哪个对应哪个业务。3. 双实例部署完整操作流程从软件安装到监听分离这一节我按软件安装 → 建第一个实例 → 建第二个实例 → 配置监听 → 连接验证的顺序把完整链路走一遍。后面涉及的命令都以 Oracle 19c Linux 7/8 为例11g 或 12c 大同小异只是个别路径和参数名略有差异。3.1 软件安装只装一套几个关键选项别选错多实例部署和单实例在软件安装阶段几乎一模一样唯一的区别是你不需要也不能选择只装这一个数据库的选项来创建初始实例——这一步我们留给后面手动操作安装阶段只装软件。用静默模式安装的话responseFile里有几个关键参数oracle.install.db.InstallEditionEE oracle.install.db.OSDBA_GROUPdba oracle.install.db.OSOPER_GROUPoper oracle.install.db.BACKUPDBA_GROUPdba oracle.install.db.DGDBA_GROUPdba oracle.install.db.KMDBA_GROUPdba oracle.install.optionINSTALL_DB_SWONLY ORACLE_BASE/u01/app/oracle ORACLE_HOME/u01/app/oracle/product/19.0.0/dbhome_1记住INSTALL_DB_SWONLY这个值很重要——它表示只装软件不建库。很多人装多实例翻车就是在这一步选了INSTALL_DB_AND_CONFIG装完软件自动建了一个 SID 为 ORCL 的库然后第二个实例建的时候发现端口、目录全都和你预期不一样还要回头删库重来。软件装完后/etc/oratab文件里会写入一行软件条目注意不是实例条目格式一般是oracle:/u01/app/oracle/product/19.0.0/dbhome_1:N这一行不绑定具体实例它是给dbhome定位用的。真正的实例条目要等建库完成后再手工添加。3.2 使用 DBCA 建第一个实例图形化与静默模式的取舍建库我优先推荐用 DBCA 的静默模式因为图形界面在多实例场景下反而容易眼花——你要连续建好几个库时静默模式可以脚本化参数一次写好后续复用。第一个实例我用TESTDB来举例。静默建库命令大概长这样dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName TESTDB \ -sid TESTDB \ -sysPassword Oracle123 \ -systemPassword Oracle123 \ -characterSet AL32UTF8 \ -nationalCharacterSet AL16UTF16 \ -memoryMgmtType AUTO_SGA \ -totalMemory 4096 \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -sampleSchema false几个参数解释一下。datafileDestination建议写到oradata这一级让 DBCA 自动建TESTDB子目录recoveryAreaDestination同理。totalMemory这里我给的是 4G实际值按你第 2 节规划好的内存来。sampleSchema建议关闭测试库也别装示例数据减少干扰。建库完成后DBCA 会自动做两件事启动监听如果之前没配过会创建一个名为 LISTENER 的默认监听端口 1521以及往/etc/oratab里追加一行TESTDB:/u01/app/oracle/product/19.0.0/dbhome_1:N注意末尾的N这是指系统重启时是否自动启动该实例现在保持N即可等实例都建完、验证通过后再决定要不要改成Y。3.3 建第二个实例前先改监听配置这一步很关键也是大量新手在这里卡住的地方。默认情况下第一个实例建完后监听 LISTENER 已经动态注册了 TESTDB端口 1521。如果你不管三七二十一直接再用 DBCA 建第二个实例它会默认注册到同一个监听 1521 上——从功能上说这没问题1521 端口可以同时服务多个实例Oracle 会根据客户端请求的 SERVICE_NAME 自动路由。但这里我强烈建议你给每个实例分开放监听端口。为什么因为多实例部署环境下你迟早会遇到只想重启 A 实例不想影响 B 实例的操作。共用监听时你执行lsnrctl stop会瞬间断开所有实例的对外连接分开监听后你lsnrctl stop LISTENER_TESTDB只影响 TESTDB另一个实例完全无感。监听配置在$ORACLE_HOME/network/admin/listener.ora。我给两个实例分别建监听的配置如下# 实例 TESTDB 的监听 LISTENER_TESTDB (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) ) ) # 实例 ORCL 的监听 LISTENER_ORCL (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1522)) ) )改完配置后先注册监听lsnrctl start LISTENER_TESTDB lsnrctl start LISTENER_ORCL lsnrctl status LISTENER_TESTDB lsnrctl status LISTENER_ORCL这一步做完你会发现第一个实例 TESTDB 已经可以通过动态注册出现在 LISTENER_TESTDB 的服务列表里了。但第二个实例还没建LISTENER_ORCL 目前是空的没关系。3.4 建第二个实例指定监听器和手工补环境DBCA 建第二个实例和第一个几乎一样唯一不同的是你需要告诉它不要动现有监听。实际上 DBCA 有-listenerPort参数但在某些版本里它可能仍然会尝试修改 listener.ora。更稳妥的办法是暂时把 listener.ora 里 LISTENER_ORCL 的配置保留建库时指定它。dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName ORCL \ -sid ORCL \ -sysPassword Oracle123 \ -systemPassword Oracle123 \ -characterSet AL32UTF8 \ -nationalCharacterSet AL16UTF16 \ -memoryMgmtType AUTO_SGA \ -totalMemory 6144 \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -listenerPort 1522 \ -sampleSchema falseDBCA 执行时必须用能操作当前 ORACLE_HOME 的环境。如果你的 shell 环境变量还指向上一次操作的实例ORACLE_SIDTESTDBDBCA 会直接读错所以建第二个实例前要么unset ORACLE_SID要么export ORACLE_SIDORCL确保会话环境是干净的。3.5 环境变量管理与 oraenv 脚本两个实例都建好后/etc/oratab里能看到两个条目TESTDB:/u01/app/oracle/product/19.0.0/dbhome_1:N ORCL:/u01/app/oracle/product/19.0.0/dbhome_1:N但问题来了你的 Linux 用户oracle的.bash_profile里ORACLE_SID 只能写一个值。我起初也图省事直接在.bash_profile里写死了ORACLE_SIDORCL然后每次要操作 TESTDB 时就手动export ORACLE_SIDTESTDB。这个办法能用但很容易翻车——你从一个终端切到另一个终端时忘了重新 export然后 SQL 连错实例数据查到一半才反应过来。正确做法是使用 Oracle 自带的oraenv脚本在.bash_profile里加上export ORAENV_ASKNO . /usr/local/bin/oraenvoraenv会读/etc/oratab根据环境变量ORACLE_SID自动设置ORACLE_HOME、PATH、LD_LIBRARY_PATH等。切换实例时只需要export ORACLE_SIDTESTDB . /usr/local/bin/oraenv这时候你的环境自动切换为 TESTDB 对应的配置。这个脚本是官方提供的比手工管理环境变量稳妥太多建议从第一天就用起来。3.6 tnsnames.ora连接字符串建议按服务名区分监听分开后客户端的tnsnames.ora也要跟着改。两个实例的条目建议这样写TESTDB (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME TESTDB) ) ) ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1522)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME ORCL) ) )注意我用了 SERVICE_NAME 而不是 SID。生产客户端大多通过 SERVICE_NAME 连接这也是 Oracle 推荐的方式。测试连通性可以用sqlplus system192.168.1.100:1521/TESTDB sqlplus system192.168.1.100:1522/ORCL如果你发现第二个实例通过 1522 连不上先不要怀疑监听配置先用lsnrctl services LISTENER_ORCL看实例是否已经成功动态注册。动态注册有延迟通常是 60 秒左右刚建完库时可能还没注册上等一两分钟再试。4. 实例的启动、关闭与日常管理多实例最容易出事的环节实话说建库本身并不难难的是之后每天的管理操作。多实例环境的日常管理最常出问题的就三件事启停顺序、告警日志定位、参数调整。4.1 启动与关闭的顺序性监听和实例的先后依赖关系多实例环境里lsnrctl stop和sqlplus shutdown的顺序是很有讲究的。正确的关闭顺序是先停应用连接或让应用切走再sqlplus / as sysdba执行shutdown immediate最后lsnrctl stop LISTENER_实例名启动顺序反过来先lsnrctl start LISTENER_实例名再sqlplus / as sysdba执行startup为什么要先启动监听再启动实例因为实例启动时如果没有监听存在远程客户端这段时间内连不上虽然数据库本身没问题但业务会有连接失败的报错窗口。如果你把监听放在实例后启动那么实例启动瞬间的动态注册会被监听接收到但中间仍有一段服务名无法解析的空窗期。这里还得专门提一下sqlplus / as sysdba。多实例环境下你要操作某个实例就必须先确保当前 shell 的ORACLE_SID指向它。用oraenv切好之后再sqlplus / as sysdba登录不然你会看到ERROR: ORA-01034: ORACLE not available这个报错信息在单实例环境下通常表示实例没启动但在多实例环境下第一种可能就是你连错了实例——也许你要启动的实例是 ORCL但当前ORACLE_SID还是 TESTDB。先echo $ORACLE_SID确认再往下排查别一上来就去折腾监听和告警日志。4.2 告警日志与 ADR 目录多实例下必须会快速定位对应实例的日志排查数据库问题时第一件事永远是看告警日志。单实例时你闭着眼也知道日志在$ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log。但多实例场景下你必须在动手前就确认好路径因为两个实例的结构是/u01/app/oracle/diag/rdbms/testdb/TESTDB/trace/alert_TESTDB.log /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log注意到差异了吗第一层testdb数据库名小写和第二层TESTDB实例名大写。如果你习惯了单实例时期alert_ORCL.log这种路径当你切到 TESTDB 环境后还下意识去查 ORCL 目录就会莫名其妙觉得问题消失了——实际查的压根不是同一个实例。更坑的是如果你两个库的 SID 命名比较接近比如 ORCL 和 ORCL2那么 ADR 目录名也会接近读日志时很容易串。所以我强烈建议多实例的 SID 命名差异要大一点TESTDB、ORCL、ARCHIVE 这种一眼能看出来的名字是最好的。查询当前实例的告警日志位置最快的是在 sqlplus 里执行select value from v$diag_info where name Diag Alert;这个查询结果永远指向当前会话所在实例的告警日志不会因为 SID 相近而出错。4.3 如何确认你当前确实连的是那一个实例多实例在线切换时一个我反复强调的小操作是登录后立即确认实例身份。尤其是测试环境里同时开着好几个终端窗口时你手上的终端到底连着哪个实例光看提示符SQL是分辨不出来的只有一个SQL没有前缀。所以我每次在 sqlplus 登录后第一件事就是SQL select instance_name, status, host_name from v$instance; INSTANCE_NAME STATUS HOST_NAME ---------------- ------------ --------------- ORCL OPEN db-server-01再加一句SQL select name, db_unique_name from v$database; NAME DB_UNIQUE_NAME --------- -------------- ORCL ORCL花五秒确认一下能省掉后面至少半小时的排查时间。5. 你可能遇到的那些莫名其妙的坑排查链路实录多实例部署的坑往往不是技术有多高深而是你以为你在操作 A 库实际上手滑动了 B 库这类低级错误的放大版本。下面几个坑都是我实际踩过、也看别人反复踩过的按排查代价从低到高列一下。5.1 实例启动报没有权限或内存不足先检查是不是环境变量串了我第一次在一台机器上部署完两个实例后执行sqlplus / as sysdba想启动 ORCL结果报ORA-01078: failure in processing system parameters。第一反应是参数文件有问题然后铺开init.ora逐行看折腾了快二十分钟结果发现是因为 shell 里ORACLE_SID还停留在 TESTDB会话直接去读了 TESTDB 的参数文件。这个报错的根源其实是环境变量ORACLE_SID与ORACLE_HOME组合错了。sqlplus / as sysdba会基于ORACLE_SID去找参数文件spfileORCL.ora或initORCL.ora如果 SID 不是 ORCL它读到的就是另一个实例的参数轻则报参数不匹配重则启动失败。记住一条铁律多实例环境下执行任何 sqlplus 命令前先echo $ORACLE_SID再用ps -ef | grep pmon核对当前有哪些实例在跑。5.2 监听端口冲突默认监听没停干净加第二个监听时最常遇见的报错是TNS-01106: Listener using port 1522 already running排查思路是先lsnrctl status看默认监听是否还占着 1521再netstat -tlnp | grep 1522看 1522 是被哪个进程占用。正常情况下 1522 应该是空闲的但如果你之前手动起过LISTENER_ORCL或者有其他应用占了端口就会撞上。我之前在一台测试机上就撞过这种问题原因是早先顺手用lsnrctl start LISTENER_ORCL测试过配置后来一直没停等到正式建库时 DBCA 检查端口发现被占用直接报错。排查办法简单直接——把相关监听全列出来ps -ef | grep tnslsnr你会看到每个监听对应的完整启动命令里面带着监听名比如tnslsnr LISTENER_ORCL。哪个不需要就lsnrctl stop哪个停干净再重新建。5.3 客户端连接串端口与 SERVICE_NAME 不匹配服务名没对上实例建好、监听正常之后最可能出现的连接报错是ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。这个报错的本质是客户端指定的端口上虽然有监听但监听的服务列表里没有你要连的 SERVICE_NAME。多实例场景下最容易踩这个坑是因为你在tnsnames.ora里给 ORCL 配置了 1522 端口但 ORCL 实例注册的可能是 1521动态注册的默认端口两边没对上。排查链路是第一步查监听实际有哪些服务lsnrctl services LISTENER_ORCL如果输出里没有 ORCL 这个服务名说明实例没有成功注册到这个监听上。第二步查实例的local_listener参数是不是指向了正确监听地址show parameter local_listener;结果应类似(ADDRESS(PROTOCOLTCP)(HOST192.168.1.100)(PORT1522))。如果这个参数是空的或者还指向上一个实例的监听动态注册就会跑偏。第三步第ALTER SYSTEM SET LOCAL_LISTENER...调整参数并执行ALTER SYSTEM REGISTER手动触发注册。5.4 实例同时维护时的一个实用建议会话级命名与登录脚本多实例环境最容易人麻的不是技术细节而是我到底在哪个实例里。我后来形成的一个习惯是在每个实例的 SQL*Plus 提示符里加上实例名标识。做法是在login.sql或glogin.sql里设置提示符。比如在ORCL的$ORACLE_HOME/sqlplus/admin/glogin.sql里加set sqlprompt ORCL 在 TESTDB 的对应文件里改成set sqlprompt TESTDB 这样每个会话一开提示符就直接告诉你在哪个实例里再也不用靠select instance_name from v$instance反复确认了。这是一个很小但极其提升幸福感的技巧。6. 事后还要补的几件事备份策略、资源监控与自动化脚本两个实例都跑起来、能从客户端正常连接多实例部署的主线任务算完成了。但真正让它能长期稳定运行的是后面这些收尾工作。6.1 每个实例的备份策略要分开做单实例环境里RMAN 备份写一条脚本就完了。多实例环境下每个实例必须有独立的 RMAN 备份脚本因为它们的数据文件、控制文件、归档日志路径完全不同。我给 ORCL 和 TESTDB 各建了一个备份脚本目录例如/home/oracle/scripts/rman_orcl.rman和/home/oracle/scripts/rman_testdb.rman内容大同小异但DBID不能混。如果你误用 TESTDB 的数据库 ID 去备份 ORCLRMAN 会直接报错——因为它拿着 A 库的控制文件信息去匹配 B 库的数据文件两者对不上。区分开脚本还不够备份日志输出也要区分。rman_orcl.log、rman_testdb.log两个文件分开写检查备份状态时一目了然。6.2 资源使用监控要按实例维度做单实例环境你top一下看系统整体负载可能就够了。但多实例环境你必须能回答当前是哪个实例在吃 CPU、吃内存。Oracle 提供了一组动态性能视图可以直接用-- 实例级内存使用 select instance_name, sum(bytes)/1024/1024 as memory_mb from v$sgastat group by instance_name;不过真正到了系统层面你还是得结合操作系统工具。top -H -p pmon_pid可以看单个实例的线程资源ps -ef | grep ora_能快速抓到每个实例的后台进程。更实际的做法是按实例分别建立监控项比如 Zabbix 里就给每个实例配置单独的 JDBC 监控项确认目标实例通过独立端口可以连接这样即使某个实例挂了监控能立刻定位到具体是哪个实例而不是整台服务器报警之后你还得手工猜。6.3 系统重启后按固定顺序拉起两个实例操作系统重启后/etc/oratab里的N决定了哪些实例会被自动拉起。默认是N也就是说系统重启后所有实例都不会自动启需要 DBA 手工启动。在多实例环境里我的做法是写一个启动脚本按依赖顺序依次启动#!/bin/bash export ORACLE_SIDORCL . /usr/local/bin/oraenv lsnrctl start LISTENER_ORCL sqlplus / as sysdba EOF startup exit EOF export ORACLE_SIDTESTDB . /usr/local/bin/oraenv lsnrctl start LISTENER_TESTDB sqlplus / as sysdba EOF startup exit EOF注意每次切换ORACLE_SID之后都要重新source oraenv不然ORACLE_HOME、PATH可能还是上一个实例的。脚本放在/home/oracle/scripts/start_all_instances.sh配上 cron 或者开机自启能省去每次重启后手工操作。6.4 补丁升级时的双倍工作量提前有心理准备最后一个提醒是心理建设层面的。多实例环境意味着每次打补丁、升级软件、调整内核参数工作量几乎是叠加的。但处理原则和单实例没什么本质区别先在不重要实例上测再在生产实例上动。比如安全补丁CPU/PSU你可以先在 TESTDB 上打完确认业务无异常再打 ORCL。在一台机器上维护两个 Oracle 实例前期规划多花一小时后面能省下几十个夜晚的排查时间。我个人最大的体会是多实例部署本身并不神秘难点全在规划和纪律上。目录怎么分、端口怎么分、环境变量怎么切、日志去哪查这些在一开始就定清楚后面的运维就是按部就班地执行。如果你是从单实例直接跳到多实例建议先在测试机上把这个流程完整走两三遍等手熟了再上真实环境。踩过几次连错实例的坑之后你会对这套环境的运转逻辑有真正的体感。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →