资讯动态

Oracle项目实战:从部署建库到SQL调优的完整避坑指南

发布时间:2026/10/9 19:38:49 来源:尧图企业网站定制
简介一份围绕Oracle项目实战的数据库设计文档完整呈现开放式基金交易平台的核心表结构设计。资源面向正在学习Oracle数据库设计、需要完成课程设计或项目实练的开发人员聚焦基金公司、基金、活期账户、理财账户、基金账户及购买、交易等数据表的字段与关系设计能够帮助读者快速理清从业务需求到数据模型的落地过程。压缩包内包含1个doc文档约245KB文档需求描述、问题分析、相关技术与工具、阶段划分及项目总结等章节齐全适合对照练习。目前已有450人学习浏览。通过学习可掌握主键、外键、约束、数据类型设计等关键技能理解基金交易平台后台管理与前台委托的实际业务逻辑是一份可直接参考的Oracle项目范例。1. Oracle项目实战的第一关不是SQL编写而是环境与基线搜索“oracle项目实战”的人大概率不是来学SELECT的而是库里已经摊上事了监听连不上、迁移完数据乱码、慢SQL拖垮接口、磁盘满了之后整个库直接挂起。这个标题讲的事情是从拿到一套Oracle环境到让它稳定扛住业务的整条链路——怎么装、怎么建库、怎么设计表、怎么迁数据、怎么调优、怎么在事故当天把系统捞回来。这篇文章按项目落地的顺序把每一步的必调参数和翻车点都摆出来。适合三类人从MySQL转过来要接手Oracle项目的开发刚被分配去搭一套新环境的DBA以及项目里Oracle正在出问题、急需排查思路的运维。我和Oracle打了多年交道最大的体会是Oracle和MySQL最大的不同不是语法而是它的“项目属性”——从部署那天起字符集、归档模式、初始化参数就已经决定了你后面会不会踩坑。2. 部署与建库静默安装、初始化参数与字符集定下项目80%的调性2.1 Oracle项目实战的部署第一步用响应文件做静默安装图形界面安装Oracle在服务器上经常起不来——没有X11转发或者网络慢导致下一步卡死。我一般用静默安装核心是一个响应文件.rsp加一条runInstaller命令。响应文件说白了就是告诉安装程序“别问了答案都在文件里”。下面是一个典型数据库软件安装的响应文件片段以19c为例版本不同路径按实际替换oracle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0 oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory ORACLE_HOME/u01/app/oracle/product/19c/dbhome_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.OSDBA_GROUPdba oracle.install.db.OSOPER_GROUPdba oracle.install.db.OSBACKUPDBA_GROUPdba oracle.install.db.OSRACDBA_GROUPdba oracle.install.db.IS_RAC_CONFIGfalse oracle.install.db.CLUSTER_NODES oracle.install.db.ROOTINSTALL_LOCATION然后执行安装./runInstaller -silent -responseFile /u01/rsp/db_install.rsp -ignorePrereqINSTALL_DB_SWONLY表示只装数据库软件不建库建库单独做这样职责清晰INVENTORY_LOCATION是安装清单目录记录装过哪些组件UNIX_GROUP_NAME和DBA_GROUP决定了操作系统用户和DBA组必须在执行安装前就建好否则后面root脚本会报错。安装日志在ORACLE_HOME/oraInstall.log报错第一件事是看它而不是重新跑一遍。我一般会加-ignorePrereq跳过系统依赖检查但前提是已确认glibc、libaio这些基础包存在新手别盲目跳过。2.2 建库前要敲定的三个初始化参数定下项目调性静默安装只装软件建库推荐用DBCA的静默模式。但建库前有几个参数会跟着实例的一生之后改起来成本极高必须提前定。第一个是db_block_size默认8KB建库后不可修改。OLTP系统用8KB基本够如果是数仓或大量大字段扫描可以选16KB但要先确认应用没有依赖8KB的隐含假设。这个参数属于“建错就后悔”型。第二个是memory_target11g以后的自动内存管理让SGA和PGA共用一块内存。服务器内存充足时直接给物理内存的50%-60%别贪多给到75%以上容易在系统内存紧张时触发OOMOracle进程直接被内核杀掉。第三个是processes决定最大并发会话。连接池应用常见误区是池大小设200、processes却还是默认150跑起来就是ORA-00020。一般按连接池上限乘以1.5倍再加后台进程数留余量。建库命令dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname ORCL -sid ORCL \ -sysPassword Ora_123456 -systemPassword Ora_123456 \ -characterSet AL32UTF8 \ -memoryPercentage 60 \ -emConfiguration NONE密码这里只是示例生产环境必须满足复杂度且长度12位以上。characterSet一栏建库时选AL32UTF8是UnicodeZHS16GBK是中文GBK编码。新项目建议直接AL32UTF8老系统迁移尽量跟随源库因为改数据库字符集基本等于重建库不是改个参数就能了事。2.3 字符集与NLS_LANG乱码问题要从源头掐掉字符集的坑不在数据库单方面而在三层一致数据库字符集、客户端NLS_LANG、应用连接配置。常见做法是数据库用AL32UTF8客户端NLS_LANG设置成AMERICAN_AMERICA.AL32UTF8如果客户端是Windows且代码页是GBK则需要设置成SIMPLIFIED CHINESE_CHINA.ZHS16GBK。NLS_LANG由“语言_地域.字符集”三段组成地域影响日期格式和货币符号字符集决定客户端和数据库之间的编码转换方式。我踩过最典型的乱码情况数据库AL32UTF8某个老程序在连接前手动把NLS_LANG设成了GBK结果插入的中文在数据库里变成“???”。因为客户端按GBK把字节流发给服务端服务端按UTF8解析编码对不上全是问号。排查命令很简单sqlplus / as sysdba EOF SELECT userenv(language) FROM dual; EOF拿输出和服务端操作系统里的echo $NLS_LANG对比。两边对不上乱码就是迟早的事。这个问题越早统一越省事项目到中后期再改字符集涉及所有历史数据和客户端改配代价极大。2.4 归档模式Oracle项目实战上线前必须做的事新库默认NOARCHIVELOG日志覆盖模式意味着数据库只能恢复到上一次备份点做不了时间点恢复。常见做法是应用联调阶段就开归档shutdown immediate; startup mount; alter database archivelog; alter database open; archive log list;执行archive log list确认Database log mode是Archive Mode。开归档之后还有两件事必须跟上一是给归档日志单独分配文件系统容量按日均日志量乘以7到10天估算二是配置基于RMAN的清理策略定期删除超过保留期的归档。否则归档日志会把磁盘写满直接造成数据库hang住这个坑在第5章单独讲。提示一下很多项目在测试环境不开归档上线前才想起来一旦忘记就是裸奔状态真出事只能靠最后一次全备恢复。3. 表结构与数据迁移从设计评审到第一批数据入库3.1 表空间规划别把数据、索引、回滚段混在一起项目开始时我一般至少创建四个表空间业务数据、索引、回滚段、临时表空间。业务数据与索引分开一是物理文件分离可以分摊I/O二是做表空间级恢复时互不牵连。回滚表空间和临时表空间在建库时自动创建不需要手工建但要注意分配大小。以下是一套典型创建脚本CREATE TABLESPACE app_data DATAFILE /u01/app/oracle/oradata/ORCL/app_data01.dbf SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 32G EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE app_idx DATAFILE /u01/app/oracle/oradata/ORCL/app_idx01.dbf SIZE 5G AUTOEXTEND ON NEXT 512M MAXSIZE 16G EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;AUTOEXTEND ON建议开启但必须配MAXSIZE否则文件无限增长会把磁盘耗尽。EXTENT MANAGEMENT LOCAL是本地管理表空间现代版本的标准做法SEGMENT SPACE MANAGEMENT AUTO表示段内空间用位图管理避免了老式freelist的争用。排序量大的报表类SQL临时表空间可以单独放到SSD盘能明显降临时段I/O。3.2 分区表设计什么时候该分分完索引怎么写分区不是越多越好。判断依据是数据量级与访问模式单表过亿、有明显的时间维度、并且查询经常带范围条件这时候分区收益最大。一个典型订单表按月份分区CREATE TABLE t_order ( order_id NUMBER(18) NOT NULL, user_id NUMBER(12) NOT NULL, amount NUMBER(12,2), create_time TIMESTAMP NOT NULL ) PARTITION BY RANGE (create_time) ( PARTITION p202501 VALUES LESS THAN (TO_DATE(2025-02-01,YYYY-MM-DD)), PARTITION p202502 VALUES LESS THAN (TO_DATE(2025-03-01,YYYY-MM-DD)), PARTITION p202503 VALUES LESS THAN (TO_DATE(2025-04-01,YYYY-MM-DD)), PARTITION pmax VALUES LESS THAN (MAXVALUE) );分区键有几点要注意第一本地索引是分区表默认选择查询条件里只要带上create_timeOracle就能做分区裁剪只扫对应分区第二如果还有频繁的按user_id查需要在user_id上建全局索引否则跨分区查询会退化成全分区扫描第三pmax分区我会保留防止程序写入超出已定义范围的时间戳时直接报ORA-14400。每月要做一次分区维护把新月份分区建好数据才能落进预期的物理切片。很多团队建完分区就不管了半年后新数据全堆在pmax里分区等于白做。3.3 从MySQL迁移到OracleOracle项目实战的SQL改写清单接手的项目如果是MySQL迁移过来的SQL语法层面的差异是第一批翻车点。先给一张常用转换对照表MySQLOracle改写INT / BIGINTNUMBER(10) / NUMBER(19)DATETIME / TIMESTAMPTIMESTAMPDATE也含时分秒VARCHAR(n)按字符数VARCHAR2(n)默认按字节中文需写成VARCHAR2(n CHAR)AUTO_INCREMENTSEQUENCE 触发器或应用层取序列LIMIT 10 OFFSET 20OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY12cNOW() / CURDATE()SYSTIMESTAMP / TRUNC(SYSDATE)INSERT ... ON DUPLICATE KEY UPDATEMERGE INTOVARCHAR2长度这一行很多人会翻车MySQL的varchar(100)是指100个字符Oracle的VARCHAR2(100)默认是100字节。中文在AL32UTF8下占3字节varchar2(100)只能存33个汉字。建表时务必写成VARCHAR2(100 CHAR)让长度按字符计算这是我在评审表结构时一定会扫的一个点。分页SQL改写是另一处高频报错。Oracle 12c以下不支持LIMIT老写法是嵌套ROWNUMSELECT * FROM ( SELECT a.*, ROWNUM rn FROM ( SELECT * FROM t_order ORDER BY create_time DESC ) a WHERE ROWNUM 30 ) WHERE rn 20;这段逻辑最内层先做排序中间层用ROWNUM截断到第30行并生成行号外层再过滤出第21到30行。为什么不能直接在结果上写ROWNUM 20因为ROWNUM在行生成前赋值大于某值的行在赋值前被丢弃查出来永远是空。12c以上可以直接用OFFSET语法但存量系统里老写法必须看得懂。3.4 第一批数据入库数据泵expdp/impdp的参数细节数据迁移我首选数据泵。它比老工具exp/imp快得多支持按表、按用户、按条件导出。一套最小可用的全用户导出expdp system/密码ORCL \ DIRECTORYDUMP_DIR \ DUMPFILEexp_202501.dmp \ LOGFILEexp_202501.log \ SCHEMASapp_user \ PARALLEL4 \ COMPRESSIONALL执行前要确认DIRECTORY对象的物理路径存在并且Oracle进程对该目录有读写权限。创建目录对象的命令sqlplus / as sysdba CREATE DIRECTORY DUMP_DIR AS /u01/dump;导入侧常见的坑是表空间不一致。源库表在USERS表空间目标库没有同名表空间impdp会直接报ORA-00959。两条路要么先在目标库建同名的表空间要么导入时加REMAP_TABLESPACEUSERS:APP_DATA做映射。字符集如果源库是GBK、目标库是UTF8数据泵导入过程会自动做转换但前提是连接impdp的客户端NLS_LANG与目标库一致否则导入后中文直接乱码。数据泵的PARALLEL参数受CPU和I/O双重限制生产环境不要盲目加到8以上I/O跟不上时并行只会加剧资源争用。3.5 序列与触发器自增主键在Oracle里的标准落地自增主键在Oracle里没有MySQL那种列属性标准做法是序列加触发器。序列不在事务范围内并发下不回滚性能比“查当前最大值1”高得多。一个简洁实现CREATE SEQUENCE seq_order_id START WITH 1 INCREMENT BY 1 CACHE 100; CREATE OR REPLACE TRIGGER trg_order_id BEFORE INSERT ON t_order FOR EACH ROW BEGIN IF :NEW.order_id IS NULL THEN SELECT seq_order_id.NEXTVAL INTO :NEW.order_id FROM dual; END IF; END; /CACHE 100表示在内存里预生成100个序号减少对数据字典的访问但实例崩溃会丢一段序号业务允许主键出现间隙才能用。触发器里的IF判断是为了兼容手工指定主键的插入不加这个判断批量导入历史数据时容易出现主键冲突。新项目如果确定只用应用层生成主键序列也可以不建触发器由应用从序列取号后塞进SQL里性能更可控。4. 性能调优慢SQL治理、执行计划与统计信息让项目撑过线上4.1 定位慢SQLOracle项目实战里最快见效的动作运行中的Oracle把SQL和运行统计都放在共享池里排查慢SQL最快的是查v$SQLAREA。我一般按“单次执行物理读高”和“总执行次数多”两个维度抓SELECT * FROM ( SELECT sql_id, executions, disk_reads, ROUND(disk_reads / NULLIF(executions,0)) reads_per_exec, SUBSTR(sql_text,1,120) sql_text FROM v$sqlarea WHERE executions 100 ORDER BY reads_per_exec DESC ) WHERE ROWNUM 20;这条SQL直接从内存里捞出那些“跑一次读一大堆磁盘”的语句典型是全表扫描重灾。拿到sql_id之后再看它的执行计划SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR(sql_id_xxx, NULL, ALL, 0));DISPLAY_AWR需要对应SQL还留在AWR快照里如果刚发生不久查不到可以用DISPLAY_CURSOR看它在共享池里的实时计划。两个函数的区别不大实战里哪个能查出来用哪个。4.2 读懂执行计划先抓三行别被一堆输出糊住新手第一次看执行计划总觉得晕其实最需要关注的是三件事有没有TABLE ACCESS FULL、有没有SORT ORDER BY、连接方式是NESTED LOOPS还是HASH JOIN。几万行的小表全表扫描不算大问题问题在千万级大表上出现全表扫描。HASH JOIN在连接列上没有合适索引时是正解但如果驱动表估算行数不准HASH JOIN在内存不足时会消耗大量临时表空间SQL跑得又慢又占磁盘。执行计划不准八成是统计信息过期而不是SQL写得不对。优化器靠统计信息估算行数不靠真实扫描。数据量变化超过10%后执行计划还按旧数据量判断路径结果就是“昨天还快今天突然慢”。所以调优前先看一眼统计信息的新鲜度再决定是改SQL还是先收集统计信息。4.3 统计信息执行计划靠它走对路收集统计信息的标准做法是DBMS_STATS一般安排在批量任务之后、业务低峰期执行BEGIN DBMS_STATS.GATHER_TABLE_STATS( OWNNAME APP_USER, TABNAME T_ORDER, CASCADE TRUE, ESTIMATE_PERCENT DBMS_STATS.AUTO_SAMPLE_SIZE, METHOD_OPT FOR ALL COLUMNS SIZE AUTO, DEGREE 4 ); END; /AUTO_SAMPLE_SIZE让Oracle自己决定采样比例比手动写30%更可靠METHOD_OPT里SIZE AUTO表示只对数据分布明显偏斜的列收集直方图宽表上全列做直方图代价很高。DEGREE是并行度生产环境不要超过CPU核数。还有一些老项目在跑analyze table compute statistics建议换成DBMS_STATS——analyze主要是早期版本验证用对分区表和直方图的处理都不如DBMS_STATS完整而且analyze在当前版本里已经不属于官方推荐路径。提示统计信息这把“体检报告”不是越频繁越好。大表每天收集一次小表每周一次足够收集太频繁作业本身会消耗数据库资源。4.4 三个写坏SQL的常见套路全踩过才算完整实战里一半以上的慢SQL不是调优问题是一开始就写坏了。第一种是函数包裹索引列。比如WHERE TRUNC(create_time) TRUNC(SYSDATE)就算create_time上有索引也用不上因为函数把列的原始值改了优化器没法做范围定位。改成范围条件后就走了索引范围扫描-- 反例函数包裹列索引失效 SELECT * FROM t_order WHERE TRUNC(create_time) TRUNC(SYSDATE); -- 正例范围条件可用索引 SELECT * FROM t_order WHERE create_time TRUNC(SYSDATE) AND create_time TRUNC(SYSDATE) INTERVAL 1 DAY;第二种是隐式类型转换。VARCHAR2字段和NUMBER比较或日期字段和字符串比较Oracle会隐式把字段转换成另一边的类型等于给每行都做了次函数运算索引失效。之前排查过一个案例应用传来的是字符串ID字段是VARCHAR2却拿去和数字比较结果每次查询全表扫。规范是绑定参数类型严格对齐字段类型必要时用TO_NUMBER、TO_DATE显式转换。第三种是前导通配符。LIKE %关键字%前导%让B树索引没法定位起点直接全表扫。能改成LIKE 关键字%就改确实需要任意位置模糊搜索的可以评估Oracle Text全文索引。4.5 绑定变量与硬解析CPU莫名飙高的元凶Oracle处理一条新SQL要先做语法解析、权限检查、生成执行计划这叫硬解析代价是软解析的几十倍。应用里拼接变量值进SQL字符串会造成大量硬解析典型症状是CPU使用率不高但数据库响应慢AWR里出现大量“hard parse”相关等待。解决思路有两个层面。应用层改绑定变量是最优解Java的PreparedStatement、Python的cursor.execute传参都属于标准做法。数据库层有一个临时兜底参数把CURSOR_SHARING从EXACT改成FORCE让字面值不同的SQL共用游标。但FORCE只是止血它会让优化器对不同类型的SQL都采用同一套执行计划可能选不到最优路径且增加系统级CPU消耗。只能用在代码不规范的历史项目里过渡长期还是得改代码。5. Oracle项目避坑六个高频翻车点、现象与解决5.1 归档目录写满数据库直接hang住现象应用侧连接全部卡住数据库连不上告警日志里是ORA-00257: archiver error。原因归档日志目录所在文件系统满了ARCH进程无法完成日志切换数据库停止提供服务。解决先清出空间确认已有备份覆盖后用RMAN清理过期归档rman target / DELETE ARCHIVELOG ALL COMPLETED BEFORE SYSDATE-7;删除后数据库会自动恢复。之后我会把归档目录纳入磁盘监控阈值设在80%就告警并配置每天执行一次归档清理。这个故障发生时的现场往往很混乱因为所有会话都卡住DBA第一反应是查锁容易走偏。记住一个规律连接全部卡死且无等待事件先看磁盘和归档。5.2 中文变成问号或乱码三层对齐才能根治现象应用页面查出来的中文全是??或乱码。原因客户端NLS_LANG与数据库字符集不一致。数据库AL32UTF8客户端为GBK时程序从GBK客户端写入的数据被服务端按UTF8解码成了乱码。SQL*Plus里执行SELECT userenv(language) FROM dual看到的是服务端操作系统里echo $NLS_LANG看到的是客户端两行不一致必出问题。解决统一客户端为AMERICAN_AMERICA.AL32UTF8并确保终端本身是UTF8编码Windows老程序如果代码页跑在GBK上就把NLS_LANG设成与库字符集匹配的ZHS16GBK。关键是定下一个标准所有客户端按同一个标准配别一台机器一个样。5.3 ORA-12514监听认识你但服务不认识你现象sqlplus / as sysdba能进但应用连接报ORA-12514: TNS:listener does not currently know of service。原因监听是好的客户端给的SERVICE_NAME和实例实际注册的服务名不匹配。常见于连接串里写的是默认ORCL但DBCA建库时改了全局库名。解决在数据库服务器执行lsnrctl services看监听实际注册了哪些服务名再按这个值去改客户端tnsnames.ora里的SERVICE_NAME。不要凭记忆猜。另外还有一种情况是实例刚启动还没完成向监听的动态注册等一两分钟或执行ALTER SYSTEM REGISTER即可。5.4 手滑删表或删数据闪回是最后的后悔药现象某次清理数据时DELETE少了WHERE整个表被清空或者DROP表时才发现进错了容器。原因低概率但后果严重事前又没有备份。解决10g以上且没有PURGE的情况下回收站和闪回能救-- 误删表从回收站恢复 FLASHBACK TABLE t_order TO BEFORE DROP; -- 误删数据用时间点闪回查出来 SELECT * FROM t_order AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL 30 MINUTE);前提是没开PURGE、UNDO保留时间够长。闪回查询查出来的数据需要用INSERT INTO ... SELECT捞回原表。但闪回只是后悔药不是备份。数据无价这个道理项目里通常是出过一次大事才真正记住。5.5 ORA-28001密码半夜过期应用集体掉线现象客户报“凌晨3点系统变慢所有应用连接失败”日志里是ORA-28001: the password has expired。原因默认profile的PASSWORD_LIFE_TIME是180天数据库运行满180天后密码到期。解决先重置应用账号密码再处理长期策略ALTER USER app_user IDENTIFIED BY New_Password_123; ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;如果安全规范不允许UNLIMITED就要给足够的生命周期和提前通知机制比如密码到期前15天开始告警。这个故障的麻烦在于它发生在半夜应用侧所有连接同时断现场一片混乱。提前把密码策略改好比当天熬夜处理划算得多。5.6 ORA-00020连接池跑满数据库不接客现象应用日志里大量ORA-00020: maximum number of processes (150) exceeded。原因processes默认150而应用连接池上限设了200池子一跑满就直接超出。解决评估连接池峰值后按1.5倍余量调整修改后重启实例生效ALTER SYSTEM SET processes500 SCOPESPFILE;processes是静态参数SCOPESPFILE表示写入服务器参数文件重启后生效。同时检查应用连接池的最小空闲连接数很多连接其实一直空闲占着不掉。还有一种隐蔽情况数据库里残留了大量异常会话没有被正确回收这时候不只是调参数还要查v$session找出是哪个应用在漏连接。6. 接手Oracle项目第一周三张巡检清单与一份基线记录接手一个已经在跑的Oracle项目建议不要急着优化SQL先把家底盘清。我的顺序是三张巡检清单加一份基线记录空间容量、日志错误、备份与权限。第一张查空间。数据文件总大小和剩余空间都要看SELECT b.tablespace_name, ROUND(b.bytes/1024/1024/1024,2) total_gb, ROUND((b.bytes - NVL(f.free,0))/1024/1024/1024,2) used_gb, ROUND(NVL(f.free,0)/1024/1024/1024,2) free_gb FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) b LEFT JOIN (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) f ON b.tablespace_name f.tablespace_name ORDER BY 2 DESC;这段把dba_data_files的总大小与dba_free_space的剩余空间关联起来一眼能看出哪个表空间快满了。只看文件大小容易误判文件大不代表空间充足文件小也不代表剩余紧张关键在剩余比例。第二张查告警日志。查看告警日志路径SELECT value FROM v$diag_info WHERE name Diag Alert;然后到对应目录下grep ORA-重点找ORA-00600、ORA-07445这类内部错误。看到一个ORA-不用紧张先看它是不是反复出现以及发生前后有什么操作对应。第三张查备份与权限。备份这条看RMAN配置或最近一次备份日志权限这条重点看应用账号有没有DBA角色有的话要尽快收掉——见过因为应用账号带DBA权限业务代码误操作影响数据字典的案例整库都被牵连。最后把以上内容落成基线记录日期、数据库版本、字符集、SGA大小、processes、各表空间使用比例、最近备份时间。存成一张表或一份JSON都行。这份基线最大的价值是让你在两周后能对比出什么发生了变化——空间涨了多少、会话数翻了几倍、备份是否连续成功。做运维不是等告警而是让变动在发生时显形。这是我带过的每一个项目都保留下来的习惯希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑