[{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/10002-trace/","section":"Tags","summary":"","title":"10002 Trace","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/dba/","section":"Tags","summary":"","title":"DBA","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/dbf/","section":"Tags","summary":"","title":"DBF","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/dm8/","section":"Tags","summary":"","title":"DM8","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/dmdul/","section":"Tags","summary":"","title":"DMDUL","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/drop/","section":"Tags","summary":"","title":"DROP","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/truncate/","section":"Tags","summary":"","title":"TRUNCATE","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/%E8%BE%BE%E6%A2%A6/","section":"Tags","summary":"","title":"达梦","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/categories/%E8%BE%BE%E6%A2%A6%E6%95%B0%E6%8D%AE%E5%BA%93/","section":"Categories","summary":"","title":"达梦数据库","type":"categories"},{"content":" 一、问题背景 # 在数据库恢复场景中，经常会遇到两个问题：\n表被 TRUNCATE 以后，数据文件里的数据是不是还能找回来？ 表被 DROP 以后，数据文件里的数据是不是还在？ 从业务视角看，TRUNCATE TABLE 和 DROP TABLE 都会让表数据不可见。但从数据文件物理层看，两者的处理方式并不完全一样。\n本文基于一次达梦 DM8 实验，从字典变化、数据文件残留、10002 trace 分析几个角度，验证 TRUNCATE 和 DROP 后数据是否被清理，以及是否具备恢复可能性。\n测试环境为达梦 DM8，页大小为：PAGE_SIZE = 8192。测试对象主要包括：USERS1.T_TEST。测试表空间：TBS_TEST\n二、实验表准备 # 2.1 创建 TBS_TEST 表空间 # 使用 32MB数据文件：\nCREATE TABLESPACE TBS_TEST DATAFILE \u0026#39;TBS_TEST01.DBF\u0026#39; SIZE 32; 确认数据文件路径：\nSELECT TABLESPACE_NAME, FILE_NAME, BYTES / 1024 / 1024 AS MB FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = \u0026#39;TBS_TEST\u0026#39;; 结果如下：\nSQL\u0026gt; CREATE TABLESPACE TBS_TEST DATAFILE \u0026#39;TBS_TEST01.DBF\u0026#39; SIZE 32;2 3 executed successfully used time: 13.918(ms). Execute id is 2101. SQL\u0026gt; SELECT TABLESPACE_NAME, FILE_NAME, BYTES / 1024 / 1024 AS MB FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = \u0026#39;TBS_TEST\u0026#39;;2 3 4 5 LINEID TABLESPACE_NAME FILE_NAME MB ---------- --------------- ----------------------------- -------------------- 1 TBS_TEST /dmdata/DAMENG/TBS_TEST01.DBF 32 used time: 22.791(ms). Execute id is 2102. SQL\u0026gt; 2.2 创建 USERS1 用户 # CREATE USER USERS1 IDENTIFIED BY \u0026#34;Users1@123\u0026#34; DEFAULT TABLESPACE TBS_TEST; 授权：\nGRANT RESOURCE TO USERS1; GRANT PUBLIC TO USERS1; GRANT SELECT ANY DICTIONARY TO USERS1; 结果如下：\nSQL\u0026gt; CREATE USER USERS1 IDENTIFIED BY \u0026#34;Users1@123\u0026#34; DEFAULT TABLESPACE TBS_TEST;2 executed successfully used time: 4.563(ms). Execute id is 2103. SQL\u0026gt; GRANT RESOURCE TO USERS1; GRANT PUBLIC TO USERS1; GRANT SELECT ANY DICTIONARY TO USERS1;executed successfully used time: 3.442(ms). Execute id is 2104. SQL\u0026gt; executed successfully used time: 1.184(ms). Execute id is 2105. SQL\u0026gt; executed successfully used time: 1.479(ms). Execute id is 2106. SQL\u0026gt; 2.3 创建 T_TEST 并插入测试数据 # 切换 USERS1：\nCONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 创建测试表：\nCREATE TABLE T_TEST ( ID INT, MARKER VARCHAR(200), PAYLOAD VARCHAR(1000), CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT PK_T_TEST PRIMARY KEY (ID) ) TABLESPACE TBS_TEST; 插入 10000 行测试数据：\nINSERT INTO T_TEST(ID, MARKER, PAYLOAD) SELECT LEVEL, \u0026#39;DM_TRUNCATE_TEST_20260706_\u0026#39; || TO_CHAR(LEVEL), \u0026#39;BEFORE_TRUNCATE_20260706_\u0026#39; || TO_CHAR(LEVEL) || \u0026#39;_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\u0026#39; FROM DUAL CONNECT BY LEVEL \u0026lt;= 10000; COMMIT; SELECT CHECKPOINT(100); 检查：\nSELECT COUNT(*) FROM T_TEST; SELECT * FROM T_TEST WHERE ID \u0026lt;= 5 ORDER BY ID; 结果如下：\nSQL\u0026gt; CONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 Server[127.0.0.1:5236]:mode is normal, state is open login used time : 2.580(ms) SQL\u0026gt; CREATE TABLE T_TEST ( ID INT, MARKER VARCHAR(200), PAYLOAD VARCHAR(1000), CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT PK_T_TEST PRIMARY KEY (ID) ) TABLESPACE TBS_TEST;2 3 4 5 6 7 8 9 executed successfully used time: 4.815(ms). Execute id is 2401. SQL\u0026gt; INSERT INTO T_TEST(ID, MARKER, PAYLOAD) SELECT LEVEL, \u0026#39;DM_TRUNCATE_TEST_20260706_\u0026#39; || TO_CHAR(LEVEL), \u0026#39;BEFORE_TRUNCATE_20260706_\u0026#39; || TO_CHAR(LEVEL) || \u0026#39;_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\u0026#39; FROM DUAL CONNECT BY LEVEL \u0026lt;= 10000; COMMIT; SELECT CHECKPOINT(100);2 3 4 5 6 affect rows 10000 used time: 33.157(ms). Execute id is 2402. SQL\u0026gt; SQL\u0026gt; executed successfully used time: 6.597(ms). Execute id is 2403. SQL\u0026gt; LINEID CHECKPOINT(100) ---------- --------------- 1 0 used time: 24.215(ms). Execute id is 2404. SQL\u0026gt; SELECT COUNT(*) FROM T_TEST; LINEID COUNT(*) ---------- -------------------- 1 10000 used time: 2.851(ms). Execute id is 2405. SQL\u0026gt; SELECT * FROM T_TEST WHERE ID \u0026lt;= 5 ORDER BY ID;2 3 4 LINEID ID MARKER PAYLOAD CREATE_TIME ---------- ----------- --------------------------- ----------------------------------------------------------------------------- -------------------------- 1 1 DM_TRUNCATE_TEST_20260706_1 BEFORE_TRUNCATE_20260706_1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2026-07-06 14:00:08.584210 2 2 DM_TRUNCATE_TEST_20260706_2 BEFORE_TRUNCATE_20260706_2_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2026-07-06 14:00:08.584210 3 3 DM_TRUNCATE_TEST_20260706_3 BEFORE_TRUNCATE_20260706_3_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2026-07-06 14:00:08.584210 4 4 DM_TRUNCATE_TEST_20260706_4 BEFORE_TRUNCATE_20260706_4_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2026-07-06 14:00:08.584210 5 5 DM_TRUNCATE_TEST_20260706_5 BEFORE_TRUNCATE_20260706_5_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2026-07-06 14:00:08.584210 used time: 2.600(ms). Execute id is 2406. SQL\u0026gt; 2.4 TRUNCATE 前记录 T_TEST 的物理位置 # 查询段信息：\nSELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;; 查询所有 extent 信息：\nSELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID; 查询页大小和数据文件：\nSELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN (\u0026#39;PAGE_SIZE\u0026#39;, \u0026#39;GLOBAL_PAGE_SIZE\u0026#39;); SELECT TABLESPACE_NAME, FILE_NAME, BYTES / 1024 / 1024 AS MB FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = \u0026#39;TBS_TEST\u0026#39;; 结果如下：\nSQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;;2 3 4 5 6 7 8 9 10 LINEID OWNER SEGMENT_NAME TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BLOCKS EXTENTS ---------- ------ ------------ --------------- ----------- ------------ -------------------- -------------------- 1 USERS1 T_TEST TBS_TEST 0 16 208 13 used time: 259.236(ms). Execute id is 2407. SQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID;2 3 4 5 6 7 8 9 10 11 LINEID OWNER SEGMENT_NAME TABLESPACE_NAME FILE_ID EXTENT_ID BLOCK_ID BLOCKS ---------- ------ ------------ --------------- ----------- ----------- ----------- ----------- 1 USERS1 T_TEST TBS_TEST 0 1 16 2 used time: 150.731(ms). Execute id is 2408. SQL\u0026gt; SQL\u0026gt; SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN (\u0026#39;PAGE_SIZE\u0026#39;, \u0026#39;GLOBAL_PAGE_SIZE\u0026#39;);2 3 LINEID PARA_NAME PARA_VALUE ---------- ---------------- ---------- 1 GLOBAL_PAGE_SIZE 8192 used time: 6.632(ms). Execute id is 2410. SQL\u0026gt; SELECT TABLESPACE_NAME, FILE_NAME, BYTES / 1024 / 1024 AS MB FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = \u0026#39;TBS_TEST\u0026#39;;2 3 4 5 LINEID TABLESPACE_NAME FILE_NAME MB ---------- --------------- ----------------------------- -------------------- 1 TBS_TEST /dmdata/DAMENG/TBS_TEST01.DBF 32 used time: 8.243(ms). Execute id is 2411. SQL\u0026gt; 从 DBA_SEGMENTS 可以看到，TRUNCATE 前 USERS1.T_TEST 的段头位于 file 0 block 16，该段记录的空间规模为 208 个块、13 个 extent。页大小为 8192 字节，因此 208 个块对应的理论空间约为：208 × 8192 = 1703936 bytes，约 1.625 MB\n这与插入 10000 行测试数据后的表段增长情况是匹配的。\n但这里需要注意一个现象：DBA_EXTENTS 只返回了一行，显示 block_id=16, blocks=2。这个结果与 DBA_SEGMENTS 中的 BLOCKS=208, EXTENTS=13 并不完全一致。因此，在本实验中不能简单认为 T_TEST 的全部数据只位于 block 16 开始的 2 个块中。对于 10000 行测试数据来说，2 个 8KB 数据块显然不足以容纳全部行内容。\n2.5 TRUNCATE 前用 strings 验证数据在 DBF 文件中 # TRUNCATE 前按 extent 精确截取验证\nSELECT \u0026#39;dd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=\u0026#39; || HEADER_BLOCK || \u0026#39; count=\u0026#39; || BLOCKS || \u0026#39; 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head\u0026#39; AS SCAN_CMD FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY HEADER_FILE, HEADER_BLOCK; 对应命令就是：\ndd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=16 count=208 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head 结果如下：\nSQL\u0026gt; SELECT \u0026#39;dd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=\u0026#39; || HEADER_BLOCK || \u0026#39; count=\u0026#39; || BLOCKS || \u0026#39; 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head\u0026#39; AS SCAN_CMD FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; 2 3 4 5 6 7 8 9 10 ORDER BY HEADER_FILE, HEADER_BLOCK; LINEID SCAN_CMD ---------- --------------------------------------------------------------------------------------------------------------------------------- 1 dd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=16 count=208 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head used time: 143.555(ms). Execute id is 2412. SQL\u0026gt; exit [dmdba@dameng-srv ~]$ dd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=16 count=208 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head DM_TRUNCATE_TEST_20260706_21 DM_TRUNCATE_TEST_20260706_22 DM_TRUNCATE_TEST_20260706_23 DM_TRUNCATE_TEST_20260706_24 DM_TRUNCATE_TEST_20260706_25 DM_TRUNCATE_TEST_20260706_26 DM_TRUNCATE_TEST_20260706_27 DM_TRUNCATE_TEST_20260706_28 DM_TRUNCATE_TEST_20260706_29 DM_TRUNCATE_TEST_20260706_30 [dmdba@dameng-srv ~]$ 三、TRUNCATE 实验与结果分析 # 3.1 开启 10002 trace 执行 TRUNCATE # 为了更好的了解 TRUNCATE 操作，开启 10002 trace\nCONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 --开启 10002 trace ALTER SESSION SET EVENTS \u0026#39;10002 trace name context forever,level 1\u0026#39;; --执行 truncate TRUNCATE TABLE T_TEST; --关闭 10002 trace ALTER SESSION SET EVENTS \u0026#39;10002 trace name context off\u0026#39;; --记录当前 sessid SELECT SESSID; --查询 trace 文件路径 SHOW PARAMETER TRACE_PATH; 结果如下：\nSQL\u0026gt; CONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 Server[127.0.0.1:5236]:mode is normal, state is open login used time : 2.628(ms) SQL\u0026gt; ALTER SESSION SET EVENTS \u0026#39;10002 trace name context forever,level 1\u0026#39;; executed successfully used time: 2.777(ms). Execute id is 2801. SQL\u0026gt; TRUNCATE TABLE T_TEST; executed successfully used time: 6.305(ms). Execute id is 2802. SQL\u0026gt; ALTER SESSION SET EVENTS \u0026#39;10002 trace name context off\u0026#39;; executed successfully used time: 3.203(ms). Execute id is 2803. SQL\u0026gt; SELECT SESSID; LINEID SESSID ---------- -------------------- 1 128256296 used time: 2.347(ms). Execute id is 2804. SQL\u0026gt; SHOW PARAMETER TRACE_PATH; LINEID para_name para_value ---------- ---------- -------------------- 1 TRACE_PATH /dmdata/DAMENG/trace SQL\u0026gt; 3.2 TRUNCATE 后验证 SQL 层面数据 # SELECT COUNT(*) FROM T_TEST; 3.3 TRUNCATE 后查看段信息和 extent 信息 # SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID; 3.4 TRUNCATE 后用 strings 验证数据文件残留 # strings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head 结果如下：\nSQL\u0026gt; SELECT COUNT(*) FROM T_TEST; LINEID COUNT(*) ---------- -------------------- 1 0 used time: 0.788(ms). Execute id is 2806. SQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;;2 3 4 5 6 7 8 9 10 LINEID OWNER SEGMENT_NAME TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BLOCKS EXTENTS ---------- ------ ------------ --------------- ----------- ------------ -------------------- -------------------- 1 USERS1 T_TEST TBS_TEST 0 16 16 1 used time: 45.680(ms). Execute id is 2807. SQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID;2 3 4 5 6 7 8 9 10 11 LINEID OWNER SEGMENT_NAME TABLESPACE_NAME FILE_ID EXTENT_ID BLOCK_ID BLOCKS ---------- ------ ------------ --------------- ----------- ----------- ----------- ----------- 1 USERS1 T_TEST TBS_TEST 0 1 16 2 used time: 32.980(ms). Execute id is 2808. SQL\u0026gt; exit [dmdba@dameng-srv ~]$ strings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;DM_TRUNCATE_TEST_20260706_\u0026#34; | head DM_TRUNCATE_TEST_20260706_1 DM_TRUNCATE_TEST_20260706_2 DM_TRUNCATE_TEST_20260706_3 DM_TRUNCATE_TEST_20260706_4 DM_TRUNCATE_TEST_20260706_5 DM_TRUNCATE_TEST_20260706_6 DM_TRUNCATE_TEST_20260706_7 DM_TRUNCATE_TEST_20260706_8 DM_TRUNCATE_TEST_20260706_9 DM_TRUNCATE_TEST_20260706_10 [dmdba@dameng-srv ~]$ 3.5 TRUNCATE 前后段信息变化说明 # 本次实验中，TRUNCATE 前 DBA_SEGMENTS 查询结果如下：\nHEADER_FILE = 0 HEADER_BLOCK = 16 BLOCKS = 208 EXTENTS = 13 TRUNCATE 后 DBA_SEGMENTS 查询结果如下：\nHEADER_FILE = 0 HEADER_BLOCK = 16 BLOCKS = 16 EXTENTS = 1 从这个变化可以看出：\nHEADER_FILE 没有变化，仍然是 0，说明 T_TEST 的段头仍然位于同一个数据文件中，也就是 /dmdata/DAMENG/TBS_TEST01.DBF。 HEADER_BLOCK 没有变化，仍然是 16，说明 TRUNCATE TABLE T_TEST 后，表对象本身没有被删除，段头位置仍然保留。也就是说，TRUNCATE 不是删除表对象，而是重置表段中的数据和空间状态。 BLOCKS 从 208 变成 16，说明 TRUNCATE 前由于插入了 10000 行数据，表段已经扩展到较大的空间规模；TRUNCATE 后，表段空间被释放或重置，只保留了较小的初始空间。 EXTENTS 从 13 变成 1，说明 TRUNCATE 前该表已经分配了多个 extent；TRUNCATE 后，原来用于存放数据的多个 extent 不再属于当前表段，只保留了一个基础 extent。 因此，TRUNCATE 的效果不是逐行删除，而是通过段级操作重置表空间使用状态。SQL 层面看，表仍然存在，但数据行变为 0；空间层面看，原来分配给该表的大量块和 extent 被释放或重新整理。\n需要特别说明的是：BLOCKS 和 EXTENTS 变小，只能说明这些块不再属于当前 T_TEST 段，不能直接证明这些块中的历史数据已经被物理清零。原来存放数据的块可能已经回到表空间空闲空间中，在被新对象或新数据覆盖之前，数据文件中仍可能残留旧行内容。\n这个结果说明：虽然 T_TEST 在 SQL 层面已经是空表，但 TBS_TEST01.DBF 数据文件中仍然能够看到 TRUNCATE 前插入的测试标记字符串。\n3.6 查看 TRUNCATE 的 10002 trace # 找最新 trace：\ncd /dmdata/DAMENG/trace ls -ltrh ls -lh *你的SESSID*.trc cat *你的SESSID*.trc 结果如下：\n[dmdba@dameng-srv ~]$ cd /dmdata/DAMENG/trace [dmdba@dameng-srv trace]$ ls -ltrh total 8.0K -rw-r--r-- 1 dmdba dinstall 4.9K Jul 6 14:21 DMSERVER_0706_1421_128256296.trc [dmdba@dameng-srv trace]$ cat DMSERVER_0706_1421_128256296.trc DM Database Server x64 V8[03134284336-20250117-257733-20132], Jan 22 2025 09:16:16 built. *** 2026-07-06 14:21:20.741000000 *** Start trace 10002 event [SESSION ID:128256296] *** [DDL SQL]: TRUNCATE TABLE T_TEST; [EQUIVALENT DML SQL]: { { INT V_DC_FLAG_LEVEL; INT ISO_LEVEL = -1; try{ V_DC_FLAG_LEVEL = SF_RESET_DDLCOMMIT_FLAG(); { PROCEDURE SP_CHECK_IS_DBMS_AQADM_TABLE() AS pkg_exist BIGINT; tab_exist BIGINT; BEGIN SELECT COUNT(*) INTO pkg_exist FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;DBMS_AQADM\u0026#39; AND SUBTYPE$ = \u0026#39;PKG\u0026#39; AND VALID = \u0026#39;Y\u0026#39; AND SCHID = SF_GET_SCHEMA_ID_BY_NAME(\u0026#39;SYS\u0026#39;); IF pkg_exist \u0026gt; 0 THEN EXECUTE IMMEDIATE \u0026#39;SELECT COUNT(*) FROM SYS.AQ$_QUEUE_TABLES WHERE OBJNO=1066\u0026#39; INTO tab_exist; IF tab_exist \u0026gt; 0 THEN RAISE EXCEPTION(-24005, EXCEPTION_MOUT(-24005)); END IF; END IF; END; SP_CHECK_IS_DBMS_AQADM_TABLE(); } STRING V_STR;{ SF_LOCK_DICT(1056964608, 3, 0); PROCEDURE PROC_LOCK_AND_CHECK_TS(TAB_ID VARCHAR, IS_HUGE INT, LOCK_TYPE INT, TAB_LEVEL INT) AS DECLARE TYPE OBJ_ID_T IS TABLE OF INT; TID_ARR OBJ_ID_T; IND_ARR OBJ_ID_T; TS_ARR OBJ_ID_T; HTS_ARR OBJ_ID_T; BEGIN IF (TAB_LEVEL = 1) THEN SELECT ID BULK COLLECT INTO IND_ARR FROM SYS.SYSOBJECTS WHERE PID = TAB_ID AND SUBTYPE$=\u0026#39;INDEX\u0026#39;; ELSE SELECT /*+CNNTB_OPT_FLAG(0)*/ PART_TABLE_ID BULK COLLECT INTO TID_ARR FROM SYS.SYSHPARTTABLEINFO WHERE PART_TABLE_ID \u0026gt; 1 AND LEVEL = TAB_LEVEL - 1 CONNECT BY BASE_TABLE_ID = PRIOR PART_TABLE_ID START WITH BASE_TABLE_ID = TAB_ID; --获取索引ID SELECT ID BULK COLLECT INTO IND_ARR FROM SYS.SYSOBJECTS WHERE PID IN (SELECT * FROM TABLE(TID_ARR)) AND SUBTYPE$=\u0026#39;INDEX\u0026#39;; END IF; --表空间加锁 IF (IS_HUGE) THEN SELECT DISTINCT GROUPID BULK COLLECT INTO TS_ARR FROM SYS.SYSINDEXES WHERE ID IN (SELECT * FROM TABLE(IND_ARR)) AND (XTYPE \u0026amp; 0X1)!=0; SELECT DISTINCT GROUPID BULK COLLECT INTO HTS_ARR FROM SYS.SYSINDEXES WHERE ID IN (SELECT * FROM TABLE(IND_ARR)) AND (XTYPE \u0026amp; 0X1)=0; FOR I IN 1..TS_ARR.COUNT LOOP SF_LOCK_TABLESPACE(TS_ARR(I), LOCK_TYPE, 1); SP_CHECK_TS_OFFLINE(TS_ARR(I)); END LOOP; FOR I IN 1..HTS_ARR.COUNT LOOP --huge表空间改造，上锁不再置上HTS的掩码LOCK_HUGE_TS_MASK SF_LOCK_TABLESPACE(HTS_ARR(I), LOCK_TYPE, 0); SP_CHECK_TS_OFFLINE(HTS_ARR(I)); END LOOP; ELSE SELECT DISTINCT GROUPID BULK COLLECT INTO TS_ARR FROM SYS.SYSINDEXES WHERE ID IN (SELECT * FROM TABLE(IND_ARR)); FOR I IN 1..TS_ARR.COUNT LOOP SF_LOCK_TABLESPACE(TS_ARR(I), LOCK_TYPE, 1); SP_CHECK_TS_OFFLINE(TS_ARR(I)); END LOOP; END IF; END; PROC_LOCK_AND_CHECK_TS(1066, 0, 4, 1); SF_LOCK_DICT(150995949, 4, 0); SF_LOCK_DICT_EX2(1066, 2); SF_TABLE_CHECK(1066, 4); DELETE SYS.SYSOBJINFOS WHERE ID = 1066 AND TYPE$ = \u0026#39;TRUNCTIME\u0026#39; AND int_value=0; INSERT INTO SYS.SYSOBJINFOS(ID, TYPE$, INT_VALUE, STR_VALUE) VALUES(1066, \u0026#39;TRUNCTIME\u0026#39;, 0, TO_CHAR(SYSDATE(),\u0026#39;YYYY-MM-DD HH24:MI:SS\u0026#39;)); SF_TRUNC_TABLE(1066, 0); SP_DCT_TAB_DDL_REG(1066, 1, 1); SF_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 0); SF_LOCK_APPLY_ID(); COMMIT; } SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); } catch (exception ex){ SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); SF_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 0); SF_SET_GEN_INS_UREC_FLAG(1); if (ISO_LEVEL != -1) SF_SET_TRX_ISO_LEVEL(ISO_LEVEL); throw; } } } -------------------------- END -------------------------- *** 2026-07-06 14:21:26.390000000 *** Start trace 10002 event [SESSION ID:128256296] *** [DDL SQL]: ALTER SESSION SET EVENTS \u0026#39;10002 trace name context off\u0026#39;; [EQUIVALENT DML SQL]: { { INT V_DC_FLAG_LEVEL; INT ISO_LEVEL = -1; try{ V_DC_FLAG_LEVEL = SF_RESET_DDLCOMMIT_FLAG(); SP_SESS_SET_TRACE_EVENT(0, 10002, 1, 1, 0); COMMIT; SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); } catch (exception ex){ SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); SF_SET_GEN_INS_UREC_FLAG(1); if (ISO_LEVEL != -1) SF_SET_TRX_ISO_LEVEL(ISO_LEVEL); throw; } } } -------------------------- END -------------------------- [dmdba@dameng-srv trace]$ 3.7 TRUNCATE 的 trace 内容分析 # 在本次实验中，TRUNCATE TABLE T_TEST; 的 trace 中可以看到类似核心内容：\nDELETE SYS.SYSOBJINFOS WHERE ID = 1066 AND TYPE$ = \u0026#39;TRUNCTIME\u0026#39; AND int_value=0; INSERT INTO SYS.SYSOBJINFOS(ID, TYPE$, INT_VALUE, STR_VALUE) VALUES(1066, \u0026#39;TRUNCTIME\u0026#39;, 0, TO_CHAR(SYSDATE(),\u0026#39;YYYY-MM-DD HH24:MI:SS\u0026#39;)); SF_TRUNC_TABLE(1066, 0); SP_DCT_TAB_DDL_REG(1066, 1, 1); SF_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 0); COMMIT; 这些信息说明 TRUNCATE 并不是普通的逐行删除，而是一次 DDL 级别的段重置操作：加字典锁/表空间锁 → 检查对象状态 → 记录 TRUNCTIME → 调用内部 SF_TRUNC_TABLE 重置或释放表段空间 → 刷新/移除字典缓存 → commit。但是它不等于对数据文件中的旧行内容做物理清零。只要旧数据块没有被后续新对象或新数据覆盖，仍然可能通过离线扫描方式找到原始数据残留。\n3.8 TRUNCATE 实验结论 # 通过本次 TRUNCATE 实验，可以得到以下结论：\n从 SQL 层面看，TRUNCATE TABLE T_TEST 执行后，SELECT COUNT(*) FROM T_TEST 返回 0，说明表数据已经对数据库用户不可见。 从段空间变化看，TRUNCATE 前 DBA_SEGMENTS 显示 T_TEST 占用 208 个块、13 个 extent；TRUNCATE 后变为 16 个块、1 个 extent，说明 TRUNCATE 会重置或释放表段空间。 HEADER_FILE 和 HEADER_BLOCK 在 TRUNCATE 前后保持不变，说明 T_TEST 表对象本身没有被删除，段头仍然保留。TRUNCATE 的行为不是删除表对象，而是对表段进行重置。 BLOCKS 和 EXTENTS 变小，只能说明原来属于该表的大量数据块不再挂在当前 T_TEST 段下，不能证明这些块中的历史数据已经被物理清零。 对整个 /dmdata/DAMENG/TBS_TEST01.DBF 数据文件执行 strings 扫描后，仍然可以看到 DM_TRUNCATE_TEST_20260706_ 测试标记，说明 TRUNCATE 后旧行内容仍然残留在数据文件中。 10002 trace 中可以看到 TRUNCTIME、SF_TRUNC_TABLE、SP_DCT_TAB_DDL_REG、SF_REMOVE_DICT_OBJ、COMMIT 等内部操作，说明 TRUNCATE 是 DDL 级别的段重置操作，不是普通逐行 DELETE。 trace 中没有体现逐行删除用户数据，也没有体现对数据文件中旧行内容进行物理清零。 因此，本次实验说明：\nTRUNCATE TABLE 会让表数据在 SQL 层面立即不可见，并重置或释放表段空间；但它并不等于对数据文件中的历史行内容进行物理清零。只要原数据块没有被后续写入覆盖，仍然可以通过离线扫描方式在 DBF 文件中发现旧数据残留，理论上也存在恢复可能。\n四、DROP 实验与结果分析 # 前面的 TRUNCATE 实验已经验证：TRUNCATE TABLE 会让表数据在 SQL 层面不可见，并且会重置或释放表段空间；但通过扫描整个数据文件，仍然可以找到 TRUNCATE 前插入的测试标记。这说明 TRUNCATE 不等于立即物理清零数据文件。\n下面继续验证 DROP TABLE 的情况。\n本节实验继续使用同一个测试环境：\n测试用户 ：USERS1 测试表 ：T_TEST 测试表空间 ：TBS_TEST 数据文件 ：/dmdata/DAMENG/TBS_TEST01.DBF 页大小 ：8192 由于前面已经执行过 TRUNCATE TABLE T_TEST，当前 T_TEST 表仍然存在，但表中已经没有数据。因此，DROP 实验前先重新插入一批带有明显标记的数据，便于后续从数据文件中搜索。\n4.1 DROP 前重新插入测试数据 # 切换到 USERS1 用户：\nCONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 插入 DROP 专用测试数据：\nINSERT INTO T_TEST(ID, MARKER, PAYLOAD) SELECT LEVEL, \u0026#39;DM_DROP_TEST_20260706_\u0026#39; || TO_CHAR(LEVEL), \u0026#39;BEFORE_DROP_20260706_\u0026#39; || TO_CHAR(LEVEL) || \u0026#39;_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\u0026#39; FROM DUAL CONNECT BY LEVEL \u0026lt;= 10000; COMMIT; 执行 checkpoint，尽量将数据刷入数据文件：\nSELECT CHECKPOINT(100); 检查数据：\nSELECT COUNT(1) FROM T_TEST; SELECT * FROM T_TEST WHERE ID \u0026lt;= 5 ORDER BY ID; 结果如下：\nSQL\u0026gt; CONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 Server[127.0.0.1:5236]:mode is normal, state is open login used time : 2.585(ms) SQL\u0026gt; INSERT INTO T_TEST(ID, MARKER, PAYLOAD) SELECT LEVEL, \u0026#39;DM_DROP_TEST_20260706_\u0026#39; || TO_CHAR(LEVEL), \u0026#39;BEFORE_DROP_20260706_\u0026#39; || TO_CHAR(LEVEL) || \u0026#39;_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\u0026#39; 2 3 4 5 FROM DUAL CONNECT BY LEVEL \u0026lt;= 10000; 6 COMMIT;affect rows 10000 used time: 15.423(ms). Execute id is 5201. SQL\u0026gt; SQL\u0026gt; executed successfully used time: 1.035(ms). Execute id is 5202. SQL\u0026gt; SELECT CHECKPOINT(100); LINEID CHECKPOINT(100) ---------- --------------- 1 0 used time: 5.592(ms). Execute id is 5203. SQL\u0026gt; SELECT COUNT(1) FROM T_TEST; LINEID COUNT(1) ---------- -------------------- 1 10000 used time: 0.562(ms). Execute id is 5204. SQL\u0026gt; SELECT * FROM T_TEST WHERE ID \u0026lt;= 5 ORDER BY ID;2 3 4 LINEID ID MARKER PAYLOAD CREATE_TIME ---------- ----------- ----------------------- ------------------------------------------------------------------------- -------------------------- 1 1 DM_DROP_TEST_20260706_1 BEFORE_DROP_20260706_1_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2026-07-06 15:37:27.706050 2 2 DM_DROP_TEST_20260706_2 BEFORE_DROP_20260706_2_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2026-07-06 15:37:27.706050 3 3 DM_DROP_TEST_20260706_3 BEFORE_DROP_20260706_3_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2026-07-06 15:37:27.706050 4 4 DM_DROP_TEST_20260706_4 BEFORE_DROP_20260706_4_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2026-07-06 15:37:27.706050 5 5 DM_DROP_TEST_20260706_5 BEFORE_DROP_20260706_5_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2026-07-06 15:37:27.706050 used time: 0.532(ms). Execute id is 5205. SQL\u0026gt; 4.2 DROP 前记录 T_TEST 的段信息和 extent 信息 # 执行 DROP 前，必须先记录 T_TEST 当前的段信息和 extent 信息。因为一旦执行 DROP TABLE T_TEST，表对象会从数据字典中删除，后续就不能再通过 DBA_SEGMENTS 或 DBA_EXTENTS 查询到这个表的物理位置。\n查询段信息：\nSELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;; 查询 extent 信息：\nSELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID; 查询页大小和数据文件路径：\nSELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN (\u0026#39;PAGE_SIZE\u0026#39;, \u0026#39;GLOBAL_PAGE_SIZE\u0026#39;); SELECT TABLESPACE_NAME, FILE_NAME, BYTES / 1024 / 1024 AS MB FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = \u0026#39;TBS_TEST\u0026#39;; 结果如下：\nSQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;;2 3 4 5 6 7 8 9 10 LINEID OWNER SEGMENT_NAME TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BLOCKS EXTENTS ---------- ------ ------------ --------------- ----------- ------------ -------------------- -------------------- 1 USERS1 T_TEST TBS_TEST 0 16 192 12 used time: 74.683(ms). Execute id is 5206. SQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID;2 3 4 5 6 7 8 9 10 11 LINEID OWNER SEGMENT_NAME TABLESPACE_NAME FILE_ID EXTENT_ID BLOCK_ID BLOCKS ---------- ------ ------------ --------------- ----------- ----------- ----------- ----------- 1 USERS1 T_TEST TBS_TEST 0 1 16 2 used time: 62.913(ms). Execute id is 5207. SQL\u0026gt; SQL\u0026gt; SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN (\u0026#39;PAGE_SIZE\u0026#39;, \u0026#39;GLOBAL_PAGE_SIZE\u0026#39;);2 3 LINEID PARA_NAME PARA_VALUE ---------- ---------------- ---------- 1 GLOBAL_PAGE_SIZE 8192 used time: 3.999(ms). Execute id is 5209. SQL\u0026gt; SELECT TABLESPACE_NAME, FILE_NAME, BYTES / 1024 / 1024 AS MB FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = \u0026#39;TBS_TEST\u0026#39;;2 3 4 5 LINEID TABLESPACE_NAME FILE_NAME MB ---------- --------------- ----------------------------- -------------------- 1 TBS_TEST /dmdata/DAMENG/TBS_TEST01.DBF 32 used time: 4.416(ms). Execute id is 5210. SQL\u0026gt; 这里需要重点说明：DROP 前记录的 HEADER_FILE、HEADER_BLOCK、BLOCKS、EXTENTS 以及 DBA_EXTENTS 中的 BLOCK_ID、BLOCKS，是 DROP 后继续分析数据文件残留的重要依据。DROP 后表对象不存在，普通数据字典已经无法再告诉我们原来的表段在哪里。\n4.3 DROP 前验证数据已经写入 DBF 文件 # DROP 前，先验证测试数据确实已经写入 /dmdata/DAMENG/TBS_TEST01.DBF 数据文件。\n第一种方式：根据 DBA_EXTENTS 生成精确扫描命令。\nSELECT \u0026#39;dd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=\u0026#39; || BLOCK_ID || \u0026#39; count=\u0026#39; || BLOCKS || \u0026#39; 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head\u0026#39; AS SCAN_CMD FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID; 将输出的命令复制到操作系统执行。例如：\ndd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=16 count=2 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head 如果 DBA_EXTENTS 返回的范围较小，而 DBA_SEGMENTS.BLOCKS 显示表段实际记录的块数较大，也可以结合 HEADER_BLOCK 和 BLOCKS 扩大扫描范围。例如：\ndd if=/dmdata/DAMENG/TBS_TEST01.DBF bs=8192 skip=16 count=192 2\u0026gt;/dev/null | strings -a | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head 第二种方式：直接扫描整个表空间数据文件。\nstrings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head 结果如下：\n[dmdba@dameng-srv ~]$ strings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head DM_DROP_TEST_20260706_21 DM_DROP_TEST_20260706_22 DM_DROP_TEST_20260706_23 DM_DROP_TEST_20260706_24 DM_DROP_TEST_20260706_25 DM_DROP_TEST_20260706_26 DM_DROP_TEST_20260706_27 DM_DROP_TEST_20260706_28 DM_DROP_TEST_20260706_29 DM_DROP_TEST_20260706_30 [dmdba@dameng-srv ~]$ 说明 DROP 前测试数据已经写入数据文件。\n这里的意义是：后续如果 DROP 后仍然能够在同一个 DBF 文件中找到这些字符串，就可以证明 DROP 不等于立即物理清零数据文件。\n4.4 开启 10002 trace 执行 DROP TABLE # 为了观察 DROP TABLE 在达梦内部涉及的字典操作和段管理动作，继续开启 10002 trace。\nCONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 --开启 10002 trace ALTER SESSION SET EVENTS \u0026#39;10002 trace name context forever,level 1\u0026#39;; --执行 DROP DROP TABLE T_TEST; --关闭 10002 trace ALTER SESSION SET EVENTS \u0026#39;10002 trace name context off\u0026#39;; --记录当前 sessid SELECT SESSID; --查询 trace 文件路径 SHOW PARAMETER TRACE_PATH; 进入 trace 目录：\ncd /dmdata/DAMENG/trace ls -ltrh ls -lh *你的SESSID*.trc cat *你的SESSID*.trc 结果如下：\nSQL\u0026gt; CONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 Server[127.0.0.1:5236]:mode is normal, state is open login used time : 2.492(ms) SQL\u0026gt; ALTER SESSION SET EVENTS \u0026#39;10002 trace name context forever,level 1\u0026#39;; executed successfully used time: 2.449(ms). Execute id is 5601. SQL\u0026gt; DROP TABLE T_TEST; executed successfully used time: 18.135(ms). Execute id is 5602. SQL\u0026gt; ALTER SESSION SET EVENTS \u0026#39;10002 trace name context off\u0026#39;; executed successfully used time: 2.722(ms). Execute id is 5603. SQL\u0026gt; SELECT SESSID; LINEID SESSID ---------- -------------------- 1 140553811567016 used time: 0.520(ms). Execute id is 5604. SQL\u0026gt; SHOW PARAMETER TRACE_PATH; LINEID para_name para_value ---------- ---------- -------------------- 1 TRACE_PATH /dmdata/DAMENG/trace SQL\u0026gt; exit [dmdba@dameng-srv ~]$ cd /dmdata/DAMENG/trace [dmdba@dameng-srv trace]$ ls -ltrh total 20K -rw-r--r-- 1 dmdba dinstall 4.9K Jul 6 14:21 DMSERVER_0706_1421_128256296.trc -rw-r--r-- 1 dmdba dinstall 11K Jul 6 15:42 DMSERVER_0706_1542_140553811567016.trc [dmdba@dameng-srv trace]$ cat DMSERVER_0706_1542_140553811567016.trc DM Database Server x64 V8[03134284336-20250117-257733-20132], Jan 22 2025 09:16:16 built. *** 2026-07-06 15:42:47.677000000 *** Start trace 10002 event [SESSION ID:140553811567016] *** [DDL SQL]: DROP TABLE T_TEST; [EQUIVALENT DML SQL]: { SF_LOCK_APPLY_ID(); { { INT V_DC_FLAG_LEVEL; INT ISO_LEVEL = -1; try{ V_DC_FLAG_LEVEL = SF_RESET_DDLCOMMIT_FLAG(); { PROCEDURE SP_CHECK_IS_DBMS_AQADM_TABLE() AS pkg_exist BIGINT; tab_exist BIGINT; BEGIN SELECT COUNT(*) INTO pkg_exist FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;DBMS_AQADM\u0026#39; AND SUBTYPE$ = \u0026#39;PKG\u0026#39; AND VALID = \u0026#39;Y\u0026#39; AND SCHID = SF_GET_SCHEMA_ID_BY_NAME(\u0026#39;SYS\u0026#39;); IF pkg_exist \u0026gt; 0 THEN EXECUTE IMMEDIATE \u0026#39;SELECT COUNT(*) FROM SYS.AQ$_QUEUE_TABLES WHERE OBJNO=1066\u0026#39; INTO tab_exist; IF tab_exist \u0026gt; 0 THEN RAISE EXCEPTION(-24005, EXCEPTION_MOUT(-24005)); END IF; END IF; END; SP_CHECK_IS_DBMS_AQADM_TABLE(); } { SP_REPORT_DCT_VERSION(1066, 0, DATETIME \u0026#39;2026-07-06 14:00:02.12\u0026#39;); SF_DELETE_INDEX_MONITOR(150995949, 33555531, \u0026#39;USERS1\u0026#39;, \u0026#39;INDEX33555531\u0026#39;); SF_DELETE_INDEX_MONITOR_BY_TABID(1066); SF_LOCK_DICT(1056964608, 3, 0); SF_LOCK_DICT(150995949, 4, 0); SP_REPORT_DCT_VERSION(1066, 0, DATETIME \u0026#39;2026-07-06 14:00:02.12\u0026#39;); SF_LOCK_DICT(1066, 2, 0); SF_REPORT_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 1); { INT TMP_CNT; SELECT COUNT(*) INTO TMP_CNT FROM SYS.SYSOBJECTS WHERE TYPE$=\u0026#39;SCHOBJ\u0026#39; AND SCHID = 150994944 AND NAME = \u0026#39;SYSSTATTABLEIDU\u0026#39;; IF (TMP_CNT == 1) { EXECUTE IMMEDIATE \u0026#39;DELETE FROM SYS.SYSSTATTABLEIDU WHERE ID = 1066\u0026#39;; } SELECT COUNT(*) INTO TMP_CNT FROM SYS.SYSOBJECTS WHERE TYPE$=\u0026#39;SCHOBJ\u0026#39; AND SCHID = 150994944 AND NAME = \u0026#39;SYSSTATPREFS\u0026#39;; IF (TMP_CNT == 1) EXECUTE IMMEDIATE \u0026#39;DELETE FROM SYS.SYSSTATPREFS WHERE ID = 1066\u0026#39;; SELECT COUNT(*) INTO TMP_CNT FROM SYS.SYSOBJECTS WHERE TYPE$=\u0026#39;SCHOBJ\u0026#39; AND SCHID = 150994944 AND NAME = \u0026#39;SYSMODIFICATIONS\u0026#39;; IF (TMP_CNT == 1) EXECUTE IMMEDIATE \u0026#39;DELETE FROM SYS.SYSMODIFICATIONS WHERE ID = 1066 OR ROOT_ID = 1066 OR BASE_ID = 1066\u0026#39;; SP_MODIFY_AUTO_STAT_OBJ(\u0026#39;D\u0026#39;, 1066, NULL, NULL); SP_MODIFY_MON_MODS(\u0026#39;D\u0026#39;, 1066, -1, -1, NULL); } { PROCEDURE SP_INVALID_DEP_OBJ(OBJID INT) AS TYPE REC IS RECORD(SCHID INT, ID INT, TYPE$ VARCHAR(10), SUBTYPE$ VARCHAR(10), NAME VARCHAR(128)); TYPE REC_TAB IS TABLE OF REC; TYPE INT_ARR_T IS TABLE OF INT; ID_ARR INT_ARR_T; OBJ_TAB REC_TAB; BEGIN SELECT /*+CNNTB_OPT_FLAG(1)*/ DISTINCT D.ID BULK COLLECT INTO ID_ARR FROM SYS.SYSDEPENDENCIES D CONNECT BY NOCYCLE PRIOR D.ID = D.REFED_ID AND PRIOR D.TYPE$ NOT IN (\u0026#39;PACKAGE_BODY\u0026#39;,\u0026#39;CLASS_BODY\u0026#39;) AND D.TYPE$ IN (\u0026#39;VIEW\u0026#39;, \u0026#39;PROCEDURE\u0026#39;,\u0026#39;FUNCTION\u0026#39;,\u0026#39;PACKAGE\u0026#39;,\u0026#39;PACKAGE_BODY\u0026#39;,\u0026#39;CLASS\u0026#39;,\u0026#39;CLASS_BODY\u0026#39;,\u0026#39;TYPE\u0026#39;,\u0026#39;JCLASS\u0026#39;,\u0026#39;TRIGGER\u0026#39;,\u0026#39;OPERATOR\u0026#39;,\u0026#39;MATERIALIZED VIEW\u0026#39;) START WITH D.REFED_ID = OBJID AND D.TYPE$ IN (\u0026#39;VIEW\u0026#39;, \u0026#39;PROCEDURE\u0026#39;,\u0026#39;FUNCTION\u0026#39;,\u0026#39;PACKAGE\u0026#39;,\u0026#39;PACKAGE_BODY\u0026#39;,\u0026#39;CLASS\u0026#39;,\u0026#39;CLASS_BODY\u0026#39;,\u0026#39;TYPE\u0026#39;,\u0026#39;JCLASS\u0026#39;,\u0026#39;TRIGGER\u0026#39;,\u0026#39;OPERATOR\u0026#39;,\u0026#39;MATERIALIZED VIEW\u0026#39;); SELECT O.SCHID, O.ID, O.TYPE$, O.SUBTYPE$ ,O.NAME BULK COLLECT INTO OBJ_TAB FROM SYS.SYSOBJECTS O WHERE O.ID IN (SELECT * FROM TABLE(ID_ARR)) AND SF_IS_SYSTEM_OBJECT(O.ID, O.INFO1, O.SUBTYPE$) = 0; FOR I IN 1..OBJ_TAB.COUNT LOOP SF_LOCK_DICT_EX(OBJ_TAB[I].ID, 2); END LOOP; UPDATE /*+MULTI_IN_CVT_EXISTS(0) ENABLE_RQ_TO_INV(0)*/ SYS.SYSOBJECTS O SET VALID=\u0026#39;N\u0026#39; WHERE (O.TYPE$, O.SCHID, O.NAME) IN (SELECT TYPE$, SCHID, NAME FROM TABLE(OBJ_TAB)) AND O.VALID = \u0026#39;Y\u0026#39; AND O.SUBTYPE$ IN (\u0026#39;VIEW\u0026#39;,\u0026#39;PROC\u0026#39;,\u0026#39;PKG\u0026#39;,\u0026#39;TRIG\u0026#39;,\u0026#39;CLASS\u0026#39;,\u0026#39;TYPE\u0026#39;,\u0026#39;JCLASS\u0026#39;); FOR I IN 1..OBJ_TAB.COUNT LOOP SF_REMOVE_DICT_OBJ(OBJ_TAB[I].SCHID, OBJ_TAB[I].ID, OBJ_TAB[I].TYPE$, OBJ_TAB[I].SUBTYPE$, 1); END LOOP; END; SP_INVALID_DEP_OBJ(1066); } DELETE FROM SYS.SYSDEPENDENCIES WHERE ID=1066; { PROCEDURE SP_REMOVE_MV_DICT_BY_BASE_TID(OBJID INT) AS TYPE REC IS RECORD(SCHID INT, ID INT); TYPE REC_MV IS TABLE OF REC; OBJ_MV REC_MV; BEGIN SELECT B.SCHID, B.ID BULK COLLECT INTO OBJ_MV FROM SYS.SYSDEPENDENCIES A, SYS.SYSOBJECTS B WHERE A.REFED_ID=OBJID AND A.TYPE$=\u0026#39;MATERIALIZED VIEW\u0026#39; AND A.REFED_TYPE$=\u0026#39;TABLE\u0026#39; AND A.ID = B.ID AND B.TYPE$ = \u0026#39;SCHOBJ\u0026#39; AND B.SUBTYPE$ = \u0026#39;VIEW\u0026#39;; FOR I IN 1..OBJ_MV.COUNT LOOP SF_REMOVE_DICT_OBJ(OBJ_MV[I].SCHID, OBJ_MV[I].ID, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;VIEW\u0026#39;, 1); END LOOP; END; SP_REMOVE_MV_DICT_BY_BASE_TID(1066); } DELETE FROM SYS.SYSDEPENDENCIES WHERE REFED_ID=1066 AND TYPE$=\u0026#39;MATERIALIZED VIEW\u0026#39; AND REFED_TYPE$=\u0026#39;TABLE\u0026#39;; DELETE FROM SYS.SYSGRANTS WHERE OBJID = 1066; SP_REMOVE_PCK_CACHE(-1, 1066, 0); DELETE FROM SYS.SYSINDEXES WHERE ID = 33555530 CHECK LIMIT 1; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;INDEX33555530\u0026#39; AND TYPE$ = \u0026#39;TABOBJ\u0026#39; AND SCHID = 150995949 CHECK LIMIT 1; DELETE FROM SYS.SYSOBJINFOS WHERE ID = 33555530; DELETE FROM SYS.SYSINDEXES WHERE ID = 33555531 CHECK LIMIT 1; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;INDEX33555531\u0026#39; AND TYPE$ = \u0026#39;TABOBJ\u0026#39; AND SCHID = 150995949 CHECK LIMIT 1; DELETE FROM SYS.SYSOBJINFOS WHERE ID = 33555531; DELETE FROM SYS.SYSOBJINFOS WHERE ID = 1066; { UPDATE SYS.SYSCOLUMNS SET NULLABLE$ = \u0026#39;Y\u0026#39; WHERE ID = 1066 AND COLID = 0; { SF_DELETE_INDEX_MONITOR(150995949, 33555531, \u0026#39;USERS1\u0026#39;, \u0026#39;INDEX33555531\u0026#39;); DELETE FROM SYS.SYSINDEXES WHERE ID = 33555531; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;INDEX33555531\u0026#39; AND ID = 33555531 AND SCHID = 150995949 AND TYPE$ = \u0026#39;TABOBJ\u0026#39; AND SUBTYPE$ = \u0026#39;INDEX\u0026#39; AND PID = 1066; DELETE FROM SYS.SYSOBJINFOS WHERE ID = 33555531; DELETE FROM SYS.SYSSTATS WHERE ID = 33555531 AND COLID = 0 AND T_FLAG = \u0026#39;I\u0026#39;; } DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;PK_T_TEST\u0026#39; AND SCHID = 150995949 AND TYPE$ = \u0026#39;TABOBJ\u0026#39;; DELETE FROM SYS.SYSCONS WHERE ID = 134218808; } DELETE FROM SYS.SYSOBJINFOS WHERE ID \u0026gt; 234881024 AND INT_VALUE = 1066 AND TYPE$ = \u0026#39;CLSREF\u0026#39;; DELETE FROM SYS.SYSTEXTS WHERE ID IN (SELECT ID FROM SYS.SYSOBJECTS INDEX SYSINDEXPIDIDSYSOBJECTS WHERE PID = 1066 AND SUBTYPE$=\u0026#39;TRIG\u0026#39;); DELETE FROM SYS.SYSOBJINFOS WHERE ID IN (SELECT ID FROM SYS.SYSOBJECTS INDEX SYSINDEXPIDIDSYSOBJECTS WHERE PID = 1066 AND SUBTYPE$=\u0026#39;TRIG\u0026#39;); DELETE FROM SYS.SYSOBJECTS INDEX SYSINDEXPIDIDSYSOBJECTS WHERE PID = 1066 AND SUBTYPE$=\u0026#39;TRIG\u0026#39;; { DELETE FROM SYS.SYSSTATS WHERE ID = 1066; DELETE FROM SYS.SYSMSTATS WHERE ID = 1066; DELETE FROM SYS.SYSSTATS WHERE ID = 33555530 AND COLID = 0 AND T_FLAG = \u0026#39;I\u0026#39;; DELETE FROM SYS.SYSSTATS WHERE ID = 33555531 AND COLID = 0 AND T_FLAG = \u0026#39;I\u0026#39;; } DELETE FROM SYS.SYSTABLECOMMENTS WHERE SCHNAME = \u0026#39;USERS1\u0026#39; AND TVNAME = \u0026#39;T_TEST\u0026#39;; DELETE FROM SYS.SYSCOLUMNCOMMENTS WHERE SCHNAME = \u0026#39;USERS1\u0026#39; AND TVNAME = \u0026#39;T_TEST\u0026#39;; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;T_TEST\u0026#39; AND TYPE$ = \u0026#39;SCHOBJ\u0026#39; AND SCHID = 150995949 CHECK LIMIT 1; DELETE FROM SYS.SYSFCOLDEFAULT WHERE TABID = 1066; DELETE FROM SYS.SYSCOLUMNS WHERE ID = 1066; DELETE FROM SYS.SYSCOLINFOS WHERE ID = 1066; DELETE FROM SYS.SYSCOLCYT WHERE TID = 1066; DELETE FROM SYS.SYSFECOLS WHERE TID = 1066; DELETE FROM SYS.SYSCOLBYUSER WHERE TID = 1066; SF_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 1); SF_DELETE_SPACELIMIT_NODE(1066); DELETE FROM SYS.POLICY_GROUPS WHERE OBJID = 1066; DELETE FROM SYS.POLICIES WHERE OBJID = 1066; DELETE FROM SYS.POLICY_CONTEXTS WHERE OBJID = 1066; DELETE FROM SYS.POLICY_COLS WHERE OBJID = 1066; DELETE FROM SYS.POLICY_MASKS WHERE OBJID = 1066; SF_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 1); EXECUTE IMMEDIATE \u0026#39;SF_DELETE_OBJ_PGRP_NODE(1066, 0)\u0026#39;; DELETE FROM SYSAUDITOR.SYSAUDIT WHERE TVPID = 1066; { PROCEDURE SP_REMOVE_STORE_PLN_BY_OBJID(OBJID_IN INT, V_SCHID INT, V_TABNAME VARCHAR) AS IS_EXISTS INT; SQLSTR STRING; BEGIN SELECT COUNT(*) INTO IS_EXISTS FROM SYS.SYSOBJECTS WHERE TYPE$=\u0026#39;SCHOBJ\u0026#39; AND SCHID = V_SCHID AND NAME = V_TABNAME; IF (IS_EXISTS != 0) THEN BEGIN SQLSTR = \u0026#39;DECLARE TYPE ID_ARR IS TABLE OF BIGINT; TYPE INT_ARR IS TABLE OF INT; TYPE STR_ARR IS TABLE OF VARCHAR(1000); PLN_ID_ARR ID_ARR; SQLSTR_ARR STR_ARR; SCHID_ARR INT_ARR; HASH_VALUE_ARR INT_ARR; BEGIN SELECT PLN_ID BULK COLLECT INTO PLN_ID_ARR FROM SYS.SYSPLNOBJID WHERE OBJID = \u0026#39;|| OBJID_IN ||\u0026#39;; IF PLN_ID_ARR.COUNT \u0026gt; 0 THEN SELECT SCHID, HASH_VALUE, SQLSTR BULK COLLECT INTO SCHID_ARR, HASH_VALUE_ARR, SQLSTR_ARR FROM SYS.SYSPLNINFO WHERE PLN_ID IN (SELECT * FROM TABLE(PLN_ID_ARR)); DELETE FROM SYS.SYSPLNINFO WHERE PLN_ID IN (SELECT * FROM TABLE(PLN_ID_ARR)); DELETE FROM SYS.SYSPLNOBJID WHERE PLN_ID IN (SELECT * FROM TABLE(PLN_ID_ARR)); FOR I IN 1..SQLSTR_ARR.COUNT LOOP SP_REMOVE_STORE_PLN_INNER(SCHID_ARR[I], HASH_VALUE_ARR[I], SQLSTR_ARR[I]); END LOOP; END IF; END;\u0026#39;; EXECUTE IMMEDIATE SQLSTR; END; END IF; END; SP_REMOVE_STORE_PLN_BY_OBJID(1066, 150994944, \u0026#39;SYSPLNINFO\u0026#39;); } SP_DCT_TAB_DDL_REG(1066, 1, 0); } SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); } catch (exception ex){ SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); SF_SET_GEN_INS_UREC_FLAG(1); if (ISO_LEVEL != -1) SF_SET_TRX_ISO_LEVEL(ISO_LEVEL); throw; } } SF_LOCK_APPLY_ID(); COMMIT; }} -------------------------- END -------------------------- *** 2026-07-06 15:42:51.287000000 *** Start trace 10002 event [SESSION ID:140553811567016] *** [DDL SQL]: ALTER SESSION SET EVENTS \u0026#39;10002 trace name context off\u0026#39;; [EQUIVALENT DML SQL]: { { INT V_DC_FLAG_LEVEL; INT ISO_LEVEL = -1; try{ V_DC_FLAG_LEVEL = SF_RESET_DDLCOMMIT_FLAG(); SP_SESS_SET_TRACE_EVENT(0, 10002, 1, 1, 0); COMMIT; SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); } catch (exception ex){ SP_RESTORE_DDLCOMMIT_FLAG(V_DC_FLAG_LEVEL); SF_SET_GEN_INS_UREC_FLAG(1); if (ISO_LEVEL != -1) SF_SET_TRX_ISO_LEVEL(ISO_LEVEL); throw; } } } -------------------------- END -------------------------- [root@dameng-srv trace]# 4.5 DROP 后验证 SQL 和字典层面对象是否存在 # DROP 后，先从 SQL 层面验证表是否还存在。\nCONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 SELECT COUNT(1) FROM T_TEST; 查询数据字典：\nSELECT OWNER, TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES WHERE OWNER = \u0026#39;USERS1\u0026#39; AND TABLE_NAME = \u0026#39;T_TEST\u0026#39;; 继续查询段信息：\nSELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;; 继续查询 extent 信息：\nSELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID; 结果如下：\nSQL\u0026gt; CONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 Server[127.0.0.1:5236]:mode is normal, state is open login used time : 2.422(ms) SQL\u0026gt; SELECT COUNT(1) FROM T_TEST; SELECT COUNT(1) FROM T_TEST; [-2106]:Error in line: 1 Invalid table or view name [T_TEST]. used time: 2.332(ms). Execute id is 0. SQL\u0026gt; SELECT OWNER, TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES WHERE OWNER = \u0026#39;USERS1\u0026#39; AND TABLE_NAME = \u0026#39;T_TEST\u0026#39;;2 3 4 5 6 no rows used time: 12.889(ms). Execute id is 6001. SQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, HEADER_FILE, HEADER_BLOCK, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39;;2 3 4 5 6 7 8 9 10 no rows used time: 41.757(ms). Execute id is 6002. SQL\u0026gt; SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = \u0026#39;USERS1\u0026#39; AND SEGMENT_NAME = \u0026#39;T_TEST\u0026#39; ORDER BY FILE_ID, BLOCK_ID;2 3 4 5 6 7 8 9 10 11 no rows used time: 24.004(ms). Execute id is 6003. SQL\u0026gt; 这说明：\nDROP TABLE 后，T_TEST 表对象已经从数据字典中删除； DBA_TABLES 中已经看不到该表； DBA_SEGMENTS 中已经看不到该表段； DBA_EXTENTS 中也已经看不到属于该表的 extent 信息； 正常 SQL 已经无法再访问 USERS1.T_TEST。 这里需要特别强调：DBA_TABLES、DBA_SEGMENTS、DBA_EXTENTS 查不到 T_TEST，只能说明对象和段映射关系在数据库字典层面已经不存在，不能直接说明数据文件中的旧行内容已经被物理清零。\n4.6 DROP 后用 strings 验证数据文件是否仍有残留 # DROP 后，不能再通过 DBA_EXTENTS 查询 T_TEST 的当前位置，因为对象已经不存在。因此，DROP 后验证数据文件残留时，主要依赖两类方式：\n第一种方式：扫描整个表空间数据文件。\nstrings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head 再扫描 payload：\nstrings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;BEFORE_DROP_20260706_\u0026#34; | head 结果如下：\n[dmdba@dameng-srv ~]$ strings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;DM_DROP_TEST_20260706_\u0026#34; | head DM_DROP_TEST_20260706_1 DM_DROP_TEST_20260706_2 DM_DROP_TEST_20260706_3 DM_DROP_TEST_20260706_4 DM_DROP_TEST_20260706_5 DM_DROP_TEST_20260706_6 DM_DROP_TEST_20260706_7 DM_DROP_TEST_20260706_8 DM_DROP_TEST_20260706_9 DM_DROP_TEST_20260706_10 [dmdba@dameng-srv ~]$ strings -a /dmdata/DAMENG/TBS_TEST01.DBF | grep \u0026#34;BEFORE_DROP_20260706_\u0026#34; | head BEFORE_DROP_20260706_1_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_2_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_3_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_4_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_5_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_6_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_7_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_8_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_9_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BEFORE_DROP_20260706_10_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB [dmdba@dameng-srv ~]$ DROP TABLE 后，只是删除对象和释放空间，并没有立即清零原数据块。数据文件中仍然残留 DROP 前写入的历史行内容。\n4.7 DROP TABLE 的 10002 trace 分析 # 本次实验对 DROP TABLE T_TEST; 开启了 10002 trace。从 trace 可以看到，达梦将该 DDL 展开为一系列等价的内部字典操作。\ntrace 开头明确记录：\n[DDL SQL]: DROP TABLE T_TEST; 本次 DROP 操作涉及的核心对象编号如下：\n表对象 ：T_TEST 表对象 ID ：1066 模式 ID ：150995949 相关索引 ID ：33555530、33555531 主键约束 ：PK_T_TEST 约束 ID ：134218808 从 trace 内容看，DROP TABLE 的内部处理大致可以分为以下几个阶段。\n第一，进入 DDL 处理流程并加字典锁：\nSF_LOCK_APPLY_ID(); V_DC_FLAG_LEVEL = SF_RESET_DDLCOMMIT_FLAG(); SF_LOCK_DICT(1056964608, 3, 0); SF_LOCK_DICT(150995949, 4, 0); SF_LOCK_DICT(1066, 2, 0); 这说明 DROP TABLE 是 DDL 级别操作，需要锁定相关字典对象，防止并发 DDL 或对象访问影响删除过程。\n第二，检查特殊对象类型，例如是否为队列表：\nSP_CHECK_IS_DBMS_AQADM_TABLE(); 该过程会检查 DBMS_AQADM 以及 SYS.AQ$_QUEUE_TABLES，判断当前对象是否属于高级队列相关表。如果是特殊队列表，需要走专门管理流程。本实验中的 T_TEST 是普通用户表，因此检查后继续执行 DROP。\n第三，处理字典版本和对象缓存：\nSP_REPORT_DCT_VERSION(1066, 0, DATETIME \u0026#39;2026-07-06 14:00:02.12\u0026#39;); SF_REPORT_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 1); SF_REMOVE_DICT_OBJ(150995949, 1066, \u0026#39;SCHOBJ\u0026#39;, \u0026#39;UTAB\u0026#39;, 1); 这说明 DROP 会报告或更新对象字典版本，并将 T_TEST 从字典缓存中移除。DROP 后，SQL 解析阶段已经无法再通过 USERS1.T_TEST 找到原表对象。\n第四，清理统计信息和对象修改监控信息：\nDELETE FROM SYS.SYSSTATTABLEIDU WHERE ID = 1066; DELETE FROM SYS.SYSSTATPREFS WHERE ID = 1066; DELETE FROM SYS.SYSMODIFICATIONS WHERE ID = 1066 OR ROOT_ID = 1066 OR BASE_ID = 1066; SP_MODIFY_AUTO_STAT_OBJ(\u0026#39;D\u0026#39;, 1066, NULL, NULL); SP_MODIFY_MON_MODS(\u0026#39;D\u0026#39;, 1066, -1, -1, NULL); 后续还可以看到：\nDELETE FROM SYS.SYSSTATS WHERE ID = 1066; DELETE FROM SYS.SYSMSTATS WHERE ID = 1066; DELETE FROM SYS.SYSSTATS WHERE ID = 33555530 AND COLID = 0 AND T_FLAG = \u0026#39;I\u0026#39;; DELETE FROM SYS.SYSSTATS WHERE ID = 33555531 AND COLID = 0 AND T_FLAG = \u0026#39;I\u0026#39;; 这些操作说明，DROP 会清理该表及其索引相关的统计信息、统计偏好设置和修改监控记录。\n第五，处理依赖对象。trace 中定义并调用了：\nPROCEDURE SP_INVALID_DEP_OBJ(OBJID INT) ... SP_INVALID_DEP_OBJ(1066); 该过程会从 SYS.SYSDEPENDENCIES 中查找依赖当前表的视图、过程、函数、包、触发器、物化视图等对象，将相关依赖对象置为无效，并移除字典缓存：\nUPDATE SYS.SYSOBJECTS O SET VALID=\u0026#39;N\u0026#39; ... SF_REMOVE_DICT_OBJ(...); 随后继续清理依赖关系：\nDELETE FROM SYS.SYSDEPENDENCIES WHERE ID=1066; DELETE FROM SYS.SYSDEPENDENCIES WHERE REFED_ID=1066 AND TYPE$=\u0026#39;MATERIALIZED VIEW\u0026#39; AND REFED_TYPE$=\u0026#39;TABLE\u0026#39;; 这说明 DROP 表时，不只是删除表本身，还会处理依赖该表的其他数据库对象。\n第六，清理对象授权和缓存：\nDELETE FROM SYS.SYSGRANTS WHERE OBJID = 1066; SP_REMOVE_PCK_CACHE(-1, 1066, 0); 这表示表对象上的授权信息以及相关包缓存会被删除或失效。\n第七，删除索引和主键约束。由于本实验表 T_TEST 创建了主键约束 PK_T_TEST，DROP 时会同时清理约束和相关索引：\nDELETE FROM SYS.SYSINDEXES WHERE ID = 33555530 CHECK LIMIT 1; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;INDEX33555530\u0026#39; AND TYPE$ = \u0026#39;TABOBJ\u0026#39; AND SCHID = 150995949 CHECK LIMIT 1; DELETE FROM SYS.SYSINDEXES WHERE ID = 33555531; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;INDEX33555531\u0026#39; AND ID = 33555531 AND SCHID = 150995949 AND TYPE$ = \u0026#39;TABOBJ\u0026#39; AND SUBTYPE$ = \u0026#39;INDEX\u0026#39; AND PID = 1066; DELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;PK_T_TEST\u0026#39; AND SCHID = 150995949 AND TYPE$ = \u0026#39;TABOBJ\u0026#39;; DELETE FROM SYS.SYSCONS WHERE ID = 134218808; 这说明 DROP 表时，表上的索引对象、主键约束对象、索引统计信息、索引监控信息也会一并删除。\n第八，删除表自身的对象和列定义。trace 中最核心的删除表对象入口语句是：\nDELETE FROM SYS.SYSOBJECTS WHERE NAME = \u0026#39;T_TEST\u0026#39; AND TYPE$ = \u0026#39;SCHOBJ\u0026#39; AND SCHID = 150995949 CHECK LIMIT 1; 随后清理列定义和列属性：\nDELETE FROM SYS.SYSFCOLDEFAULT WHERE TABID = 1066; DELETE FROM SYS.SYSCOLUMNS WHERE ID = 1066; DELETE FROM SYS.SYSCOLINFOS WHERE ID = 1066; DELETE FROM SYS.SYSCOLCYT WHERE TID = 1066; DELETE FROM SYS.SYSFECOLS WHERE TID = 1066; DELETE FROM SYS.SYSCOLBYUSER WHERE TID = 1066; 同时还会清理表注释和列注释：\nDELETE FROM SYS.SYSTABLECOMMENTS WHERE SCHNAME = \u0026#39;USERS1\u0026#39; AND TVNAME = \u0026#39;T_TEST\u0026#39;; DELETE FROM SYS.SYSCOLUMNCOMMENTS WHERE SCHNAME = \u0026#39;USERS1\u0026#39; AND TVNAME = \u0026#39;T_TEST\u0026#39;; 这说明 DROP 后，不只是表数据不可见，表对象定义、列定义、约束、索引和注释等元数据也会从数据字典中删除。\n第九，清理策略、审计、空间限制和执行计划信息：\nSF_DELETE_SPACELIMIT_NODE(1066); DELETE FROM SYS.POLICY_GROUPS WHERE OBJID = 1066; DELETE FROM SYS.POLICIES WHERE OBJID = 1066; DELETE FROM SYS.POLICY_CONTEXTS WHERE OBJID = 1066; DELETE FROM SYS.POLICY_COLS WHERE OBJID = 1066; DELETE FROM SYS.POLICY_MASKS WHERE OBJID = 1066; DELETE FROM SYSAUDITOR.SYSAUDIT WHERE TVPID = 1066; SP_REMOVE_STORE_PLN_BY_OBJID(1066, 150994944, \u0026#39;SYSPLNINFO\u0026#39;); 最后执行 DDL 注册并提交：\nSP_DCT_TAB_DDL_REG(1066, 1, 0); COMMIT; 这说明 DROP TABLE 是一次完整提交的 DDL 操作，不能通过普通 ROLLBACK 撤销。\n从整个 10002 trace 看，DROP TABLE T_TEST 的主体动作是：\n加锁； 检查对象状态； 处理字典版本； 清理统计信息； 置无效依赖对象； 删除依赖关系； 删除授权； 删除索引； 删除主键约束； 删除表对象入口； 删除列定义； 删除注释； 删除策略、审计、计划、缓存； 注册 DDL； COMMIT。 trace 中没有看到对 USERS1.T_TEST 执行逐行删除的动作，也没有看到对 /dmdata/DAMENG/TBS_TEST01.DBF 数据文件进行物理清零的动作。因此，本次 trace 支持如下判断：\nDROP TABLE 是对象级 DDL 操作，核心是删除对象字典入口并释放段空间。 它不是普通 DELETE，也不是对数据文件中旧行内容执行物理擦除。 DROP 后，SQL 和字典层面已经无法访问原表。 但只要原数据块没有被后续写入覆盖，数据文件中仍可能残留历史行内容。 4.8 DROP 实验结论 # 通过 DROP 实验，可以得到以下结论：\nDROP TABLE T_TEST 后，正常 SQL 无法再访问 USERS1.T_TEST。 DBA_TABLES 中查不到 T_TEST，说明表对象已经从数据库字典中删除。 DBA_SEGMENTS 中查不到 T_TEST，说明表段已经不再作为一个可见段挂在该对象名下。 DBA_EXTENTS 中查不到 T_TEST，说明原来属于该表的 extent 已经无法再通过表名查询。 这些字典层面的消失，只能说明对象和段映射关系被删除，不能直接证明数据文件中的历史内容被物理清零。 如果 DROP 后扫描 /dmdata/DAMENG/TBS_TEST01.DBF 仍然可以看到 DM_DROP_TEST_20260706_ 测试标记，说明 DROP 后数据文件中仍有旧数据残留。 如果 DROP 后扫描不到测试标记，也只能说明当前扫描范围内没有找到可识别字符串，不能直接推出 DROP 一定会物理清零全部旧数据。 因此，DROP 的本质可以概括为：\nDROP TABLE 删除的是表对象和相关字典映射关系，并释放该对象占用的段空间。 但释放空间不等于立即物理清零数据文件。 只要旧数据块没有被后续对象或新数据覆盖，数据文件中仍可能残留历史行内容，具备离线恢复的可能。 五、TRUNCATE 与 DROP 对比分析 # 通过前面的实验可以看出，TRUNCATE 和 DROP 都会让数据在 SQL 层面不可见，但二者在对象保留、字典变化、段空间处理和恢复条件上存在明显区别。\n对比项 TRUNCATE TABLE DROP TABLE SQL 查询结果 表仍然存在，但数据行数变为 0 表对象不存在，查询时报对象或视图不存在 表对象是否保留 保留 不保留 DBA_TABLES 中是否可见 可见 不可见 DBA_SEGMENTS 中是否可见 通常仍可见 不可见 DBA_EXTENTS 中是否可见 可见，但只反映 TRUNCATE 后当前仍属于该表的 extent 不可见 段头位置 HEADER_FILE、HEADER_BLOCK 通常保持不变 表对象删除后，无法再通过表名查询段头 段空间变化 BLOCKS、EXTENTS 明显变小，说明段空间被重置或释放 原表段映射关系被删除，空间被释放为可重新分配状态 是否逐行 DELETE 否 否 是否普通 ROLLBACK 可恢复 否 否 10002 trace 重点 TRUNCTIME、SF_TRUNC_TABLE、SP_DCT_TAB_DDL_REG、COMMIT 删除 SYSOBJECTS、SYSCOLUMNS、SYSINDEXES、SYSCONS、SYSSTATS、SYSDEPENDENCIES、SYSGRANTS 等字典信息，并 COMMIT 对索引和约束的影响 表对象和索引对象通常仍保留，只是数据被清空或段被重置 表对象、索引对象、主键约束、列定义等元数据都会被删除 数据文件是否立即清零 不一定，本实验中仍能扫描到 TRUNCATE 前测试字符串 不一定，本实验中仍能扫描到 DROP 前测试字符串 数据文件残留证据 strings -a /dmdata/DAMENG/TBS_TEST01.DBF 仍可看到 DM_TRUNCATE_TEST_20260706_ strings -a /dmdata/DAMENG/TBS_TEST01.DBF 仍可看到 DM_DROP_TEST_20260706_ 和 BEFORE_DROP_20260706_ 恢复难度 相对较低，因为表结构仍然存在，字段顺序、数据类型等信息还可查 相对较高，因为表对象和列定义等字典信息已经删除，需要依赖事前记录、备份、字典残留或人工重建表结构 恢复关键条件 原数据块未被覆盖，表结构仍可识别 原数据块未被覆盖，表结构、字段顺序、字段类型等元信息仍可获得或重建 本质概括 保留对象，重置表段 删除对象，释放段空间 综合来看，TRUNCATE 和 DROP 的共同点是：二者都不是逐行删除，也都不能通过普通 ROLLBACK 恢复；从数据文件层面看，二者都不等价于立即物理清零。\n二者的核心区别是：TRUNCATE 保留表对象，只是重置或释放表段空间；DROP 删除表对象及相关字典信息，并释放原表段空间。因此，DROP 后恢复难度通常高于 TRUNCATE，因为不仅要找回数据块，还要解决表结构和字典元数据缺失的问题。\n六、用 dmdul 拯救被 TRUNCATE 的表 # 前面的实验已经证明，TRUNCATE TABLE 会让表数据在 SQL 层面不可见，但并不会立即物理清零数据文件中的历史行内容。为了进一步验证这些残留数据是否真的具备恢复价值，本节使用自研工具 dmdul 对一张被 TRUNCATE 的测试表进行离线恢复实验。\n本节单独创建一张小表 USERS1.T_TRUNCATE_TEST，插入 100 行数据后执行 TRUNCATE，然后使用 dmdul 从数据文件中恢复。\n6.1 创建测试表并插入 100 行数据 # 使用 USERS1 用户创建测试表：\nCONN USERS1/\u0026#34;Users1@123\u0026#34;@127.0.0.1:5236 创建表：\nCREATE TABLE T_TRUNCATE_TEST ( ID INT, MARKER VARCHAR(200), PAYLOAD VARCHAR(1000), CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT PK_T_TRUNCATE_TEST PRIMARY KEY (ID) ) TABLESPACE TBS_TEST; 插入 100 行带有明显标记的数据：\nINSERT INTO T_TRUNCATE_TEST(ID, MARKER, PAYLOAD) SELECT LEVEL, \u0026#39;DMDUL_TRUNCATE_RECOVER_\u0026#39; || TO_CHAR(LEVEL), \u0026#39;DMDUL_BEFORE_TRUNCATE_\u0026#39; || TO_CHAR(LEVEL) || \u0026#39;_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39; FROM DUAL CONNECT BY LEVEL \u0026lt;= 100; COMMIT; 执行 checkpoint，将数据尽量刷入数据文件：\nSELECT CHECKPOINT(100); 检查数据：\nSELECT COUNT(*) FROM T_TRUNCATE_TEST; SELECT * FROM T_TRUNCATE_TEST WHERE ID \u0026lt;= 10 ORDER BY ID; 实验结果如下：\nSQL\u0026gt; CREATE TABLE T_TRUNCATE_TEST ( ID INT, MARKER VARCHAR(200), PAYLOAD VARCHAR(1000), CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT PK_T_TRUNCATE_TEST PRIMARY KEY (ID) ) TABLESPACE TBS_TEST; executed successfully used time: 31.952(ms). Execute id is 6501. SQL\u0026gt; INSERT INTO T_TRUNCATE_TEST(ID, MARKER, PAYLOAD) SELECT LEVEL, \u0026#39;DMDUL_TRUNCATE_RECOVER_\u0026#39; || TO_CHAR(LEVEL), \u0026#39;DMDUL_BEFORE_TRUNCATE_\u0026#39; || TO_CHAR(LEVEL) || \u0026#39;_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39; FROM DUAL CONNECT BY LEVEL \u0026lt;= 100; affect rows 100 SQL\u0026gt; COMMIT; executed successfully SQL\u0026gt; SELECT CHECKPOINT(100); LINEID CHECKPOINT(100) ---------- --------------- 1 0 SQL\u0026gt; SELECT COUNT(*) FROM T_TRUNCATE_TEST; LINEID COUNT(*) ---------- -------------------- 1 100 查询前 10 行可以看到测试标记：\nLINEID ID MARKER PAYLOAD CREATE_TIME ---------- ----------- ------------------------- ----------------------------------------------------------------- -------------------------- 1 1 DMDUL_TRUNCATE_RECOVER_1 DMDUL_BEFORE_TRUNCATE_1_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 2 2 DMDUL_TRUNCATE_RECOVER_2 DMDUL_BEFORE_TRUNCATE_2_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 3 3 DMDUL_TRUNCATE_RECOVER_3 DMDUL_BEFORE_TRUNCATE_3_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 4 4 DMDUL_TRUNCATE_RECOVER_4 DMDUL_BEFORE_TRUNCATE_4_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 5 5 DMDUL_TRUNCATE_RECOVER_5 DMDUL_BEFORE_TRUNCATE_5_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 6 6 DMDUL_TRUNCATE_RECOVER_6 DMDUL_BEFORE_TRUNCATE_6_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 7 7 DMDUL_TRUNCATE_RECOVER_7 DMDUL_BEFORE_TRUNCATE_7_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 8 8 DMDUL_TRUNCATE_RECOVER_8 DMDUL_BEFORE_TRUNCATE_8_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 9 9 DMDUL_TRUNCATE_RECOVER_9 DMDUL_BEFORE_TRUNCATE_9_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 10 10 DMDUL_TRUNCATE_RECOVER_10 DMDUL_BEFORE_TRUNCATE_10_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2026-07-06 17:25:15.535503 这一步说明，T_TRUNCATE_TEST 在 TRUNCATE 前确实有 100 行业务数据。\n6.2 执行 TRUNCATE # 执行 TRUNCATE：\nTRUNCATE TABLE T_TRUNCATE_TEST; 结果如下：\nSQL\u0026gt; TRUNCATE TABLE T_TRUNCATE_TEST; executed successfully used time: 6.412(ms). Execute id is 6507. 此时，从 SQL 层面看，T_TRUNCATE_TEST 已经被清空。\n建议补充执行以下 SQL 确认：\nSELECT COUNT(*) FROM T_TRUNCATE_TEST; 预期结果为：\nCOUNT(*) = 0 6.3 使用 dmdul 扫描数据库文件 # 查看 dmdul 版本：\n./dmdul version 结果如下：\n[dmdba@dameng-srv DAMENG]$ ./dmdul version dmdul v0.2.0 (6875da9) 进入 dmdul 交互模式：\n./dmdul [dmdba@dameng-srv DAMENG]$ ./dmdul version dmdul v0.2.0 (6875da9) [dmdba@dameng-srv DAMENG]$ ./dmdul dmdul: Release v0.2.0 - Dameng Data Unloader Tool Copyright (c) 2026 greatfinish. All rights reserved. https://github.com/greatfinish/dmdul Type help; for available commands. DMDUL\u0026gt; 配置 SYSTEM.DBF 和数据文件目录：\nDMDUL\u0026gt; set system /dmdata/DAMENG/SYSTEM.DBF; DMDUL\u0026gt; set data_dir /dmdata/DAMENG; DMDUL\u0026gt; set system /dmdata/DAMENG/SYSTEM.DBF; system = /dmdata/DAMENG/SYSTEM.DBF DMDUL\u0026gt; set data_dir /dmdata/DAMENG; data_dir = /dmdata/DAMENG DMDUL\u0026gt; 执行 bootstrap：\nDMDUL\u0026gt; bootstrap; 输出如下：\nDMDUL\u0026gt; bootstrap; bootstrap completed system file: /dmdata/DAMENG/SYSTEM.DBF control file: /dmdata/DAMENG/dm.ctl control.dul: /dmdata/DAMENG/control.dul (data files: 6) dictionary dir: /dmdata/DAMENG/dmdul_dict (users=5 tables=18 columns=92 views=4 sequences=1 routines=10 triggers=2 synonyms=11 tab_privs=25) page size: 8192 bytes extent size: 16 pages (u32 @ 0x80) page count: 9472 charset: UTF-8 (UNICODE_FLAG=1) (SYSTEM.DBF page 4 + 0x2D) charset parameter: utf-8 objects loaded: 1183 users loaded: 5 tables loaded: 18 columns loaded: 92 views loaded: 4 sequences loaded: 1 routines loaded: 10 triggers loaded: 2 synonyms loaded: 11 tab privileges loaded: 25 DMDUL\u0026gt; 这个结果说明，dmdul 已经成功读取 SYSTEM.DBF、dm.ctl 和数据文件目录，完成字典解析，并识别出当前数据库中的用户、表、列、视图、序列、存储对象、触发器、同义词和对象权限等信息。\n6.4 确认 dmdul 能识别被 TRUNCATE 的表 # 查看用户列表：\nDMDUL\u0026gt; list user; 输出如下：\nDMDUL\u0026gt; list user; dictionary source: SYSTEM.DBF dictionary dir: /dmdata/DAMENG/dmdul_dict dictionary rows: users=5 tables=18 columns=92 views=4 sequences=1 routines=10 triggers=2 synonyms=11 tab_privs=25 objects=1183 user tables APP_USER 0 HR_TEST 3 SY 1 SYSDBA 13 USERS1 1 DMDUL\u0026gt; 查看 USERS1 用户下的表：\nDMDUL\u0026gt; list table USERS1; 输出如下：\nDMDUL\u0026gt; list table USERS1; owner table table_id columns tablespace storage partition USERS1 T_TRUNCATE_TEST 1067 4 TBS_TEST CLUSTERBTR NO 1 table(s) DMDUL\u0026gt; 这里可以看到，虽然 T_TRUNCATE_TEST 已经被 TRUNCATE，但表对象仍然存在，dmdul 仍然可以从字典中识别到该表：\nowner = USERS1 table = T_TRUNCATE_TEST table_id = 1067 columns = 4 tablespace = TBS_TEST storage = CLUSTERBTR partition = NO 这与前面 TRUNCATE 实验的结论一致：TRUNCATE 后表对象仍在，只是表数据在 SQL 层面不可见，表段空间被重置或释放。\n6.5 使用 dmdul recover table 恢复数据 # 执行恢复命令：\nDMDUL\u0026gt; recover table USERS1.T_TRUNCATE_TEST; 结果如下：\nDMDUL\u0026gt; recover table USERS1.T_TRUNCATE_TEST; recovery mode: on ddl output: /dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_ddl.sql data output: /dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_data.sql tables exported: 1 rows exported: 100 rows failed: 0 DMDUL\u0026gt; 这个结果非常关键：\ntables exported = 1 rows exported = 100 rows failed = 0 说明 dmdul 成功从 TRUNCATE 后的数据文件中恢复出了 T_TRUNCATE_TEST 的 100 行历史数据。\n6.6 查看 dmdul 恢复出的 DDL # 查看恢复出的 DDL 文件：\ncat /dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_ddl.sql 结果如下：\n-- Generated by dmdul export-ddl. Review before running. -- Users and roles -- Password hashes are not exported. Change the placeholder password after import. CREATE USER USERS1 IDENTIFIED BY \u0026#34;dmdul_default_password\u0026#34; DEFAULT TABLESPACE \u0026#34;TBS_TEST\u0026#34; TEMPORARY TABLESPACE \u0026#34;TEMP\u0026#34;; GRANT PUBLIC TO USERS1; GRANT RESOURCE TO USERS1; -- Tables CREATE TABLE USERS1.T_TRUNCATE_TEST ( ID INT NOT NULL, MARKER VARCHAR(200), PAYLOAD VARCHAR(1000), CREATE_TIME TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ) STORAGE(ON \u0026#34;TBS_TEST\u0026#34;, CLUSTERBTR); -- Indexes -- Constraints ALTER TABLE USERS1.T_TRUNCATE_TEST ADD CONSTRAINT PK_T_TRUNCATE_TEST PRIMARY KEY (ID); -- Comments 可以看到，dmdul 不仅恢复出了数据，还生成了表结构 DDL，包括：\n1. 用户 USERS1； 2. 表 USERS1.T_TRUNCATE_TEST； 3. 字段 ID、MARKER、PAYLOAD、CREATE_TIME； 4. 字段类型； 5. 表空间 TBS_TEST； 6. 存储类型 CLUSTERBTR； 7. 主键约束 PK_T_TRUNCATE_TEST。 6.7 查看 dmdul 恢复出的数据 # 查看恢复出的数据文件：\ncat /dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_data.sql 恢复文件中可以看到完整的 INSERT 语句：\n-- Generated by dmdul export-data. Review before running. -- Current decoder targets ordinary in-row heap/cluster/IOT rows. INSERT INTO USERS1.T_TRUNCATE_TEST (ID, MARKER, PAYLOAD, CREATE_TIME) VALUES (1, \u0026#39;DMDUL_TRUNCATE_RECOVER_1\u0026#39;, \u0026#39;DMDUL_BEFORE_TRUNCATE_1_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39;, DATETIME \u0026#39;2026-07-06 17:25:15.535503\u0026#39;); INSERT INTO USERS1.T_TRUNCATE_TEST (ID, MARKER, PAYLOAD, CREATE_TIME) VALUES (2, \u0026#39;DMDUL_TRUNCATE_RECOVER_2\u0026#39;, \u0026#39;DMDUL_BEFORE_TRUNCATE_2_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39;, DATETIME \u0026#39;2026-07-06 17:25:15.535503\u0026#39;); INSERT INTO USERS1.T_TRUNCATE_TEST (ID, MARKER, PAYLOAD, CREATE_TIME) VALUES (3, \u0026#39;DMDUL_TRUNCATE_RECOVER_3\u0026#39;, \u0026#39;DMDUL_BEFORE_TRUNCATE_3_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39;, DATETIME \u0026#39;2026-07-06 17:25:15.535503\u0026#39;); INSERT INTO USERS1.T_TRUNCATE_TEST (ID, MARKER, PAYLOAD, CREATE_TIME) VALUES (4, \u0026#39;DMDUL_TRUNCATE_RECOVER_4\u0026#39;, \u0026#39;DMDUL_BEFORE_TRUNCATE_4_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39;, DATETIME \u0026#39;2026-07-06 17:25:15.535503\u0026#39;); INSERT INTO USERS1.T_TRUNCATE_TEST (ID, MARKER, PAYLOAD, CREATE_TIME) VALUES (5, \u0026#39;DMDUL_TRUNCATE_RECOVER_5\u0026#39;, \u0026#39;DMDUL_BEFORE_TRUNCATE_5_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39;, DATETIME \u0026#39;2026-07-06 17:25:15.535503\u0026#39;); ... INSERT INTO USERS1.T_TRUNCATE_TEST (ID, MARKER, PAYLOAD, CREATE_TIME) VALUES (100, \u0026#39;DMDUL_TRUNCATE_RECOVER_100\u0026#39;, \u0026#39;DMDUL_BEFORE_TRUNCATE_100_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\u0026#39;, DATETIME \u0026#39;2026-07-06 17:25:15.535503\u0026#39;); 从恢复结果可以看到：\n1. ID 从 1 到 100 均被恢复； 2. MARKER 字段中的 DMDUL_TRUNCATE_RECOVER_ 标记被完整恢复； 3. PAYLOAD 字段中的 DMDUL_BEFORE_TRUNCATE_ 标记被完整恢复； 4. CREATE_TIME 字段也被恢复为原始插入时间 2026-07-06 17:25:15.535503。 也可以通过命令统计恢复出的行数：\ngrep -c \u0026#34;INSERT INTO USERS1.T_TRUNCATE_TEST\u0026#34; /dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_data.sql 结果为：\n[dmdba@dameng-srv DAMENG]$ grep -c \u0026#34;INSERT INTO USERS1.T_TRUNCATE_TEST\u0026#34; /dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_data.sql 100 [dmdba@dameng-srv DAMENG]$ 6.8 dmdul 恢复实验结论 # 本次 dmdul 恢复实验进一步验证了前文关于 TRUNCATE 的判断：\nTRUNCATE 后，表数据在 SQL 层面已经不可见，但数据文件中的旧行内容并没有立即消失。 在本实验中，T_TRUNCATE_TEST 被 TRUNCATE 后，dmdul 仍然成功从数据文件中恢复出 100 行数据，并生成了可执行的 DDL 和 INSERT 脚本：\nDDL 文件 ：/dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_ddl.sql 数据文件 ：/dmdata/DAMENG/USERS1_T_TRUNCATE_TEST_recover_data.sql 恢复行数 ：100 失败行数 ：0 这说明：\nTRUNCATE 并不会立即物理清零数据文件中的旧行内容。 TRUNCATE 后，只要原数据块尚未被新对象或新数据覆盖，仍然有实际恢复可能。 相比 DROP，TRUNCATE 后表对象和字段定义 七、关于 dmdul：一个达梦离线数据抽取小工具 # 本文最后的 TRUNCATE 恢复实验使用的是我自己写的开源小工具：dmdul。\n项目地址：\nhttps://github.com/greatfinish/dmdul dmdul 的定位是一个面向达梦数据库的数据文件离线分析和数据抽取工具。它的目标不是替代数据库官方恢复手段，而是在数据库无法正常打开、表被误操作、或者需要分析 DBF 文件残留数据时，提供一种额外的离线排查和恢复思路。\n目前 dmdul 主要支持：\n功能 说明 离线读取达梦数据文件 基于 SYSTEM.DBF、dm.ctl 和用户表空间 DBF 文件进行分析 解析数据字典 可识别用户、表、列、视图、序列、触发器、权限等基础字典信息 查看用户和表 支持 list user、list table \u0026lt;owner\u0026gt; 等交互式命令 导出表结构 可以生成用户表的 DDL 脚本 导出表数据 可以将识别到的数据导出为 INSERT SQL 尝试恢复 TRUNCATE、DROP 后数据 在旧数据块未被覆盖的情况下，可尝试从数据文件中恢复被 TRUNCATE、DROP 的历史数据 在本文实验中，USERS1.T_TRUNCATE_TEST 被 TRUNCATE 后，数据库 SQL 层面已经无法查询到原来的 100 行数据，但 dmdul 仍然成功从数据文件中恢复出完整的 100 行记录：\ntables exported: 1 rows exported: 100 rows failed: 0 这说明，只要数据文件中的旧块没有被新数据覆盖，TRUNCATE 后的数据并不一定真的“消失”，仍然存在离线恢复的可能。\n当然，任何离线恢复工具都不能保证所有场景 100% 成功。实际恢复效果取决于数据块是否被覆盖、表结构是否还能识别、字段类型是否支持、数据是否涉及 LOB、压缩、加密、分区等复杂场景。因此，建议优先使用数据库官方备份恢复手段，dmdul 更适合作为应急分析、实验验证和补充恢复工具。\n如果你也对达梦数据库文件格式、误操作恢复、离线数据抽取感兴趣，欢迎关注、试用或一起完善这个项目：\nhttps://github.com/greatfinish/dmdul 也欢迎提交 issue、建议和测试案例，让这个工具在更多真实场景中逐步完善。\n八、最终结论 # 达梦数据库中，TRUNCATE 和 DROP 都会让数据在 SQL 层面不可见，但并不等于立即物理清零数据文件；只要原数据块没有被覆盖，仍然可能存在离线扫描和恢复的机会。在没有可用备份、且原数据块尚未被覆盖的情况下，也可以尝试使用我的开源工具 dmdul 进行离线扫描和辅助恢复。\n","date":"2026-07-06","externalUrl":null,"permalink":"/posts/dameng-truncate-drop-datafile-residue-recovery/","section":"文章","summary":"一次达梦数据库 TRUNCATE / DROP 数据文件残留实验：从 SQL 层面、数据字典、数据文件物理扫描和 10002 trace 多个角度验证数据是否真的被清理，并使用 dmdul 离线抽取工具成功恢复 TRUNCATE 后的测试数据。","title":"达梦数据库 TRUNCATE / DROP 后数据真的没了吗？一次数据文件残留实验验证","type":"posts"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/%E7%A6%BB%E7%BA%BF%E6%8A%BD%E5%8F%96/","section":"Tags","summary":"","title":"离线抽取","type":"tags"},{"content":"专注数据库生产故障处理、性能优化、备份恢复、RAC/Data Guard、PostgreSQL、达梦数据库与 Linux 运维实践。\n88 篇文章 · 持续更新\n","date":"2026-07-06","externalUrl":null,"permalink":"/","section":"首页","summary":"","title":"首页","type":"page"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/categories/%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D/","section":"Categories","summary":"","title":"数据恢复","type":"categories"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D/","section":"Tags","summary":"","title":"数据恢复","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6/","section":"Tags","summary":"","title":"数据文件","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/posts/","section":"文章","summary":"Oracle、PostgreSQL、达梦、MongoDB、Linux 运维、数据库故障处理与技术实践文章。","title":"文章","type":"posts"},{"content":" 项目简介 # DMDUL 是一个面向达梦数据库的数据文件离线分析与数据抽取工具。\n项目目标是在数据库无法正常打开、实例无法正常启动、系统表空间或用户表空间需要离线分析时，通过读取达梦数据库相关文件，辅助完成对象识别、表结构分析、数据页扫描和数据导出。\n项目地址：\nGitHub：https://github.com/greatfinish/dmdul Release 下载：https://github.com/greatfinish/dmdul/releases 适用场景 # DMDUL 主要适用于以下场景：\n达梦数据库实例无法正常打开； 需要离线分析数据文件中的对象信息； 需要辅助识别表、字段、索引、页类型等内部结构； 需要在恢复、取证、测试或研究环境中抽取部分数据； 需要验证达梦数据文件页级结构和系统字典信息。 注意：DMDUL 是离线分析和辅助恢复工具，不应替代正式备份恢复方案。生产环境操作前，请优先保留原始数据文件副本。\n功能特性 # 当前工具重点能力包括：\n功能 说明 控制文件分析 读取达梦控制文件中的部分结构信息 表空间识别 辅助识别 SYSTEM、ROLL、MAIN 等表空间信息 系统字典扫描 离线扫描系统字典对象 表结构识别 辅助识别表、字段、对象号等信息 页级扫描 识别数据页、索引页和候选对象 数据抽取 从候选数据页中抽取可识别记录 交互模式 提供 REPL 风格的交互式操作 文档说明 提供安装、使用、配置、开发和离线扫描说明 安装方式 # 下载 Release # 前往 GitHub Release 页面下载对应版本：\nhttps://github.com/greatfinish/dmdul/releases Windows 环境可以下载编译好的 dmdul.exe。\n源码编译 # git clone https://github.com/greatfinish/dmdul.git cd dmdul go test ./... go build -o bin/dmdul.exe ./cmd/dmdul Linux 环境可以编译为：\ngo build -o bin/dmdul ./cmd/dmdul 基本使用 # 查看帮助：\ndmdul --help 进入交互模式：\ndmdul 示例操作流程：\n1. 指定控制文件和数据文件路径 2. 扫描表空间和系统字典 3. 识别对象和表结构 4. 确认目标表对象号 5. 扫描候选数据页 6. 导出识别到的数据 推荐工作流程 # 生产故障场景下，建议采用以下流程：\n原始文件只读保留 ↓ 复制数据文件到分析环境 ↓ 使用 DMDUL 离线扫描 ↓ 识别表空间和系统字典 ↓ 定位目标表对象 ↓ 页级扫描和样例验证 ↓ 导出可恢复数据 风险提示 # 使用 DMDUL 前请注意：\n不要直接在生产原始文件上操作； 先复制控制文件、数据文件到独立分析目录； 工具输出结果需要结合实际数据库版本和文件状态判断； 对损坏页、未识别页、索引页、LOB 页等场景需要谨慎验证； 离线抽取结果不等价于完整一致性恢复结果。 项目定位 # DMDUL 当前定位是：\n达梦数据库离线数据文件分析与数据抽取辅助工具 它更适合用于：\n数据恢复辅助； 数据库内部结构学习； 故障场景验证； 页级结构分析； DBA 工具实验。 不建议将其作为常规备份恢复手段。\n后续计划 # 后续计划逐步增强：\n更多页类型识别； 更完善的字段类型解析； 更友好的导出格式； 更完整的字典对象映射； 更丰富的异常文件兼容能力； Linux / Windows 双平台 Release 自动构建。 参与项目 # 欢迎通过 GitHub 提交 Issue、建议或 Pull Request：\nhttps://github.com/greatfinish/dmdul 如果你在达梦数据库恢复、数据文件分析、页级结构识别方面有测试案例，也欢迎一起完善这个工具。\n","date":"2026-06-29","externalUrl":null,"permalink":"/tools/dmdul/","section":"工具","summary":"DMDUL 是一个面向达梦数据库的数据文件离线分析与数据抽取工具，目标是在数据库无法正常打开时，通过离线扫描控制文件、数据文件和系统字典信息，辅助识别表、字段、索引和数据页，并尽可能导出可恢复的数据。","title":"DMDUL：达梦数据库离线抽取数据工具","type":"tools"},{"content":"","date":"2026-06-29","externalUrl":null,"permalink":"/tags/go/","section":"Tags","summary":"","title":"Go","type":"tags"},{"content":"","date":"2026-06-29","externalUrl":null,"permalink":"/tags/%E8%BE%BE%E6%A2%A6%E6%95%B0%E6%8D%AE%E5%BA%93/","section":"Tags","summary":"","title":"达梦数据库","type":"tags"},{"content":"","date":"2026-06-29","externalUrl":null,"permalink":"/categories/%E5%B7%A5%E5%85%B7/","section":"Categories","summary":"","title":"工具","type":"categories"},{"content":"这里整理个人开源工具、数据库运维脚本、故障处理辅助工具和实验项目。\n","date":"2026-06-29","externalUrl":null,"permalink":"/tools/","section":"工具","summary":"这里整理个人开源工具、数据库运维脚本、故障处理辅助工具和实验项目。","title":"工具","type":"tools"},{"content":"","date":"2026-06-29","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B7%A5%E5%85%B7/","section":"Tags","summary":"","title":"数据库工具","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/cache-buffers-chains/","section":"Tags","summary":"","title":"Cache Buffers Chains","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/latch-free/","section":"Tags","summary":"","title":"Latch Free","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/categories/oracle/","section":"Categories","summary":"","title":"Oracle","type":"categories"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/oracle-11g/","section":"Tags","summary":"","title":"Oracle 11g","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/sql-plan-baseline/","section":"Tags","summary":"","title":"SQL Plan Baseline","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/sql%E4%BC%98%E5%8C%96/","section":"Tags","summary":"","title":"SQL优化","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/%E7%BB%91%E5%AE%9A%E5%8F%98%E9%87%8F/","section":"Tags","summary":"","title":"绑定变量","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/%E9%AB%98cpu/","section":"Tags","summary":"","title":"高CPU","type":"tags"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/%E6%95%85%E9%9A%9C%E5%A4%84%E7%90%86/","section":"Tags","summary":"","title":"故障处理","type":"tags"},{"content":" 一、故障背景 # 某业务系统 Oracle 11g 数据库在业务运行期间出现 CPU 使用率持续接近 100% 的情况。数据库版本为：Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production。数据库实例信息：Oracle 11g - Primary ditch，故障时间点大约在：2026-06-10 13:59 ~ 14:00，从操作系统和数据库侧观察，数据库负载明显升高，前台业务进程持续占用 CPU，业务访问存在性能风险。\n二、故障现象 # 1. 操作系统 CPU 使用率接近 100% # 现场 top 输出显示：\ntop - 13:59:10 up 582 days, 41 min, 2 users, load average: 9.59, 9.26, 7.92 Tasks: 268 total, 9 running, 258 sleeping, 0 stopped, 1 zombie Cpu(s): 99.8%us, 0.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 其中：99.8%us、0.0%wa。说明 CPU 主要消耗在用户态，且几乎没有 IO wait。该现象基本可以判断为数据库前台 SQL 执行消耗 CPU，而不是存储 IO 卡顿。\n操作系统层面高 CPU 进程如下：\nPID USER %CPU COMMAND 15680 oracle 99.7 oracle 15920 oracle 99.7 oracle 16219 oracle 99.7 oracle 15430 oracle 99.3 oracle 16233 oracle 99.3 oracle 16155 oracle 96.4 oracle 16186 oracle 91.4 oracle 15916 oracle 90.7 oracle 可以看到，多个 Oracle 前台进程分别占用接近一个 CPU 核心，最终导致数据库服务器 CPU 被打满。\n2. oratop 显示数据库 DB CPU 占比高 # 使用 oratop 观察数据库负载：\nOracle 11g - Primary ditch 13:59:58 up: 1.6y, 1 ins, 58 sn, 3 us, 20G mt, 5% fra, 1 er, 111% db ID %CPU LOAD %DCU AAS ASC ASI ASW ASP AST UST MBPS IOPS IORL LOGR PHYR PHYW %FR PGA TEMP UTPS UCPS SSRT DCTR DWTR %DBT 1 99 9 99 8.9 8 2 0 0 8 58 9 328 29u 1.4M 221 1 7 362M 1.7G 0 13 294m 87 12 100 等待事件分布：\nEVENT (C) TOTAL WAITS TIME(s) AVG_MS PCT WAIT_CLASS DB CPU 2.10E+07 76 SQL*Net message from dblink 1.042E+08 2187973 21.0 8 Network SQL*Net more data from dblink 4.069E+08 1749493 4.3 6 Network Backup: MML write backup piece 6.093E+08 1435440 2.4 5 Administrative db file sequential read 1.309E+10 1352103 0.1 5 User I/O 其中 DB CPU 占比 76%，与 OS 层面 99.8%us 相互印证。\n3. 高负载会话集中在同一个 SQL # oratop 中可以看到，多个活动会话都在执行同一个 SQL_ID：\nID SID SPID USERNAME PROGRAM SRV SERVICE PGA SQLID/BLOCKER OPN E/T STA STE WAIT_CLASS EVENT/*LATCH W/T 1 165 15430 HISSCM w3wp.exe DED ditch 3.5M 4ja6bgs1su89c SEL 0.5h ACT CPU Concurrenc latch: cache buffers 13m 1 465 16219 HISSCM w3wp.exe DED ditch 1.4M 4ja6bgs1su89c SEL 0.5h ACT CPU Other latch free 13m 1 4 15680 HISSCM w3wp.exe DED ditch 3.2M 4ja6bgs1su89c SEL 0.6h ACT CPU Other latch free 862u 1 782 16155 HISSCM w3wp.exe DED ditch 954k 4ja6bgs1su89c SEL 0.5h ACT CPU Other latch free 609u 1 6 16233 HISSCM w3wp.exe DED ditch 954k 4ja6bgs1su89c SEL 0.5h ACT CPU Other latch free 231u 1 15 16186 HISSCM w3wp.exe DED ditch 979k 4ja6bgs1su89c SEL 0.5h ACT CPU Other latch free 35u 1 932 15916 HISSCM w3wp.exe DED ditch 2.0M 4ja6bgs1su89c SEL 0.5h ACT CPU User I/O db file sequential re 14u 1 627 15920 HISSCM w3wp.exe DED ditch 3.0M 4ja6bgs1su89c SEL 0.6h ACT CPU User I/O db file sequential re 12u 初步判断：\n故障 SQL_ID：4ja6bgs1su89c 数据库用户：HISSCM 应用程序：w3wp.exe 来源机器：WORKGROUP\\YYGYL-DB-VSS-NE 主要等待：latch free / latch: cache buffers chains\n说明问题集中在 IIS/.NET 应用 w3wp.exe 发起的某个 SQL 上。\n三、分析过程 # 1. 通过 OS SPID 定位数据库会话 # 根据 top 中的 Oracle 进程号，执行以下 SQL 定位数据库会话：\nset lines 300 pages 100 col username for a15 col program for a25 col machine for a30 col module for a30 col event for a35 col sql_id for a15 select s.sid, s.serial#, p.spid, s.username, s.machine, s.program, s.module, s.status, s.sql_id, s.sql_child_number, s.event, s.state, s.last_call_et from v$session s join v$process p on s.paddr = p.addr where p.spid in (\u0026#39;15680\u0026#39;,\u0026#39;15920\u0026#39;,\u0026#39;16219\u0026#39;,\u0026#39;15430\u0026#39;,\u0026#39;16233\u0026#39;,\u0026#39;16155\u0026#39;,\u0026#39;16186\u0026#39;,\u0026#39;15916\u0026#39;) order by s.last_call_et desc; 查询结果：\nSID SERIAL# SPID USERNAME MACHINE PROGRAM MODULE STATUS SQL_ID SQL_CHILD_NUMBER EVENT STATE LAST_CALL_ET --- ------- ----- -------- -------------------------- --------- -------- -------- --------------- ---------------- --------------------------- ------------------ ------------ 4 64439 15680 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED SHORT TIME 2210 627 51801 15920 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED KNOWN TIME 2100 165 13197 15430 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED SHORT TIME 2016 932 26869 15916 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED SHORT TIME 1989 15 32425 16186 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED SHORT TIME 1905 782 401 16155 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED SHORT TIME 1879 465 48709 16219 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch: cache buffers chains WAITED SHORT TIME 1768 6 48513 16233 HISSCM WORKGROUP\\YYGYL-DB-VSS-NE w3wp.exe w3wp.exe ACTIVE 4ja6bgs1su89c 21 latch free WAITED KNOWN TIME 1709 结论：\n8 个高 CPU Oracle 前台进程，全部执行 SQL_ID=4ja6bgs1su89c，且全部为 child_number=21。\n这一步将问题范围从“数据库整体 CPU 高”缩小到“单条 SQL 的某个 child cursor 异常”。\n2. 查看 SQL 执行统计 # 执行以下 SQL 查看该 SQL_ID 的所有 child cursor：\nset long 200000 set lines 300 pages 100 col sql_text for a120 select sql_id, child_number, plan_hash_value, executions, elapsed_time/1000000 elapsed_s, cpu_time/1000000 cpu_s, buffer_gets, disk_reads, rows_processed, parse_calls, loads from v$sql where sql_id = \u0026#39;4ja6bgs1su89c\u0026#39; order by child_number; 关键结果如下：\nSQL_ID CHILD_NUMBER PLAN_HASH_VALUE EXECUTIONS ELAPSED_S CPU_S BUFFER_GETS DISK_READS ROWS_PROCESSED --------------- ------------ --------------- ---------- ---------- ---------- ----------- ---------- -------------- 4ja6bgs1su89c 1 209089688 18 2.893776 2.207665 1193342 4837 18 4ja6bgs1su89c 2 209089688 26 3.515837 2.817574 1650474 5546 26 4ja6bgs1su89c 3 209089688 23 3.032803 2.451626 1448162 4019 23 ... 4ja6bgs1su89c 17 209089688 76 5.101620 4.734278 2887103 7876 76 ... 4ja6bgs1su89c 21 3976293346 10 17736.2609 16541.4603 2973986803 293276 2 ... 4ja6bgs1su89c 24 209089688 54 9.888483 9.296582 7073602 8043 54 从结果看，绝大多数 child cursor 的执行时间只有几秒，逻辑读在几十万到几百万之间；而 child_number=21 明显异常：\nchild_number = 21 plan_hash_value = 3976293346 executions = 10 elapsed_s = 17736.2609 cpu_s = 16541.4603 buffer_gets = 2973986803 disk_reads = 293276 rows_processed = 2 也就是说，child 21 只执行了 10 次，却消耗了约 1.65 万秒 CPU，产生了约 29.7 亿逻辑读，最终只处理了 2 行结果。\n这说明问题不是业务返回数据量大，而是执行路径极其低效。\n3. 查看 SQL 文本 # 执行：\nset long 200000 set pages 0 select sql_fulltext from v$sql where sql_id = \u0026#39;4ja6bgs1su89c\u0026#39; and rownum = 1; SQL 文本如下：\nselect count(:areaid||:cstid||:csttype||:empid) from SCM_SALINV_V where 1=1 and areaid=:areaid and dealid=:cstid and invoicedate\u0026gt;=to_date(:invoicedate564 ,\u0026#39;yyyy-mm-dd\u0026#39;) 该 SQL 是一个基于视图 SCM_SALINV_V 的计数查询，核心过滤条件为：\nareaid = :areaid dealid = :cstid invoicedate \u0026gt;= to_date(:invoicedate564, \u0026#39;yyyy-mm-dd\u0026#39;) 其中 count(:areaid||:cstid||:csttype||:empid) 写法没有实际必要，建议后续应用侧改为：\nselect count(*) from SCM_SALINV_V where areaid=:areaid and dealid=:cstid and invoicedate\u0026gt;=to_date(:invoicedate564 ,\u0026#39;yyyy-mm-dd\u0026#39;) 4. 对比好计划与坏计划 # 执行：\nset lines 300 pages 300 select * from table(dbms_xplan.display_cursor( \u0026#39;4ja6bgs1su89c\u0026#39;, null, \u0026#39;ALLSTATS LAST +PEEKED_BINDS +OUTLINE +ALIAS +NOTE\u0026#39; )); 好计划主要为：\nPlan hash value: 209089688 | Id | Operation | Name | |* 9 | TABLE ACCESS FULL | PUB_TRANCODE | |* 10 | TABLE ACCESS BY INDEX ROWID | SCM_SALINV | |* 11 | INDEX RANGE SCAN | IDX_SCM_SALINV_INVOICEDATE | |* 12 | TABLE ACCESS FULL | PUB_HOSPITAL | |* 14 | INDEX RANGE SCAN | IDX_PUB_HOSDEA_REL_HOSID | 好计划的特点：\nSCM_SALINV 使用 IDX_SCM_SALINV_INVOICEDATE。 先利用 INVOICEDATE 做日期范围过滤。 配合 HASH JOIN，整体执行时间较短。 坏计划为：\nPlan hash value: 3976293346 | Id | Operation | Name | E-Rows | | 0 | SELECT STATEMENT | | | | 1 | SORT AGGREGATE | | 1 | | 2 | NESTED LOOPS | | 1 | | 3 | NESTED LOOPS | | 1 | | 4 | NESTED LOOPS | | 1 | | 5 | NESTED LOOPS | | 1 | | 6 | NESTED LOOPS | | 1 | | 7 | NESTED LOOPS | | 1 | | 8 | NESTED LOOPS | | 1 | |* 9 | INDEX SKIP SCAN | PK_PUB_TRANSCODE | 1 | |* 10 | TABLE ACCESS BY INDEX ROWID | SCM_SALINV | 1 | |* 11 | INDEX RANGE SCAN | IDX_SCM_SALINV_DEALID | 1 | 坏计划的问题：\n使用 PK_PUB_TRANSCODE 做 INDEX SKIP SCAN。 后续通过 Nested Loops 驱动 SCM_SALINV。 SCM_SALINV 访问路径选择了 IDX_SCM_SALINV_DEALID。 由于 DEALID=1 数据量极大，导致访问大量无效数据。 大量逻辑读引发 CPU 飙升和 latch: cache buffers chains 竞争。 5. 查询 child 21 的绑定变量 # 执行：\nset lines 300 pages 100 col name for a20 col datatype_string for a20 col value_string for a50 col last_captured for a20 select sql_id, child_number, name, position, datatype_string, value_string, to_char(last_captured,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) last_captured from v$sql_bind_capture where sql_id = \u0026#39;4ja6bgs1su89c\u0026#39; and child_number = 21 order by position; 结果：\nSQL_ID CHILD_NUMBER NAME POSITION DATATYPE_STRING VALUE_STRING LAST_CAPTURED --------------- ------------ ---------------- -------- --------------- ------------ -------------------- 4ja6bgs1su89c 21 :AREAID 1 NUMBER 1 2026-06-10 13:24:04 4ja6bgs1su89c 21 :CSTID 2 NUMBER 1 2026-06-10 13:24:04 4ja6bgs1su89c 21 :CSTTYPE 3 NUMBER 4ja6bgs1su89c 21 :EMPID 4 NUMBER 4ja6bgs1su89c 21 :AREAID 5 NUMBER 1 2026-06-10 13:24:04 4ja6bgs1su89c 21 :CSTID 6 NUMBER 1 2026-06-10 13:24:04 4ja6bgs1su89c 21 :INVOICEDATE564 7 VARCHAR2(32) 2026-06-09 2026-06-10 13:24:04 因此，child 21 对应的实际过滤条件为：\nareaid = 1 dealid = 1 invoicedate \u0026gt;= to_date(\u0026#39;2026-06-09\u0026#39;,\u0026#39;yyyy-mm-dd\u0026#39;) 6. 验证数据分布与选择性 # 先查询 SCM_SALINV 表整体分布：\nselect count(*) total_cnt, count(distinct dealid) dealid_ndv, count(distinct areaid) areaid_ndv, count(distinct trunc(invoicedate)) date_ndv from HISSCM.SCM_SALINV; 结果：\nTOTAL_CNT DEALID_NDV AREAID_NDV DATE_NDV --------- ---------- ---------- -------- 4495927 7 1 374 说明：\nSCM_SALINV 总行数约 449 万。 DEALID 只有 7 个不同值。 AREAID 只有 1 个不同值。 INVOICEDATE 有 374 个不同日期。 接着验证 child 21 绑定值的选择性：\nselect count(*) from HISSCM.SCM_SALINV where dealid = 1; 结果：\nCOUNT(*) ---------- 3600971 继续增加 areaid=1 条件：\nselect count(*) from HISSCM.SCM_SALINV where dealid = 1 and areaid = 1; 结果：\nCOUNT(*) ---------- 3600971 说明 areaid=1 没有过滤效果。\n最后增加日期条件：\nselect count(*) from HISSCM.SCM_SALINV where dealid = 1 and areaid = 1 and invoicedate \u0026gt;= to_date(\u0026#39;2026-06-09\u0026#39;,\u0026#39;yyyy-mm-dd\u0026#39;); 结果：\nCOUNT(*) ---------- 9737 该结果非常关键：\ndealid = 1 命中 3600971 行 dealid = 1 and areaid = 1 仍然命中 3600971 行 再加 invoicedate \u0026gt;= 2026-06-09 只剩 9737 行 说明：\nDEALID=1 是大倾斜值，选择性很差。 AREAID=1 没有过滤效果。 真正有效的过滤条件是 INVOICEDATE。 因此，坏计划使用 IDX_SCM_SALINV_DEALID 是导致高 CPU 的核心原因。\n四、故障根因 # 本次故障的直接原因是：SQL_ID=4ja6bgs1su89c 生成了多个 child cursor，其中 child_number=21 选择了错误执行计划 plan_hash_value=3976293346。\n错误计划的主要问题：\n使用 PK_PUB_TRANSCODE 做 INDEX SKIP SCAN。 通过 Nested Loops 访问 SCM_SALINV。 SCM_SALINV 使用 IDX_SCM_SALINV_DEALID。 绑定变量 CSTID=1，即 DEALID=1，而该条件命中约 360 万行。 日期条件 INVOICEDATE\u0026gt;=2026-06-09 实际只返回 9737 行，但坏计划没有优先使用日期过滤。 大量无效逻辑读导致 CPU 99%，并伴随 latch free / latch: cache buffers chains。 根因可以总结为：绑定变量取值存在数据倾斜，优化器生成了不适合当前绑定值的执行计划。错误计划选择低选择性 DEALID 索引，导致 SCM_SALINV 大量逻辑读和 CPU 消耗。\n五、处理过程 # 1. 固定好执行计划 # 在处理前查询 SQL Plan Baseline：\nselect sql_handle, plan_name, enabled, accepted, fixed, origin from dba_sql_plan_baselines where sql_text like \u0026#39;%SCM_SALINV_V%\u0026#39; order by created desc; 结果：\nno rows selected 说明当时还没有 SQL Plan Baseline。\n将好计划 plan_hash_value=209089688 从 cursor cache 加载为固定计划：\ndeclare l_plans number; begin l_plans := dbms_spm.load_plans_from_cursor_cache( sql_id =\u0026gt; \u0026#39;4ja6bgs1su89c\u0026#39;, plan_hash_value =\u0026gt; 209089688, fixed =\u0026gt; \u0026#39;YES\u0026#39;, enabled =\u0026gt; \u0026#39;YES\u0026#39;); dbms_output.put_line(\u0026#39;Loaded plans: \u0026#39; || l_plans); end; / 执行结果：\nPL/SQL procedure successfully completed. 再次查看 Baseline：\nselect sql_handle, plan_name, enabled, accepted, fixed, origin from dba_sql_plan_baselines where sql_text like \u0026#39;%SCM_SALINV_V%\u0026#39; order by created desc; 结果：\nSQL_HANDLE PLAN_NAME ENA ACC FIX ORIGIN ------------------------------ ------------------------------ --- --- --- -------------- SQL_25c9cd0351ce2f2c SQL_PLAN_2bkfd0d8wwbtc3cef7efc YES YES YES MANUAL-LOAD 说明好计划已经被固定。\n2. 清理坏 child cursor # 查询坏计划 child 21 的地址和 hash value：\nselect child_number, address, hash_value, plan_hash_value from v$sql where sql_id = \u0026#39;4ja6bgs1su89c\u0026#39; and child_number = 21; 结果：\nCHILD_NUMBER ADDRESS HASH_VALUE PLAN_HASH_VALUE ------------ ---------------- ---------- --------------- 21 00000005569B6108 59580716 3976293346 执行 purge命令后成功：\nexec sys.dbms_shared_pool.purge(\u0026#39;00000005569B6108,59580716\u0026#39;,\u0026#39;C\u0026#39;); 结果：\nPL/SQL procedure successfully completed. 需要注意的是，dbms_shared_pool.purge 可以清理 cursor 对象，防止后续复用坏计划，但不能中断已经在执行的 SQL。对于已经运行中的 child 21 会话，仍需要等待其结束或手工 kill session。\n3. 创建复合索引 # 基于数据分布，当前 SQL 的关键条件为：\ndealid = :cstid areaid = :areaid invoicedate \u0026gt;= :invoicedate564 因此创建复合索引：\ncreate index HISSCM.IDX_SCM_SALINV_DA_DATE on HISSCM.SCM_SALINV(DEALID, AREAID, INVOICEDATE) online; 执行结果：\nIndex created. 虽然 AREAID 只有一个不同值，选择性较低，但由于 SQL 条件中包含 dealid + areaid + invoicedate，该复合索引可以支持当前 SQL 通过等值条件加范围条件访问数据，避免只按 DEALID 扫描 360 万行。\n4. 收集统计信息 # 索引创建完成后，立即收集表和索引统计信息：\nbegin dbms_stats.gather_table_stats( ownname =\u0026gt; \u0026#39;HISSCM\u0026#39;, tabname =\u0026gt; \u0026#39;SCM_SALINV\u0026#39;, estimate_percent =\u0026gt; dbms_stats.auto_sample_size, method_opt =\u0026gt; \u0026#39;FOR ALL COLUMNS SIZE AUTO\u0026#39;, cascade =\u0026gt; true, degree =\u0026gt; 4 ); end; / 执行结果：\nPL/SQL procedure successfully completed. 六、处理后验证 # 处理后再次查询 SQL 执行统计：\nselect child_number, plan_hash_value, executions, elapsed_time/1000000 elapsed_s, cpu_time/1000000 cpu_s, buffer_gets, disk_reads, rows_processed from v$sql where sql_id = \u0026#39;4ja6bgs1su89c\u0026#39; order by child_number; 结果：\nCHILD_NUMBER PLAN_HASH_VALUE EXECUTIONS ELAPSED_S CPU_S BUFFER_GETS DISK_READS ROWS_PROCESSED ------------ --------------- ---------- ---------- ---------- ----------- ---------- -------------- 0 209089688 2 .621105 .270959 112899 340 2 21 3976293346 10 26146.5052 24319.4699 68099814 293351 2 可以看到，新生成的 child 0 已经使用好计划：\nplan_hash_value = 209089688 executions = 2 elapsed_s = 0.621105 cpu_s = 0.270959 buffer_gets = 112899 而旧的 child 21 仍然是坏计划：\nplan_hash_value = 3976293346 这说明：\nBaseline 已经对新解析生效。 新执行已开始走好计划。 已在执行的旧 child 21 会话不会因为 purge 自动中断，需要单独处理。 七、应急 kill 语句 # 对于已经运行很久的旧 child 21 会话，如果业务允许，可以执行：\nalter system kill session \u0026#39;4,64439\u0026#39; immediate; alter system kill session \u0026#39;627,51801\u0026#39; immediate; alter system kill session \u0026#39;165,13197\u0026#39; immediate; alter system kill session \u0026#39;932,26869\u0026#39; immediate; alter system kill session \u0026#39;15,32425\u0026#39; immediate; alter system kill session \u0026#39;782,401\u0026#39; immediate; alter system kill session \u0026#39;465,48709\u0026#39; immediate; alter system kill session \u0026#39;6,48513\u0026#39; immediate; 如果会话处于 KILLED 状态长时间不释放，可以从 OS 层处理对应 SPID：\nkill -9 15680 kill -9 15920 kill -9 15430 kill -9 15916 kill -9 16186 kill -9 16155 kill -9 16219 kill -9 16233 注意：OS 层 kill -9 属于强制手段，应在确认这些会话是可中断查询后再执行。\n八、总结 # 本次故障是由 SQL_ID=4ja6bgs1su89c 的 child 21 选择错误执行计划导致，最终通过固定好计划、清理坏游标、创建复合索引并收集统计信息恢复稳定。\n","date":"2026-06-10","externalUrl":null,"permalink":"/posts/oracle-sql-plan-high-cpu-cbc-latch/","section":"文章","summary":"一次 Oracle SQL 执行计划异常故障复盘：多个 w3wp.exe 会话集中执行 SQL_ID 4ja6bgs1su89c，child 21 选择低选择性 DEALID 索引，导致约 29.7 亿逻辑读、CPU 接近 100%、latch free 与 cache buffers chains 竞争。最终通过固定好计划、清理坏游标、创建复合索引并收集统计信息恢复稳定。","title":"记一次由 SQL 执行计划异常引发的高 CPU 与 cache buffers chains 竞争故障处理","type":"posts"},{"content":"","date":"2026-06-10","externalUrl":null,"permalink":"/tags/%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92/","section":"Tags","summary":"","title":"执行计划","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/active-data-guard/","section":"Tags","summary":"","title":"Active Data Guard","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/adg/","section":"Tags","summary":"","title":"ADG","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/apply-lag/","section":"Tags","summary":"","title":"Apply Lag","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/data-guard/","section":"Tags","summary":"","title":"Data Guard","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/mrp/","section":"Tags","summary":"","title":"MRP","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/oracle/","section":"Tags","summary":"","title":"Oracle","type":"tags"},{"content":"适用范围：Oracle Data Guard / Active Data Guard 日常巡检、故障判断、恢复后验证。\n适用版本：Oracle 11g / 12c / 18c / 19c 物理备库。\n一、文档目标 # 本文档用于检查 Oracle ADG 是否同步正常、是否存在传输延迟、应用延迟、归档缺口，以及主库到备库的日志传输目标是否异常。\n巡检最终应输出以下结论之一：\n结论 含义 正常 无 archive gap，transport lag=0 或秒级，apply lag=0 或秒级，MRP/RFS 正常 有传输延迟 主库 redo 未及时传到备库，transport lag 较大 有应用延迟 redo 已到备库，但 MRP 应用慢，apply lag 较大 有归档缺口 v$archive_gap 有记录，备库缺少中间归档 MRP 未启动 没有 MRP0，或备库只读但未应用 主库传输异常 主库 v$archive_dest / v$archive_dest_status 有 ERROR 二、总体判断逻辑 # ADG 巡检不能只看一个视图，要从以下几个维度综合判断：\n检查维度 关键视图 正常状态 备库角色 v$database DATABASE_ROLE=PHYSICAL STANDBY 备库打开模式 v$database MOUNTED 或 READ ONLY WITH APPLY 日志接收 v$managed_standby / v$dataguard_process 有 RFS，且对应主库 LGWR/ARCH 连接 日志应用 v$managed_standby / v$dataguard_process 有 MRP0，状态为 APPLYING_LOG 或 WAIT_FOR_LOG 传输延迟 v$dataguard_stats transport lag 为 0 或秒级 应用延迟 v$dataguard_stats apply lag 为 0 或秒级 归档缺口 v$archive_gap no rows selected sequence 差距 v$archived_log 每个 thread# 的 seq_lag=0 或短时间可追平 主库传输目标 v$archive_dest / v$archive_dest_status STATUS=VALID，ERROR 为空 注意：Active Data Guard 实时应用场景下，v$archived_log.applied 可能略滞后于 standby redo log 的实时应用位置，因此需要结合 v$managed_standby、v$dataguard_stats、v$archive_gap 一起判断。\n三、备库侧巡检 SQL # 巡检前 SQL*Plus 格式设置，建议每次巡检前先执行：\nset lines 300 pages 1000 set long 20000 set trimspool on set tab off col database_role for a20 col open_mode for a25 col protection_mode for a25 col switchover_status for a25 col process for a20 col status for a20 col client_process for a20 col thread# for 999 col sequence# for 999999999 col block# for 999999999 col name for a30 col value for a30 col unit for a25 col time_computed for a30 col datum_time for a30 col dest_name for a20 col type for a10 col database_mode for a20 col recovery_mode for a20 col synchronization_status for a20 col synchronized for a10 col gap_status for a20 col db_unique_name for a20 col dest_name for a30 col destination for a80 col error for a100 以下 SQL 优先在备库执行。\n3.1 检查备库角色和打开状态 # select database_role, open_mode, protection_mode, switchover_status from v$database; 正常参考：\nDATABASE_ROLE OPEN_MODE PROTECTION_MODE SWITCHOVER_STATUS -------------------- ------------------------- ------------------------- ------------------------- PHYSICAL STANDBY MOUNTED MAXIMUM PERFORMANCE NOT ALLOWED 或者：\nPHYSICAL STANDBY READ ONLY WITH APPLY MAXIMUM PERFORMANCE NOT ALLOWED 判断标准：\n字段 正常/异常判断 DATABASE_ROLE 正常应为 PHYSICAL STANDBY OPEN_MODE=MOUNTED 备库挂载状态，可以正常应用日志 OPEN_MODE=READ ONLY WITH APPLY ADG 可读且实时应用，正常 OPEN_MODE=READ ONLY 只读打开但未应用，需要检查 MRP 是否启动 OPEN_MODE=READ WRITE 不是正常物理备库状态，需要确认是否已 failover/switchover 3.2 检查 RFS / MRP 进程状态 # select process, status, thread#, sequence#, block#, client_process from v$managed_standby order by process, thread#; 正常参考：\nPROCESS STATUS THREAD# SEQUENCE# BLOCK# CLIENT_PROCESS ------------------ ------------------------ ------- ---------- ---------- ---------------- MRP0 APPLYING_LOG 2 62398 27749 N/A RFS IDLE 1 96120 239800 LGWR RFS IDLE 2 62398 27754 LGWR 判断标准：\n进程/状态 含义 判断 RFS 存在 备库正在接收主库 redo 正常 CLIENT_PROCESS=LGWR 主库 LGWR 直接传输 redo 正常 CLIENT_PROCESS=Archival 归档方式传输 正常 MRP0 APPLYING_LOG 备库正在应用日志 正常 MRP0 WAIT_FOR_LOG 已追平，等待新日志 正常 没有 MRP0 日志应用未启动 异常 MRP0 WAIT_FOR_GAP 缺少归档日志 异常 MRP0 的 sequence# / block# 长时间不变 可能卡住或 I/O 慢 需排查 注意：RFS IDLE 不一定异常，可能表示当前没有新的 redo 或已经接收完当前 redo。\n3.3 检查 ADG 传输延迟和应用延迟 # select name, value, unit, time_computed, datum_time from v$dataguard_stats where name in (\u0026#39;transport lag\u0026#39;, \u0026#39;apply lag\u0026#39;, \u0026#39;apply finish time\u0026#39;, \u0026#39;estimated startup time\u0026#39;); 正常参考：\nNAME VALUE TIME_COMPUTED DATUM_TIME ------------------------------ ------------------------------ ------------------------------ ------------------------------ transport lag +00 00:00:00 05/15/2026 21:10:06 05/15/2026 21:10:06 apply lag +00 00:00:00 05/15/2026 21:10:06 05/15/2026 21:10:06 apply finish time +00 00:00:00.000 05/15/2026 21:10:06 判断标准：\n指标 含义 正常判断 transport lag 主库 redo 传到备库的延迟 0 或秒级 apply lag 备库应用 redo 的延迟 0 或秒级 apply finish time 预计追平还需要多久 0 或很短 datum_time 统计数据采样时间 应接近当前时间 异常示例：\napply lag +92 07:52:39 说明备库应用延迟已经超过 92 天，属于严重不同步。\n注意：如果存在 archive gap，transport lag 和 apply finish time 可能不准确，应优先以 v$archive_gap 为准。\n3.4 检查是否存在归档缺口 # select * from v$archive_gap; 正常结果：\nno rows selected 异常示例：\nTHREAD# LOW_SEQUENCE# HIGH_SEQUENCE# CON_ID ------- ------------- -------------- ---------- 1 88228 94296 1 2 56221 60831 1 含义：\nThread 缺失范围 说明 thread 1 88228 ~ 94296 缺少 thread 1 的中间归档 thread 2 56221 ~ 60831 缺少 thread 2 的中间归档 只要 v$archive_gap 有记录，就不能认为 ADG 同步正常。\n3.5 检查每个 thread 的接收和应用差距 # select thread#, max(sequence#) as max_received_seq, max(case when applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) then sequence# end) as max_applied_seq, max(sequence#) - max(case when applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) then sequence# end) as seq_lag from v$archived_log where resetlogs_change# = (select resetlogs_change# from v$database) group by thread# order by thread#; 正常参考：\nTHREAD# MAX_RECEIVED_SEQ MAX_APPLIED_SEQ SEQ_LAG ------- ---------------- --------------- ---------- 1 96119 96119 0 2 62397 62397 0 判断标准：\nseq_lag 判断 0 已追平 1~2 可能是实时应用/归档标记滞后，需要结合 v$managed_standby 判断 持续增长 应用延迟或归档未连续应用 某个 thread 差距大 RAC 某个线程存在传输或应用问题 3.6 检查最近应用到的时间点 # select thread#, max(sequence#) as last_applied_seq, to_char(max(next_time), \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as last_applied_time from v$archived_log where applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) and resetlogs_change# = (select resetlogs_change# from v$database) group by thread# order by thread#; 输出示例：\nTHREAD# LAST_APPLIED_SEQ LAST_APPLIED_TIME ------- ---------------- -------------------- 1 96119 2026-05-15 21:09:44 2 62397 2026-05-15 21:09:44 用途：\n确认备库数据大致应用到哪个业务时间点； 当 apply lag 异常时，用于判断落后时间范围； RAC 环境下分别确认每个 thread 的应用时间。 3.7 查看最近归档日志应用明细 # select thread#, sequence#, applied, to_char(first_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as first_time, to_char(next_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as next_time, to_char(completion_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as completion_time from ( select a.*, row_number() over(partition by thread# order by sequence# desc) rn from v$archived_log a where resetlogs_change# = (select resetlogs_change# from v$database) ) where rn \u0026lt;= 10 order by thread#, sequence# desc; 用途：\n查看每个 thread 最近 10 个归档日志是否已应用； 检查 APPLIED 是否为 YES 或 IN-MEMORY； 辅助判断某个 thread 是否落后。 四、主库侧巡检 SQL # 巡检前 SQL*Plus 格式设置，建议每次巡检前先执行：\nset lines 300 pages 1000 set long 20000 set trimspool on set tab off col database_role for a20 col open_mode for a25 col protection_mode for a25 col switchover_status for a25 col process for a20 col status for a20 col client_process for a20 col thread# for 999 col sequence# for 999999999 col block# for 999999999 col name for a30 col value for a30 col unit for a25 col time_computed for a30 col datum_time for a30 col dest_name for a20 col type for a10 col database_mode for a20 col recovery_mode for a20 col synchronization_status for a20 col synchronized for a10 col gap_status for a20 col db_unique_name for a20 col dest_name for a30 col destination for a80 col error for a100 以下 SQL 在主库执行，用于确认主库到备库的日志传输目标是否正常。\n4.1 检查主库归档目标状态 # select dest_id, dest_name, status, type, database_mode, recovery_mode, db_unique_name, synchronization_status, synchronized, gap_status, error from v$archive_dest_status where status \u0026lt;\u0026gt; \u0026#39;INACTIVE\u0026#39; and type = \u0026#39;PHYSICAL\u0026#39; order by dest_id; 正常参考：\nDEST_ID STATUS TARGET DATABASE_MODE RECOVERY_MODE ERROR ------- ------- ------- ---------------- ------------------------- ----- 2 VALID STANDBY OPEN_READ-ONLY MANAGED REAL TIME APPLY 判断标准：\n字段 正常判断 STATUS VALID TARGET STANDBY RECOVERY_MODE MANAGED REAL TIME APPLY 或 MANAGED ERROR 为空 5.2 检查主库归档目标配置和错误信息 # select dest_id, dest_name, status, destination, error from v$archive_dest where status \u0026lt;\u0026gt; \u0026#39;INACTIVE\u0026#39; and destination is not null order by dest_id; 正常参考：\nDEST_ID DEST_NAME STATUS DESTINATION ERROR ------- --------------------- -------- ----------------- ----- 1 LOG_ARCHIVE_DEST_1 VALID USE_DB_RECOVERY_FILE_DEST 2 LOG_ARCHIVE_DEST_2 VALID standby_tns 如果 ERROR 不为空，需要优先处理主库日志传输问题。\n5.3 主库查看当前归档 sequence # select thread#, max(sequence#) as current_archived_seq from v$archived_log where resetlogs_change# = (select resetlogs_change# from v$database) group by thread# order by thread#; 用途：\n和备库 max_received_seq 对比； 判断主库已经生成到哪个归档 sequence； RAC 环境下必须分别看每个 thread#。 5.4 主库查看当前 online redo sequence # select thread#, group#, sequence#, status, archived from v$log order by thread#, group#; 用途：\n查看主库当前正在写哪个 online redo； 和备库 RFS/MRP 当前 sequence 对比； 判断实时应用是否接近当前日志。 五、一键汇总巡检 SQL # 以下 SQL 建议保存为 adg_check.sql，在备库执行。\nset lines 300 pages 1000 set trimspool on set tab off prompt ====================================================================== prompt 1. DATABASE ROLE / OPEN MODE prompt ====================================================================== col database_role for a20 col open_mode for a25 col protection_mode for a25 col switchover_status for a25 select database_role, open_mode, protection_mode, switchover_status from v$database; prompt ====================================================================== prompt 2. MANAGED STANDBY PROCESS prompt ====================================================================== col process for a18 col status for a24 col client_process for a16 select process, status, thread#, sequence#, block#, client_process from v$managed_standby order by process, thread#; prompt ====================================================================== prompt 3. DATAGUARD LAG prompt ====================================================================== col name for a30 col value for a30 col unit for a25 col time_computed for a30 col datum_time for a30 select name, value, unit, time_computed, datum_time from v$dataguard_stats where name in (\u0026#39;transport lag\u0026#39;, \u0026#39;apply lag\u0026#39;, \u0026#39;apply finish time\u0026#39;, \u0026#39;estimated startup time\u0026#39;); prompt ====================================================================== prompt 4. ARCHIVE GAP prompt ====================================================================== select * from v$archive_gap; prompt ====================================================================== prompt 5. RECEIVED/APPLIED SEQUENCE LAG BY THREAD prompt ====================================================================== col max_received_seq for 999999999 col max_applied_seq for 999999999 col seq_lag for 999999999 select thread#, max(sequence#) as max_received_seq, max(case when applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) then sequence# end) as max_applied_seq, max(sequence#) - max(case when applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) then sequence# end) as seq_lag from v$archived_log where resetlogs_change# = (select resetlogs_change# from v$database) group by thread# order by thread#; prompt ====================================================================== prompt 6. LAST APPLIED TIME BY THREAD prompt ====================================================================== col last_applied_time for a20 select thread#, max(sequence#) as last_applied_seq, to_char(max(next_time), \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as last_applied_time from v$archived_log where applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) and resetlogs_change# = (select resetlogs_change# from v$database) group by thread# order by thread#; 执行方式：\nsqlplus / as sysdba @adg_check.sql 如需保存日志：\nspool /tmp/adg_check_\u0026amp;\u0026amp;_DATE.log @adg_check.sql spool off 六、异常场景判断与处理 SOP # 6.1 场景一：v$archive_gap 有记录 # 异常表现：\nselect * from v$archive_gap; 输出类似：\nTHREAD# LOW_SEQUENCE# HIGH_SEQUENCE# ------- ------------- -------------- 1 88228 94296 2 56221 60831 判断：\n备库缺少中间归档，MRP 无法连续恢复到最新位置。 处理路径：\n在主库确认缺失归档是否还存在； 如果归档存在，复制到备库并注册； 如果归档不存在或缺口太大，使用 RMAN 增量推进备库； 重启 MRP； 重新验证 v$archive_gap、apply lag、seq_lag。 主库查询缺失归档是否存在：\nselect thread#, sequence#, name, deleted, status, to_char(first_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) first_time, to_char(next_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) next_time from v$archived_log where resetlogs_change# = (select resetlogs_change# from v$database) and ( (thread# = 1 and sequence# between 88228 and 94296) or (thread# = 2 and sequence# between 56221 and 60831) ) order by thread#, sequence#; 备库注册归档：\nalter database recover managed standby database cancel; alter database register physical logfile \u0026#39;/u01/arch_gap/thread1/1_88228_xxx.arc\u0026#39;; alter database register physical logfile \u0026#39;/u01/arch_gap/thread2/2_56221_xxx.arc\u0026#39;; alter database recover managed standby database using current logfile disconnect from session; 批量生成注册脚本：\nfind /u01/arch_gap -type f | sort | awk \u0026#39;{print \u0026#34;alter database register physical logfile \u0026#39;\\\u0026#39;\u0026#39;\u0026#34; $0 \u0026#34;\u0026#39;\\\u0026#39;\u0026#39;;\u0026#34;}\u0026#39; \u0026gt; /tmp/register_arch.sql sqlplus / as sysdba @/tmp/register_arch.sql 6.2 场景二：归档缺口太大或归档已丢失 # 适用情况：\n缺失归档数量很多； 主库 FRA 已清理； RMAN 备份中恢复归档成本过高； 手工补归档时间太长。 推荐处理：使用 RMAN 增量推进备库。\n方式 A：18c/19c 从主库服务恢复备库 # 备库执行：\nrman target / recover standby database from service \u0026#39;主库TNS服务名\u0026#39;; 执行前确认备库能连接主库：\ntnsping 主库TNS服务名 sqlplus sys/密码@主库TNS服务名 as sysdba 方式 B：传统 RMAN incremental from SCN # 备库查询最低 SCN：\nselect min(checkpoint_change#) as standby_min_scn from v$datafile_header; 主库基于该 SCN 做增量备份：\nrun { allocate channel c1 device type disk; allocate channel c2 device type disk; backup incremental from scn \u0026lt;standby_min_scn\u0026gt; database format \u0026#39;/u01/standby_incr/standby_incr_%U.bkp\u0026#39;; release channel c1; release channel c2; } backup current controlfile for standby format \u0026#39;/u01/standby_incr/standby_control_%U.bkp\u0026#39;; 拷贝到备库：\nscp /u01/standby_incr/* oracle@备库主机:/u01/standby_incr/ 备库恢复：\nrman target / startup force nomount; restore standby controlfile from \u0026#39;/u01/standby_incr/standby_control_xxx.bkp\u0026#39;; alter database mount; catalog start with \u0026#39;/u01/standby_incr/\u0026#39;; recover database noredo; 恢复完成后启动 MRP：\nalter database recover managed standby database using current logfile disconnect from session; 6.3 场景三：没有 MRP0 # 异常表现：\nv$managed_standby 中没有 MRP0 处理：\nalter database recover managed standby database using current logfile disconnect from session; 如果不使用实时应用：\nalter database recover managed standby database disconnect from session; 再次检查：\nselect process, status, thread#, sequence#, block#, client_process from v$managed_standby order by process, thread#; 正常应看到：\nMRP0 APPLYING_LOG 或：\nMRP0 WAIT_FOR_LOG 6.4 场景四：主库传输目标报错 # 主库检查：\nselect dest_id, dest_name, status, destination, error from v$archive_dest where target = \u0026#39;STANDBY\u0026#39; order by dest_id; 如果 ERROR 不为空，按以下方向排查：\n问题方向 检查内容 网络 主备监听、端口、主机名解析、防火墙 TNS tnsping、tnsnames.ora、service_name 密码文件 主备 SYS 密码、orapw 文件是否一致 归档目标 log_archive_dest_n 配置是否正确 备库状态 备库实例是否启动到 mount/open 状态 FRA/磁盘空间 主库或备库归档目录是否满 常用测试：\ntnsping standby_tns sqlplus sys/密码@standby_tns as sysdba 6.5 场景五：传输正常但应用慢 # 现象：\nRFS 正常； transport lag 不大； apply lag 持续增长； max_received_seq \u0026gt; max_applied_seq。 处理方向：\n检查备库 I/O 性能； 检查备库 CPU / 内存压力； 检查是否有大量 redo 需要应用； 检查 standby redo log 是否合理； 检查 alert 日志是否有 MRP 报错。 操作系统检查：\ntop vmstat 1 10 iostat -x 1 10 重点关注：\n指标 异常判断 %util 接近 100%，磁盘忙 await 明显升高，I/O 响应慢 %iowait 长时间较高，系统等待 I/O MRP 进程 CPU 长时间高，说明正在追日志；长时间无变化则可能卡住 七、恢复后验证 SOP # ADG 异常处理完成后，必须连续验证以下项目。\n7.1 验证无归档缺口 # select * from v$archive_gap; 正常：\nno rows selected 7.2 验证延迟归零 # select name, value, time_computed, datum_time from v$dataguard_stats where name in (\u0026#39;transport lag\u0026#39;,\u0026#39;apply lag\u0026#39;,\u0026#39;apply finish time\u0026#39;); 正常：\ntransport lag +00 00:00:00 apply lag +00 00:00:00 apply finish time +00 00:00:00.000 7.3 验证每个 thread 追平 # select thread#, max(sequence#) as max_received_seq, max(case when applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) then sequence# end) as max_applied_seq, max(sequence#) - max(case when applied in (\u0026#39;YES\u0026#39;,\u0026#39;IN-MEMORY\u0026#39;) then sequence# end) as seq_lag from v$archived_log where resetlogs_change# = (select resetlogs_change# from v$database) group by thread# order by thread#; 正常：\nTHREAD# MAX_RECEIVED_SEQ MAX_APPLIED_SEQ SEQ_LAG ------- ---------------- --------------- ------- 1 96119 96119 0 2 62397 62397 0 7.4 验证 MRP/RFS 状态 # select process, status, thread#, sequence#, block#, client_process from v$managed_standby order by process, thread#; 正常：\nMRP0 APPLYING_LOG 或 WAIT_FOR_LOG RFS IDLE / RECEIVING，CLIENT_PROCESS 为 LGWR 或 Archival 7.5 建议观察周期 # 只有持续满足以下条件，才能认为恢复稳定：\nv$archive_gap = no rows selected transport lag = 0 或秒级 apply lag = 0 或秒级 每个 thread# 的 seq_lag = 0 或短时间可追平 MRP0/RFS 状态正常 主库传输目标无 ERROR 八、常用命令速查 # 8.1 启动实时应用 # alter database recover managed standby database using current logfile disconnect from session; 8.2 停止日志应用 # alter database recover managed standby database cancel; 8.3 启动非实时应用 # alter database recover managed standby database disconnect from session; 8.4 主库强制归档当前日志 # alter system archive log current; 8.5 主库切换日志 # alter system switch logfile; 8.6 备库注册单个归档 # alter database register physical logfile \u0026#39;/path/to/archive.arc\u0026#39;; 8.7 查看 alert 日志 # adrci show homes set home diag/rdbms/\u0026lt;db_unique_name\u0026gt;/\u0026lt;instance_name\u0026gt; show alert -tail 200 或：\ntail -200f $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log ","date":"2026-06-08","externalUrl":null,"permalink":"/posts/oracle-adg-sync-lag-check-sql-sop/","section":"文章","summary":"一篇 Oracle ADG 巡检与故障判断 SOP，系统整理备库侧与主库侧常用 SQL，包含 v$database、v$managed_standby、v$dataguard_stats、v$archive_gap、v$archived_log、v$archive_dest_status 等视图的检查方法，并给出 archive gap、MRP 未启动、主库传输异常、应用慢和 RMAN 增量推进备库的处理流程。","title":"Oracle ADG 同步状态与延迟巡检 SQL SOP","type":"posts"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/rfs/","section":"Tags","summary":"","title":"RFS","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/transport-lag/","section":"Tags","summary":"","title":"Transport Lag","type":"tags"},{"content":"","date":"2026-06-08","externalUrl":null,"permalink":"/tags/%E5%BD%92%E6%A1%A3%E7%BC%BA%E5%8F%A3/","section":"Tags","summary":"","title":"归档缺口","type":"tags"},{"content":"","date":"2026-05-26","externalUrl":null,"permalink":"/tags/dbms_redact/","section":"Tags","summary":"","title":"DBMS_REDACT","type":"tags"},{"content":"","date":"2026-05-26","externalUrl":null,"permalink":"/tags/dbms_rls/","section":"Tags","summary":"","title":"DBMS_RLS","type":"tags"},{"content":" 一、前言 # 在企业数据库安全治理中，身份证号、手机号、工资、银行卡号、邮箱、地址等字段通常属于敏感数据。传统做法包括修改真实数据、建立脱敏副本库、应用层代码脱敏、导出后手工处理等，但这些方式通常存在业务侵入大、运维复杂、数据冗余、安全边界不清晰等问题。\n动态数据脱敏的核心思想是：真实数据不变，仅在查询结果返回时根据策略动态屏蔽敏感字段。\n本文结合 Oracle 与达梦数据库两种实现方式，通过员工表中的身份证号、手机号、工资三个字段进行完整演示，并把实际排错过程中遇到的问题一并整理出来，形成一份可复现、可验证、可发布的技术实践文档。\n数据库 实现方式 核心对象 Oracle DBMS_REDACT Redaction Policy 达梦 DM8 DBMS_RLS + POLICY + MASK RLS Policy + Mask Function 二、Oracle 动态数据脱敏 # 2.1 DBMS_REDACT 理论说明 # Oracle DBMS_REDACT 是用于实现 Data Redaction 的 PL/SQL 包。其作用是在 SQL 查询结果返回给低权限用户或应用前，对指定列进行实时掩码处理。该机制不修改表中的真实数据，而是在结果返回阶段进行动态处理。\nOracle Data Redaction 的几个关键点：\n项目 说明 是否修改原始数据 不修改 生效阶段 查询结果返回前 控制对象 表或视图中的敏感列 条件控制 通过 expression 判断是否脱敏 绕过机制 具有 EXEMPT REDACTION POLICY 权限的用户不会被脱敏 多列脱敏 同一对象先 ADD_POLICY，后续列通过 ALTER_POLICY ADD_COLUMN 添加 Oracle 的 expression 逻辑与达梦后面示例不同：\nOracle DBMS_REDACT：expression 为 TRUE 时执行脱敏。 例如：\nEXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; 表示对符合条件的普通查询用户执行脱敏。\n2.2 创建测试用户 # CREATE USER HR_TEST IDENTIFIED BY \u0026#34;Oracle123\u0026#34;; GRANT CONNECT, RESOURCE TO HR_TEST; SQL\u0026gt; CREATE USER HR_TEST IDENTIFIED BY \u0026#34;Oracle123\u0026#34;; User created. SQL\u0026gt; GRANT CONNECT,RESOURCE TO HR_TEST; Grant succeeded. SQL\u0026gt; 2.3 创建测试表 # CREATE TABLE HR_TEST.EMP_INFO ( EMP_ID INT, EMP_NAME VARCHAR2(50), ID_CARD VARCHAR2(18), MOBILE VARCHAR2(11), SALARY NUMBER(10,2) ); 插入测试数据：\nINSERT INTO HR_TEST.EMP_INFO VALUES (1, \u0026#39;张三\u0026#39;, \u0026#39;310101199001011234\u0026#39;, \u0026#39;13812345678\u0026#39;, 25000); INSERT INTO HR_TEST.EMP_INFO VALUES (2, \u0026#39;李四\u0026#39;, \u0026#39;320102198805056789\u0026#39;, \u0026#39;13987654321\u0026#39;, 18000); COMMIT; 结果如下：\nSQL\u0026gt; CREATE TABLE HR_TEST.EMP_INFO ( EMP_ID INT, 2 3 4 EMP_NAME VARCHAR2(50), ID_CARD VARCHAR2(18), MOBILE VARCHAR2(11), SALARY NUMBER(10,2) ); INSERT INTO HR_TEST.EMP_INFO VALUES (1, \u0026#39;张三\u0026#39;, \u0026#39;310101199001011234\u0026#39;, \u0026#39;13812345678\u0026#39;, 25000); INSERT INTO HR_TEST.EMP_INFO VALUES (2, \u0026#39;李四\u0026#39;, \u0026#39;320102198805056789\u0026#39;, \u0026#39;13987654321\u0026#39;, 18000); COMMIT; 5 6 7 8 Table created. SQL\u0026gt; SQL\u0026gt; 2 1 row created. SQL\u0026gt; SQL\u0026gt; 2 1 row created. SQL\u0026gt; SQL\u0026gt; Commit complete. SQL\u0026gt; select * from HR_TEST.EMP_INFO; EMP_ID EMP_NAME ID_CARD ---------- -------------------------------------------------- ------------------ MOBILE SALARY ----------- ---------- 1 张三 310101199001011234 13812345678 25000 2 李四 320102198805056789 13987654321 18000 SQL\u0026gt; 2.4 Oracle 创建身份证脱敏策略 # 目标：\n310101199001011234 → 310101********1234 添加策略：\nBEGIN DBMS_REDACT.ADD_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, COLUMN_NAME =\u0026gt; \u0026#39;ID_CARD\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;REDACT_EMP_ID_CARD\u0026#39;, FUNCTION_TYPE =\u0026gt; DBMS_REDACT.PARTIAL, FUNCTION_PARAMETERS =\u0026gt; \u0026#39;VVVVVVVVVVVVVVVVVV,VVVVVVVVVVVVVVVVVV,*,7,14\u0026#39;, EXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; ); END; / SQL\u0026gt; BEGIN DBMS_REDACT.ADD_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, COLUMN_NAME =\u0026gt; \u0026#39;ID_CARD\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;REDACT_EMP_ID_CARD\u0026#39;, FUNCTION_TYPE =\u0026gt; DBMS_REDACT.PARTIAL, FUNCTION_PARAMETERS =\u0026gt; \u0026#39;VVVVVVVVVVVVVVVVVV,VVVVVVVVVVVVVVVVVV,*,7,14\u0026#39;, EXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; ); END; / 2 3 4 5 6 7 8 9 10 11 12 PL/SQL procedure successfully completed. SQL\u0026gt; 2.5 Oracle 添加手机号脱敏 # 目标：\n13812345678 → 138****5678 使用 DBMS_REDACT.ALTER_POLICY，在已有策略中增加列：：\nBEGIN DBMS_REDACT.ALTER_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;REDACT_EMP_ID_CARD\u0026#39;, ACTION =\u0026gt; DBMS_REDACT.ADD_COLUMN, COLUMN_NAME =\u0026gt; \u0026#39;MOBILE\u0026#39;, FUNCTION_TYPE =\u0026gt; DBMS_REDACT.PARTIAL, FUNCTION_PARAMETERS =\u0026gt; \u0026#39;VVVVVVVVVVV,VVVVVVVVVVV,*,4,7\u0026#39;, EXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; ); END; / SQL\u0026gt; BEGIN 2 DBMS_REDACT.ALTER_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;REDACT_EMP_ID_CARD\u0026#39;, ACTION =\u0026gt; DBMS_REDACT.ADD_COLUMN, COLUMN_NAME =\u0026gt; \u0026#39;MOBILE\u0026#39;, FUNCTION_TYPE =\u0026gt; DBMS_REDACT.PARTIAL, FUNCTION_PARAMETERS =\u0026gt; \u0026#39;VVVVVVVVVVV,VVVVVVVVVVV,*,4,7\u0026#39;, EXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; ); END; / 3 4 5 6 7 8 9 10 11 12 13 PL/SQL procedure successfully completed. SQL\u0026gt; 特别注意：同一张表只能 ADD_POLICY 一次。后续字段必须：ALTER_POLICY + ADD_COLUMN\n2.6 Oracle 添加工资脱敏 # BEGIN DBMS_REDACT.ALTER_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;REDACT_EMP_ID_CARD\u0026#39;, ACTION =\u0026gt; DBMS_REDACT.ADD_COLUMN, COLUMN_NAME =\u0026gt; \u0026#39;SALARY\u0026#39;, FUNCTION_TYPE =\u0026gt; DBMS_REDACT.FULL, EXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; ); END; / SQL\u0026gt; BEGIN DBMS_REDACT.ALTER_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, 2 3 4 OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;REDACT_EMP_ID_CARD\u0026#39;, ACTION =\u0026gt; DBMS_REDACT.ADD_COLUMN, COLUMN_NAME =\u0026gt; \u0026#39;SALARY\u0026#39;, FUNCTION_TYPE =\u0026gt; DBMS_REDACT.FULL, EXPRESSION =\u0026gt; \u0026#39;1=1\u0026#39; ); END; / 5 6 7 8 9 10 11 12 PL/SQL procedure successfully completed. SQL\u0026gt; 2.7 Oracle 验证脱敏效果 # CONN HR_TEST/Oracle123 SELECT EMP_ID,EMP_NAME,ID_CARD,MOBILE,SALARY FROM HR_TEST.EMP_INFO; 结果：\nSQL\u0026gt; CONN HR_TEST/Oracle123 Connected. SQL\u0026gt; SET LINES 200 SQL\u0026gt; SELECT EMP_ID,EMP_NAME,ID_CARD,MOBILE,SALARY FROM HR_TEST.EMP_INFO; EMP_ID EMP_NAME ID_CARD MOBILE SALARY ---------- -------------------------------------------------- ------------------ ----------- ---------- 1 张三 310101********1234 138****5678 0 2 李四 320102********6789 139****4321 0 SQL\u0026gt; 2.8 Oracle 查看脱敏策略 # 查看 Policy # SELECT OBJECT_OWNER, OBJECT_NAME, POLICY_NAME, EXPRESSION, ENABLE FROM REDACTION_POLICIES WHERE OBJECT_OWNER = \u0026#39;HR_TEST\u0026#39; AND OBJECT_NAME = \u0026#39;EMP_INFO\u0026#39;; SQL\u0026gt; SELECT OBJECT_OWNER, OBJECT_NAME, POLICY_NAME, EXPRESSION, ENABLE FROM REDACTION_POLICIES WHERE OBJECT_OWNER = \u0026#39;HR_TEST\u0026#39; AND OBJECT_NAME = \u0026#39;EMP_INFO\u0026#39;; 2 3 4 5 6 7 8 OBJECT_OWNER OBJECT_NAME POLICY_NAME EXPRESSION ENABLE -------------------- ------------------------------ ------------------------------ -------------------- ------- HR_TEST EMP_INFO REDACT_EMP_ID_CARD 1=1 YES SQL\u0026gt; 查看脱敏字段 # SELECT OBJECT_OWNER, OBJECT_NAME, COLUMN_NAME, FUNCTION_TYPE, FUNCTION_PARAMETERS FROM REDACTION_COLUMNS WHERE OBJECT_OWNER = \u0026#39;HR_TEST\u0026#39; AND OBJECT_NAME = \u0026#39;EMP_INFO\u0026#39;; SQL\u0026gt; SELECT OBJECT_OWNER, OBJECT_NAME, COLUMN_NAME, FUNCTION_TYPE, FUNCTION_PARAMETERS FROM REDACTION_COLUMNS WHERE OBJECT_OWNER = \u0026#39;HR_TEST\u0026#39; AND OBJECT_NAME = \u0026#39;EMP_INFO\u0026#39;; 2 3 4 5 6 7 8 OBJECT_OWNER OBJECT_NAME COLUMN_NAME FUNCTION_TYPE FUNCTION_PARAMETERS -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ HR_TEST EMP_INFO ID_CARD PARTIAL REDACTION VVVVVVVVVVVVVVVVVV,VVVVVVVVVVVVVVVVVV,*,7,14 HR_TEST EMP_INFO MOBILE PARTIAL REDACTION VVVVVVVVVVV,VVVVVVVVVVV,*,4,7 HR_TEST EMP_INFO SALARY FULL REDACTION SQL\u0026gt; 2.9 Oracle 管理员默认不脱敏 # 数据库管理员保留权限机制。实验验证SYSDBA 默认绕过脱敏策略：\nSQL\u0026gt; CONN / AS SYSDBA Connected. SQL\u0026gt; SELECT EMP_ID,EMP_NAME,ID_CARD,MOBILE,SALARY FROM HR_TEST.EMP_INFO; EMP_ID EMP_NAME ID_CARD MOBILE SALARY ---------- -------------------------------------------------- ------------------ ----------- ---------- 1 张三 310101199001011234 13812345678 25000 2 李四 320102198805056789 13987654321 18000 SQL\u0026gt; 用户 是否脱敏 APP_USER 脱敏 SYSDBA 不脱敏 三、达梦数据库动态数据脱敏 # 3.1 DBMS_RLS 理论说明 # 达梦数据库提供 DBMS_RLS 包，通过策略 POLICY 管理实现数据行级安全访问控制，即 Row Level Security，简称 RLS。RLS 的原始设计目标是控制不同行或不同机构的数据访问范围，避免在大量 SQL、视图或应用代码中反复手工追加 WHERE 条件。\n在脱敏场景中，可以结合以下对象实现动态数据脱敏：\n组件 作用 ENABLE_RLS 开启 RLS 能力 POLICY_FUNCTION 返回策略谓词 DBMS_RLS.ADD_POLICY 将策略绑定到表或视图 SEC_RELEVANT_COLS 指定敏感列 SEC_RELEVANT_COLS_OPT =\u0026gt; DBMS_RLS.ALL_ROWS 保留所有行，仅处理敏感列显示 DBMS_RLS.ADD_MASK 为敏感列绑定掩码函数 MASK FUNCTION 定义字段最终显示形式 达梦官方文档明确说明：DBMS_RLS 依赖 ENABLE_RLS=1，开启后需要初始化 DBMS_RLS 系统包，策略对 SYSDBA 用户不会生效，DM MPP 环境不支持 DBMS_RLS 包。\n3.2 开启 ENABLE_RLS # 修改ENABLE_RLS参数，重启数据库实例。\nALTER SYSTEM SET \u0026#39;ENABLE_RLS\u0026#39; = 1 SPFILE; EXIT; DmServiceDMSERVER restart [dmdba@dameng-srv ~]$ disql SYSDBA password: Server[LOCALHOST:5236]:mode is normal, state is open login used time : 4.068(ms) disql V8 SQL\u0026gt; ALTER SYSTEM SET \u0026#39;ENABLE_RLS\u0026#39; = 1 SPFILE; DMSQL executed successfully used time: 9.649(ms). Execute id is 6801. SQL\u0026gt; EXIT [dmdba@dameng-srv ~]$ DmServiceDMSERVER restart Stopping DmServiceDMSERVER: [ OK ] Starting DmServiceDMSERVER: [ OK ] [dmdba@dameng-srv ~]$ 验证：\nSELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = \u0026#39;ENABLE_RLS\u0026#39;; 应看到：\n[dmdba@dameng-srv ~]$ disql SYSDBA password: Server[LOCALHOST:5236]:mode is normal, state is open login used time : 4.601(ms) disql V8 SQL\u0026gt; SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = \u0026#39;ENABLE_RLS\u0026#39;;2 3 LINEID PARA_NAME PARA_VALUE ---------- ---------- ---------- 1 ENABLE_RLS 1 used time: 7.147(ms). Execute id is 601. SQL\u0026gt; 3.3 初始化 DBMS_RLS（部分环境需要） # 部分版本需要初始化：\nSP_INIT_RLS_SYS(1); 兼容旧版本的方式：\nSP_CREATE_SYSTEM_PACKAGES(1, \u0026#39;DBMS_RLS\u0026#39;); 实际执行时，如果当前版本已经内置或已经初始化，则不需要重复执行。\n3.4 创建测试用户 # CREATE USER HR_TEST IDENTIFIED BY \u0026#34;Dameng123\u0026#34;; GRANT RESOURCE,PUBLIC TO HR_TEST; SQL\u0026gt; CREATE USER HR_TEST IDENTIFIED BY \u0026#34;Dameng123\u0026#34;; executed successfully used time: 4.078(ms). Execute id is 608. SQL\u0026gt; GRANT RESOURCE,PUBLIC TO HR_TEST; executed successfully used time: 3.900(ms). Execute id is 609. SQL\u0026gt; 注意：测试脱敏时不要给业务用户授予 DBA，避免高权限导致判断混乱。\n3.5 创建测试表 # CREATE TABLE HR_TEST.EMP_INFO ( EMP_ID INT, EMP_NAME VARCHAR2(50), ID_CARD VARCHAR2(18), MOBILE VARCHAR2(11), SALARY NUMBER(10,2) ); 插入数据：\nINSERT INTO HR_TEST.EMP_INFO VALUES (1, \u0026#39;张三\u0026#39;, \u0026#39;310101199001011234\u0026#39;, \u0026#39;13812345678\u0026#39;, 25000); INSERT INTO HR_TEST.EMP_INFO VALUES (2, \u0026#39;李四\u0026#39;, \u0026#39;320102198805056789\u0026#39;, \u0026#39;13987654321\u0026#39;, 18000); COMMIT; 执行结果：\nSQL\u0026gt; CREATE TABLE HR_TEST.EMP_INFO ( EMP_ID INT, EMP_NAME VARCHAR2(50), ID_CARD VARCHAR2(18), MOBILE VARCHAR2(11), SALARY NUMBER(10,2) );2 3 4 5 6 7 8 executed successfully used time: 4.899(ms). Execute id is 610. SQL\u0026gt; INSERT INTO HR_TEST.EMP_INFO VALUES (1, \u0026#39;\u0026#39;, \u0026#39;310101199001011234\u0026#39;, \u0026#39;13812345678\u0026#39;, 25000); INSERT INTO HR_TEST.EMP_INFO VALUES (2, \u0026#39;\u0026#39;, \u0026#39;320102198805056789\u0026#39;, \u0026#39;13987654321\u0026#39;, 18000); COMMIT;2 affect rows 1 used time: 3.683(ms). Execute id is 611. SQL\u0026gt; SQL\u0026gt; 2 affect rows 1 used time: 1.163(ms). Execute id is 612. SQL\u0026gt; SQL\u0026gt; executed successfully used time: 1.035(ms). Execute id is 613. 3.6 创建策略函数 # 达梦策略函数必须符合固定模板：两个输入参数，返回字符串。返回值会作为策略谓词参与访问控制。\nCREATE OR REPLACE FUNCTION HR_TEST.RLS_EMP_MASK_FUN ( P_OWNER VARCHAR2, P_OBJ VARCHAR2 ) RETURN VARCHAR2 AS BEGIN RETURN \u0026#39;1=2\u0026#39;; END; / SQL\u0026gt; CREATE OR REPLACE FUNCTION HR_TEST.RLS_EMP_MASK_FUN ( P_OWNER VARCHAR2, P_OBJ VARCHAR2 ) RETURN VARCHAR2 AS BEGIN RETURN \u0026#39;1=2\u0026#39;; END; /2 3 4 5 6 7 8 9 10 11 executed successfully used time: 8.267(ms). Execute id is 1202. SQL\u0026gt; 注意：RETURN '1=2';条件不成立，策略生效，触发 MASK\n3.7 创建 MASK 函数 # 身份证号脱敏函数 # CREATE OR REPLACE FUNCTION HR_TEST.MASK_ID_CARD ( P_ID_CARD VARCHAR2 ) RETURN VARCHAR2 AS BEGIN RETURN SUBSTR(P_ID_CARD, 1, 6) || \u0026#39;********\u0026#39; || SUBSTR(P_ID_CARD, -4); END; / SQL\u0026gt; CREATE OR REPLACE FUNCTION HR_TEST.MASK_ID_CARD ( P_ID_CARD VARCHAR2 ) RETURN VARCHAR2 AS BEGIN RETURN SUBSTR(P_ID_CARD, 1, 6) || \u0026#39;********\u0026#39; || SUBSTR(P_ID_CARD, -4); END; /2 3 4 5 6 7 8 9 10 11 12 executed successfully used time: 7.145(ms). Execute id is 1203. SQL\u0026gt; 手机号脱敏函数 # CREATE OR REPLACE FUNCTION HR_TEST.MASK_MOBILE ( P_MOBILE VARCHAR2 ) RETURN VARCHAR2 AS BEGIN RETURN SUBSTR(P_MOBILE, 1, 3) || \u0026#39;****\u0026#39; || SUBSTR(P_MOBILE, -4); END; / SQL\u0026gt; CREATE OR REPLACE FUNCTION HR_TEST.MASK_MOBILE ( P_MOBILE VARCHAR2 ) RETURN VARCHAR2 AS BEGIN RETURN SUBSTR(P_MOBILE, 1, 3) || \u0026#39;****\u0026#39; || SUBSTR(P_MOBILE, -4); END; /2 3 4 5 6 7 8 9 10 11 12 executed successfully used time: 7.131(ms). Execute id is 1204. SQL\u0026gt; 工资脱敏函数 # CREATE OR REPLACE FUNCTION HR_TEST.MASK_SALARY ( P_SALARY NUMBER ) RETURN NUMBER AS BEGIN RETURN 0; END; / SQL\u0026gt; CREATE OR REPLACE FUNCTION HR_TEST.MASK_SALARY ( P_SALARY NUMBER ) RETURN NUMBER AS BEGIN RETURN 0; END; /2 3 4 5 6 7 8 9 10 executed successfully used time: 7.257(ms). Execute id is 1205. SQL\u0026gt; 3.8 创建 RLS Policy # BEGIN DBMS_RLS.ADD_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;POL_EMP_INFO_MASK\u0026#39;, FUNCTION_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, POLICY_FUNCTION =\u0026gt; \u0026#39;RLS_EMP_MASK_FUN\u0026#39;, STATEMENT_TYPES =\u0026gt; \u0026#39;SELECT\u0026#39;, SEC_RELEVANT_COLS =\u0026gt; \u0026#39;ID_CARD,MOBILE,SALARY\u0026#39;, SEC_RELEVANT_COLS_OPT =\u0026gt; DBMS_RLS.ALL_ROWS ); END; / SQL\u0026gt; BEGIN DBMS_RLS.ADD_POLICY( OBJECT_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, OBJECT_NAME =\u0026gt; \u0026#39;EMP_INFO\u0026#39;, POLICY_NAME =\u0026gt; \u0026#39;POL_EMP_INFO_MASK\u0026#39;, 2 3 4 5 6 FUNCTION_SCHEMA =\u0026gt; \u0026#39;HR_TEST\u0026#39;, POLICY_FUNCTION =\u0026gt; \u0026#39;RLS_EMP_MASK_FUN\u0026#39;, STATEMENT_TYPES =\u0026gt; \u0026#39;SELECT\u0026#39;, SEC_RELEVANT_COLS =\u0026gt; \u0026#39;ID_CARD,MOBILE,SALARY\u0026#39;, SEC_RELEVANT_COLS_OPT =\u0026gt; DBMS_RLS.ALL_ROWS ); 7 8 9 10 11 12 END; /13 DMSQL executed successfully used time: 5.585(ms). Execute id is 1206. SQL\u0026gt; 这里的关键参数说明：\n参数 说明 OBJECT_SCHEMA 被保护对象所在模式 OBJECT_NAME 被保护表或视图 POLICY_NAME 策略名称 FUNCTION_SCHEMA 策略函数所在模式 POLICY_FUNCTION 返回策略谓词的函数 STATEMENT_TYPES 生效 SQL 类型，本例为 SELECT SEC_RELEVANT_COLS 敏感列列表 SEC_RELEVANT_COLS_OPT 指定 ALL_ROWS 后保留所有行，仅处理敏感列显示 3.9 绑定 MASK 函数 # 身份证号：\nDBMS_RLS.ADD_MASK( \u0026#39;HR_TEST\u0026#39;, \u0026#39;EMP_INFO\u0026#39;, \u0026#39;ID_CARD\u0026#39;, \u0026#39;HR_TEST\u0026#39;, NULL, \u0026#39;MASK_ID_CARD\u0026#39; ); SQL\u0026gt; DBMS_RLS.ADD_MASK( \u0026#39;HR_TEST\u0026#39;, \u0026#39;EMP_INFO\u0026#39;, \u0026#39;ID_CARD\u0026#39;, \u0026#39;HR_TEST\u0026#39;, NULL, \u0026#39;MASK_ID_CARD\u0026#39; );2 3 4 5 6 7 8 DMSQL executed successfully used time: 5.621(ms). Execute id is 1207. SQL\u0026gt; 手机号：\nDBMS_RLS.ADD_MASK( \u0026#39;HR_TEST\u0026#39;, \u0026#39;EMP_INFO\u0026#39;, \u0026#39;MOBILE\u0026#39;, \u0026#39;HR_TEST\u0026#39;, NULL, \u0026#39;MASK_MOBILE\u0026#39; ); SQL\u0026gt; DBMS_RLS.ADD_MASK( \u0026#39;HR_TEST\u0026#39;, \u0026#39;EMP_INFO\u0026#39;, \u0026#39;MOBILE\u0026#39;, \u0026#39;HR_TEST\u0026#39;, NULL, \u0026#39;MASK_MOBILE\u0026#39; );2 3 4 5 6 7 8 DMSQL executed successfully used time: 3.423(ms). Execute id is 1208. SQL\u0026gt; 工资：\nDBMS_RLS.ADD_MASK( \u0026#39;HR_TEST\u0026#39;, \u0026#39;EMP_INFO\u0026#39;, \u0026#39;SALARY\u0026#39;, \u0026#39;HR_TEST\u0026#39;, NULL, \u0026#39;MASK_SALARY\u0026#39; ); SQL\u0026gt; DBMS_RLS.ADD_MASK( \u0026#39;HR_TEST\u0026#39;, \u0026#39;EMP_INFO\u0026#39;, \u0026#39;SALARY\u0026#39;, \u0026#39;HR_TEST\u0026#39;, NULL, \u0026#39;MASK_SALARY\u0026#39; );2 3 4 5 6 7 8 DMSQL executed successfully used time: 3.313(ms). Execute id is 1209. SQL\u0026gt; 3.10 达梦验证脱敏效果 # 普通用户或业务用户查询：\nCONN HR_TEST/Dameng123 SELECT EMP_ID,EMP_NAME,ID_CARD,MOBILE,SALARY FROM HR_TEST.EMP_INFO; 验证结果：\nSQL\u0026gt; CONN HR_TEST/Dameng123 Server[LOCALHOST:5236]:mode is normal, state is open login used time : 3.265(ms) SQL\u0026gt; SELECT EMP_ID,EMP_NAME,ID_CARD,MOBILE,SALARY FROM HR_TEST.EMP_INFO; LINEID EMP_ID EMP_NAME ID_CARD MOBILE SALARY ---------- ----------- -------- ------------------ ----------- ------ 1 1 310101********1234 138****5678 0 2 2 320102********6789 139****4321 0 used time: 4.411(ms). Execute id is 1502. SQL\u0026gt; 3.11 达梦查看脱敏策略 # 查看 Policy # SQL\u0026gt; SELECT * FROM SYS.POLICIES; LINEID OBJID POLICY_GROUP POLICY_NAME PF_SCHNAME PKG_NAME FUN_NAME SEL DEL INS UPD IND CHK_OPTION ENABLE STATIC_POLICY POLICY_TYPE LONG_PREDICATE TRIGID ---------- ----------- ------------ ----------------- ---------- -------- ---------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------- ----------- -------------- ----------- 1 1035 SYS_DEFAULT POL_EMP_INFO_MASK HR_TEST NULL RLS_EMP_MASK_FUN 3 0 0 0 0 0 1 0 5 0 -1 used time: 3.384(ms). Execute id is 1503. SQL\u0026gt; 查看 MASK # SQL\u0026gt; SELECT * FROM SYS.DBA_POLICY_MASKS; LINEID OBJECT_OWNER OBJECT_NAME COLUMN_NAME FUNCTION_OWNER PACKAGE_NAME FUNCTION_NAME ---------- ------------ ----------- ----------- -------------- ------------ ------------- 1 HR_TEST EMP_INFO ID_CARD HR_TEST NULL MASK_ID_CARD 2 HR_TEST EMP_INFO MOBILE HR_TEST NULL MASK_MOBILE 3 HR_TEST EMP_INFO SALARY HR_TEST NULL MASK_SALARY used time: 4.071(ms). Execute id is 1504. SQL\u0026gt; 3.12 达梦管理员默认不脱敏 # SYSDBA 默认绕过 RLS 脱敏策略。\n[dmdba@dameng-srv ~]$ disql SYSDBA password: Server[LOCALHOST:5236]:mode is normal, state is open login used time : 4.042(ms) disql V8 SQL\u0026gt; SELECT EMP_ID,EMP_NAME,ID_CARD,MOBILE,SALARY FROM HR_TEST.EMP_INFO; LINEID EMP_ID EMP_NAME ID_CARD MOBILE SALARY ---------- ----------- -------- ------------------ ----------- ------ 1 1 310101199001011234 13812345678 25000 2 2 320102198805056789 13987654321 18000 used time: 3.265(ms). Execute id is 1201. SQL\u0026gt; 实验验证结果：\n用户 是否脱敏 HR_TEST 脱敏 SYSDBA 不脱敏 四、Oracle 与达梦动态脱敏对比 # 对比项 Oracle DBMS_REDACT 达梦 DBMS_RLS 功能定位 动态数据脱敏 行级安全 + 动态脱敏 原始数据 不修改 不修改 生效阶段 查询结果返回前 查询策略改写与列掩码阶段 控制方式 Redaction Policy Policy Function + Mask Function 多列处理 首列 ADD_POLICY，后续列 ALTER_POLICY ADD_COLUMN SEC_RELEVANT_COLS 指定列，ADD_MASK 绑定函数 条件逻辑 expression 为 TRUE 时脱敏 本例中 RETURN '1=2' 触发掩码显示 管理员绕过 SYSDBA / EXEMPT 权限用户不脱敏 SYSDBA 不脱敏 复杂度 较低，原生脱敏能力 较高，但灵活性更强 五、总结 # 动态数据脱敏不是简单地把字段替换成星号，而是一种基于数据库策略的敏感数据访问控制能力。它的核心价值在于：真实数据仍然保存在数据库中，普通用户或应用查询时只看到脱敏结果，管理员或授权用户在受控场景下仍可访问原始数据，应用 SQL 通常无需大规模改造。\n从本次实践看，Oracle 与达梦的实现路径不同，但目标一致：都希望在不改变原始数据的前提下，降低敏感信息在查询、运维、报表、测试和排障过程中的暴露风险。\n无论 Oracle 还是达梦，动态脱敏都不是万能的数据安全方案。它解决的是“查询展示层面的敏感数据暴露”问题，不能替代权限最小化、账号治理、数据库审计、备份加密、网络访问控制和运维流程管控。尤其要注意，SYSDBA 等高权限管理员默认可以绕过脱敏策略，因此生产环境必须结合审计和权限管理共同落地。\n参考资料 # Oracle Database PL/SQL Packages and Types Reference：DBMS_REDACT Oracle Advanced Security Guide：Configuring Oracle Data Redaction Policies Oracle Data Redaction Guide：Redacting Multiple Columns Oracle Error Help：ORA-28069 / ORA-28074 达梦官方文档：DBMS_RLS 包 达梦官方 FAQ：如何使图形化工具查询出来的数据不全是明文 dbi-services 技术文章：Oracle Data Redaction or how to hide critical information ","date":"2026-05-26","externalUrl":null,"permalink":"/posts/oracle-dameng-dynamic-data-masking/","section":"文章","summary":"一篇数据库动态数据脱敏实战文档，基于 Oracle DBMS_REDACT 与达梦 DM8 DBMS_RLS 实现身份证号、手机号、工资字段脱敏，覆盖策略创建、字段绑定、普通用户验证、管理员绕过、策略查看和 Oracle / 达梦机制对比。","title":"Oracle 与达梦数据库动态数据脱敏实战：基于 DBMS_REDACT / DBMS_RLS","type":"posts"},{"content":"","date":"2026-05-26","externalUrl":null,"permalink":"/tags/%E5%8A%A8%E6%80%81%E8%84%B1%E6%95%8F/","section":"Tags","summary":"","title":"动态脱敏","type":"tags"},{"content":"","date":"2026-05-26","externalUrl":null,"permalink":"/tags/%E6%95%8F%E6%84%9F%E6%95%B0%E6%8D%AE%E4%BF%9D%E6%8A%A4/","section":"Tags","summary":"","title":"敏感数据保护","type":"tags"},{"content":"","date":"2026-05-26","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8/","section":"Tags","summary":"","title":"数据安全","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/duplicate/","section":"Tags","summary":"","title":"Duplicate","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/oracle-18c/","section":"Tags","summary":"","title":"Oracle 18c","type":"tags"},{"content":" 一、背景需求 # 生产库中有一个业务视图被误修改，需要单独恢复到修改前版本。\n如下先在生产库确认本次对象信息，最后修改时间：\nset lines 200 pages 100 col owner for a20 col object_name for a40 col object_type for a15 col last_ddl_time for a20 col status for a10 select owner, object_name, object_type, to_char(last_ddl_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) last_ddl_time, status from dba_objects where owner = \u0026#39;WMPROD\u0026#39; and object_name = \u0026#39;V_YN_GSP_NBR\u0026#39; and object_type = \u0026#39;VIEW\u0026#39;; 查询结果：\nOWNER OBJECT_NAME OBJECT_TYPE LAST_DDL_TIME STATUS -------------------- ---------------------------------------- --------------- -------------------- ---------- WMPROD V_YN_GSP_NBR VIEW 2026-05-21 14:48:47 VALID SQL\u0026gt; 恢复目标：只恢复 WMPROD.V_YN_GSP_NBR 这个视图定义，不回退生产库数据，不影响其他业务对象，恢复到 2026-05-21 14:48:47 修改之前\n二、恢复思路 # 恢复方法如下表格：\n方法 是否推荐 适用条件 风险 从代码库/发布脚本找旧视图定义 最推荐 有版本管理或上线脚本 最低 用 RMAN 克隆辅助库到修改前时间点，再导出视图 DDL 推荐 有 RMAN 备份 + 归档完整 低，不影响生产 生产库 Flashback Database 回退 不推荐 需要整库回退 高，会影响所有业务 RMAN 直接恢复单个视图 不支持 视图不是物理段对象 不可行 LogMiner 查归档 可辅助定位 想确认谁改的、改了什么 不一定能还原旧定义 Oracle 的视图本质上是数据字典里的元数据对象，不像表数据文件那样可以直接通过 RMAN 单独恢复一个对象。\n所以本次采用的思路是：\n生产库保持不动 ↓ 使用 RMAN Duplicate 克隆一个辅助库 WMSAUX ↓ 辅助库恢复到视图被修改之前的时间点 ↓ 从辅助库导出旧版视图 DDL ↓ 在生产库执行 CREATE OR REPLACE VIEW 覆盖错误定义 ↓ 编译、验证、清理辅助库 为什么不直接做生产库时间点恢复？\n方案 是否采用 原因 生产库 PITR 否 会把整个生产库回退，影响所有业务数据 Flashback Database 否 同样是整库级别回退，风险过高 LogMiner 找 DDL 仅辅助 能定位修改 SQL，但不一定能拿到旧定义 RMAN Duplicate 辅助库 是 不影响生产库，能准确拿到修改前数据字典状态 三、环境信息确认 # 生产库基本信息：\nset lines 200 pages 100 col name for a20 col open_mode for a20 col database_role for a20 select name, dbid, open_mode, database_role from v$database; select instance_name, host_name, version, status from v$instance; 查询结果：\nNAME DBID OPEN_MODE DATABASE_ROLE -------------------- ---------- -------------------- -------------------- WMPROD 3080983586 READ WRITE PRIMARY INSTANCE_NAME HOST_NAME VERSION STATUS ---------------- -------------- ----------------- -------- wmprod wmsdb2019 18.0.0.0.0 OPEN 生产库数据文件和 redo 文件都在文件系统路径：\nSQL\u0026gt; set lines 300 pages 100 col file_name for a120 select file_id, file_name from dba_data_files where rownum \u0026lt;= 20 order by file_id;SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; 2 3 4 FILE_ID FILE_NAME ---------- ------------------------------------------------------------------------------------------------------------------------ 1 /u01/app/oracle/oradata/WMPROD/system01.dbf 2 /u01/app/oracle/oradata/WMPROD/sysaux01.dbf 3 /u01/app/oracle/oradata/WMPROD/undotbs01.dbf 4 /u01/app/oracle/oradata/WMPROD/users01.dbf 5 /u01/app/oracle/oradata/WMPROD/APPT_TXN_DT_TBS.dbf 6 /u01/app/oracle/oradata/WMPROD/APPT_TXN_IDX_TBS.dbf 7 /u01/app/oracle/oradata/WMPROD/CBO_TXN_DT_TBS01.dbf 8 /u01/app/oracle/oradata/WMPROD/CBO_TXN_IDX_TBS01.dbf 9 /u01/app/oracle/oradata/WMPROD/CM_BST4K_DT_TBS01.dbf 10 /u01/app/oracle/oradata/WMPROD/CM_BST4K_IDX_TBS01.dbf 11 /u01/app/oracle/oradata/WMPROD/LEMA_LGTXN_DT_TBS01.dbf 12 /u01/app/oracle/oradata/WMPROD/LEMA_STAT_DT_TBS01.dbf 27 /u01/app/oracle/oradata/WMPROD/LEMA_STAT_DT_TBS02.dbf 28 /u01/app/oracle/oradata/WMPROD/LEMA_STAT_DT_TBS03.dbf 29 /u01/app/oracle/oradata/WMPROD/LEMA_STAT_DT_TBS04.dbf 30 /u01/app/oracle/oradata/WMPROD/LEMA_LGTXN_DT_TBS02.dbf 31 /u01/app/oracle/oradata/WMPROD/LEMA_LGTXN_DT_TBS03.dbf 39 /u01/app/oracle/oradata/WMPROD/LEMA_LGTXN_DT_TBS04.dbf 42 /u01/app/oracle/oradata/WMPROD/LEMA_LGTXN_DT_TBS05.dbf 43 /u01/app/oracle/oradata/WMPROD/LEMA_LGTXN_DT_TBS06.dbf 20 rows selected. SQL\u0026gt; set lines 300 pages 100 col member for a120 select group#, member from v$logfile order by group#;SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; 2 3 GROUP# MEMBER ---------- ------------------------------------------------------------------------------------------------------------------------ 1 /u01/app/oracle/oradata/WMPROD/redo01.log 2 /u01/app/oracle/oradata/WMPROD/redo02.log 3 /u01/app/oracle/oradata/WMPROD/redo03.log 4 /u01/app/oracle/oradata/WMPROD/redo4.log 5 /u01/app/oracle/oradata/WMPROD/redo5.log 6 /u01/app/oracle/oradata/WMPROD/redo6.log 7 /u01/app/oracle/oradata/WMPROD/standby7.log 8 /u01/app/oracle/oradata/WMPROD/standby8.log 9 /u01/app/oracle/oradata/WMPROD/standby9.log 10 /u01/app/oracle/oradata/WMPROD/standby10.log 11 /u01/app/oracle/oradata/WMPROD/standby11.log 12 /u01/app/oracle/oradata/WMPROD/standby12.log 12 rows selected. SQL\u0026gt; 因此辅助库规划为：\n辅助库 名称 SID WMSAUX 数据文件目录 /u01/app/oracle/oradata/WMSAUX FRA 目录 /u01/app/oracle/fast_recovery_area/WMSAUX 审计目录 /u01/app/oracle/admin/WMSAUX/adump 四、查看 RMAN 备份情况 # 进入 RMAN：\nexport ORACLE_SID=wmprod rman target / 查看备份摘要：\n[oracle@wmsdb2019 backup]$ rman target / Recovery Manager: Release 18.0.0.0.0 - Production on Fri May 22 15:09:25 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved. connected to target database: WMPROD (DBID=3080983586) RMAN\u0026gt; LIST BACKUP SUMMARY; using target database control file instead of recovery catalog List of Backups =============== Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag ------- -- -- - ----------- ------------------- ------- ------- ---------- --- 46003 B 0 A SBT_TAPE 2026-05-07 06:33:35 1 1 NO HOT_DB_BK_LEVEL0 46004 B 0 A SBT_TAPE 2026-05-07 06:33:42 1 1 NO HOT_DB_BK_LEVEL0 46005 B 0 A SBT_TAPE 2026-05-07 06:33:44 1 1 NO HOT_DB_BK_LEVEL0 46006 B 0 A SBT_TAPE 2026-05-07 06:33:51 1 1 NO HOT_DB_BK_LEVEL0 46007 B F A SBT_TAPE 2026-05-07 06:34:01 1 1 NO TAG20260507T063353 46008 B A A SBT_TAPE 2026-05-07 06:35:05 1 1 NO TAG20260507T063410 46009 B A A SBT_TAPE 2026-05-07 06:35:16 1 1 NO TAG20260507T063410 46010 B A A SBT_TAPE 2026-05-07 06:36:19 1 1 NO TAG20260507T063410 46011 B A A SBT_TAPE 2026-05-07 06:36:28 1 1 NO TAG20260507T063410 46012 B A A SBT_TAPE 2026-05-07 06:37:23 1 1 NO TAG20260507T063410 46013 B A A SBT_TAPE 2026-05-07 06:37:36 1 1 NO TAG20260507T063410 46014 B F A SBT_TAPE 2026-05-07 06:37:50 1 1 NO TAG20260507T063743 46015 B F A SBT_TAPE 2026-05-07 06:38:07 1 1 NO TAG20260507T063759 46016 B F A SBT_TAPE 2026-05-07 06:38:23 1 1 NO TAG20260507T063816 46017 B 0 A SBT_TAPE 2026-05-08 02:17:59 1 1 NO HOT_DB_BK_LEVEL0 46018 B 0 A SBT_TAPE 2026-05-08 02:18:27 1 1 NO HOT_DB_BK_LEVEL0 46019 B 0 A SBT_TAPE 2026-05-08 02:45:36 1 1 NO HOT_DB_BK_LEVEL0 46020 B 0 A SBT_TAPE 2026-05-08 02:45:54 1 1 NO HOT_DB_BK_LEVEL0 46021 B 0 A SBT_TAPE 2026-05-08 03:25:48 1 1 NO HOT_DB_BK_LEVEL0 46022 B 0 A SBT_TAPE 2026-05-08 03:26:07 1 1 NO HOT_DB_BK_LEVEL0 46023 B 0 A SBT_TAPE 2026-05-08 04:03:28 1 1 NO HOT_DB_BK_LEVEL0 46024 B 0 A SBT_TAPE 2026-05-08 04:08:44 1 1 NO HOT_DB_BK_LEVEL0 46025 B 0 A SBT_TAPE 2026-05-08 04:53:05 1 1 NO HOT_DB_BK_LEVEL0 46026 B 0 A SBT_TAPE 2026-05-08 04:56:32 1 1 NO HOT_DB_BK_LEVEL0 46027 B 0 A SBT_TAPE 2026-05-08 05:13:31 1 1 NO HOT_DB_BK_LEVEL0 46028 B 0 A SBT_TAPE 2026-05-08 05:16:23 1 1 NO HOT_DB_BK_LEVEL0 46029 B 0 A SBT_TAPE 2026-05-08 05:32:07 1 1 NO HOT_DB_BK_LEVEL0 46030 B 0 A SBT_TAPE 2026-05-08 05:34:00 1 1 NO HOT_DB_BK_LEVEL0 46031 B 0 A SBT_TAPE 2026-05-08 05:38:00 1 1 NO HOT_DB_BK_LEVEL0 46032 B 0 A SBT_TAPE 2026-05-08 05:51:21 1 1 NO HOT_DB_BK_LEVEL0 46033 B 0 A SBT_TAPE 2026-05-08 05:54:10 1 1 NO HOT_DB_BK_LEVEL0 46034 B 0 A SBT_TAPE 2026-05-08 05:54:50 1 1 NO HOT_DB_BK_LEVEL0 46035 B 0 A SBT_TAPE 2026-05-08 05:57:04 1 1 NO HOT_DB_BK_LEVEL0 46036 B 0 A SBT_TAPE 2026-05-08 06:10:11 1 1 NO HOT_DB_BK_LEVEL0 46037 B 0 A SBT_TAPE 2026-05-08 06:10:18 1 1 NO HOT_DB_BK_LEVEL0 46038 B 0 A SBT_TAPE 2026-05-08 06:16:17 1 1 NO HOT_DB_BK_LEVEL0 46039 B 0 A SBT_TAPE 2026-05-08 06:21:53 1 1 NO HOT_DB_BK_LEVEL0 46040 B 0 A SBT_TAPE 2026-05-08 06:23:08 1 1 NO HOT_DB_BK_LEVEL0 46041 B 0 A SBT_TAPE 2026-05-08 06:24:15 1 1 NO HOT_DB_BK_LEVEL0 46042 B 0 A SBT_TAPE 2026-05-08 06:25:31 1 1 NO HOT_DB_BK_LEVEL0 46043 B 0 A SBT_TAPE 2026-05-08 06:26:22 1 1 NO HOT_DB_BK_LEVEL0 46044 B 0 A SBT_TAPE 2026-05-08 06:30:01 1 1 NO HOT_DB_BK_LEVEL0 46045 B 0 A SBT_TAPE 2026-05-08 06:30:13 1 1 NO HOT_DB_BK_LEVEL0 46046 B 0 A SBT_TAPE 2026-05-08 06:32:04 1 1 NO HOT_DB_BK_LEVEL0 46047 B 0 A SBT_TAPE 2026-05-08 06:32:38 1 1 NO HOT_DB_BK_LEVEL0 46048 B 0 A SBT_TAPE 2026-05-08 06:33:51 1 1 NO HOT_DB_BK_LEVEL0 46049 B 0 A SBT_TAPE 2026-05-08 06:34:03 1 1 NO HOT_DB_BK_LEVEL0 46050 B 0 A SBT_TAPE 2026-05-08 06:34:50 1 1 NO HOT_DB_BK_LEVEL0 46051 B 0 A SBT_TAPE 2026-05-08 06:34:59 1 1 NO HOT_DB_BK_LEVEL0 46052 B 0 A SBT_TAPE 2026-05-08 06:35:29 1 1 NO HOT_DB_BK_LEVEL0 46053 B 0 A SBT_TAPE 2026-05-08 06:35:34 1 1 NO HOT_DB_BK_LEVEL0 46054 B 0 A SBT_TAPE 2026-05-08 06:35:44 1 1 NO HOT_DB_BK_LEVEL0 46055 B 0 A SBT_TAPE 2026-05-08 06:35:45 1 1 NO HOT_DB_BK_LEVEL0 46056 B 0 A SBT_TAPE 2026-05-08 06:35:51 1 1 NO HOT_DB_BK_LEVEL0 46057 B 0 A SBT_TAPE 2026-05-08 06:35:52 1 1 NO HOT_DB_BK_LEVEL0 46058 B 0 A SBT_TAPE 2026-05-08 06:36:00 1 1 NO HOT_DB_BK_LEVEL0 46059 B 0 A SBT_TAPE 2026-05-08 06:36:03 1 1 NO HOT_DB_BK_LEVEL0 46060 B 0 A SBT_TAPE 2026-05-08 06:36:09 1 1 NO HOT_DB_BK_LEVEL0 46061 B 0 A SBT_TAPE 2026-05-08 06:36:11 1 1 NO HOT_DB_BK_LEVEL0 46062 B F A SBT_TAPE 2026-05-08 06:36:27 1 1 NO TAG20260508T063620 46063 B A A SBT_TAPE 2026-05-08 06:37:44 1 1 NO TAG20260508T063637 46064 B A A SBT_TAPE 2026-05-08 06:37:49 1 1 NO TAG20260508T063637 46065 B A A SBT_TAPE 2026-05-08 06:39:07 1 1 NO TAG20260508T063637 46066 B A A SBT_TAPE 2026-05-08 06:39:10 1 1 NO TAG20260508T063637 46067 B A A SBT_TAPE 2026-05-08 06:40:22 1 1 NO TAG20260508T063637 46068 B F A SBT_TAPE 2026-05-08 06:40:32 1 1 NO TAG20260508T064026 46069 B F A SBT_TAPE 2026-05-08 06:40:49 1 1 NO TAG20260508T064042 46070 B F A SBT_TAPE 2026-05-08 06:40:56 1 1 NO TAG20260508T064050 46071 B 0 A SBT_TAPE 2026-05-09 02:23:31 1 1 NO HOT_DB_BK_LEVEL0 46072 B 0 A SBT_TAPE 2026-05-09 02:23:47 1 1 NO HOT_DB_BK_LEVEL0 46073 B 0 A SBT_TAPE 2026-05-09 03:02:03 1 1 NO HOT_DB_BK_LEVEL0 46074 B 0 A SBT_TAPE 2026-05-09 03:02:08 1 1 NO HOT_DB_BK_LEVEL0 46075 B 0 A SBT_TAPE 2026-05-09 03:52:29 1 1 NO HOT_DB_BK_LEVEL0 46076 B 0 A SBT_TAPE 2026-05-09 03:56:33 1 1 NO HOT_DB_BK_LEVEL0 46077 B 0 A SBT_TAPE 2026-05-09 04:58:41 1 1 NO HOT_DB_BK_LEVEL0 46078 B 0 A SBT_TAPE 2026-05-09 05:03:30 1 1 NO HOT_DB_BK_LEVEL0 46079 B 0 A SBT_TAPE 2026-05-09 05:41:20 1 1 NO HOT_DB_BK_LEVEL0 46080 B 0 A SBT_TAPE 2026-05-09 05:41:48 1 1 NO HOT_DB_BK_LEVEL0 46081 B 0 A SBT_TAPE 2026-05-09 06:03:33 1 1 NO HOT_DB_BK_LEVEL0 46082 B 0 A SBT_TAPE 2026-05-09 06:03:50 1 1 NO HOT_DB_BK_LEVEL0 46083 B 0 A SBT_TAPE 2026-05-09 06:24:54 1 1 NO HOT_DB_BK_LEVEL0 46084 B 0 A SBT_TAPE 2026-05-09 06:25:01 1 1 NO HOT_DB_BK_LEVEL0 46085 B 0 A SBT_TAPE 2026-05-09 06:31:45 1 1 NO HOT_DB_BK_LEVEL0 46086 B 0 A SBT_TAPE 2026-05-09 06:44:38 1 1 NO HOT_DB_BK_LEVEL0 46087 B 0 A SBT_TAPE 2026-05-09 06:47:54 1 1 NO HOT_DB_BK_LEVEL0 46088 B 0 A SBT_TAPE 2026-05-09 06:50:40 1 1 NO HOT_DB_BK_LEVEL0 46089 B 0 A SBT_TAPE 2026-05-09 06:51:25 1 1 NO HOT_DB_BK_LEVEL0 46090 B 0 A SBT_TAPE 2026-05-09 07:07:08 1 1 NO HOT_DB_BK_LEVEL0 46091 B 0 A SBT_TAPE 2026-05-09 07:07:35 1 1 NO HOT_DB_BK_LEVEL0 46092 B 0 A SBT_TAPE 2026-05-09 07:14:12 1 1 NO HOT_DB_BK_LEVEL0 46093 B 0 A SBT_TAPE 2026-05-09 07:20:51 1 1 NO HOT_DB_BK_LEVEL0 46094 B 0 A SBT_TAPE 2026-05-09 07:21:47 1 1 NO HOT_DB_BK_LEVEL0 46095 B 0 A SBT_TAPE 2026-05-09 07:23:28 1 1 NO HOT_DB_BK_LEVEL0 46096 B 0 A SBT_TAPE 2026-05-09 07:24:56 1 1 NO HOT_DB_BK_LEVEL0 46097 B 0 A SBT_TAPE 2026-05-09 07:26:12 1 1 NO HOT_DB_BK_LEVEL0 46098 B 0 A SBT_TAPE 2026-05-09 07:30:33 1 1 NO HOT_DB_BK_LEVEL0 46099 B 0 A SBT_TAPE 2026-05-09 07:30:37 1 1 NO HOT_DB_BK_LEVEL0 46100 B 0 A SBT_TAPE 2026-05-09 07:32:58 1 1 NO HOT_DB_BK_LEVEL0 46101 B 0 A SBT_TAPE 2026-05-09 07:33:02 1 1 NO HOT_DB_BK_LEVEL0 46102 B 0 A SBT_TAPE 2026-05-09 07:34:12 1 1 NO HOT_DB_BK_LEVEL0 46103 B 0 A SBT_TAPE 2026-05-09 07:35:09 1 1 NO HOT_DB_BK_LEVEL0 46104 B 0 A SBT_TAPE 2026-05-09 07:35:10 1 1 NO HOT_DB_BK_LEVEL0 46105 B 0 A SBT_TAPE 2026-05-09 07:35:56 1 1 NO HOT_DB_BK_LEVEL0 46106 B 0 A SBT_TAPE 2026-05-09 07:36:11 1 1 NO HOT_DB_BK_LEVEL0 46107 B 0 A SBT_TAPE 2026-05-09 07:36:19 1 1 NO HOT_DB_BK_LEVEL0 46108 B 0 A SBT_TAPE 2026-05-09 07:36:22 1 1 NO HOT_DB_BK_LEVEL0 46109 B 0 A SBT_TAPE 2026-05-09 07:36:38 1 1 NO HOT_DB_BK_LEVEL0 46110 B 0 A SBT_TAPE 2026-05-09 07:36:38 1 1 NO HOT_DB_BK_LEVEL0 46111 B 0 A SBT_TAPE 2026-05-09 07:36:52 1 1 NO HOT_DB_BK_LEVEL0 46112 B 0 A SBT_TAPE 2026-05-09 07:36:53 1 1 NO HOT_DB_BK_LEVEL0 46113 B 0 A SBT_TAPE 2026-05-09 07:37:07 1 1 NO HOT_DB_BK_LEVEL0 46114 B 0 A SBT_TAPE 2026-05-09 07:37:08 1 1 NO HOT_DB_BK_LEVEL0 46115 B 0 A SBT_TAPE 2026-05-09 07:37:22 1 1 NO HOT_DB_BK_LEVEL0 46116 B F A SBT_TAPE 2026-05-09 07:37:38 1 1 NO TAG20260509T073731 46117 B A A SBT_TAPE 2026-05-09 07:39:00 1 1 NO TAG20260509T073748 46118 B A A SBT_TAPE 2026-05-09 07:39:04 1 1 NO TAG20260509T073748 46119 B A A SBT_TAPE 2026-05-09 07:40:25 1 1 NO TAG20260509T073748 46120 B A A SBT_TAPE 2026-05-09 07:40:29 1 1 NO TAG20260509T073748 46121 B A A SBT_TAPE 2026-05-09 07:41:31 1 1 NO TAG20260509T073748 46122 B F A SBT_TAPE 2026-05-09 07:41:44 1 1 NO TAG20260509T074137 46123 B F A SBT_TAPE 2026-05-09 07:42:01 1 1 NO TAG20260509T074153 46124 B F A SBT_TAPE 2026-05-09 07:42:16 1 1 NO TAG20260509T074209 46125 B 0 A SBT_TAPE 2026-05-10 02:16:01 1 1 NO HOT_DB_BK_LEVEL0 46126 B 0 A SBT_TAPE 2026-05-10 02:16:33 1 1 NO HOT_DB_BK_LEVEL0 46127 B 0 A SBT_TAPE 2026-05-10 02:43:03 1 1 NO HOT_DB_BK_LEVEL0 46128 B 0 A SBT_TAPE 2026-05-10 02:43:36 1 1 NO HOT_DB_BK_LEVEL0 46129 B 0 A SBT_TAPE 2026-05-10 03:16:00 1 1 NO HOT_DB_BK_LEVEL0 46130 B 0 A SBT_TAPE 2026-05-10 03:16:22 1 1 NO HOT_DB_BK_LEVEL0 46131 B 0 A SBT_TAPE 2026-05-10 03:49:31 1 1 NO HOT_DB_BK_LEVEL0 46132 B 0 A SBT_TAPE 2026-05-10 03:50:11 1 1 NO HOT_DB_BK_LEVEL0 46133 B 0 A SBT_TAPE 2026-05-10 04:33:42 1 1 NO HOT_DB_BK_LEVEL0 46134 B 0 A SBT_TAPE 2026-05-10 04:36:09 1 1 NO HOT_DB_BK_LEVEL0 46135 B 0 A SBT_TAPE 2026-05-10 05:08:38 1 1 NO HOT_DB_BK_LEVEL0 46136 B 0 A SBT_TAPE 2026-05-10 05:12:34 1 1 NO HOT_DB_BK_LEVEL0 46137 B 0 A SBT_TAPE 2026-05-10 05:31:13 1 1 NO HOT_DB_BK_LEVEL0 46138 B 0 A SBT_TAPE 2026-05-10 05:33:27 1 1 NO HOT_DB_BK_LEVEL0 46139 B 0 A SBT_TAPE 2026-05-10 05:36:48 1 1 NO HOT_DB_BK_LEVEL0 46140 B 0 A SBT_TAPE 2026-05-10 05:50:17 1 1 NO HOT_DB_BK_LEVEL0 46141 B 0 A SBT_TAPE 2026-05-10 05:53:34 1 1 NO HOT_DB_BK_LEVEL0 46142 B 0 A SBT_TAPE 2026-05-10 05:53:40 1 1 NO HOT_DB_BK_LEVEL0 46143 B 0 A SBT_TAPE 2026-05-10 05:57:13 1 1 NO HOT_DB_BK_LEVEL0 46144 B 0 A SBT_TAPE 2026-05-10 06:08:08 1 1 NO HOT_DB_BK_LEVEL0 46145 B 0 A SBT_TAPE 2026-05-10 06:11:11 1 1 NO HOT_DB_BK_LEVEL0 46146 B 0 A SBT_TAPE 2026-05-10 06:17:17 1 1 NO HOT_DB_BK_LEVEL0 46147 B 0 A SBT_TAPE 2026-05-10 06:21:22 1 1 NO HOT_DB_BK_LEVEL0 46148 B 0 A SBT_TAPE 2026-05-10 06:22:58 1 1 NO HOT_DB_BK_LEVEL0 46149 B 0 A SBT_TAPE 2026-05-10 06:24:26 1 1 NO HOT_DB_BK_LEVEL0 46150 B 0 A SBT_TAPE 2026-05-10 06:25:45 1 1 NO HOT_DB_BK_LEVEL0 46151 B 0 A SBT_TAPE 2026-05-10 06:26:37 1 1 NO HOT_DB_BK_LEVEL0 46152 B 0 A SBT_TAPE 2026-05-10 06:30:36 1 1 NO HOT_DB_BK_LEVEL0 46153 B 0 A SBT_TAPE 2026-05-10 06:31:04 1 1 NO HOT_DB_BK_LEVEL0 46154 B 0 A SBT_TAPE 2026-05-10 06:33:02 1 1 NO HOT_DB_BK_LEVEL0 46155 B 0 A SBT_TAPE 2026-05-10 06:33:14 1 1 NO HOT_DB_BK_LEVEL0 46156 B 0 A SBT_TAPE 2026-05-10 06:34:28 1 1 NO HOT_DB_BK_LEVEL0 46157 B 0 A SBT_TAPE 2026-05-10 06:35:06 1 1 NO HOT_DB_BK_LEVEL0 46158 B 0 A SBT_TAPE 2026-05-10 06:35:30 1 1 NO HOT_DB_BK_LEVEL0 46159 B 0 A SBT_TAPE 2026-05-10 06:35:53 1 1 NO HOT_DB_BK_LEVEL0 46160 B 0 A SBT_TAPE 2026-05-10 06:36:05 1 1 NO HOT_DB_BK_LEVEL0 46161 B 0 A SBT_TAPE 2026-05-10 06:36:16 1 1 NO HOT_DB_BK_LEVEL0 46162 B 0 A SBT_TAPE 2026-05-10 06:36:30 1 1 NO HOT_DB_BK_LEVEL0 46163 B 0 A SBT_TAPE 2026-05-10 06:36:31 1 1 NO HOT_DB_BK_LEVEL0 46164 B 0 A SBT_TAPE 2026-05-10 06:36:38 1 1 NO HOT_DB_BK_LEVEL0 46165 B 0 A SBT_TAPE 2026-05-10 06:36:42 1 1 NO HOT_DB_BK_LEVEL0 46166 B 0 A SBT_TAPE 2026-05-10 06:36:49 1 1 NO HOT_DB_BK_LEVEL0 46167 B 0 A SBT_TAPE 2026-05-10 06:36:52 1 1 NO HOT_DB_BK_LEVEL0 46168 B 0 A SBT_TAPE 2026-05-10 06:36:59 1 1 NO HOT_DB_BK_LEVEL0 46169 B 0 A SBT_TAPE 2026-05-10 06:37:02 1 1 NO HOT_DB_BK_LEVEL0 46170 B F A SBT_TAPE 2026-05-10 06:37:17 1 1 NO TAG20260510T063711 46171 B A A SBT_TAPE 2026-05-10 06:38:22 1 1 NO TAG20260510T063728 46172 B A A SBT_TAPE 2026-05-10 06:38:24 1 1 NO TAG20260510T063728 46173 B A A SBT_TAPE 2026-05-10 06:39:33 1 1 NO TAG20260510T063728 46174 B A A SBT_TAPE 2026-05-10 06:39:41 1 1 NO TAG20260510T063728 46175 B A A SBT_TAPE 2026-05-10 06:40:45 1 1 NO TAG20260510T063728 46176 B A A SBT_TAPE 2026-05-10 06:40:45 1 1 NO TAG20260510T063728 46177 B F A SBT_TAPE 2026-05-10 06:41:00 1 1 NO TAG20260510T064054 46178 B F A SBT_TAPE 2026-05-10 06:41:10 1 1 NO TAG20260510T064102 46179 B F A SBT_TAPE 2026-05-10 06:41:24 1 1 NO TAG20260510T064118 46180 B 0 A SBT_TAPE 2026-05-11 02:17:02 1 1 NO HOT_DB_BK_LEVEL0 46181 B 0 A SBT_TAPE 2026-05-11 02:17:38 1 1 NO HOT_DB_BK_LEVEL0 46182 B 0 A SBT_TAPE 2026-05-11 02:43:36 1 1 NO HOT_DB_BK_LEVEL0 46183 B 0 A SBT_TAPE 2026-05-11 02:44:31 1 1 NO HOT_DB_BK_LEVEL0 46184 B 0 A SBT_TAPE 2026-05-11 03:19:46 1 1 NO HOT_DB_BK_LEVEL0 46185 B 0 A SBT_TAPE 2026-05-11 03:21:15 1 1 NO HOT_DB_BK_LEVEL0 46186 B 0 A SBT_TAPE 2026-05-11 03:57:15 1 1 NO HOT_DB_BK_LEVEL0 46187 B 0 A SBT_TAPE 2026-05-11 03:58:57 1 1 NO HOT_DB_BK_LEVEL0 46188 B 0 A SBT_TAPE 2026-05-11 04:46:47 1 1 NO HOT_DB_BK_LEVEL0 46189 B 0 A SBT_TAPE 2026-05-11 04:48:09 1 1 NO HOT_DB_BK_LEVEL0 46190 B 0 A SBT_TAPE 2026-05-11 05:13:26 1 1 NO HOT_DB_BK_LEVEL0 46191 B 0 A SBT_TAPE 2026-05-11 05:14:56 1 1 NO HOT_DB_BK_LEVEL0 46192 B 0 A SBT_TAPE 2026-05-11 05:32:11 1 1 NO HOT_DB_BK_LEVEL0 46193 B 0 A SBT_TAPE 2026-05-11 05:33:56 1 1 NO HOT_DB_BK_LEVEL0 46194 B 0 A SBT_TAPE 2026-05-11 05:38:10 1 1 NO HOT_DB_BK_LEVEL0 46195 B 0 A SBT_TAPE 2026-05-11 05:51:28 1 1 NO HOT_DB_BK_LEVEL0 46196 B 0 A SBT_TAPE 2026-05-11 05:54:57 1 1 NO HOT_DB_BK_LEVEL0 46197 B 0 A SBT_TAPE 2026-05-11 05:55:13 1 1 NO HOT_DB_BK_LEVEL0 46198 B 0 A SBT_TAPE 2026-05-11 05:58:48 1 1 NO HOT_DB_BK_LEVEL0 46199 B 0 A SBT_TAPE 2026-05-11 06:10:28 1 1 NO HOT_DB_BK_LEVEL0 46200 B 0 A SBT_TAPE 2026-05-11 06:12:29 1 1 NO HOT_DB_BK_LEVEL0 46201 B 0 A SBT_TAPE 2026-05-11 06:17:48 1 1 NO HOT_DB_BK_LEVEL0 46202 B 0 A SBT_TAPE 2026-05-11 06:23:21 1 1 NO HOT_DB_BK_LEVEL0 46203 B 0 A SBT_TAPE 2026-05-11 06:23:48 1 1 NO HOT_DB_BK_LEVEL0 46204 B 0 A SBT_TAPE 2026-05-11 06:25:02 1 1 NO HOT_DB_BK_LEVEL0 46205 B 0 A SBT_TAPE 2026-05-11 06:26:31 1 1 NO HOT_DB_BK_LEVEL0 46206 B 0 A SBT_TAPE 2026-05-11 06:28:12 1 1 NO HOT_DB_BK_LEVEL0 46207 B 0 A SBT_TAPE 2026-05-11 06:31:32 1 1 NO HOT_DB_BK_LEVEL0 46208 B 0 A SBT_TAPE 2026-05-11 06:32:01 1 1 NO HOT_DB_BK_LEVEL0 46209 B 0 A SBT_TAPE 2026-05-11 06:33:58 1 1 NO HOT_DB_BK_LEVEL0 46210 B 0 A SBT_TAPE 2026-05-11 06:34:21 1 1 NO HOT_DB_BK_LEVEL0 46211 B 0 A SBT_TAPE 2026-05-11 06:35:34 1 1 NO HOT_DB_BK_LEVEL0 46212 B 0 A SBT_TAPE 2026-05-11 06:35:41 1 1 NO HOT_DB_BK_LEVEL0 46213 B 0 A SBT_TAPE 2026-05-11 06:36:27 1 1 NO HOT_DB_BK_LEVEL0 46214 B 0 A SBT_TAPE 2026-05-11 06:36:28 1 1 NO HOT_DB_BK_LEVEL0 46215 B 0 A SBT_TAPE 2026-05-11 06:37:01 1 1 NO HOT_DB_BK_LEVEL0 46216 B 0 A SBT_TAPE 2026-05-11 06:37:06 1 1 NO HOT_DB_BK_LEVEL0 46217 B 0 A SBT_TAPE 2026-05-11 06:37:12 1 1 NO HOT_DB_BK_LEVEL0 46218 B 0 A SBT_TAPE 2026-05-11 06:37:19 1 1 NO HOT_DB_BK_LEVEL0 46219 B 0 A SBT_TAPE 2026-05-11 06:37:22 1 1 NO HOT_DB_BK_LEVEL0 46220 B 0 A SBT_TAPE 2026-05-11 06:37:31 1 1 NO HOT_DB_BK_LEVEL0 46221 B 0 A SBT_TAPE 2026-05-11 06:37:33 1 1 NO HOT_DB_BK_LEVEL0 46222 B 0 A SBT_TAPE 2026-05-11 06:37:48 1 1 NO HOT_DB_BK_LEVEL0 46223 B 0 A SBT_TAPE 2026-05-11 06:37:48 1 1 NO HOT_DB_BK_LEVEL0 46224 B 0 A SBT_TAPE 2026-05-11 06:38:02 1 1 NO HOT_DB_BK_LEVEL0 46225 B F A SBT_TAPE 2026-05-11 06:38:11 1 1 NO TAG20260511T063804 46226 B A A SBT_TAPE 2026-05-11 06:39:21 1 1 NO TAG20260511T063821 46227 B A A SBT_TAPE 2026-05-11 06:39:28 1 1 NO TAG20260511T063821 46228 B A A SBT_TAPE 2026-05-11 06:40:31 1 1 NO TAG20260511T063821 46229 B F A SBT_TAPE 2026-05-11 06:40:49 1 1 NO TAG20260511T064043 46230 B F A SBT_TAPE 2026-05-11 06:41:07 1 1 NO TAG20260511T064059 46231 B F A SBT_TAPE 2026-05-11 06:41:23 1 1 NO TAG20260511T064115 46232 B 0 A SBT_TAPE 2026-05-12 02:17:25 1 1 NO HOT_DB_BK_LEVEL0 46233 B 0 A SBT_TAPE 2026-05-12 02:18:49 1 1 NO HOT_DB_BK_LEVEL0 46234 B 0 A SBT_TAPE 2026-05-12 02:45:28 1 1 NO HOT_DB_BK_LEVEL0 46235 B 0 A SBT_TAPE 2026-05-12 02:46:43 1 1 NO HOT_DB_BK_LEVEL0 46236 B 0 A SBT_TAPE 2026-05-12 03:22:01 1 1 NO HOT_DB_BK_LEVEL0 46237 B 0 A SBT_TAPE 2026-05-12 03:30:48 1 1 NO HOT_DB_BK_LEVEL0 46238 B 0 A SBT_TAPE 2026-05-12 04:06:18 1 1 NO HOT_DB_BK_LEVEL0 46239 B 0 A SBT_TAPE 2026-05-12 04:10:42 1 1 NO HOT_DB_BK_LEVEL0 46240 B 0 A SBT_TAPE 2026-05-12 04:53:28 1 1 NO HOT_DB_BK_LEVEL0 46241 B 0 A SBT_TAPE 2026-05-12 04:53:30 1 1 NO HOT_DB_BK_LEVEL0 46242 B 0 A SBT_TAPE 2026-05-12 05:15:01 1 1 NO HOT_DB_BK_LEVEL0 46243 B 0 A SBT_TAPE 2026-05-12 05:14:59 1 1 NO HOT_DB_BK_LEVEL0 46244 B 0 A SBT_TAPE 2026-05-12 05:33:24 1 1 NO HOT_DB_BK_LEVEL0 46245 B 0 A SBT_TAPE 2026-05-12 05:33:34 1 1 NO HOT_DB_BK_LEVEL0 46246 B 0 A SBT_TAPE 2026-05-12 05:40:11 1 1 NO HOT_DB_BK_LEVEL0 46247 B 0 A SBT_TAPE 2026-05-12 05:49:58 1 1 NO HOT_DB_BK_LEVEL0 46248 B 0 A SBT_TAPE 2026-05-12 05:53:30 1 1 NO HOT_DB_BK_LEVEL0 46249 B 0 A SBT_TAPE 2026-05-12 05:57:38 1 1 NO HOT_DB_BK_LEVEL0 46250 B 0 A SBT_TAPE 2026-05-12 05:58:17 1 1 NO HOT_DB_BK_LEVEL0 46251 B 0 A SBT_TAPE 2026-05-12 06:12:24 1 1 NO HOT_DB_BK_LEVEL0 46252 B 0 A SBT_TAPE 2026-05-12 06:12:49 1 1 NO HOT_DB_BK_LEVEL0 46253 B 0 A SBT_TAPE 2026-05-12 06:19:05 1 1 NO HOT_DB_BK_LEVEL0 46254 B 0 A SBT_TAPE 2026-05-12 06:24:16 1 1 NO HOT_DB_BK_LEVEL0 46255 B 0 A SBT_TAPE 2026-05-12 06:24:49 1 1 NO HOT_DB_BK_LEVEL0 46256 B 0 A SBT_TAPE 2026-05-12 06:26:40 1 1 NO HOT_DB_BK_LEVEL0 46257 B 0 A SBT_TAPE 2026-05-12 06:27:54 1 1 NO HOT_DB_BK_LEVEL0 46258 B 0 A SBT_TAPE 2026-05-12 06:29:07 1 1 NO HOT_DB_BK_LEVEL0 46259 B 0 A SBT_TAPE 2026-05-12 06:33:04 1 1 NO HOT_DB_BK_LEVEL0 46260 B 0 A SBT_TAPE 2026-05-12 06:33:09 1 1 NO HOT_DB_BK_LEVEL0 46261 B 0 A SBT_TAPE 2026-05-12 06:35:13 1 1 NO HOT_DB_BK_LEVEL0 46262 B 0 A SBT_TAPE 2026-05-12 06:35:47 1 1 NO HOT_DB_BK_LEVEL0 46263 B 0 A SBT_TAPE 2026-05-12 06:36:55 1 1 NO HOT_DB_BK_LEVEL0 46264 B 0 A SBT_TAPE 2026-05-12 06:37:22 1 1 NO HOT_DB_BK_LEVEL0 46265 B 0 A SBT_TAPE 2026-05-12 06:37:48 1 1 NO HOT_DB_BK_LEVEL0 46266 B 0 A SBT_TAPE 2026-05-12 06:38:13 1 1 NO HOT_DB_BK_LEVEL0 46267 B 0 A SBT_TAPE 2026-05-12 06:38:44 1 1 NO HOT_DB_BK_LEVEL0 46268 B 0 A SBT_TAPE 2026-05-12 06:38:44 1 1 NO HOT_DB_BK_LEVEL0 46269 B 0 A SBT_TAPE 2026-05-12 06:38:53 1 1 NO HOT_DB_BK_LEVEL0 46270 B 0 A SBT_TAPE 2026-05-12 06:38:55 1 1 NO HOT_DB_BK_LEVEL0 46271 B 0 A SBT_TAPE 2026-05-12 06:39:10 1 1 NO HOT_DB_BK_LEVEL0 46272 B 0 A SBT_TAPE 2026-05-12 06:39:11 1 1 NO HOT_DB_BK_LEVEL0 46273 B 0 A SBT_TAPE 2026-05-12 06:39:26 1 1 NO HOT_DB_BK_LEVEL0 46274 B 0 A SBT_TAPE 2026-05-12 06:39:25 1 1 NO HOT_DB_BK_LEVEL0 46275 B 0 A SBT_TAPE 2026-05-12 06:39:40 1 1 NO HOT_DB_BK_LEVEL0 46276 B 0 A SBT_TAPE 2026-05-12 06:39:41 1 1 NO HOT_DB_BK_LEVEL0 46277 B F A SBT_TAPE 2026-05-12 06:39:57 1 1 NO TAG20260512T063950 46278 B A A SBT_TAPE 2026-05-12 06:40:59 1 1 NO TAG20260512T064007 46279 B A A SBT_TAPE 2026-05-12 06:41:01 1 1 NO TAG20260512T064007 46280 B A A SBT_TAPE 2026-05-12 06:41:57 1 1 NO TAG20260512T064007 46281 B A A SBT_TAPE 2026-05-12 06:41:57 1 1 NO TAG20260512T064007 46282 B A A SBT_TAPE 2026-05-12 06:42:55 1 1 NO TAG20260512T064007 46283 B A A SBT_TAPE 2026-05-12 06:43:02 1 1 NO TAG20260512T064007 46284 B F A SBT_TAPE 2026-05-12 06:43:20 1 1 NO TAG20260512T064309 46285 B F A SBT_TAPE 2026-05-12 06:43:32 1 1 NO TAG20260512T064325 46286 B F A SBT_TAPE 2026-05-12 06:43:48 1 1 NO TAG20260512T064342 46287 B 0 A SBT_TAPE 2026-05-13 02:16:33 1 1 NO HOT_DB_BK_LEVEL0 46288 B 0 A SBT_TAPE 2026-05-13 02:16:50 1 1 NO HOT_DB_BK_LEVEL0 46289 B 0 A SBT_TAPE 2026-05-13 02:43:42 1 1 NO HOT_DB_BK_LEVEL0 46290 B 0 A SBT_TAPE 2026-05-13 02:44:25 1 1 NO HOT_DB_BK_LEVEL0 46291 B 0 A SBT_TAPE 2026-05-13 03:20:22 1 1 NO HOT_DB_BK_LEVEL0 46292 B 0 A SBT_TAPE 2026-05-13 03:22:20 1 1 NO HOT_DB_BK_LEVEL0 46293 B 0 A SBT_TAPE 2026-05-13 04:00:12 1 1 NO HOT_DB_BK_LEVEL0 46294 B 0 A SBT_TAPE 2026-05-13 04:04:07 1 1 NO HOT_DB_BK_LEVEL0 46295 B 0 A SBT_TAPE 2026-05-13 04:45:21 1 1 NO HOT_DB_BK_LEVEL0 46296 B 0 A SBT_TAPE 2026-05-13 04:52:43 1 1 NO HOT_DB_BK_LEVEL0 46297 B 0 A SBT_TAPE 2026-05-13 05:10:23 1 1 NO HOT_DB_BK_LEVEL0 46298 B 0 A SBT_TAPE 2026-05-13 05:13:31 1 1 NO HOT_DB_BK_LEVEL0 46299 B 0 A SBT_TAPE 2026-05-13 05:29:48 1 1 NO HOT_DB_BK_LEVEL0 46300 B 0 A SBT_TAPE 2026-05-13 05:32:08 1 1 NO HOT_DB_BK_LEVEL0 46301 B 0 A SBT_TAPE 2026-05-13 05:35:39 1 1 NO HOT_DB_BK_LEVEL0 46302 B 0 A SBT_TAPE 2026-05-13 05:49:33 1 1 NO HOT_DB_BK_LEVEL0 46303 B 0 A SBT_TAPE 2026-05-13 05:52:40 1 1 NO HOT_DB_BK_LEVEL0 46304 B 0 A SBT_TAPE 2026-05-13 05:53:27 1 1 NO HOT_DB_BK_LEVEL0 46305 B 0 A SBT_TAPE 2026-05-13 05:57:00 1 1 NO HOT_DB_BK_LEVEL0 46306 B 0 A SBT_TAPE 2026-05-13 06:08:18 1 1 NO HOT_DB_BK_LEVEL0 46307 B 0 A SBT_TAPE 2026-05-13 06:10:52 1 1 NO HOT_DB_BK_LEVEL0 46308 B 0 A SBT_TAPE 2026-05-13 06:17:10 1 1 NO HOT_DB_BK_LEVEL0 46309 B 0 A SBT_TAPE 2026-05-13 06:21:08 1 1 NO HOT_DB_BK_LEVEL0 46310 B 0 A SBT_TAPE 2026-05-13 06:22:59 1 1 NO HOT_DB_BK_LEVEL0 46311 B 0 A SBT_TAPE 2026-05-13 06:24:34 1 1 NO HOT_DB_BK_LEVEL0 46312 B 0 A SBT_TAPE 2026-05-13 06:26:19 1 1 NO HOT_DB_BK_LEVEL0 46313 B 0 A SBT_TAPE 2026-05-13 06:26:24 1 1 NO HOT_DB_BK_LEVEL0 46314 B 0 A SBT_TAPE 2026-05-13 06:29:57 1 1 NO HOT_DB_BK_LEVEL0 46315 B 0 A SBT_TAPE 2026-05-13 06:31:06 1 1 NO HOT_DB_BK_LEVEL0 46316 B 0 A SBT_TAPE 2026-05-13 06:32:15 1 1 NO HOT_DB_BK_LEVEL0 46317 B 0 A SBT_TAPE 2026-05-13 06:33:14 1 1 NO HOT_DB_BK_LEVEL0 46318 B 0 A SBT_TAPE 2026-05-13 06:34:19 1 1 NO HOT_DB_BK_LEVEL0 46319 B 0 A SBT_TAPE 2026-05-13 06:34:22 1 1 NO HOT_DB_BK_LEVEL0 46320 B 0 A SBT_TAPE 2026-05-13 06:35:12 1 1 NO HOT_DB_BK_LEVEL0 46321 B 0 A SBT_TAPE 2026-05-13 06:35:15 1 1 NO HOT_DB_BK_LEVEL0 46322 B 0 A SBT_TAPE 2026-05-13 06:35:48 1 1 NO HOT_DB_BK_LEVEL0 46323 B 0 A SBT_TAPE 2026-05-13 06:35:58 1 1 NO HOT_DB_BK_LEVEL0 46324 B 0 A SBT_TAPE 2026-05-13 06:36:03 1 1 NO HOT_DB_BK_LEVEL0 46325 B 0 A SBT_TAPE 2026-05-13 06:36:10 1 1 NO HOT_DB_BK_LEVEL0 46326 B 0 A SBT_TAPE 2026-05-13 06:36:14 1 1 NO HOT_DB_BK_LEVEL0 46327 B 0 A SBT_TAPE 2026-05-13 06:36:21 1 1 NO HOT_DB_BK_LEVEL0 46328 B 0 A SBT_TAPE 2026-05-13 06:36:24 1 1 NO HOT_DB_BK_LEVEL0 46329 B 0 A SBT_TAPE 2026-05-13 06:36:37 1 1 NO HOT_DB_BK_LEVEL0 46330 B 0 A SBT_TAPE 2026-05-13 06:36:37 1 1 NO HOT_DB_BK_LEVEL0 46331 B 0 A SBT_TAPE 2026-05-13 06:36:44 1 1 NO HOT_DB_BK_LEVEL0 46332 B F A SBT_TAPE 2026-05-13 06:36:56 1 1 NO TAG20260513T063646 46333 B A A SBT_TAPE 2026-05-13 06:38:07 1 1 NO TAG20260513T063703 46334 B A A SBT_TAPE 2026-05-13 06:38:18 1 1 NO TAG20260513T063703 46335 B A A SBT_TAPE 2026-05-13 06:39:29 1 1 NO TAG20260513T063703 46336 B A A SBT_TAPE 2026-05-13 06:39:31 1 1 NO TAG20260513T063703 46337 B A A SBT_TAPE 2026-05-13 06:40:21 1 1 NO TAG20260513T063703 46338 B F A SBT_TAPE 2026-05-13 06:40:31 1 1 NO TAG20260513T064025 46339 B F A SBT_TAPE 2026-05-13 06:40:49 1 1 NO TAG20260513T064041 46340 B F A SBT_TAPE 2026-05-13 06:41:03 1 1 NO TAG20260513T064057 46341 B F A DISK 2026-05-13 15:31:46 1 1 NO TAG20260513T153146 46342 B F A DISK 2026-05-13 16:41:55 1 1 NO TAG20260513T164155 46343 B F A DISK 2026-05-13 22:12:41 1 1 NO TAG20260513T221241 46344 B F A DISK 2026-05-13 22:32:42 1 1 NO TAG20260513T223242 46345 B 0 A SBT_TAPE 2026-05-14 02:16:14 1 1 NO HOT_DB_BK_LEVEL0 46346 B 0 A SBT_TAPE 2026-05-14 02:17:01 1 1 NO HOT_DB_BK_LEVEL0 46347 B 0 A SBT_TAPE 2026-05-14 02:43:39 1 1 NO HOT_DB_BK_LEVEL0 46348 B 0 A SBT_TAPE 2026-05-14 02:43:49 1 1 NO HOT_DB_BK_LEVEL0 46349 B 0 A SBT_TAPE 2026-05-14 03:19:33 1 1 NO HOT_DB_BK_LEVEL0 46350 B 0 A SBT_TAPE 2026-05-14 03:20:12 1 1 NO HOT_DB_BK_LEVEL0 46351 B 0 A SBT_TAPE 2026-05-14 03:58:40 1 1 NO HOT_DB_BK_LEVEL0 46352 B 0 A SBT_TAPE 2026-05-14 03:58:47 1 1 NO HOT_DB_BK_LEVEL0 46353 B 0 A SBT_TAPE 2026-05-14 04:45:44 1 1 NO HOT_DB_BK_LEVEL0 46354 B 0 A SBT_TAPE 2026-05-14 04:48:28 1 1 NO HOT_DB_BK_LEVEL0 46355 B 0 A SBT_TAPE 2026-05-14 05:12:08 1 1 NO HOT_DB_BK_LEVEL0 46356 B 0 A SBT_TAPE 2026-05-14 05:12:40 1 1 NO HOT_DB_BK_LEVEL0 46357 B 0 A SBT_TAPE 2026-05-14 05:31:12 1 1 NO HOT_DB_BK_LEVEL0 46358 B 0 A SBT_TAPE 2026-05-14 05:31:53 1 1 NO HOT_DB_BK_LEVEL0 46359 B 0 A SBT_TAPE 2026-05-14 05:37:35 1 1 NO HOT_DB_BK_LEVEL0 46360 B 0 A SBT_TAPE 2026-05-14 05:49:12 1 1 NO HOT_DB_BK_LEVEL0 46361 B 0 A SBT_TAPE 2026-05-14 05:53:33 1 1 NO HOT_DB_BK_LEVEL0 46362 B 0 A SBT_TAPE 2026-05-14 05:55:17 1 1 NO HOT_DB_BK_LEVEL0 46363 B 0 A SBT_TAPE 2026-05-14 05:58:09 1 1 NO HOT_DB_BK_LEVEL0 46364 B 0 A SBT_TAPE 2026-05-14 06:10:12 1 1 NO HOT_DB_BK_LEVEL0 46365 B 0 A SBT_TAPE 2026-05-14 06:12:20 1 1 NO HOT_DB_BK_LEVEL0 46366 B 0 A SBT_TAPE 2026-05-14 06:18:31 1 1 NO HOT_DB_BK_LEVEL0 46367 B 0 A SBT_TAPE 2026-05-14 06:23:29 1 1 NO HOT_DB_BK_LEVEL0 46368 B 0 A SBT_TAPE 2026-05-14 06:24:18 1 1 NO HOT_DB_BK_LEVEL0 46369 B 0 A SBT_TAPE 2026-05-14 06:26:10 1 1 NO HOT_DB_BK_LEVEL0 46370 B 0 A SBT_TAPE 2026-05-14 06:27:27 1 1 NO HOT_DB_BK_LEVEL0 46371 B 0 A SBT_TAPE 2026-05-14 06:27:39 1 1 NO HOT_DB_BK_LEVEL0 46372 B 0 A SBT_TAPE 2026-05-14 06:31:23 1 1 NO HOT_DB_BK_LEVEL0 46373 B 0 A SBT_TAPE 2026-05-14 06:32:49 1 1 NO HOT_DB_BK_LEVEL0 46374 B 0 A SBT_TAPE 2026-05-14 06:33:45 1 1 NO HOT_DB_BK_LEVEL0 46375 B 0 A SBT_TAPE 2026-05-14 06:34:59 1 1 NO HOT_DB_BK_LEVEL0 46376 B 0 A SBT_TAPE 2026-05-14 06:36:00 1 1 NO HOT_DB_BK_LEVEL0 46377 B 0 A SBT_TAPE 2026-05-14 06:36:04 1 1 NO HOT_DB_BK_LEVEL0 46378 B 0 A SBT_TAPE 2026-05-14 06:36:42 1 1 NO HOT_DB_BK_LEVEL0 46379 B 0 A SBT_TAPE 2026-05-14 06:36:46 1 1 NO HOT_DB_BK_LEVEL0 46380 B 0 A SBT_TAPE 2026-05-14 06:37:16 1 1 NO HOT_DB_BK_LEVEL0 46381 B 0 A SBT_TAPE 2026-05-14 06:37:22 1 1 NO HOT_DB_BK_LEVEL0 46382 B 0 A SBT_TAPE 2026-05-14 06:37:25 1 1 NO HOT_DB_BK_LEVEL0 46383 B 0 A SBT_TAPE 2026-05-14 06:37:33 1 1 NO HOT_DB_BK_LEVEL0 46384 B 0 A SBT_TAPE 2026-05-14 06:37:35 1 1 NO HOT_DB_BK_LEVEL0 46385 B 0 A SBT_TAPE 2026-05-14 06:37:42 1 1 NO HOT_DB_BK_LEVEL0 46386 B 0 A SBT_TAPE 2026-05-14 06:37:45 1 1 NO HOT_DB_BK_LEVEL0 46387 B 0 A SBT_TAPE 2026-05-14 06:37:54 1 1 NO HOT_DB_BK_LEVEL0 46388 B 0 A SBT_TAPE 2026-05-14 06:37:55 1 1 NO HOT_DB_BK_LEVEL0 46389 B 0 A SBT_TAPE 2026-05-14 06:38:03 1 1 NO HOT_DB_BK_LEVEL0 46390 B F A SBT_TAPE 2026-05-14 06:38:23 1 1 NO TAG20260514T063812 46391 B A A SBT_TAPE 2026-05-14 06:39:33 1 1 NO TAG20260514T063829 46392 B A A SBT_TAPE 2026-05-14 06:39:36 1 1 NO TAG20260514T063829 46393 B A A SBT_TAPE 2026-05-14 06:40:49 1 1 NO TAG20260514T063829 46394 B A A SBT_TAPE 2026-05-14 06:40:54 1 1 NO TAG20260514T063829 46395 B A A SBT_TAPE 2026-05-14 06:41:48 1 1 NO TAG20260514T063829 46396 B A A SBT_TAPE 2026-05-14 06:41:53 1 1 NO TAG20260514T063829 46397 B F A SBT_TAPE 2026-05-14 06:42:04 1 1 NO TAG20260514T064158 46398 B F A SBT_TAPE 2026-05-14 06:42:23 1 1 NO TAG20260514T064215 46399 B F A SBT_TAPE 2026-05-14 06:42:38 1 1 NO TAG20260514T064231 46400 B 0 A SBT_TAPE 2026-05-15 02:16:29 1 1 NO HOT_DB_BK_LEVEL0 46401 B 0 A SBT_TAPE 2026-05-15 02:16:38 1 1 NO HOT_DB_BK_LEVEL0 46402 B 0 A SBT_TAPE 2026-05-15 02:44:06 1 1 NO HOT_DB_BK_LEVEL0 46403 B 0 A SBT_TAPE 2026-05-15 02:44:48 1 1 NO HOT_DB_BK_LEVEL0 46404 B 0 A SBT_TAPE 2026-05-15 03:22:24 1 1 NO HOT_DB_BK_LEVEL0 46405 B 0 A SBT_TAPE 2026-05-15 03:23:00 1 1 NO HOT_DB_BK_LEVEL0 46406 B 0 A SBT_TAPE 2026-05-15 03:59:58 1 1 NO HOT_DB_BK_LEVEL0 46407 B 0 A SBT_TAPE 2026-05-15 04:01:57 1 1 NO HOT_DB_BK_LEVEL0 46408 B 0 A SBT_TAPE 2026-05-15 04:47:30 1 1 NO HOT_DB_BK_LEVEL0 46409 B 0 A SBT_TAPE 2026-05-15 04:50:08 1 1 NO HOT_DB_BK_LEVEL0 46410 B 0 A SBT_TAPE 2026-05-15 05:13:54 1 1 NO HOT_DB_BK_LEVEL0 46411 B 0 A SBT_TAPE 2026-05-15 05:13:54 1 1 NO HOT_DB_BK_LEVEL0 46412 B 0 A SBT_TAPE 2026-05-15 05:32:19 1 1 NO HOT_DB_BK_LEVEL0 46413 B 0 A SBT_TAPE 2026-05-15 05:32:36 1 1 NO HOT_DB_BK_LEVEL0 46414 B 0 A SBT_TAPE 2026-05-15 05:38:32 1 1 NO HOT_DB_BK_LEVEL0 46415 B 0 A SBT_TAPE 2026-05-15 05:49:57 1 1 NO HOT_DB_BK_LEVEL0 46416 B 0 A SBT_TAPE 2026-05-15 05:53:55 1 1 NO HOT_DB_BK_LEVEL0 46417 B 0 A SBT_TAPE 2026-05-15 05:56:20 1 1 NO HOT_DB_BK_LEVEL0 46418 B 0 A SBT_TAPE 2026-05-15 05:58:21 1 1 NO HOT_DB_BK_LEVEL0 46419 B 0 A SBT_TAPE 2026-05-15 06:11:18 1 1 NO HOT_DB_BK_LEVEL0 46420 B 0 A SBT_TAPE 2026-05-15 06:12:21 1 1 NO HOT_DB_BK_LEVEL0 46421 B 0 A SBT_TAPE 2026-05-15 06:18:15 1 1 NO HOT_DB_BK_LEVEL0 46422 B 0 A SBT_TAPE 2026-05-15 06:23:01 1 1 NO HOT_DB_BK_LEVEL0 46423 B 0 A SBT_TAPE 2026-05-15 06:24:51 1 1 NO HOT_DB_BK_LEVEL0 46424 B 0 A SBT_TAPE 2026-05-15 06:26:48 1 1 NO HOT_DB_BK_LEVEL0 46425 B 0 A SBT_TAPE 2026-05-15 06:28:09 1 1 NO HOT_DB_BK_LEVEL0 46426 B 0 A SBT_TAPE 2026-05-15 06:28:31 1 1 NO HOT_DB_BK_LEVEL0 46427 B 0 A SBT_TAPE 2026-05-15 06:32:34 1 1 NO HOT_DB_BK_LEVEL0 46428 B 0 A SBT_TAPE 2026-05-15 06:32:36 1 1 NO HOT_DB_BK_LEVEL0 46429 B 0 A SBT_TAPE 2026-05-15 06:34:45 1 1 NO HOT_DB_BK_LEVEL0 46430 B 0 A SBT_TAPE 2026-05-15 06:34:55 1 1 NO HOT_DB_BK_LEVEL0 46431 B 0 A SBT_TAPE 2026-05-15 06:36:13 1 1 NO HOT_DB_BK_LEVEL0 46432 B 0 A SBT_TAPE 2026-05-15 06:36:36 1 1 NO HOT_DB_BK_LEVEL0 46433 B 0 A SBT_TAPE 2026-05-15 06:37:15 1 1 NO HOT_DB_BK_LEVEL0 46434 B 0 A SBT_TAPE 2026-05-15 06:37:28 1 1 NO HOT_DB_BK_LEVEL0 46435 B 0 A SBT_TAPE 2026-05-15 06:38:02 1 1 NO HOT_DB_BK_LEVEL0 46436 B 0 A SBT_TAPE 2026-05-15 06:38:04 1 1 NO HOT_DB_BK_LEVEL0 46437 B 0 A SBT_TAPE 2026-05-15 06:38:17 1 1 NO HOT_DB_BK_LEVEL0 46438 B 0 A SBT_TAPE 2026-05-15 06:38:18 1 1 NO HOT_DB_BK_LEVEL0 46439 B 0 A SBT_TAPE 2026-05-15 06:38:26 1 1 NO HOT_DB_BK_LEVEL0 46440 B 0 A SBT_TAPE 2026-05-15 06:38:28 1 1 NO HOT_DB_BK_LEVEL0 46441 B 0 A SBT_TAPE 2026-05-15 06:38:36 1 1 NO HOT_DB_BK_LEVEL0 46442 B 0 A SBT_TAPE 2026-05-15 06:38:40 1 1 NO HOT_DB_BK_LEVEL0 46443 B 0 A SBT_TAPE 2026-05-15 06:38:52 1 1 NO HOT_DB_BK_LEVEL0 46444 B 0 A SBT_TAPE 2026-05-15 06:38:53 1 1 NO HOT_DB_BK_LEVEL0 46445 B F A SBT_TAPE 2026-05-15 06:39:11 1 1 NO TAG20260515T063902 46446 B A A SBT_TAPE 2026-05-15 06:40:29 1 1 NO TAG20260515T063919 46447 B A A SBT_TAPE 2026-05-15 06:40:34 1 1 NO TAG20260515T063919 46448 B A A SBT_TAPE 2026-05-15 06:41:37 1 1 NO TAG20260515T063919 46449 B A A SBT_TAPE 2026-05-15 06:41:43 1 1 NO TAG20260515T063919 46450 B A A SBT_TAPE 2026-05-15 06:42:43 1 1 NO TAG20260515T063919 46451 B A A SBT_TAPE 2026-05-15 06:42:53 1 1 NO TAG20260515T063919 46452 B A A SBT_TAPE 2026-05-15 06:43:53 1 1 NO TAG20260515T063919 46453 B A A SBT_TAPE 2026-05-15 06:43:52 1 1 NO TAG20260515T063919 46454 B F A SBT_TAPE 2026-05-15 06:44:16 1 1 NO TAG20260515T064408 46455 B F A SBT_TAPE 2026-05-15 06:44:31 1 1 NO TAG20260515T064425 46456 B F A SBT_TAPE 2026-05-15 06:44:48 1 1 NO TAG20260515T064441 46457 B F A DISK 2026-05-15 10:29:12 1 1 NO TAG20260515T102912 46458 B 0 A SBT_TAPE 2026-05-16 02:22:12 1 1 NO HOT_DB_BK_LEVEL0 46459 B 0 A SBT_TAPE 2026-05-16 02:23:12 1 1 NO HOT_DB_BK_LEVEL0 46460 B 0 A SBT_TAPE 2026-05-16 03:00:17 1 1 NO HOT_DB_BK_LEVEL0 46461 B 0 A SBT_TAPE 2026-05-16 03:01:45 1 1 NO HOT_DB_BK_LEVEL0 46462 B 0 A SBT_TAPE 2026-05-16 04:00:47 1 1 NO HOT_DB_BK_LEVEL0 46463 B 0 A SBT_TAPE 2026-05-16 04:16:30 1 1 NO HOT_DB_BK_LEVEL0 46464 B 0 A SBT_TAPE 2026-05-16 05:08:27 1 1 NO HOT_DB_BK_LEVEL0 46465 B 0 A SBT_TAPE 2026-05-16 05:08:47 1 1 NO HOT_DB_BK_LEVEL0 46466 B 0 A SBT_TAPE 2026-05-16 05:39:31 1 1 NO HOT_DB_BK_LEVEL0 46467 B 0 A SBT_TAPE 2026-05-16 05:39:54 1 1 NO HOT_DB_BK_LEVEL0 46468 B 0 A SBT_TAPE 2026-05-16 06:01:12 1 1 NO HOT_DB_BK_LEVEL0 46469 B 0 A SBT_TAPE 2026-05-16 06:02:11 1 1 NO HOT_DB_BK_LEVEL0 46470 B 0 A SBT_TAPE 2026-05-16 06:22:25 1 1 NO HOT_DB_BK_LEVEL0 46471 B 0 A SBT_TAPE 2026-05-16 06:23:41 1 1 NO HOT_DB_BK_LEVEL0 46472 B 0 A SBT_TAPE 2026-05-16 06:29:34 1 1 NO HOT_DB_BK_LEVEL0 46473 B 0 A SBT_TAPE 2026-05-16 06:43:11 1 1 NO HOT_DB_BK_LEVEL0 46474 B 0 A SBT_TAPE 2026-05-16 06:47:48 1 1 NO HOT_DB_BK_LEVEL0 46475 B 0 A SBT_TAPE 2026-05-16 06:49:17 1 1 NO HOT_DB_BK_LEVEL0 46476 B 0 A SBT_TAPE 2026-05-16 06:52:59 1 1 NO HOT_DB_BK_LEVEL0 46477 B 0 A SBT_TAPE 2026-05-16 07:05:57 1 1 NO HOT_DB_BK_LEVEL0 46478 B 0 A SBT_TAPE 2026-05-16 07:08:57 1 1 NO HOT_DB_BK_LEVEL0 46479 B 0 A SBT_TAPE 2026-05-16 07:15:40 1 1 NO HOT_DB_BK_LEVEL0 46480 B 0 A SBT_TAPE 2026-05-16 07:20:42 1 1 NO HOT_DB_BK_LEVEL0 46481 B 0 A SBT_TAPE 2026-05-16 07:21:58 1 1 NO HOT_DB_BK_LEVEL0 46482 B 0 A SBT_TAPE 2026-05-16 07:24:19 1 1 NO HOT_DB_BK_LEVEL0 46483 B 0 A SBT_TAPE 2026-05-16 07:26:32 1 1 NO HOT_DB_BK_LEVEL0 46484 B 0 A SBT_TAPE 2026-05-16 07:26:36 1 1 NO HOT_DB_BK_LEVEL0 46485 B 0 A SBT_TAPE 2026-05-16 07:30:50 1 1 NO HOT_DB_BK_LEVEL0 46486 B 0 A SBT_TAPE 2026-05-16 07:31:58 1 1 NO HOT_DB_BK_LEVEL0 46487 B 0 A SBT_TAPE 2026-05-16 07:33:32 1 1 NO HOT_DB_BK_LEVEL0 46488 B 0 A SBT_TAPE 2026-05-16 07:34:36 1 1 NO HOT_DB_BK_LEVEL0 46489 B 0 A SBT_TAPE 2026-05-16 07:35:50 1 1 NO HOT_DB_BK_LEVEL0 46490 B 0 A SBT_TAPE 2026-05-16 07:35:52 1 1 NO HOT_DB_BK_LEVEL0 46491 B 0 A SBT_TAPE 2026-05-16 07:36:55 1 1 NO HOT_DB_BK_LEVEL0 46492 B 0 A SBT_TAPE 2026-05-16 07:36:54 1 1 NO HOT_DB_BK_LEVEL0 46493 B 0 A SBT_TAPE 2026-05-16 07:37:25 1 1 NO HOT_DB_BK_LEVEL0 46494 B 0 A SBT_TAPE 2026-05-16 07:37:42 1 1 NO HOT_DB_BK_LEVEL0 46495 B 0 A SBT_TAPE 2026-05-16 07:37:46 1 1 NO HOT_DB_BK_LEVEL0 46496 B 0 A SBT_TAPE 2026-05-16 07:37:58 1 1 NO HOT_DB_BK_LEVEL0 46497 B 0 A SBT_TAPE 2026-05-16 07:37:59 1 1 NO HOT_DB_BK_LEVEL0 46498 B 0 A SBT_TAPE 2026-05-16 07:38:14 1 1 NO HOT_DB_BK_LEVEL0 46499 B 0 A SBT_TAPE 2026-05-16 07:38:14 1 1 NO HOT_DB_BK_LEVEL0 46500 B 0 A SBT_TAPE 2026-05-16 07:38:28 1 1 NO HOT_DB_BK_LEVEL0 46501 B 0 A SBT_TAPE 2026-05-16 07:38:29 1 1 NO HOT_DB_BK_LEVEL0 46502 B 0 A SBT_TAPE 2026-05-16 07:38:43 1 1 NO HOT_DB_BK_LEVEL0 46503 B F A SBT_TAPE 2026-05-16 07:38:59 1 1 NO TAG20260516T073852 46504 B A A SBT_TAPE 2026-05-16 07:40:21 1 1 NO TAG20260516T073909 46505 B A A SBT_TAPE 2026-05-16 07:40:24 1 1 NO TAG20260516T073909 46506 B A A SBT_TAPE 2026-05-16 07:41:44 1 1 NO TAG20260516T073909 46507 B A A SBT_TAPE 2026-05-16 07:41:50 1 1 NO TAG20260516T073909 46508 B A A SBT_TAPE 2026-05-16 07:43:05 1 1 NO TAG20260516T073909 46509 B A A SBT_TAPE 2026-05-16 07:43:07 1 1 NO TAG20260516T073909 46510 B A A SBT_TAPE 2026-05-16 07:43:56 1 1 NO TAG20260516T073909 46511 B F A SBT_TAPE 2026-05-16 07:44:14 1 1 NO TAG20260516T074407 46512 B F A SBT_TAPE 2026-05-16 07:44:31 1 1 NO TAG20260516T074423 46513 B F A SBT_TAPE 2026-05-16 07:44:46 1 1 NO TAG20260516T074439 46514 B 0 A SBT_TAPE 2026-05-17 02:16:45 1 1 NO HOT_DB_BK_LEVEL0 46515 B 0 A SBT_TAPE 2026-05-17 02:17:40 1 1 NO HOT_DB_BK_LEVEL0 46516 B 0 A SBT_TAPE 2026-05-17 02:44:18 1 1 NO HOT_DB_BK_LEVEL0 46517 B 0 A SBT_TAPE 2026-05-17 02:45:49 1 1 NO HOT_DB_BK_LEVEL0 46518 B 0 A SBT_TAPE 2026-05-17 03:21:33 1 1 NO HOT_DB_BK_LEVEL0 46519 B 0 A SBT_TAPE 2026-05-17 03:22:03 1 1 NO HOT_DB_BK_LEVEL0 46520 B 0 A SBT_TAPE 2026-05-17 03:58:11 1 1 NO HOT_DB_BK_LEVEL0 46521 B 0 A SBT_TAPE 2026-05-17 03:58:33 1 1 NO HOT_DB_BK_LEVEL0 46522 B 0 A SBT_TAPE 2026-05-17 04:46:14 1 1 NO HOT_DB_BK_LEVEL0 46523 B 0 A SBT_TAPE 2026-05-17 04:47:22 1 1 NO HOT_DB_BK_LEVEL0 46524 B 0 A SBT_TAPE 2026-05-17 05:12:25 1 1 NO HOT_DB_BK_LEVEL0 46525 B 0 A SBT_TAPE 2026-05-17 05:12:36 1 1 NO HOT_DB_BK_LEVEL0 46526 B 0 A SBT_TAPE 2026-05-17 05:31:00 1 1 NO HOT_DB_BK_LEVEL0 46527 B 0 A SBT_TAPE 2026-05-17 05:31:08 1 1 NO HOT_DB_BK_LEVEL0 46528 B 0 A SBT_TAPE 2026-05-17 05:37:05 1 1 NO HOT_DB_BK_LEVEL0 46529 B 0 A SBT_TAPE 2026-05-17 05:48:35 1 1 NO HOT_DB_BK_LEVEL0 46530 B 0 A SBT_TAPE 2026-05-17 05:52:59 1 1 NO HOT_DB_BK_LEVEL0 46531 B 0 A SBT_TAPE 2026-05-17 05:54:15 1 1 NO HOT_DB_BK_LEVEL0 46532 B 0 A SBT_TAPE 2026-05-17 05:57:37 1 1 NO HOT_DB_BK_LEVEL0 46533 B 0 A SBT_TAPE 2026-05-17 06:09:49 1 1 NO HOT_DB_BK_LEVEL0 46534 B 0 A SBT_TAPE 2026-05-17 06:11:33 1 1 NO HOT_DB_BK_LEVEL0 46535 B 0 A SBT_TAPE 2026-05-17 06:16:51 1 1 NO HOT_DB_BK_LEVEL0 46536 B 0 A SBT_TAPE 2026-05-17 06:23:01 1 1 NO HOT_DB_BK_LEVEL0 46537 B 0 A SBT_TAPE 2026-05-17 06:23:00 1 1 NO HOT_DB_BK_LEVEL0 46538 B 0 A SBT_TAPE 2026-05-17 06:25:06 1 1 NO HOT_DB_BK_LEVEL0 46539 B 0 A SBT_TAPE 2026-05-17 06:27:10 1 1 NO HOT_DB_BK_LEVEL0 46540 B 0 A SBT_TAPE 2026-05-17 06:27:39 1 1 NO HOT_DB_BK_LEVEL0 46541 B 0 A SBT_TAPE 2026-05-17 06:31:43 1 1 NO HOT_DB_BK_LEVEL0 46542 B 0 A SBT_TAPE 2026-05-17 06:32:04 1 1 NO HOT_DB_BK_LEVEL0 46543 B 0 A SBT_TAPE 2026-05-17 06:34:05 1 1 NO HOT_DB_BK_LEVEL0 46544 B 0 A SBT_TAPE 2026-05-17 06:34:06 1 1 NO HOT_DB_BK_LEVEL0 46545 B 0 A SBT_TAPE 2026-05-17 06:35:10 1 1 NO HOT_DB_BK_LEVEL0 46546 B 0 A SBT_TAPE 2026-05-17 06:36:05 1 1 NO HOT_DB_BK_LEVEL0 46547 B 0 A SBT_TAPE 2026-05-17 06:36:16 1 1 NO HOT_DB_BK_LEVEL0 46548 B 0 A SBT_TAPE 2026-05-17 06:36:58 1 1 NO HOT_DB_BK_LEVEL0 46549 B 0 A SBT_TAPE 2026-05-17 06:36:59 1 1 NO HOT_DB_BK_LEVEL0 46550 B 0 A SBT_TAPE 2026-05-17 06:37:12 1 1 NO HOT_DB_BK_LEVEL0 46551 B 0 A SBT_TAPE 2026-05-17 06:37:27 1 1 NO HOT_DB_BK_LEVEL0 46552 B 0 A SBT_TAPE 2026-05-17 06:37:29 1 1 NO HOT_DB_BK_LEVEL0 46553 B 0 A SBT_TAPE 2026-05-17 06:37:41 1 1 NO HOT_DB_BK_LEVEL0 46554 B 0 A SBT_TAPE 2026-05-17 06:37:43 1 1 NO HOT_DB_BK_LEVEL0 46555 B 0 A SBT_TAPE 2026-05-17 06:37:57 1 1 NO HOT_DB_BK_LEVEL0 46556 B 0 A SBT_TAPE 2026-05-17 06:37:58 1 1 NO HOT_DB_BK_LEVEL0 46557 B 0 A SBT_TAPE 2026-05-17 06:38:12 1 1 NO HOT_DB_BK_LEVEL0 46558 B 0 A SBT_TAPE 2026-05-17 06:38:11 1 1 NO HOT_DB_BK_LEVEL0 46559 B F A SBT_TAPE 2026-05-17 06:38:28 1 1 NO TAG20260517T063821 46560 B A A SBT_TAPE 2026-05-17 06:39:32 1 1 NO TAG20260517T063838 46561 B A A SBT_TAPE 2026-05-17 06:39:35 1 1 NO TAG20260517T063838 46562 B A A SBT_TAPE 2026-05-17 06:40:38 1 1 NO TAG20260517T063838 46563 B A A SBT_TAPE 2026-05-17 06:40:40 1 1 NO TAG20260517T063838 46564 B F A SBT_TAPE 2026-05-17 06:40:57 1 1 NO TAG20260517T064051 46565 B F A SBT_TAPE 2026-05-17 06:41:07 1 1 NO TAG20260517T064059 46566 B F A SBT_TAPE 2026-05-17 06:41:22 1 1 NO TAG20260517T064115 46567 B 0 A SBT_TAPE 2026-05-18 02:17:54 1 1 NO HOT_DB_BK_LEVEL0 46568 B 0 A SBT_TAPE 2026-05-18 02:18:10 1 1 NO HOT_DB_BK_LEVEL0 46569 B 0 A SBT_TAPE 2026-05-18 02:45:59 1 1 NO HOT_DB_BK_LEVEL0 46570 B 0 A SBT_TAPE 2026-05-18 02:46:20 1 1 NO HOT_DB_BK_LEVEL0 46571 B 0 A SBT_TAPE 2026-05-18 03:22:00 1 1 NO HOT_DB_BK_LEVEL0 46572 B 0 A SBT_TAPE 2026-05-18 03:23:33 1 1 NO HOT_DB_BK_LEVEL0 46573 B 0 A SBT_TAPE 2026-05-18 04:03:24 1 1 NO HOT_DB_BK_LEVEL0 46574 B 0 A SBT_TAPE 2026-05-18 04:03:39 1 1 NO HOT_DB_BK_LEVEL0 46575 B 0 A SBT_TAPE 2026-05-18 04:48:49 1 1 NO HOT_DB_BK_LEVEL0 46576 B 0 A SBT_TAPE 2026-05-18 04:48:49 1 1 NO HOT_DB_BK_LEVEL0 46577 B 0 A SBT_TAPE 2026-05-18 05:12:55 1 1 NO HOT_DB_BK_LEVEL0 46578 B 0 A SBT_TAPE 2026-05-18 05:12:59 1 1 NO HOT_DB_BK_LEVEL0 46579 B 0 A SBT_TAPE 2026-05-18 05:31:52 1 1 NO HOT_DB_BK_LEVEL0 46580 B 0 A SBT_TAPE 2026-05-18 05:31:54 1 1 NO HOT_DB_BK_LEVEL0 46581 B 0 A SBT_TAPE 2026-05-18 05:38:21 1 1 NO HOT_DB_BK_LEVEL0 46582 B 0 A SBT_TAPE 2026-05-18 05:49:14 1 1 NO HOT_DB_BK_LEVEL0 46583 B 0 A SBT_TAPE 2026-05-18 05:53:19 1 1 NO HOT_DB_BK_LEVEL0 46584 B 0 A SBT_TAPE 2026-05-18 05:55:29 1 1 NO HOT_DB_BK_LEVEL0 46585 B 0 A SBT_TAPE 2026-05-18 05:58:11 1 1 NO HOT_DB_BK_LEVEL0 46586 B 0 A SBT_TAPE 2026-05-18 06:11:09 1 1 NO HOT_DB_BK_LEVEL0 46587 B 0 A SBT_TAPE 2026-05-18 06:11:26 1 1 NO HOT_DB_BK_LEVEL0 46588 B 0 A SBT_TAPE 2026-05-18 06:17:51 1 1 NO HOT_DB_BK_LEVEL0 46589 B 0 A SBT_TAPE 2026-05-18 06:23:45 1 1 NO HOT_DB_BK_LEVEL0 46590 B 0 A SBT_TAPE 2026-05-18 06:24:11 1 1 NO HOT_DB_BK_LEVEL0 46591 B 0 A SBT_TAPE 2026-05-18 06:26:03 1 1 NO HOT_DB_BK_LEVEL0 46592 B 0 A SBT_TAPE 2026-05-18 06:28:03 1 1 NO HOT_DB_BK_LEVEL0 46593 B 0 A SBT_TAPE 2026-05-18 06:29:04 1 1 NO HOT_DB_BK_LEVEL0 46594 B 0 A SBT_TAPE 2026-05-18 06:31:51 1 1 NO HOT_DB_BK_LEVEL0 46595 B 0 A SBT_TAPE 2026-05-18 06:33:05 1 1 NO HOT_DB_BK_LEVEL0 46596 B 0 A SBT_TAPE 2026-05-18 06:34:13 1 1 NO HOT_DB_BK_LEVEL0 46597 B 0 A SBT_TAPE 2026-05-18 06:35:24 1 1 NO HOT_DB_BK_LEVEL0 46598 B 0 A SBT_TAPE 2026-05-18 06:36:20 1 1 NO HOT_DB_BK_LEVEL0 46599 B 0 A SBT_TAPE 2026-05-18 06:36:42 1 1 NO HOT_DB_BK_LEVEL0 46600 B 0 A SBT_TAPE 2026-05-18 06:37:22 1 1 NO HOT_DB_BK_LEVEL0 46601 B 0 A SBT_TAPE 2026-05-18 06:37:36 1 1 NO HOT_DB_BK_LEVEL0 46602 B 0 A SBT_TAPE 2026-05-18 06:37:57 1 1 NO HOT_DB_BK_LEVEL0 46603 B 0 A SBT_TAPE 2026-05-18 06:38:06 1 1 NO HOT_DB_BK_LEVEL0 46604 B 0 A SBT_TAPE 2026-05-18 06:38:14 1 1 NO HOT_DB_BK_LEVEL0 46605 B 0 A SBT_TAPE 2026-05-18 06:38:26 1 1 NO HOT_DB_BK_LEVEL0 46606 B 0 A SBT_TAPE 2026-05-18 06:38:27 1 1 NO HOT_DB_BK_LEVEL0 46607 B 0 A SBT_TAPE 2026-05-18 06:38:41 1 1 NO HOT_DB_BK_LEVEL0 46608 B 0 A SBT_TAPE 2026-05-18 06:38:42 1 1 NO HOT_DB_BK_LEVEL0 46609 B 0 A SBT_TAPE 2026-05-18 06:38:56 1 1 NO HOT_DB_BK_LEVEL0 46610 B 0 A SBT_TAPE 2026-05-18 06:38:56 1 1 NO HOT_DB_BK_LEVEL0 46611 B 0 A SBT_TAPE 2026-05-18 06:39:03 1 1 NO HOT_DB_BK_LEVEL0 46612 B F A SBT_TAPE 2026-05-18 06:39:11 1 1 NO TAG20260518T063904 46613 B A A SBT_TAPE 2026-05-18 06:40:08 1 1 NO TAG20260518T063921 46614 B A A SBT_TAPE 2026-05-18 06:40:12 1 1 NO TAG20260518T063921 46615 B A A SBT_TAPE 2026-05-18 06:41:05 1 1 NO TAG20260518T063921 46616 B F A SBT_TAPE 2026-05-18 06:41:21 1 1 NO TAG20260518T064114 46617 B F A SBT_TAPE 2026-05-18 06:41:37 1 1 NO TAG20260518T064130 46618 B F A SBT_TAPE 2026-05-18 06:41:53 1 1 NO TAG20260518T064146 46619 B 0 A SBT_TAPE 2026-05-19 02:16:19 1 1 NO HOT_DB_BK_LEVEL0 46620 B 0 A SBT_TAPE 2026-05-19 02:17:04 1 1 NO HOT_DB_BK_LEVEL0 46621 B 0 A SBT_TAPE 2026-05-19 02:43:28 1 1 NO HOT_DB_BK_LEVEL0 46622 B 0 A SBT_TAPE 2026-05-19 02:45:06 1 1 NO HOT_DB_BK_LEVEL0 46623 B 0 A SBT_TAPE 2026-05-19 03:19:11 1 1 NO HOT_DB_BK_LEVEL0 46624 B 0 A SBT_TAPE 2026-05-19 03:21:14 1 1 NO HOT_DB_BK_LEVEL0 46625 B 0 A SBT_TAPE 2026-05-19 03:58:53 1 1 NO HOT_DB_BK_LEVEL0 46626 B 0 A SBT_TAPE 2026-05-19 04:02:32 1 1 NO HOT_DB_BK_LEVEL0 46627 B 0 A SBT_TAPE 2026-05-19 04:48:47 1 1 NO HOT_DB_BK_LEVEL0 46628 B 0 A SBT_TAPE 2026-05-19 04:49:56 1 1 NO HOT_DB_BK_LEVEL0 46629 B 0 A SBT_TAPE 2026-05-19 05:13:48 1 1 NO HOT_DB_BK_LEVEL0 46630 B 0 A SBT_TAPE 2026-05-19 05:14:05 1 1 NO HOT_DB_BK_LEVEL0 46631 B 0 A SBT_TAPE 2026-05-19 05:32:16 1 1 NO HOT_DB_BK_LEVEL0 46632 B 0 A SBT_TAPE 2026-05-19 05:33:09 1 1 NO HOT_DB_BK_LEVEL0 46633 B 0 A SBT_TAPE 2026-05-19 05:38:47 1 1 NO HOT_DB_BK_LEVEL0 46634 B 0 A SBT_TAPE 2026-05-19 05:50:41 1 1 NO HOT_DB_BK_LEVEL0 46635 B 0 A SBT_TAPE 2026-05-19 05:54:36 1 1 NO HOT_DB_BK_LEVEL0 46636 B 0 A SBT_TAPE 2026-05-19 05:55:59 1 1 NO HOT_DB_BK_LEVEL0 46637 B 0 A SBT_TAPE 2026-05-19 05:59:25 1 1 NO HOT_DB_BK_LEVEL0 46638 B 0 A SBT_TAPE 2026-05-19 06:11:31 1 1 NO HOT_DB_BK_LEVEL0 46639 B 0 A SBT_TAPE 2026-05-19 06:12:46 1 1 NO HOT_DB_BK_LEVEL0 46640 B 0 A SBT_TAPE 2026-05-19 06:18:35 1 1 NO HOT_DB_BK_LEVEL0 46641 B 0 A SBT_TAPE 2026-05-19 06:24:26 1 1 NO HOT_DB_BK_LEVEL0 46642 B 0 A SBT_TAPE 2026-05-19 06:25:10 1 1 NO HOT_DB_BK_LEVEL0 46643 B 0 A SBT_TAPE 2026-05-19 06:27:20 1 1 NO HOT_DB_BK_LEVEL0 46644 B 0 A SBT_TAPE 2026-05-19 06:29:28 1 1 NO HOT_DB_BK_LEVEL0 46645 B 0 A SBT_TAPE 2026-05-19 06:29:31 1 1 NO HOT_DB_BK_LEVEL0 46646 B 0 A SBT_TAPE 2026-05-19 06:33:47 1 1 NO HOT_DB_BK_LEVEL0 46647 B 0 A SBT_TAPE 2026-05-19 06:34:38 1 1 NO HOT_DB_BK_LEVEL0 46648 B 0 A SBT_TAPE 2026-05-19 06:35:22 1 1 NO HOT_DB_BK_LEVEL0 46649 B 0 A SBT_TAPE 2026-05-19 06:36:44 1 1 NO HOT_DB_BK_LEVEL0 46650 B 0 A SBT_TAPE 2026-05-19 06:37:38 1 1 NO HOT_DB_BK_LEVEL0 46651 B 0 A SBT_TAPE 2026-05-19 06:37:57 1 1 NO HOT_DB_BK_LEVEL0 46652 B 0 A SBT_TAPE 2026-05-19 06:38:34 1 1 NO HOT_DB_BK_LEVEL0 46653 B 0 A SBT_TAPE 2026-05-19 06:38:54 1 1 NO HOT_DB_BK_LEVEL0 46654 B 0 A SBT_TAPE 2026-05-19 06:39:19 1 1 NO HOT_DB_BK_LEVEL0 46655 B 0 A SBT_TAPE 2026-05-19 06:39:33 1 1 NO HOT_DB_BK_LEVEL0 46656 B 0 A SBT_TAPE 2026-05-19 06:39:39 1 1 NO HOT_DB_BK_LEVEL0 46657 B 0 A SBT_TAPE 2026-05-19 06:39:42 1 1 NO HOT_DB_BK_LEVEL0 46658 B 0 A SBT_TAPE 2026-05-19 06:39:49 1 1 NO HOT_DB_BK_LEVEL0 46659 B 0 A SBT_TAPE 2026-05-19 06:39:53 1 1 NO HOT_DB_BK_LEVEL0 46660 B 0 A SBT_TAPE 2026-05-19 06:40:00 1 1 NO HOT_DB_BK_LEVEL0 46661 B 0 A SBT_TAPE 2026-05-19 06:40:06 1 1 NO HOT_DB_BK_LEVEL0 46662 B 0 A SBT_TAPE 2026-05-19 06:40:15 1 1 NO HOT_DB_BK_LEVEL0 46663 B 0 A SBT_TAPE 2026-05-19 06:40:15 1 1 NO HOT_DB_BK_LEVEL0 46664 B F A SBT_TAPE 2026-05-19 06:40:29 1 1 NO TAG20260519T064023 46665 B A A SBT_TAPE 2026-05-19 06:41:32 1 1 NO TAG20260519T064040 46666 B A A SBT_TAPE 2026-05-19 06:41:36 1 1 NO TAG20260519T064040 46667 B A A SBT_TAPE 2026-05-19 06:42:27 1 1 NO TAG20260519T064040 46668 B A A SBT_TAPE 2026-05-19 06:42:39 1 1 NO TAG20260519T064040 46669 B A A SBT_TAPE 2026-05-19 06:43:31 1 1 NO TAG20260519T064040 46670 B A A SBT_TAPE 2026-05-19 06:43:43 1 1 NO TAG20260519T064040 46671 B F A SBT_TAPE 2026-05-19 06:43:55 1 1 NO TAG20260519T064348 46672 B F A SBT_TAPE 2026-05-19 06:44:12 1 1 NO TAG20260519T064404 46673 B F A SBT_TAPE 2026-05-19 06:44:26 1 1 NO TAG20260519T064420 46674 B 0 A SBT_TAPE 2026-05-20 02:16:14 1 1 NO HOT_DB_BK_LEVEL0 46675 B 0 A SBT_TAPE 2026-05-20 02:16:31 1 1 NO HOT_DB_BK_LEVEL0 46676 B 0 A SBT_TAPE 2026-05-20 02:43:57 1 1 NO HOT_DB_BK_LEVEL0 46677 B 0 A SBT_TAPE 2026-05-20 02:44:38 1 1 NO HOT_DB_BK_LEVEL0 46678 B 0 A SBT_TAPE 2026-05-20 03:21:05 1 1 NO HOT_DB_BK_LEVEL0 46679 B 0 A SBT_TAPE 2026-05-20 03:21:47 1 1 NO HOT_DB_BK_LEVEL0 46680 B 0 A SBT_TAPE 2026-05-20 03:58:09 1 1 NO HOT_DB_BK_LEVEL0 46681 B 0 A SBT_TAPE 2026-05-20 04:05:55 1 1 NO HOT_DB_BK_LEVEL0 46682 B 0 A SBT_TAPE 2026-05-20 04:49:01 1 1 NO HOT_DB_BK_LEVEL0 46683 B 0 A SBT_TAPE 2026-05-20 04:54:41 1 1 NO HOT_DB_BK_LEVEL0 46684 B 0 A SBT_TAPE 2026-05-20 05:12:35 1 1 NO HOT_DB_BK_LEVEL0 46685 B 0 A SBT_TAPE 2026-05-20 05:15:55 1 1 NO HOT_DB_BK_LEVEL0 46686 B 0 A SBT_TAPE 2026-05-20 05:30:38 1 1 NO HOT_DB_BK_LEVEL0 46687 B 0 A SBT_TAPE 2026-05-20 05:34:52 1 1 NO HOT_DB_BK_LEVEL0 46688 B 0 A SBT_TAPE 2026-05-20 05:37:20 1 1 NO HOT_DB_BK_LEVEL0 46689 B 0 A SBT_TAPE 2026-05-20 05:52:15 1 1 NO HOT_DB_BK_LEVEL0 46690 B 0 A SBT_TAPE 2026-05-20 05:54:38 1 1 NO HOT_DB_BK_LEVEL0 46691 B 0 A SBT_TAPE 2026-05-20 05:56:16 1 1 NO HOT_DB_BK_LEVEL0 46692 B 0 A SBT_TAPE 2026-05-20 05:59:40 1 1 NO HOT_DB_BK_LEVEL0 46693 B 0 A SBT_TAPE 2026-05-20 06:11:42 1 1 NO HOT_DB_BK_LEVEL0 46694 B 0 A SBT_TAPE 2026-05-20 06:13:48 1 1 NO HOT_DB_BK_LEVEL0 46695 B 0 A SBT_TAPE 2026-05-20 06:19:39 1 1 NO HOT_DB_BK_LEVEL0 46696 B 0 A SBT_TAPE 2026-05-20 06:24:56 1 1 NO HOT_DB_BK_LEVEL0 46697 B 0 A SBT_TAPE 2026-05-20 06:25:32 1 1 NO HOT_DB_BK_LEVEL0 46698 B 0 A SBT_TAPE 2026-05-20 06:27:54 1 1 NO HOT_DB_BK_LEVEL0 46699 B 0 A SBT_TAPE 2026-05-20 06:29:58 1 1 NO HOT_DB_BK_LEVEL0 46700 B 0 A SBT_TAPE 2026-05-20 06:30:00 1 1 NO HOT_DB_BK_LEVEL0 46701 B 0 A SBT_TAPE 2026-05-20 06:33:36 1 1 NO HOT_DB_BK_LEVEL0 46702 B 0 A SBT_TAPE 2026-05-20 06:34:27 1 1 NO HOT_DB_BK_LEVEL0 46703 B 0 A SBT_TAPE 2026-05-20 06:35:57 1 1 NO HOT_DB_BK_LEVEL0 46704 B 0 A SBT_TAPE 2026-05-20 06:36:39 1 1 NO HOT_DB_BK_LEVEL0 46705 B 0 A SBT_TAPE 2026-05-20 06:37:56 1 1 NO HOT_DB_BK_LEVEL0 46706 B 0 A SBT_TAPE 2026-05-20 06:37:54 1 1 NO HOT_DB_BK_LEVEL0 46707 B 0 A SBT_TAPE 2026-05-20 06:38:52 1 1 NO HOT_DB_BK_LEVEL0 46708 B 0 A SBT_TAPE 2026-05-20 06:38:54 1 1 NO HOT_DB_BK_LEVEL0 46709 B 0 A SBT_TAPE 2026-05-20 06:39:17 1 1 NO HOT_DB_BK_LEVEL0 46710 B 0 A SBT_TAPE 2026-05-20 06:39:21 1 1 NO HOT_DB_BK_LEVEL0 46711 B 0 A SBT_TAPE 2026-05-20 06:39:27 1 1 NO HOT_DB_BK_LEVEL0 46712 B 0 A SBT_TAPE 2026-05-20 06:39:31 1 1 NO HOT_DB_BK_LEVEL0 46713 B 0 A SBT_TAPE 2026-05-20 06:39:38 1 1 NO HOT_DB_BK_LEVEL0 46714 B 0 A SBT_TAPE 2026-05-20 06:39:39 1 1 NO HOT_DB_BK_LEVEL0 46715 B 0 A SBT_TAPE 2026-05-20 06:39:56 1 1 NO HOT_DB_BK_LEVEL0 46716 B 0 A SBT_TAPE 2026-05-20 06:39:54 1 1 NO HOT_DB_BK_LEVEL0 46717 B 0 A SBT_TAPE 2026-05-20 06:40:09 1 1 NO HOT_DB_BK_LEVEL0 46718 B 0 A SBT_TAPE 2026-05-20 06:40:10 1 1 NO HOT_DB_BK_LEVEL0 46719 B F A SBT_TAPE 2026-05-20 06:40:26 1 1 NO TAG20260520T064019 46720 B A A SBT_TAPE 2026-05-20 06:41:39 1 1 NO TAG20260520T064036 46721 B A A SBT_TAPE 2026-05-20 06:41:41 1 1 NO TAG20260520T064036 46722 B A A SBT_TAPE 2026-05-20 06:42:56 1 1 NO TAG20260520T064036 46723 B A A SBT_TAPE 2026-05-20 06:42:57 1 1 NO TAG20260520T064036 46724 B A A SBT_TAPE 2026-05-20 06:43:54 1 1 NO TAG20260520T064036 46725 B A A SBT_TAPE 2026-05-20 06:44:11 1 1 NO TAG20260520T064036 46726 B F A SBT_TAPE 2026-05-20 06:44:22 1 1 NO TAG20260520T064415 46727 B F A SBT_TAPE 2026-05-20 06:44:38 1 1 NO TAG20260520T064432 46728 B F A SBT_TAPE 2026-05-20 06:44:55 1 1 NO TAG20260520T064448 46729 B 0 A SBT_TAPE 2026-05-21 02:17:30 1 1 NO HOT_DB_BK_LEVEL0 46730 B 0 A SBT_TAPE 2026-05-21 02:17:36 1 1 NO HOT_DB_BK_LEVEL0 46731 B 0 A SBT_TAPE 2026-05-21 02:44:47 1 1 NO HOT_DB_BK_LEVEL0 46732 B 0 A SBT_TAPE 2026-05-21 02:44:59 1 1 NO HOT_DB_BK_LEVEL0 46733 B 0 A SBT_TAPE 2026-05-21 03:21:49 1 1 NO HOT_DB_BK_LEVEL0 46734 B 0 A SBT_TAPE 2026-05-21 03:22:01 1 1 NO HOT_DB_BK_LEVEL0 46735 B 0 A SBT_TAPE 2026-05-21 03:57:22 1 1 NO HOT_DB_BK_LEVEL0 46736 B 0 A SBT_TAPE 2026-05-21 03:59:02 1 1 NO HOT_DB_BK_LEVEL0 46737 B 0 A SBT_TAPE 2026-05-21 04:49:53 1 1 NO HOT_DB_BK_LEVEL0 46738 B 0 A SBT_TAPE 2026-05-21 04:50:39 1 1 NO HOT_DB_BK_LEVEL0 46739 B 0 A SBT_TAPE 2026-05-21 05:12:10 1 1 NO HOT_DB_BK_LEVEL0 46740 B 0 A SBT_TAPE 2026-05-21 05:12:38 1 1 NO HOT_DB_BK_LEVEL0 46741 B 0 A SBT_TAPE 2026-05-21 05:31:28 1 1 NO HOT_DB_BK_LEVEL0 46742 B 0 A SBT_TAPE 2026-05-21 05:31:30 1 1 NO HOT_DB_BK_LEVEL0 46743 B 0 A SBT_TAPE 2026-05-21 05:38:21 1 1 NO HOT_DB_BK_LEVEL0 46744 B 0 A SBT_TAPE 2026-05-21 05:49:09 1 1 NO HOT_DB_BK_LEVEL0 46745 B 0 A SBT_TAPE 2026-05-21 05:53:16 1 1 NO HOT_DB_BK_LEVEL0 46746 B 0 A SBT_TAPE 2026-05-21 05:55:46 1 1 NO HOT_DB_BK_LEVEL0 46747 B 0 A SBT_TAPE 2026-05-21 05:57:40 1 1 NO HOT_DB_BK_LEVEL0 46748 B 0 A SBT_TAPE 2026-05-21 06:10:38 1 1 NO HOT_DB_BK_LEVEL0 46749 B 0 A SBT_TAPE 2026-05-21 06:11:38 1 1 NO HOT_DB_BK_LEVEL0 46750 B 0 A SBT_TAPE 2026-05-21 06:17:30 1 1 NO HOT_DB_BK_LEVEL0 46751 B 0 A SBT_TAPE 2026-05-21 06:22:44 1 1 NO HOT_DB_BK_LEVEL0 46752 B 0 A SBT_TAPE 2026-05-21 06:23:52 1 1 NO HOT_DB_BK_LEVEL0 46753 B 0 A SBT_TAPE 2026-05-21 06:26:14 1 1 NO HOT_DB_BK_LEVEL0 46754 B 0 A SBT_TAPE 2026-05-21 06:27:57 1 1 NO HOT_DB_BK_LEVEL0 46755 B 0 A SBT_TAPE 2026-05-21 06:28:22 1 1 NO HOT_DB_BK_LEVEL0 46756 B 0 A SBT_TAPE 2026-05-21 06:32:13 1 1 NO HOT_DB_BK_LEVEL0 46757 B 0 A SBT_TAPE 2026-05-21 06:32:48 1 1 NO HOT_DB_BK_LEVEL0 46758 B 0 A SBT_TAPE 2026-05-21 06:34:39 1 1 NO HOT_DB_BK_LEVEL0 46759 B 0 A SBT_TAPE 2026-05-21 06:34:49 1 1 NO HOT_DB_BK_LEVEL0 46760 B 0 A SBT_TAPE 2026-05-21 06:36:03 1 1 NO HOT_DB_BK_LEVEL0 46761 B 0 A SBT_TAPE 2026-05-21 06:36:47 1 1 NO HOT_DB_BK_LEVEL0 46762 B 0 A SBT_TAPE 2026-05-21 06:37:04 1 1 NO HOT_DB_BK_LEVEL0 46763 B 0 A SBT_TAPE 2026-05-21 06:37:47 1 1 NO HOT_DB_BK_LEVEL0 46764 B 0 A SBT_TAPE 2026-05-21 06:37:46 1 1 NO HOT_DB_BK_LEVEL0 46765 B 0 A SBT_TAPE 2026-05-21 06:37:59 1 1 NO HOT_DB_BK_LEVEL0 46766 B 0 A SBT_TAPE 2026-05-21 06:38:10 1 1 NO HOT_DB_BK_LEVEL0 46767 B 0 A SBT_TAPE 2026-05-21 06:38:14 1 1 NO HOT_DB_BK_LEVEL0 46768 B 0 A SBT_TAPE 2026-05-21 06:38:21 1 1 NO HOT_DB_BK_LEVEL0 46769 B 0 A SBT_TAPE 2026-05-21 06:38:24 1 1 NO HOT_DB_BK_LEVEL0 46770 B 0 A SBT_TAPE 2026-05-21 06:38:31 1 1 NO HOT_DB_BK_LEVEL0 46771 B 0 A SBT_TAPE 2026-05-21 06:38:39 1 1 NO HOT_DB_BK_LEVEL0 46772 B 0 A SBT_TAPE 2026-05-21 06:38:42 1 1 NO HOT_DB_BK_LEVEL0 46773 B 0 A SBT_TAPE 2026-05-21 06:38:56 1 1 NO HOT_DB_BK_LEVEL0 46774 B F A SBT_TAPE 2026-05-21 06:39:12 1 1 NO TAG20260521T063905 46775 B A A SBT_TAPE 2026-05-21 06:40:30 1 1 NO TAG20260521T063922 46776 B A A SBT_TAPE 2026-05-21 06:40:29 1 1 NO TAG20260521T063922 46777 B A A SBT_TAPE 2026-05-21 06:41:46 1 1 NO TAG20260521T063922 46778 B A A SBT_TAPE 2026-05-21 06:41:53 1 1 NO TAG20260521T063922 46779 B A A SBT_TAPE 2026-05-21 06:42:54 1 1 NO TAG20260521T063922 46780 B A A SBT_TAPE 2026-05-21 06:43:02 1 1 NO TAG20260521T063922 46781 B F A SBT_TAPE 2026-05-21 06:43:21 1 1 NO TAG20260521T064315 46782 B F A SBT_TAPE 2026-05-21 06:43:40 1 1 NO TAG20260521T064331 46783 B F A SBT_TAPE 2026-05-21 06:43:54 1 1 NO TAG20260521T064347 46784 B 0 A SBT_TAPE 2026-05-22 02:16:13 1 1 NO HOT_DB_BK_LEVEL0 46785 B 0 A SBT_TAPE 2026-05-22 02:17:20 1 1 NO HOT_DB_BK_LEVEL0 46786 B 0 A SBT_TAPE 2026-05-22 02:44:25 1 1 NO HOT_DB_BK_LEVEL0 46787 B 0 A SBT_TAPE 2026-05-22 02:44:23 1 1 NO HOT_DB_BK_LEVEL0 46788 B 0 A SBT_TAPE 2026-05-22 03:19:49 1 1 NO HOT_DB_BK_LEVEL0 46789 B 0 A SBT_TAPE 2026-05-22 03:20:17 1 1 NO HOT_DB_BK_LEVEL0 46790 B 0 A SBT_TAPE 2026-05-22 03:59:10 1 1 NO HOT_DB_BK_LEVEL0 46791 B 0 A SBT_TAPE 2026-05-22 04:04:21 1 1 NO HOT_DB_BK_LEVEL0 46792 B 0 A SBT_TAPE 2026-05-22 04:48:43 1 1 NO HOT_DB_BK_LEVEL0 46793 B 0 A SBT_TAPE 2026-05-22 04:52:06 1 1 NO HOT_DB_BK_LEVEL0 46794 B 0 A SBT_TAPE 2026-05-22 05:13:36 1 1 NO HOT_DB_BK_LEVEL0 46795 B 0 A SBT_TAPE 2026-05-22 05:14:57 1 1 NO HOT_DB_BK_LEVEL0 46796 B 0 A SBT_TAPE 2026-05-22 05:31:50 1 1 NO HOT_DB_BK_LEVEL0 46797 B 0 A SBT_TAPE 2026-05-22 05:33:58 1 1 NO HOT_DB_BK_LEVEL0 46798 B 0 A SBT_TAPE 2026-05-22 05:38:34 1 1 NO HOT_DB_BK_LEVEL0 46799 B 0 A SBT_TAPE 2026-05-22 05:51:18 1 1 NO HOT_DB_BK_LEVEL0 46800 B 0 A SBT_TAPE 2026-05-22 05:55:36 1 1 NO HOT_DB_BK_LEVEL0 46801 B 0 A SBT_TAPE 2026-05-22 05:55:46 1 1 NO HOT_DB_BK_LEVEL0 46802 B 0 A SBT_TAPE 2026-05-22 06:00:11 1 1 NO HOT_DB_BK_LEVEL0 46803 B 0 A SBT_TAPE 2026-05-22 06:11:03 1 1 NO HOT_DB_BK_LEVEL0 46804 B 0 A SBT_TAPE 2026-05-22 06:13:35 1 1 NO HOT_DB_BK_LEVEL0 46805 B 0 A SBT_TAPE 2026-05-22 06:19:59 1 1 NO HOT_DB_BK_LEVEL0 46806 B 0 A SBT_TAPE 2026-05-22 06:24:06 1 1 NO HOT_DB_BK_LEVEL0 46807 B 0 A SBT_TAPE 2026-05-22 06:25:51 1 1 NO HOT_DB_BK_LEVEL0 46808 B 0 A SBT_TAPE 2026-05-22 06:28:18 1 1 NO HOT_DB_BK_LEVEL0 46809 B 0 A SBT_TAPE 2026-05-22 06:29:02 1 1 NO HOT_DB_BK_LEVEL0 46810 B 0 A SBT_TAPE 2026-05-22 06:30:06 1 1 NO HOT_DB_BK_LEVEL0 46811 B 0 A SBT_TAPE 2026-05-22 06:33:48 1 1 NO HOT_DB_BK_LEVEL0 46812 B 0 A SBT_TAPE 2026-05-22 06:34:13 1 1 NO HOT_DB_BK_LEVEL0 46813 B 0 A SBT_TAPE 2026-05-22 06:35:55 1 1 NO HOT_DB_BK_LEVEL0 46814 B 0 A SBT_TAPE 2026-05-22 06:36:31 1 1 NO HOT_DB_BK_LEVEL0 46815 B 0 A SBT_TAPE 2026-05-22 06:37:37 1 1 NO HOT_DB_BK_LEVEL0 46816 B 0 A SBT_TAPE 2026-05-22 06:38:04 1 1 NO HOT_DB_BK_LEVEL0 46817 B 0 A SBT_TAPE 2026-05-22 06:38:22 1 1 NO HOT_DB_BK_LEVEL0 46818 B 0 A SBT_TAPE 2026-05-22 06:38:43 1 1 NO HOT_DB_BK_LEVEL0 46819 B 0 A SBT_TAPE 2026-05-22 06:39:13 1 1 NO HOT_DB_BK_LEVEL0 46820 B 0 A SBT_TAPE 2026-05-22 06:39:14 1 1 NO HOT_DB_BK_LEVEL0 46821 B 0 A SBT_TAPE 2026-05-22 06:39:28 1 1 NO HOT_DB_BK_LEVEL0 46822 B 0 A SBT_TAPE 2026-05-22 06:39:29 1 1 NO HOT_DB_BK_LEVEL0 46823 B 0 A SBT_TAPE 2026-05-22 06:39:37 1 1 NO HOT_DB_BK_LEVEL0 46824 B 0 A SBT_TAPE 2026-05-22 06:39:39 1 1 NO HOT_DB_BK_LEVEL0 46825 B 0 A SBT_TAPE 2026-05-22 06:39:47 1 1 NO HOT_DB_BK_LEVEL0 46826 B 0 A SBT_TAPE 2026-05-22 06:39:50 1 1 NO HOT_DB_BK_LEVEL0 46827 B 0 A SBT_TAPE 2026-05-22 06:39:57 1 1 NO HOT_DB_BK_LEVEL0 46828 B 0 A SBT_TAPE 2026-05-22 06:39:58 1 1 NO HOT_DB_BK_LEVEL0 46829 B F A SBT_TAPE 2026-05-22 06:40:13 1 1 NO TAG20260522T064006 46830 B A A SBT_TAPE 2026-05-22 06:41:15 1 1 NO TAG20260522T064023 46831 B A A SBT_TAPE 2026-05-22 06:41:21 1 1 NO TAG20260522T064023 46832 B A A SBT_TAPE 2026-05-22 06:42:36 1 1 NO TAG20260522T064023 46833 B A A SBT_TAPE 2026-05-22 06:42:39 1 1 NO TAG20260522T064023 46834 B A A SBT_TAPE 2026-05-22 06:43:41 1 1 NO TAG20260522T064023 46835 B A A SBT_TAPE 2026-05-22 06:43:43 1 1 NO TAG20260522T064023 46836 B F A SBT_TAPE 2026-05-22 06:44:01 1 1 NO TAG20260522T064354 46837 B F A SBT_TAPE 2026-05-22 06:44:18 1 1 NO TAG20260522T064410 46838 B F A SBT_TAPE 2026-05-22 06:44:34 1 1 NO TAG20260522T064426 RMAN\u0026gt; 从备份信息看，本库备份设备类型主要是：\nDevice Type = SBT_TAPE 也就是通过 NetBackup 介质管理器进行备份，不是普通磁盘备份。备份摘要中可以看到大量 SBT_TAPE 备份集，并且近期备份状态为 AVAILABLE。\n继续查看指定时间段归档：\nRMAN\u0026gt; LIST BACKUP OF ARCHIVELOG FROM TIME \u0026#34;TO_DATE(\u0026#39;2026-05-21 00:00:00\u0026#39;,\u0026#39;YYYY-MM-DD HH24:MI:SS\u0026#39;)\u0026#34; UNTIL TIME \u0026#34;TO_DATE(\u0026#39;2026-05-21 15:00:00\u0026#39;,\u0026#39;YYYY-MM-DD HH24:MI:SS\u0026#39;)\u0026#34;;2\u0026gt; List of Backup Sets =================== BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 46778 1.79G SBT_TAPE 00:01:15 2026-05-21 06:41:53 BP Key: 46778 Status: AVAILABLE Compressed: NO Tag: TAG20260521T063922 Handle: al_46789_1_1233816038 Media: @aaaab List of Archived Logs in backup set 46778 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 73535 24508901526942 2026-05-20 23:34:01 24508901818144 2026-05-21 00:10:49 BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 46779 1.44G SBT_TAPE 00:00:55 2026-05-21 06:42:54 BP Key: 46779 Status: AVAILABLE Compressed: NO Tag: TAG20260521T063922 Handle: al_46791_1_1233816119 Media: @aaaab List of Archived Logs in backup set 46779 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 73536 24508901818144 2026-05-21 00:10:49 24508901827779 2026-05-21 00:10:58 1 73537 24508901827779 2026-05-21 00:10:58 24508901877269 2026-05-21 00:20:55 1 73538 24508901877269 2026-05-21 00:20:55 24508902122304 2026-05-21 01:10:49 1 73539 24508902122304 2026-05-21 01:10:49 24508902764591 2026-05-21 02:53:13 1 73540 24508902764591 2026-05-21 02:53:13 24508903028376 2026-05-21 03:35:13 1 73541 24508903028376 2026-05-21 03:35:13 24508903028514 2026-05-21 03:35:25 1 73542 24508903028514 2026-05-21 03:35:25 24508903028671 2026-05-21 03:35:40 1 73543 24508903028671 2026-05-21 03:35:40 24508903499100 2026-05-21 05:00:49 1 73544 24508903499100 2026-05-21 05:00:49 24508903779784 2026-05-21 05:31:19 1 73545 24508903779784 2026-05-21 05:31:19 24508903853890 2026-05-21 05:40:49 1 73546 24508903853890 2026-05-21 05:40:49 24508904184632 2026-05-21 05:55:58 1 73547 24508904184632 2026-05-21 05:55:58 24508904396323 2026-05-21 06:25:07 1 73548 24508904396323 2026-05-21 06:25:07 24508904398777 2026-05-21 06:25:10 1 73549 24508904398777 2026-05-21 06:25:10 24508904401249 2026-05-21 06:25:13 1 73550 24508904401249 2026-05-21 06:25:13 24508904477477 2026-05-21 06:39:21 1 73551 24508904477477 2026-05-21 06:39:21 24508904477522 2026-05-21 06:39:22 BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 46830 1.76G SBT_TAPE 00:00:51 2026-05-22 06:41:15 BP Key: 46830 Status: AVAILABLE Compressed: NO Tag: TAG20260522T064023 Handle: al_46842_1_1233902424 Media: @aaaab List of Archived Logs in backup set 46830 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 73571 24508908130311 2026-05-21 11:00:05 24508908169379 2026-05-21 11:02:08 1 73572 24508908169379 2026-05-21 11:02:08 24508908229487 2026-05-21 11:05:38 1 73573 24508908229487 2026-05-21 11:05:38 24508908276823 2026-05-21 11:07:47 1 73574 24508908276823 2026-05-21 11:07:47 24508908314865 2026-05-21 11:10:23 1 73575 24508908314865 2026-05-21 11:10:23 24508908393936 2026-05-21 11:13:41 1 73576 24508908393936 2026-05-21 11:13:41 24508908453938 2026-05-21 11:18:02 1 73577 24508908453938 2026-05-21 11:18:02 24508908511409 2026-05-21 11:22:02 1 73578 24508908511409 2026-05-21 11:22:02 24508908592655 2026-05-21 11:26:17 1 73579 24508908592655 2026-05-21 11:26:17 24508908878337 2026-05-21 11:33:47 1 73580 24508908878337 2026-05-21 11:33:47 24508909630923 2026-05-21 11:49:14 1 73581 24508909630923 2026-05-21 11:49:14 24508911067083 2026-05-21 12:10:05 1 73582 24508911067083 2026-05-21 12:10:05 24508911324881 2026-05-21 12:49:08 1 73583 24508911324881 2026-05-21 12:49:08 24508911618585 2026-05-21 13:00:05 1 73584 24508911618585 2026-05-21 13:00:05 24508911746737 2026-05-21 13:05:26 1 73585 24508911746737 2026-05-21 13:05:26 24508911805442 2026-05-21 13:10:08 1 73586 24508911805442 2026-05-21 13:10:08 24508911863994 2026-05-21 13:13:41 1 73587 24508911863994 2026-05-21 13:13:41 24508911937944 2026-05-21 13:18:05 1 73588 24508911937944 2026-05-21 13:18:05 24508911996002 2026-05-21 13:21:53 1 73589 24508911996002 2026-05-21 13:21:53 24508912058065 2026-05-21 13:26:23 1 73590 24508912058065 2026-05-21 13:26:23 24508912136291 2026-05-21 13:38:11 BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 46833 1.70G SBT_TAPE 00:01:10 2026-05-22 06:42:39 BP Key: 46833 Status: AVAILABLE Compressed: NO Tag: TAG20260522T064023 Handle: al_46844_1_1233902489 Media: @aaaab List of Archived Logs in backup set 46833 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 73552 24508904477522 2026-05-21 06:39:22 24508905242162 2026-05-21 08:24:01 1 73553 24508905242162 2026-05-21 08:24:01 24508905550289 2026-05-21 08:41:07 1 73554 24508905550289 2026-05-21 08:41:07 24508905815984 2026-05-21 08:56:10 1 73555 24508905815984 2026-05-21 08:56:10 24508905849310 2026-05-21 09:00:07 1 73556 24508905849310 2026-05-21 09:00:07 24508905977458 2026-05-21 09:05:04 1 73557 24508905977458 2026-05-21 09:05:04 24508906035024 2026-05-21 09:08:53 1 73558 24508906035024 2026-05-21 09:08:53 24508906107065 2026-05-21 09:12:35 1 73559 24508906107065 2026-05-21 09:12:35 24508906170735 2026-05-21 09:17:14 1 73560 24508906170735 2026-05-21 09:17:14 24508906230231 2026-05-21 09:21:23 1 73561 24508906230231 2026-05-21 09:21:23 24508906308019 2026-05-21 09:25:59 1 73562 24508906308019 2026-05-21 09:25:59 24508906390587 2026-05-21 09:33:05 1 73563 24508906390587 2026-05-21 09:33:05 24508906553555 2026-05-21 09:42:47 1 73564 24508906553555 2026-05-21 09:42:47 24508907061821 2026-05-21 09:54:59 1 73565 24508907061821 2026-05-21 09:54:59 24508907158574 2026-05-21 10:03:56 1 73566 24508907158574 2026-05-21 10:03:56 24508907265742 2026-05-21 10:16:23 1 73567 24508907265742 2026-05-21 10:16:23 24508907630532 2026-05-21 10:29:56 1 73568 24508907630532 2026-05-21 10:29:56 24508907828480 2026-05-21 10:40:56 1 73569 24508907828480 2026-05-21 10:40:56 24508908040703 2026-05-21 10:52:08 1 73570 24508908040703 2026-05-21 10:52:08 24508908130311 2026-05-21 11:00:05 BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ ------------------- 46835 1.70G SBT_TAPE 00:00:58 2026-05-22 06:43:43 BP Key: 46835 Status: AVAILABLE Compressed: NO Tag: TAG20260522T064023 Handle: al_46845_1_1233902565 Media: @aaaab List of Archived Logs in backup set 46835 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- ------------------- ---------- --------- 1 73591 24508912136291 2026-05-21 13:38:11 24508912431890 2026-05-21 13:47:05 1 73592 24508912431890 2026-05-21 13:47:05 24508912500490 2026-05-21 13:55:20 1 73593 24508912500490 2026-05-21 13:55:20 24508912593258 2026-05-21 14:02:53 1 73594 24508912593258 2026-05-21 14:02:53 24508912832247 2026-05-21 14:08:50 1 73595 24508912832247 2026-05-21 14:08:50 24508912924568 2026-05-21 14:17:29 1 73596 24508912924568 2026-05-21 14:17:29 24508913118341 2026-05-21 14:28:02 1 73597 24508913118341 2026-05-21 14:28:02 24508913591529 2026-05-21 14:41:20 1 73598 24508913591529 2026-05-21 14:41:20 24508913746380 2026-05-21 14:49:20 1 73599 24508913746380 2026-05-21 14:49:20 24508913935125 2026-05-21 15:00:02 RMAN\u0026gt; exit Recovery Manager complete. [oracle@wmsdb2019 backup]$ 关键归档信息如下：\nBS Key : 46835 Device : SBT_TAPE Status : AVAILABLE Handle : al_46845_1_1233902565 Thread Sequence Low Time Next Time ------ -------- ------------------- ------------------- 1 73591 2026-05-21 13:38:11 2026-05-21 13:47:05 1 73592 2026-05-21 13:47:05 2026-05-21 13:55:20 1 73593 2026-05-21 13:55:20 2026-05-21 14:02:53 1 73594 2026-05-21 14:02:53 2026-05-21 14:08:50 1 73595 2026-05-21 14:08:50 2026-05-21 14:17:29 1 73596 2026-05-21 14:17:29 2026-05-21 14:28:02 1 73597 2026-05-21 14:28:02 2026-05-21 14:41:20 1 73598 2026-05-21 14:41:20 2026-05-21 14:49:20 1 73599 2026-05-21 14:49:20 2026-05-21 15:00:02 视图修改时间是 2026-05-21 14:48:47，归档 sequence 73598 覆盖 14:41:20 到 14:49:20，因此归档链满足恢复到修改前时间点的要求。\n五、恢复时间点选择 # 但本次只需要取视图定义，不关心 14:45 到 14:48 之间的数据变化，所以为了避开 DDL 边界时间，最终选择恢复到更早一点：\nSET UNTIL TIME \u0026#34;to_date(\u0026#39;2026-05-21 14:45:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;)\u0026#34;; 判断原则：\n判断点 说明 必须早于误修改时间 避免恢复到错误 DDL 已提交之后 不必精确到秒 只是为了取旧视图定义 建议提前几分钟 避免时间精度、提交时刻、时区显示等边界问题 归档必须覆盖该时间点 本例 sequence 73598 覆盖目标时间 六、创建辅助库参数文件 # 确认空间：\n[oracle@wmsdb2019 backup]$ df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 126G 0 126G 0% /dev tmpfs 126G 0 126G 0% /dev/shm tmpfs 126G 290M 126G 1% /run tmpfs 126G 0 126G 0% /sys/fs/cgroup /dev/mapper/rhel-root 50G 20G 31G 39% / /dev/mapper/rhel-u01 2.5T 987G 1.5T 41% /u01 /dev/mapper/rhel-home 10G 8.0G 2.1G 80% /home /dev/sda1 497M 217M 280M 44% /boot /dev/mapper/vg_backup-lv_backup 800G 167G 634G 21% /backup tmpfs 26G 12K 26G 1% /run/user/42 tmpfs 26G 0 26G 0% /run/user/0 [oracle@wmsdb2019 backup]$ 结论还有1.5T够辅助库恢复。\n创建目录：\nmkdir -p /u01/app/oracle/oradata/WMSAUX mkdir -p /u01/app/oracle/fast_recovery_area/WMSAUX mkdir -p /u01/app/oracle/admin/WMSAUX/adump [oracle@wmsdb2019 rman]$ mkdir -p /u01/app/oracle/oradata/WMSAUX [oracle@wmsdb2019 rman]$ mkdir -p /u01/app/oracle/fast_recovery_area/WMSAUX [oracle@wmsdb2019 rman]$ mkdir -p /u01/app/oracle/admin/WMSAUX/adump [oracle@wmsdb2019 rman]$ 创建 pfile：\nvi $ORACLE_HOME/dbs/initWMSAUX.ora 内容如下：\ndb_name=\u0026#39;WMSAUX\u0026#39; db_unique_name=\u0026#39;WMSAUX\u0026#39; memory_target=8G control_files=\u0026#39;/u01/app/oracle/oradata/WMSAUX/control01.ctl\u0026#39;,\u0026#39;/u01/app/oracle/oradata/WMSAUX/control02.ctl\u0026#39; audit_file_dest=\u0026#39;/u01/app/oracle/admin/WMSAUX/adump\u0026#39; db_create_file_dest=\u0026#39;/u01/app/oracle/oradata/WMSAUX\u0026#39; db_recovery_file_dest=\u0026#39;/u01/app/oracle/fast_recovery_area/WMSAUX\u0026#39; db_recovery_file_dest_size=100G db_file_name_convert=\u0026#39;/u01/app/oracle/oradata/WMPROD\u0026#39;,\u0026#39;/u01/app/oracle/oradata/WMSAUX\u0026#39; log_file_name_convert=\u0026#39;/u01/app/oracle/oradata/WMPROD\u0026#39;,\u0026#39;/u01/app/oracle/oradata/WMSAUX\u0026#39; compatible=\u0026#39;18.0.0\u0026#39; [oracle@wmsdb2019 rman]$ vi $ORACLE_HOME/dbs/initWMSAUX.ora [oracle@wmsdb2019 rman]$ cat $ORACLE_HOME/dbs/initWMSAUX.ora db_name=\u0026#39;WMSAUX\u0026#39; db_unique_name=\u0026#39;WMSAUX\u0026#39; memory_target=8G control_files=\u0026#39;/u01/app/oracle/oradata/WMSAUX/control01.ctl\u0026#39;,\u0026#39;/u01/app/oracle/oradata/WMSAUX/control02.ctl\u0026#39; audit_file_dest=\u0026#39;/u01/app/oracle/admin/WMSAUX/adump\u0026#39; db_create_file_dest=\u0026#39;/u01/app/oracle/oradata/WMSAUX\u0026#39; db_recovery_file_dest=\u0026#39;/u01/app/oracle/fast_recovery_area/WMSAUX\u0026#39; db_recovery_file_dest_size=100G db_file_name_convert=\u0026#39;/u01/app/oracle/oradata/WMPROD\u0026#39;,\u0026#39;/u01/app/oracle/oradata/WMSAUX\u0026#39; log_file_name_convert=\u0026#39;/u01/app/oracle/oradata/WMPROD\u0026#39;,\u0026#39;/u01/app/oracle/oradata/WMSAUX\u0026#39; compatible=\u0026#39;18.0.0\u0026#39; [oracle@wmsdb2019 rman]$ 启动辅助实例到 NOMOUNT：\nexport ORACLE_SID=WMSAUX sqlplus / as sysdba startup nomount pfile=\u0026#39;$ORACLE_HOME/dbs/initWMSAUX.ora\u0026#39;; exit 输出：\n[oracle@wmsdb2019 rman]$ export ORACLE_SID=WMSAUX [oracle@wmsdb2019 rman]$ sqlplus / as sysdba SQL*Plus: Release 18.0.0.0.0 - Production on Fri May 22 15:20:34 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup nomount pfile=\u0026#39;$ORACLE_HOME/dbs/initWMSAUX.ora\u0026#39;; ORACLE instance started. Total System Global Area 8589933416 bytes Fixed Size 12217192 bytes Variable Size 4882169856 bytes Database Buffers 3657433088 bytes Redo Buffers 38113280 bytes SQL\u0026gt; exit Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 [oracle@wmsdb2019 rman]$ 七、执行 RMAN Duplicate # RMAN 连接到 target 指向生产库，auxiliary 指向辅助库\nexport ORACLE_SID=WMSAUX rman target sys/****@wmprod auxiliary / [oracle@wmsdb2019 ~]$ rman target sys/Sin0pharmYN@wmprod auxiliary / Recovery Manager: Release 18.0.0.0.0 - Production on Fri May 22 15:55:25 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved. connected to target database: WMPROD (DBID=3080983586) connected to auxiliary database: WMSAUX (not mounted) RMAN\u0026gt; 由于备份走 NetBackup，因此需要分配 SBT_TAPE 辅助通道，并发送 NetBackup 参数。\n实际执行脚本如下，密码已脱敏：\nRUN { SET UNTIL TIME \u0026#34;to_date(\u0026#39;2026-05-21 14:45:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;)\u0026#34;; ALLOCATE AUXILIARY CHANNEL aux00 TYPE \u0026#39;SBT_TAPE\u0026#39;; ALLOCATE AUXILIARY CHANNEL aux01 TYPE \u0026#39;SBT_TAPE\u0026#39;; SEND \u0026#39;NB_ORA_SERV=nbu-master,NB_ORA_CLIENT=wmsdb2019\u0026#39;; DUPLICATE TARGET DATABASE TO WMSAUX NOFILENAMECHECK; RELEASE CHANNEL aux00; RELEASE CHANNEL aux01; } 恢复步骤结果：\n[oracle@wmsdb2019 ~]$ rman target sys/******@wmprod auxiliary / Recovery Manager: Release 18.0.0.0.0 - Production on Fri May 22 15:55:25 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved. connected to target database: WMPROD (DBID=3080983586) connected to auxiliary database: WMSAUX (not mounted) RMAN\u0026gt; RUN { 2\u0026gt; SET UNTIL TIME \u0026#34;to_date(\u0026#39;2026-05-21 14:45:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;)\u0026#34;; ALLOCATE AUXILIARY CHANNEL aux00 TYPE \u0026#39;SBT_TAPE\u0026#39;; ALLOCATE AUXILIARY CHANNEL aux01 TYPE \u0026#39;SBT_TAPE\u0026#39;; 3\u0026gt; 4\u0026gt; SEND \u0026#39;NB_ORA_SERV=nbu-master,NB_ORA_CLIENT=wmsdb2019\u0026#39;; DUPLICATE TARGET DATABASE TO WMSAUX NOFILENAMECHECK; 5\u0026gt; 6\u0026gt; 7\u0026gt; 8\u0026gt; 9\u0026gt; 10\u0026gt; 11\u0026gt; 12\u0026gt; RELEASE CHANNEL aux00; RELEASE CHANNEL aux01; }13\u0026gt; 14\u0026gt; executing command: SET until clause using target database control file instead of recovery catalog allocated channel: aux00 channel aux00: SID=977 device type=SBT_TAPE channel aux00: Veritas NetBackup for Oracle - Release 8.0 (2016110921) allocated channel: aux01 channel aux01: SID=4393 device type=SBT_TAPE channel aux01: Veritas NetBackup for Oracle - Release 8.0 (2016110921) sent command to channel: aux00 sent command to channel: aux01 Starting Duplicate Db at 2026-05-22 15:57:09 contents of Memory Script: { sql clone \u0026#34;create spfile from memory\u0026#34;; } executing Memory Script sql statement: create spfile from memory contents of Memory Script: { shutdown clone immediate; startup clone nomount; } executing Memory Script Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 8589933416 bytes Fixed Size 12217192 bytes Variable Size 4882169856 bytes Database Buffers 3657433088 bytes Redo Buffers 38113280 bytes allocated channel: aux00 channel aux00: SID=5247 device type=SBT_TAPE channel aux00: Veritas NetBackup for Oracle - Release 8.0 (2016110921) allocated channel: aux01 channel aux01: SID=5369 device type=SBT_TAPE channel aux01: Veritas NetBackup for Oracle - Release 8.0 (2016110921) contents of Memory Script: { set until scn 24508913591529; sql clone \u0026#34;alter system set db_name = \u0026#39;\u0026#39;WMPROD\u0026#39;\u0026#39; comment= \u0026#39;\u0026#39;Modified by RMAN duplicate\u0026#39;\u0026#39; scope=spfile\u0026#34;; sql clone \u0026#34;alter system set db_unique_name = \u0026#39;\u0026#39;WMSAUX\u0026#39;\u0026#39; comment= \u0026#39;\u0026#39;Modified by RMAN duplicate\u0026#39;\u0026#39; scope=spfile\u0026#34;; shutdown clone immediate; startup clone force nomount restore clone primary controlfile; alter clone database mount; } executing Memory Script executing command: SET until clause sql statement: alter system set db_name = \u0026#39;\u0026#39;WMPROD\u0026#39;\u0026#39; comment= \u0026#39;\u0026#39;Modified by RMAN duplicate\u0026#39;\u0026#39; scope=spfile sql statement: alter system set db_unique_name = \u0026#39;\u0026#39;WMSAUX\u0026#39;\u0026#39; comment= \u0026#39;\u0026#39;Modified by RMAN duplicate\u0026#39;\u0026#39; scope=spfile Oracle instance shut down Oracle instance started Total System Global Area 8589933416 bytes Fixed Size 12217192 bytes Variable Size 4882169856 bytes Database Buffers 3657433088 bytes Redo Buffers 38113280 bytes allocated channel: aux00 channel aux00: SID=5247 device type=SBT_TAPE channel aux00: Veritas NetBackup for Oracle - Release 8.0 (2016110921) allocated channel: aux01 channel aux01: SID=5369 device type=SBT_TAPE channel aux01: Veritas NetBackup for Oracle - Release 8.0 (2016110921) Starting restore at 2026-05-22 15:58:25 channel aux00: starting datafile backup set restore channel aux00: restoring control file channel aux00: reading from backup piece c-3080983586-20260521-02 channel aux00: piece handle=c-3080983586-20260521-02 tag=TAG20260521T064347 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:15 output file name=/u01/app/oracle/oradata/WMSAUX/control01.ctl output file name=/u01/app/oracle/oradata/WMSAUX/control02.ctl Finished restore at 2026-05-22 15:58:42 database mounted contents of Memory Script: { set until scn 24508913591529; set newname for datafile 1 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/system01.dbf\u0026#34;; set newname for datafile 2 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/sysaux01.dbf\u0026#34;; set newname for datafile 3 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/undotbs01.dbf\u0026#34;; set newname for datafile 4 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/users01.dbf\u0026#34;; set newname for datafile 5 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/APPT_TXN_DT_TBS.dbf\u0026#34;; set newname for datafile 6 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/APPT_TXN_IDX_TBS.dbf\u0026#34;; set newname for datafile 7 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/CBO_TXN_DT_TBS01.dbf\u0026#34;; set newname for datafile 8 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/CBO_TXN_IDX_TBS01.dbf\u0026#34;; set newname for datafile 9 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/CM_BST4K_DT_TBS01.dbf\u0026#34;; set newname for datafile 10 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/CM_BST4K_IDX_TBS01.dbf\u0026#34;; set newname for datafile 11 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS01.dbf\u0026#34;; set newname for datafile 12 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS01.dbf\u0026#34;; set newname for datafile 13 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_DT_TBS01.dbf\u0026#34;; set newname for datafile 14 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_IDX_TBS01.dbf\u0026#34;; set newname for datafile 15 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LLMDATA_TBS01.dbf\u0026#34;; set newname for datafile 16 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS01.dbf\u0026#34;; set newname for datafile 17 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/MLMDATA_TBS01.dbf\u0026#34;; set newname for datafile 18 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/MLMINDX_TBS01.dbf\u0026#34;; set newname for datafile 19 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLMDATA_TBS01.dbf\u0026#34;; set newname for datafile 20 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLMINDX_TBS01.dbf\u0026#34;; set newname for datafile 21 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLOT_DT_TBS.dbf\u0026#34;; set newname for datafile 22 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLOT_INDX_TBS.dbf\u0026#34;; set newname for datafile 23 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/TE_BST_DT_TBS01.dbf\u0026#34;; set newname for datafile 24 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/TE_BST_IDX_TBS01.dbf\u0026#34;; set newname for datafile 25 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/YMS_BST_DT_TBS01.dbf\u0026#34;; set newname for datafile 26 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/YMS_BST_IDX_TBS01.dbf\u0026#34;; set newname for datafile 27 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS02.dbf\u0026#34;; set newname for datafile 28 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS03.dbf\u0026#34;; set newname for datafile 29 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS04.dbf\u0026#34;; set newname for datafile 30 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS02.dbf\u0026#34;; set newname for datafile 31 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS03.dbf\u0026#34;; set newname for datafile 32 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS05.dbf\u0026#34;; set newname for datafile 33 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS06.dbf\u0026#34;; set newname for datafile 34 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS07.dbf\u0026#34;; set newname for datafile 35 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS08.dbf\u0026#34;; set newname for datafile 36 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS09.dbf\u0026#34;; set newname for datafile 37 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS10.dbf\u0026#34;; set newname for datafile 38 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS02.dbf\u0026#34;; set newname for datafile 39 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS04.dbf\u0026#34;; set newname for datafile 40 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS11.dbf\u0026#34;; set newname for datafile 41 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS12.dbf\u0026#34;; set newname for datafile 42 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS05.dbf\u0026#34;; set newname for datafile 43 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS06.dbf\u0026#34;; set newname for datafile 44 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS13.dbf\u0026#34;; set newname for datafile 45 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS14.dbf\u0026#34;; restore clone database ; } executing Memory Script executing command: SET until clause executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting restore at 2026-05-22 15:58:46 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00029 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS04.dbf channel aux00: reading from backup piece bk_46741_1_1233798369 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00027 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS02.dbf channel aux01: reading from backup piece bk_46740_1_1233798369 channel aux01: piece handle=bk_46740_1_1233798369 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:45 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00032 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS05.dbf channel aux01: reading from backup piece bk_46742_1_1233800254 channel aux00: piece handle=bk_46741_1_1233798369 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:09:52 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00033 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS06.dbf channel aux00: reading from backup piece bk_46743_1_1233800262 channel aux01: piece handle=bk_46742_1_1233800254 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:33 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00034 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS07.dbf channel aux01: reading from backup piece bk_46744_1_1233801897 channel aux00: piece handle=bk_46743_1_1233800262 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:10:01 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00035 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS08.dbf channel aux00: reading from backup piece bk_46745_1_1233801904 channel aux01: piece handle=bk_46744_1_1233801897 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:50 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00036 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS09.dbf channel aux01: reading from backup piece bk_46746_1_1233804120 channel aux00: piece handle=bk_46745_1_1233801904 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:09:40 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00037 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS10.dbf channel aux00: reading from backup piece bk_46747_1_1233804127 channel aux01: piece handle=bk_46746_1_1233804120 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:40 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00012 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS01.dbf channel aux01: reading from backup piece bk_46749_1_1233806347 channel aux00: piece handle=bk_46747_1_1233804127 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:09:50 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00039 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS04.dbf channel aux00: reading from backup piece bk_46748_1_1233806252 channel aux01: piece handle=bk_46749_1_1233806347 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:41 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00011 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS01.dbf channel aux01: reading from backup piece bk_46750_1_1233809403 channel aux00: piece handle=bk_46748_1_1233806252 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:09:51 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00031 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS03.dbf channel aux00: reading from backup piece bk_46751_1_1233809448 channel aux01: piece handle=bk_46750_1_1233809403 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:50 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00016 to /u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS01.dbf channel aux01: reading from backup piece bk_46753_1_1233810769 channel aux00: piece handle=bk_46751_1_1233809448 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:09:40 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00030 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS02.dbf channel aux00: reading from backup piece bk_46752_1_1233810744 channel aux01: piece handle=bk_46753_1_1233810769 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:09:40 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00038 to /u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS02.dbf channel aux01: reading from backup piece bk_46754_1_1233811904 channel aux00: piece handle=bk_46752_1_1233810744 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:09:51 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00040 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS11.dbf channel aux00: reading from backup piece bk_46755_1_1233811904 channel aux01: piece handle=bk_46754_1_1233811904 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:04:51 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00044 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS13.dbf channel aux01: reading from backup piece bk_46757_1_1233812955 channel aux00: piece handle=bk_46755_1_1233811904 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:07:00 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00041 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS12.dbf channel aux00: reading from backup piece bk_46756_1_1233812309 channel aux01: piece handle=bk_46757_1_1233812955 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:03:40 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00045 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS14.dbf channel aux01: reading from backup piece bk_46758_1_1233813200 channel aux01: piece handle=bk_46758_1_1233813200 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:04:25 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00015 to /u01/app/oracle/oradata/WMSAUX/LLMDATA_TBS01.dbf channel aux01: reading from backup piece bk_46759_1_1233813355 channel aux00: piece handle=bk_46756_1_1233812309 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:06:05 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00019 to /u01/app/oracle/oradata/WMSAUX/SLMDATA_TBS01.dbf channel aux00: reading from backup piece bk_46760_1_1233813470 channel aux00: piece handle=bk_46760_1_1233813470 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:07:15 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00007 to /u01/app/oracle/oradata/WMSAUX/CBO_TXN_DT_TBS01.dbf channel aux00: reading from backup piece bk_46762_1_1233814310 channel aux01: piece handle=bk_46759_1_1233813355 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:08:11 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00008 to /u01/app/oracle/oradata/WMSAUX/CBO_TXN_IDX_TBS01.dbf channel aux01: reading from backup piece bk_46763_1_1233814665 channel aux01: piece handle=bk_46763_1_1233814665 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:03:06 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00002 to /u01/app/oracle/oradata/WMSAUX/sysaux01.dbf channel aux01: reading from backup piece bk_46761_1_1233814255 channel aux00: piece handle=bk_46762_1_1233814310 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:03:10 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00042 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS05.dbf channel aux00: reading from backup piece bk_46765_1_1233815046 channel aux00: piece handle=bk_46765_1_1233815046 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:01:45 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00028 to /u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS03.dbf channel aux00: reading from backup piece bk_46764_1_1233814971 channel aux00: piece handle=bk_46764_1_1233814971 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:02:45 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00043 to /u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS06.dbf channel aux00: reading from backup piece bk_46766_1_1233815181 channel aux01: piece handle=bk_46761_1_1233814255 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:05:58 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00003 to /u01/app/oracle/oradata/WMSAUX/undotbs01.dbf channel aux01: reading from backup piece bk_46768_1_1233815311 channel aux00: piece handle=bk_46766_1_1233815181 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:01:50 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00020 to /u01/app/oracle/oradata/WMSAUX/SLMINDX_TBS01.dbf channel aux00: reading from backup piece bk_46767_1_1233815286 channel aux01: piece handle=bk_46768_1_1233815311 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:01:40 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00013 to /u01/app/oracle/oradata/WMSAUX/LEMA_TXN_DT_TBS01.dbf channel aux01: reading from backup piece bk_46769_1_1233815546 channel aux00: piece handle=bk_46767_1_1233815286 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:02:40 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00014 to /u01/app/oracle/oradata/WMSAUX/LEMA_TXN_IDX_TBS01.dbf channel aux00: reading from backup piece bk_46770_1_1233815581 channel aux01: piece handle=bk_46769_1_1233815546 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:01:25 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00023 to /u01/app/oracle/oradata/WMSAUX/TE_BST_DT_TBS01.dbf channel aux01: reading from backup piece bk_46772_1_1233815702 channel aux01: piece handle=bk_46772_1_1233815702 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:45 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00018 to /u01/app/oracle/oradata/WMSAUX/MLMINDX_TBS01.dbf channel aux01: reading from backup piece bk_46771_1_1233815686 channel aux00: piece handle=bk_46770_1_1233815581 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:01:00 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00001 to /u01/app/oracle/oradata/WMSAUX/system01.dbf channel aux00: reading from backup piece bk_46773_1_1233815767 channel aux00: piece handle=bk_46773_1_1233815767 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:35 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00017 to /u01/app/oracle/oradata/WMSAUX/MLMDATA_TBS01.dbf channel aux00: reading from backup piece bk_46775_1_1233815827 channel aux01: piece handle=bk_46771_1_1233815686 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:50 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00024 to /u01/app/oracle/oradata/WMSAUX/TE_BST_IDX_TBS01.dbf channel aux01: reading from backup piece bk_46774_1_1233815812 channel aux00: piece handle=bk_46775_1_1233815827 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:25 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00005 to /u01/app/oracle/oradata/WMSAUX/APPT_TXN_DT_TBS.dbf channel aux00: reading from backup piece bk_46777_1_1233815872 channel aux01: piece handle=bk_46774_1_1233815812 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:29 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00004 to /u01/app/oracle/oradata/WMSAUX/users01.dbf channel aux01: reading from backup piece bk_46776_1_1233815872 channel aux00: piece handle=bk_46777_1_1233815872 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:06 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00006 to /u01/app/oracle/oradata/WMSAUX/APPT_TXN_IDX_TBS.dbf channel aux00: reading from backup piece bk_46778_1_1233815887 channel aux00: piece handle=bk_46778_1_1233815887 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:07 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00009 to /u01/app/oracle/oradata/WMSAUX/CM_BST4K_DT_TBS01.dbf channel aux00: reading from backup piece bk_46779_1_1233815894 channel aux01: piece handle=bk_46776_1_1233815872 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:10 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00010 to /u01/app/oracle/oradata/WMSAUX/CM_BST4K_IDX_TBS01.dbf channel aux01: reading from backup piece bk_46780_1_1233815897 channel aux00: piece handle=bk_46779_1_1233815894 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:07 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00021 to /u01/app/oracle/oradata/WMSAUX/SLOT_DT_TBS.dbf channel aux00: reading from backup piece bk_46781_1_1233815905 channel aux01: piece handle=bk_46780_1_1233815897 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:07 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00022 to /u01/app/oracle/oradata/WMSAUX/SLOT_INDX_TBS.dbf channel aux01: reading from backup piece bk_46782_1_1233815912 channel aux00: piece handle=bk_46781_1_1233815905 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:07 channel aux00: starting datafile backup set restore channel aux00: specifying datafile(s) to restore from backup set channel aux00: restoring datafile 00025 to /u01/app/oracle/oradata/WMSAUX/YMS_BST_DT_TBS01.dbf channel aux00: reading from backup piece bk_46783_1_1233815915 channel aux01: piece handle=bk_46782_1_1233815912 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:07 channel aux01: starting datafile backup set restore channel aux01: specifying datafile(s) to restore from backup set channel aux01: restoring datafile 00026 to /u01/app/oracle/oradata/WMSAUX/YMS_BST_IDX_TBS01.dbf channel aux01: reading from backup piece bk_46784_1_1233815930 channel aux00: piece handle=bk_46783_1_1233815915 tag=HOT_DB_BK_LEVEL0 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:07 channel aux01: piece handle=bk_46784_1_1233815930 tag=HOT_DB_BK_LEVEL0 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:07 Finished restore at 2026-05-22 17:42:44 contents of Memory Script: { switch clone datafile all; } executing Memory Script datafile 1 switched to datafile copy input datafile copy RECID=46 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/system01.dbf datafile 2 switched to datafile copy input datafile copy RECID=47 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=48 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=49 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/users01.dbf datafile 5 switched to datafile copy input datafile copy RECID=50 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/APPT_TXN_DT_TBS.dbf datafile 6 switched to datafile copy input datafile copy RECID=51 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/APPT_TXN_IDX_TBS.dbf datafile 7 switched to datafile copy input datafile copy RECID=52 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/CBO_TXN_DT_TBS01.dbf datafile 8 switched to datafile copy input datafile copy RECID=53 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/CBO_TXN_IDX_TBS01.dbf datafile 9 switched to datafile copy input datafile copy RECID=54 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/CM_BST4K_DT_TBS01.dbf datafile 10 switched to datafile copy input datafile copy RECID=55 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/CM_BST4K_IDX_TBS01.dbf datafile 11 switched to datafile copy input datafile copy RECID=56 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS01.dbf datafile 12 switched to datafile copy input datafile copy RECID=57 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS01.dbf datafile 13 switched to datafile copy input datafile copy RECID=58 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_DT_TBS01.dbf datafile 14 switched to datafile copy input datafile copy RECID=59 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_IDX_TBS01.dbf datafile 15 switched to datafile copy input datafile copy RECID=60 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LLMDATA_TBS01.dbf datafile 16 switched to datafile copy input datafile copy RECID=61 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS01.dbf datafile 17 switched to datafile copy input datafile copy RECID=62 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/MLMDATA_TBS01.dbf datafile 18 switched to datafile copy input datafile copy RECID=63 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/MLMINDX_TBS01.dbf datafile 19 switched to datafile copy input datafile copy RECID=64 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/SLMDATA_TBS01.dbf datafile 20 switched to datafile copy input datafile copy RECID=65 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/SLMINDX_TBS01.dbf datafile 21 switched to datafile copy input datafile copy RECID=66 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/SLOT_DT_TBS.dbf datafile 22 switched to datafile copy input datafile copy RECID=67 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/SLOT_INDX_TBS.dbf datafile 23 switched to datafile copy input datafile copy RECID=68 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/TE_BST_DT_TBS01.dbf datafile 24 switched to datafile copy input datafile copy RECID=69 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/TE_BST_IDX_TBS01.dbf datafile 25 switched to datafile copy input datafile copy RECID=70 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/YMS_BST_DT_TBS01.dbf datafile 26 switched to datafile copy input datafile copy RECID=71 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/YMS_BST_IDX_TBS01.dbf datafile 27 switched to datafile copy input datafile copy RECID=72 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS02.dbf datafile 28 switched to datafile copy input datafile copy RECID=73 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS03.dbf datafile 29 switched to datafile copy input datafile copy RECID=74 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS04.dbf datafile 30 switched to datafile copy input datafile copy RECID=75 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS02.dbf datafile 31 switched to datafile copy input datafile copy RECID=76 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS03.dbf datafile 32 switched to datafile copy input datafile copy RECID=77 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS05.dbf datafile 33 switched to datafile copy input datafile copy RECID=78 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS06.dbf datafile 34 switched to datafile copy input datafile copy RECID=79 STAMP=1233942164 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS07.dbf datafile 35 switched to datafile copy input datafile copy RECID=80 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS08.dbf datafile 36 switched to datafile copy input datafile copy RECID=81 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS09.dbf datafile 37 switched to datafile copy input datafile copy RECID=82 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS10.dbf datafile 38 switched to datafile copy input datafile copy RECID=83 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS02.dbf datafile 39 switched to datafile copy input datafile copy RECID=84 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS04.dbf datafile 40 switched to datafile copy input datafile copy RECID=85 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS11.dbf datafile 41 switched to datafile copy input datafile copy RECID=86 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS12.dbf datafile 42 switched to datafile copy input datafile copy RECID=87 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS05.dbf datafile 43 switched to datafile copy input datafile copy RECID=88 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS06.dbf datafile 44 switched to datafile copy input datafile copy RECID=89 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS13.dbf datafile 45 switched to datafile copy input datafile copy RECID=90 STAMP=1233942165 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS14.dbf contents of Memory Script: { set until time \u0026#34;to_date(\u0026#39;MAY 21 2026 14:45:00\u0026#39;, \u0026#39;MON DD YYYY HH24:MI:SS\u0026#39;)\u0026#34;; recover clone database delete archivelog ; } executing Memory Script executing command: SET until clause Starting recover at 2026-05-22 17:42:45 starting media recovery channel aux00: starting archived log restore to default destination channel aux00: restoring archived log archived log thread=1 sequence=73539 channel aux00: restoring archived log archived log thread=1 sequence=73540 channel aux00: restoring archived log archived log thread=1 sequence=73541 channel aux00: restoring archived log archived log thread=1 sequence=73542 channel aux00: restoring archived log archived log thread=1 sequence=73543 channel aux00: restoring archived log archived log thread=1 sequence=73544 channel aux00: restoring archived log archived log thread=1 sequence=73545 channel aux00: restoring archived log archived log thread=1 sequence=73546 channel aux00: restoring archived log archived log thread=1 sequence=73547 channel aux00: restoring archived log archived log thread=1 sequence=73548 channel aux00: restoring archived log archived log thread=1 sequence=73549 channel aux00: restoring archived log archived log thread=1 sequence=73550 channel aux00: restoring archived log archived log thread=1 sequence=73551 channel aux00: reading from backup piece al_46791_1_1233816119 channel aux01: starting archived log restore to default destination channel aux01: restoring archived log archived log thread=1 sequence=73552 channel aux01: restoring archived log archived log thread=1 sequence=73553 channel aux01: restoring archived log archived log thread=1 sequence=73554 channel aux01: restoring archived log archived log thread=1 sequence=73555 channel aux01: restoring archived log archived log thread=1 sequence=73556 channel aux01: restoring archived log archived log thread=1 sequence=73557 channel aux01: restoring archived log archived log thread=1 sequence=73558 channel aux01: restoring archived log archived log thread=1 sequence=73559 channel aux01: restoring archived log archived log thread=1 sequence=73560 channel aux01: restoring archived log archived log thread=1 sequence=73561 channel aux01: restoring archived log archived log thread=1 sequence=73562 channel aux01: restoring archived log archived log thread=1 sequence=73563 channel aux01: restoring archived log archived log thread=1 sequence=73564 channel aux01: restoring archived log archived log thread=1 sequence=73565 channel aux01: restoring archived log archived log thread=1 sequence=73566 channel aux01: restoring archived log archived log thread=1 sequence=73567 channel aux01: restoring archived log archived log thread=1 sequence=73568 channel aux01: restoring archived log archived log thread=1 sequence=73569 channel aux01: restoring archived log archived log thread=1 sequence=73570 channel aux01: reading from backup piece al_46844_1_1233902489 channel aux00: piece handle=al_46791_1_1233816119 tag=TAG20260521T063922 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:35 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73539_o1099dtn_.arc thread=1 sequence=73539 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73539_o1099dtn_.arc RECID=147053 STAMP=1233942200 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73540_o1098y54_.arc thread=1 sequence=73540 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73540_o1098y54_.arc RECID=147034 STAMP=1233942187 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73541_o1098y62_.arc thread=1 sequence=73541 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73541_o1098y62_.arc RECID=147033 STAMP=1233942186 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73542_o1098y4f_.arc thread=1 sequence=73542 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73542_o1098y4f_.arc RECID=147035 STAMP=1233942187 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73543_o1099c1w_.arc thread=1 sequence=73543 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73543_o1099c1w_.arc RECID=147050 STAMP=1233942199 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73544_o1099bsr_.arc thread=1 sequence=73544 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73544_o1099bsr_.arc RECID=147051 STAMP=1233942200 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73545_o1099cdz_.arc thread=1 sequence=73545 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73545_o1099cdz_.arc RECID=147049 STAMP=1233942199 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73546_o1099d5b_.arc thread=1 sequence=73546 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73546_o1099d5b_.arc RECID=147052 STAMP=1233942200 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73547_o1098y20_.arc thread=1 sequence=73547 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73547_o1098y20_.arc RECID=147045 STAMP=1233942192 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73548_o1098y3l_.arc thread=1 sequence=73548 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73548_o1098y3l_.arc RECID=147036 STAMP=1233942188 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73549_o1098y2x_.arc thread=1 sequence=73549 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73549_o1098y2x_.arc RECID=147037 STAMP=1233942188 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73550_o1099hgd_.arc thread=1 sequence=73550 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73550_o1099hgd_.arc RECID=147048 STAMP=1233942199 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73551_o1099job_.arc thread=1 sequence=73551 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73551_o1099job_.arc RECID=147046 STAMP=1233942192 channel aux00: starting archived log restore to default destination channel aux00: restoring archived log archived log thread=1 sequence=73571 channel aux00: restoring archived log archived log thread=1 sequence=73572 channel aux00: restoring archived log archived log thread=1 sequence=73573 channel aux00: restoring archived log archived log thread=1 sequence=73574 channel aux00: restoring archived log archived log thread=1 sequence=73575 channel aux00: restoring archived log archived log thread=1 sequence=73576 channel aux00: restoring archived log archived log thread=1 sequence=73577 channel aux00: restoring archived log archived log thread=1 sequence=73578 channel aux00: restoring archived log archived log thread=1 sequence=73579 channel aux00: restoring archived log archived log thread=1 sequence=73580 channel aux00: restoring archived log archived log thread=1 sequence=73581 channel aux00: restoring archived log archived log thread=1 sequence=73582 channel aux00: restoring archived log archived log thread=1 sequence=73583 channel aux00: restoring archived log archived log thread=1 sequence=73584 channel aux00: restoring archived log archived log thread=1 sequence=73585 channel aux00: restoring archived log archived log thread=1 sequence=73586 channel aux00: restoring archived log archived log thread=1 sequence=73587 channel aux00: restoring archived log archived log thread=1 sequence=73588 channel aux00: restoring archived log archived log thread=1 sequence=73589 channel aux00: restoring archived log archived log thread=1 sequence=73590 channel aux00: reading from backup piece al_46842_1_1233902424 channel aux01: piece handle=al_46844_1_1233902489 tag=TAG20260522T064023 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:47 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73552_o1099j8b_.arc thread=1 sequence=73552 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73552_o1099j8b_.arc RECID=147060 STAMP=1233942209 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73553_o1098z33_.arc thread=1 sequence=73553 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73553_o1098z33_.arc RECID=147044 STAMP=1233942192 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73554_o1098z43_.arc thread=1 sequence=73554 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73554_o1098z43_.arc RECID=147043 STAMP=1233942191 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73555_o1098z6b_.arc thread=1 sequence=73555 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73555_o1098z6b_.arc RECID=147042 STAMP=1233942191 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73556_o1099ntx_.arc thread=1 sequence=73556 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73556_o1099ntx_.arc RECID=147061 STAMP=1233942211 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73557_o1098z9c_.arc thread=1 sequence=73557 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73557_o1098z9c_.arc RECID=147040 STAMP=1233942190 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73558_o1099hy2_.arc thread=1 sequence=73558 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73558_o1099hy2_.arc RECID=147059 STAMP=1233942209 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73559_o1099wsc_.arc thread=1 sequence=73559 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73559_o1099wsc_.arc RECID=147062 STAMP=1233942214 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73560_o1099gq0_.arc thread=1 sequence=73560 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73560_o1099gq0_.arc RECID=147056 STAMP=1233942205 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73561_o1098z88_.arc thread=1 sequence=73561 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73561_o1098z88_.arc RECID=147039 STAMP=1233942190 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73562_o1099gwf_.arc thread=1 sequence=73562 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73562_o1099gwf_.arc RECID=147054 STAMP=1233942204 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73563_o1099hnr_.arc thread=1 sequence=73563 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73563_o1099hnr_.arc RECID=147058 STAMP=1233942206 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73564_o1098z57_.arc thread=1 sequence=73564 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73564_o1098z57_.arc RECID=147041 STAMP=1233942191 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73565_o1099x0w_.arc thread=1 sequence=73565 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73565_o1099x0w_.arc RECID=147063 STAMP=1233942214 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73566_o1099xhm_.arc thread=1 sequence=73566 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73566_o1099xhm_.arc RECID=147064 STAMP=1233942214 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73567_o1098z76_.arc thread=1 sequence=73567 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73567_o1098z76_.arc RECID=147038 STAMP=1233942190 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73568_o1099hh2_.arc thread=1 sequence=73568 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73568_o1099hh2_.arc RECID=147057 STAMP=1233942206 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73569_o1099gkh_.arc thread=1 sequence=73569 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73569_o1099gkh_.arc RECID=147055 STAMP=1233942205 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73570_o1098z1x_.arc thread=1 sequence=73570 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73570_o1098z1x_.arc RECID=147047 STAMP=1233942196 channel aux01: starting archived log restore to default destination channel aux01: restoring archived log archived log thread=1 sequence=73591 channel aux01: restoring archived log archived log thread=1 sequence=73592 channel aux01: restoring archived log archived log thread=1 sequence=73593 channel aux01: restoring archived log archived log thread=1 sequence=73594 channel aux01: restoring archived log archived log thread=1 sequence=73595 channel aux01: restoring archived log archived log thread=1 sequence=73596 channel aux01: restoring archived log archived log thread=1 sequence=73597 channel aux01: restoring archived log archived log thread=1 sequence=73598 channel aux01: reading from backup piece al_46845_1_1233902565 channel aux00: piece handle=al_46842_1_1233902424 tag=TAG20260522T064023 channel aux00: restored backup piece 1 channel aux00: restore complete, elapsed time: 00:00:42 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73571_o109bgo3_.arc thread=1 sequence=73571 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73571_o109bgo3_.arc RECID=147068 STAMP=1233942236 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73572_o109bw46_.arc thread=1 sequence=73572 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73572_o109bw46_.arc RECID=147073 STAMP=1233942249 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73573_o109c9tk_.arc thread=1 sequence=73573 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73573_o109c9tk_.arc RECID=147082 STAMP=1233942258 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73574_o109bwby_.arc thread=1 sequence=73574 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73574_o109bwby_.arc RECID=147075 STAMP=1233942250 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73575_o109cb1r_.arc thread=1 sequence=73575 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73575_o109cb1r_.arc RECID=147083 STAMP=1233942258 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73576_o109bvpt_.arc thread=1 sequence=73576 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73576_o109bvpt_.arc RECID=147074 STAMP=1233942249 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73577_o109bgoy_.arc thread=1 sequence=73577 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73577_o109bgoy_.arc RECID=147066 STAMP=1233942235 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73578_o109bgn4_.arc thread=1 sequence=73578 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73578_o109bgn4_.arc RECID=147069 STAMP=1233942236 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73579_o109bgm4_.arc thread=1 sequence=73579 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73579_o109bgm4_.arc RECID=147070 STAMP=1233942236 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73580_o109c9o2_.arc thread=1 sequence=73580 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73580_o109c9o2_.arc RECID=147081 STAMP=1233942258 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73581_o109by3z_.arc thread=1 sequence=73581 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73581_o109by3z_.arc RECID=147080 STAMP=1233942251 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73582_o109cb77_.arc thread=1 sequence=73582 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73582_o109cb77_.arc RECID=147084 STAMP=1233942258 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73583_o109bgjv_.arc thread=1 sequence=73583 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73583_o109bgjv_.arc RECID=147072 STAMP=1233942238 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73584_o109bgqm_.arc thread=1 sequence=73584 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73584_o109bgqm_.arc RECID=147065 STAMP=1233942235 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73585_o109bgpr_.arc thread=1 sequence=73585 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73585_o109bgpr_.arc RECID=147067 STAMP=1233942236 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73586_o109bwl8_.arc thread=1 sequence=73586 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73586_o109bwl8_.arc RECID=147077 STAMP=1233942250 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73587_o109bvxt_.arc thread=1 sequence=73587 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73587_o109bvxt_.arc RECID=147076 STAMP=1233942250 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73588_o109bwvc_.arc thread=1 sequence=73588 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73588_o109bwvc_.arc RECID=147078 STAMP=1233942250 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73589_o109bgl3_.arc thread=1 sequence=73589 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73589_o109bgl3_.arc RECID=147071 STAMP=1233942237 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73590_o109bx3b_.arc thread=1 sequence=73590 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73590_o109bx3b_.arc RECID=147079 STAMP=1233942250 channel aux01: piece handle=al_46845_1_1233902565 tag=TAG20260522T064023 channel aux01: restored backup piece 1 channel aux01: restore complete, elapsed time: 00:00:38 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73591_o109cs6t_.arc thread=1 sequence=73591 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73591_o109cs6t_.arc RECID=147087 STAMP=1233942273 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73592_o109cs9h_.arc thread=1 sequence=73592 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73592_o109cs9h_.arc RECID=147086 STAMP=1233942272 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73593_o109d05m_.arc thread=1 sequence=73593 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73593_o109d05m_.arc RECID=147088 STAMP=1233942278 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73594_o109cs89_.arc thread=1 sequence=73594 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73594_o109cs89_.arc RECID=147085 STAMP=1233942272 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73595_o109d11r_.arc thread=1 sequence=73595 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73595_o109d11r_.arc RECID=147090 STAMP=1233942279 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73596_o109d0c3_.arc thread=1 sequence=73596 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73596_o109d0c3_.arc RECID=147089 STAMP=1233942279 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73597_o109d6sx_.arc thread=1 sequence=73597 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73597_o109d6sx_.arc RECID=147091 STAMP=1233942283 archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73598_o109d702_.arc thread=1 sequence=73598 channel clone_default: deleting archived log(s) archived log file name=/u01/app/oracle/fast_recovery_area/WMSAUX/WMSAUX/archivelog/2026_05_22/o1_mf_1_73598_o109d702_.arc RECID=147092 STAMP=1233942283 media recovery complete, elapsed time: 00:00:19 Finished recover at 2026-05-22 17:45:16 released channel: aux00 released channel: aux01 Oracle instance started Total System Global Area 8589933416 bytes Fixed Size 12217192 bytes Variable Size 4898947072 bytes Database Buffers 3640655872 bytes Redo Buffers 38113280 bytes contents of Memory Script: { sql clone \u0026#34;alter system set db_name = \u0026#39;\u0026#39;WMSAUX\u0026#39;\u0026#39; comment= \u0026#39;\u0026#39;Reset to original value by RMAN\u0026#39;\u0026#39; scope=spfile\u0026#34;; sql clone \u0026#34;alter system reset db_unique_name scope=spfile\u0026#34;; } executing Memory Script sql statement: alter system set db_name = \u0026#39;\u0026#39;WMSAUX\u0026#39;\u0026#39; comment= \u0026#39;\u0026#39;Reset to original value by RMAN\u0026#39;\u0026#39; scope=spfile sql statement: alter system reset db_unique_name scope=spfile Oracle instance started Total System Global Area 8589933416 bytes Fixed Size 12217192 bytes Variable Size 4882169856 bytes Database Buffers 3657433088 bytes Redo Buffers 38113280 bytes sql statement: CREATE CONTROLFILE REUSE SET DATABASE \u0026#34;WMSAUX\u0026#34; RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 1168 LOGFILE GROUP 1 ( \u0026#39;/u01/app/oracle/oradata/WMSAUX/redo01.log\u0026#39; ) SIZE 200 M REUSE, GROUP 2 ( \u0026#39;/u01/app/oracle/oradata/WMSAUX/redo02.log\u0026#39; ) SIZE 200 M REUSE, GROUP 3 ( \u0026#39;/u01/app/oracle/oradata/WMSAUX/redo03.log\u0026#39; ) SIZE 200 M REUSE, GROUP 4 ( \u0026#39;/u01/app/oracle/oradata/WMSAUX/redo4.log\u0026#39; ) SIZE 200 M REUSE, GROUP 5 ( \u0026#39;/u01/app/oracle/oradata/WMSAUX/redo5.log\u0026#39; ) SIZE 200 M REUSE, GROUP 6 ( \u0026#39;/u01/app/oracle/oradata/WMSAUX/redo6.log\u0026#39; ) SIZE 200 M REUSE DATAFILE \u0026#39;/u01/app/oracle/oradata/WMSAUX/system01.dbf\u0026#39; CHARACTER SET AL32UTF8 contents of Memory Script: { set newname for tempfile 1 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/temp01.dbf\u0026#34;; set newname for tempfile 2 to \u0026#34;/u01/app/oracle/oradata/WMSAUX/temp02.dbf\u0026#34;; switch clone tempfile all; catalog clone datafilecopy \u0026#34;/u01/app/oracle/oradata/WMSAUX/sysaux01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/undotbs01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/users01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/APPT_TXN_DT_TBS.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/APPT_TXN_IDX_TBS.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/CBO_TXN_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/CBO_TXN_IDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/CM_BST4K_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/CM_BST4K_IDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_IDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LLMDATA_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/MLMDATA_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/MLMINDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLMDATA_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLMINDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLOT_DT_TBS.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/SLOT_INDX_TBS.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/TE_BST_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/TE_BST_IDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/YMS_BST_DT_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/YMS_BST_IDX_TBS01.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS02.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS03.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS04.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS02.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS03.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS05.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS06.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS07.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS08.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS09.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS10.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS02.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS04.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS11.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS12.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS05.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS06.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS13.dbf\u0026#34;, \u0026#34;/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS14.dbf\u0026#34;; switch clone datafile all; } executing Memory Script executing command: SET NEWNAME executing command: SET NEWNAME renamed tempfile 1 to /u01/app/oracle/oradata/WMSAUX/temp01.dbf in control file renamed tempfile 2 to /u01/app/oracle/oradata/WMSAUX/temp02.dbf in control file cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/sysaux01.dbf RECID=1 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/undotbs01.dbf RECID=2 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/users01.dbf RECID=3 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/APPT_TXN_DT_TBS.dbf RECID=4 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/APPT_TXN_IDX_TBS.dbf RECID=5 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/CBO_TXN_DT_TBS01.dbf RECID=6 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/CBO_TXN_IDX_TBS01.dbf RECID=7 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/CM_BST4K_DT_TBS01.dbf RECID=8 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/CM_BST4K_IDX_TBS01.dbf RECID=9 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS01.dbf RECID=10 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS01.dbf RECID=11 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_DT_TBS01.dbf RECID=12 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_IDX_TBS01.dbf RECID=13 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LLMDATA_TBS01.dbf RECID=14 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS01.dbf RECID=15 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/MLMDATA_TBS01.dbf RECID=16 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/MLMINDX_TBS01.dbf RECID=17 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/SLMDATA_TBS01.dbf RECID=18 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/SLMINDX_TBS01.dbf RECID=19 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/SLOT_DT_TBS.dbf RECID=20 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/SLOT_INDX_TBS.dbf RECID=21 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/TE_BST_DT_TBS01.dbf RECID=22 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/TE_BST_IDX_TBS01.dbf RECID=23 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/YMS_BST_DT_TBS01.dbf RECID=24 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/YMS_BST_IDX_TBS01.dbf RECID=25 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS02.dbf RECID=26 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS03.dbf RECID=27 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS04.dbf RECID=28 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS02.dbf RECID=29 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS03.dbf RECID=30 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS05.dbf RECID=31 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS06.dbf RECID=32 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS07.dbf RECID=33 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS08.dbf RECID=34 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS09.dbf RECID=35 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS10.dbf RECID=36 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS02.dbf RECID=37 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS04.dbf RECID=38 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS11.dbf RECID=39 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS12.dbf RECID=40 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS05.dbf RECID=41 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS06.dbf RECID=42 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS13.dbf RECID=43 STAMP=1233942360 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS14.dbf RECID=44 STAMP=1233942360 datafile 2 switched to datafile copy input datafile copy RECID=1 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=2 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=3 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/users01.dbf datafile 5 switched to datafile copy input datafile copy RECID=4 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/APPT_TXN_DT_TBS.dbf datafile 6 switched to datafile copy input datafile copy RECID=5 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/APPT_TXN_IDX_TBS.dbf datafile 7 switched to datafile copy input datafile copy RECID=6 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/CBO_TXN_DT_TBS01.dbf datafile 8 switched to datafile copy input datafile copy RECID=7 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/CBO_TXN_IDX_TBS01.dbf datafile 9 switched to datafile copy input datafile copy RECID=8 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/CM_BST4K_DT_TBS01.dbf datafile 10 switched to datafile copy input datafile copy RECID=9 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/CM_BST4K_IDX_TBS01.dbf datafile 11 switched to datafile copy input datafile copy RECID=10 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS01.dbf datafile 12 switched to datafile copy input datafile copy RECID=11 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS01.dbf datafile 13 switched to datafile copy input datafile copy RECID=12 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_DT_TBS01.dbf datafile 14 switched to datafile copy input datafile copy RECID=13 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_TXN_IDX_TBS01.dbf datafile 15 switched to datafile copy input datafile copy RECID=14 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LLMDATA_TBS01.dbf datafile 16 switched to datafile copy input datafile copy RECID=15 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS01.dbf datafile 17 switched to datafile copy input datafile copy RECID=16 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/MLMDATA_TBS01.dbf datafile 18 switched to datafile copy input datafile copy RECID=17 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/MLMINDX_TBS01.dbf datafile 19 switched to datafile copy input datafile copy RECID=18 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/SLMDATA_TBS01.dbf datafile 20 switched to datafile copy input datafile copy RECID=19 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/SLMINDX_TBS01.dbf datafile 21 switched to datafile copy input datafile copy RECID=20 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/SLOT_DT_TBS.dbf datafile 22 switched to datafile copy input datafile copy RECID=21 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/SLOT_INDX_TBS.dbf datafile 23 switched to datafile copy input datafile copy RECID=22 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/TE_BST_DT_TBS01.dbf datafile 24 switched to datafile copy input datafile copy RECID=23 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/TE_BST_IDX_TBS01.dbf datafile 25 switched to datafile copy input datafile copy RECID=24 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/YMS_BST_DT_TBS01.dbf datafile 26 switched to datafile copy input datafile copy RECID=25 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/YMS_BST_IDX_TBS01.dbf datafile 27 switched to datafile copy input datafile copy RECID=26 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS02.dbf datafile 28 switched to datafile copy input datafile copy RECID=27 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS03.dbf datafile 29 switched to datafile copy input datafile copy RECID=28 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS04.dbf datafile 30 switched to datafile copy input datafile copy RECID=29 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS02.dbf datafile 31 switched to datafile copy input datafile copy RECID=30 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS03.dbf datafile 32 switched to datafile copy input datafile copy RECID=31 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS05.dbf datafile 33 switched to datafile copy input datafile copy RECID=32 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS06.dbf datafile 34 switched to datafile copy input datafile copy RECID=33 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS07.dbf datafile 35 switched to datafile copy input datafile copy RECID=34 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS08.dbf datafile 36 switched to datafile copy input datafile copy RECID=35 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS09.dbf datafile 37 switched to datafile copy input datafile copy RECID=36 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS10.dbf datafile 38 switched to datafile copy input datafile copy RECID=37 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LLMINDX_TBS02.dbf datafile 39 switched to datafile copy input datafile copy RECID=38 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS04.dbf datafile 40 switched to datafile copy input datafile copy RECID=39 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS11.dbf datafile 41 switched to datafile copy input datafile copy RECID=40 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_STAT_DT_TBS12.dbf datafile 42 switched to datafile copy input datafile copy RECID=41 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS05.dbf datafile 43 switched to datafile copy input datafile copy RECID=42 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS06.dbf datafile 44 switched to datafile copy input datafile copy RECID=43 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS13.dbf datafile 45 switched to datafile copy input datafile copy RECID=44 STAMP=1233942360 file name=/u01/app/oracle/oradata/WMSAUX/LEMA_LGTXN_DT_TBS14.dbf Reenabling controlfile options for auxiliary database Executing: alter database add supplemental log data Executing: alter database force logging contents of Memory Script: { Alter clone database open resetlogs; } executing Memory Script database opened Cannot remove created server parameter file Finished Duplicate Db at 2026-05-22 17:46:08 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of release command at 05/22/2026 17:46:08 RMAN-06012: channel: aux00 not allocated RMAN\u0026gt; RMAN 自动恢复控制文件：\nchannel aux00: restoring control file channel aux00: reading from backup piece c-3080983586-20260521-02 output file name=/u01/app/oracle/oradata/WMSAUX/control01.ctl output file name=/u01/app/oracle/oradata/WMSAUX/control02.ctl database mounted 并自动把生产库数据文件转换到辅助库目录，例如：\n/u01/app/oracle/oradata/WMSAUX/system01.dbf /u01/app/oracle/oradata/WMSAUX/sysaux01.dbf /u01/app/oracle/oradata/WMSAUX/undotbs01.dbf ... 这些路径来自 db_file_name_convert 和 RMAN Duplicate 自动生成的 set newname。\nRMAN 最后输出：\nAlter clone database open resetlogs; database opened Finished Duplicate Db at 2026-05-22 17:46:08 说明辅助库已经成功打开。后面出现了：\nRMAN-06012: channel: aux00 not allocated 这是释放通道时的报错，不影响 Duplicate 成功，因为数据库已经 open resetlogs 并且 RMAN 明确显示 Finished Duplicate Db。\n判断 Duplicate 成功的关键不是看是否完全没有报错，而是看以下几项：\n检查点 结果 target 是否为 WMPROD 是 auxiliary 是否为 WMSAUX 是 控制文件是否恢复到 WMSAUX 目录 是 数据文件是否恢复到 WMSAUX 目录 是 是否完成 recover clone database 是 是否 open resetlogs 是 是否出现 Finished Duplicate Db 是 八、从辅助库导出旧版视图 DDL # 进入辅助库：\nexport ORACLE_SID=WMSAUX sqlplus / as sysdba [oracle@wmsdb2019 ~]$ export ORACLE_SID=WMSAUX [oracle@wmsdb2019 ~]$ sqlplus / as sysdba SQL*Plus: Release 18.0.0.0.0 - Production on Fri May 22 21:36:08 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 SQL\u0026gt; 建议使用下面这种方式导出，避免 SQL 文件里带 SQL\u0026gt; 提示符：\nset long 1000000 set longchunksize 1000000 set pages 0 set lines 300 set trimspool on set heading off set feedback off set echo off set termout off set sqlprompt \u0026#39;\u0026#39; exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;SQLTERMINATOR\u0026#39;,true); exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;PRETTY\u0026#39;,true); exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;EMIT_SCHEMA\u0026#39;,true); spool /tmp/V_YN_GSP_NBR_old_20260521_144500.sql select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) from dual; spool off SQL\u0026gt; set long 1000000 set longchunksize 1000000 set pages 0 set lines 300 set trimspool on set heading off set feedback off exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;SQLTERMINATOR\u0026#39;,true);SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;PRETTY\u0026#39;,true); SQL\u0026gt; exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;EMIT_SCHEMA\u0026#39;,true); SQL\u0026gt; spool /tmp/V_YN_GSP_NBR_old_20260521_144846.sql SQL\u0026gt; select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) from dual; 2 CREATE OR REPLACE FORCE EDITIONABLE VIEW \u0026#34;WMPROD\u0026#34;.\u0026#34;V_YN_GSP_NBR\u0026#34; (\u0026#34;CREATE_DATETIME\u0026#34;, \u0026#34;CREATE_DATE_TIME\u0026#34;, \u0026#34;WHSE\u0026#34;, \u0026#34;SEASON\u0026#34;, \u0026#34;COMPANY_DESCRIPTION\u0026#34;, \u0026#34;BILLNO_TYPE\u0026#34;, \u0026#34;BILLNO_NAME\u0026#34;, \u0026#34;I_O_FLAG\u0026#34;, \u0026#34;I_O_FLAG_TYPE\u0026#34;, \u0026#34;TC_LPN_ID\u0026#34;, \u0026#34;CMS_BILLNO\u0026#34;, \u0026#34;CMS_GRPNO\u0026#34;, \u0026#34;WMS_BILLNO\u0026#34;, \u0026#34;ITEM_ID\u0026#34;, \u0026#34;SIZE_DESC\u0026#34;, \u0026#34;DESCRIPTION\u0026#34;, \u0026#34;BATCH_NBR\u0026#34;, \u0026#34;GSP_NBR\u0026#34;, \u0026#34;UOM\u0026#34;, \u0026#34;DNAME\u0026#34;, \u0026#34;COMMODITY_LEVEL_DESC\u0026#34;, \u0026#34;C_QSTD\u0026#34;, \u0026#34;C_APPR_CODE\u0026#34;, \u0026#34;BUSINESS_PARTNER_ID\u0026#34;, \u0026#34;VENDOR_NAME\u0026#34;, \u0026#34;STD_PACK_QTY\u0026#34;, \u0026#34;USER_NAME\u0026#34;) AS select cgnt.create_date_time as create_datetime, -- 监管码时间 /*to_date(cgnt.create_date_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as create_datetime, -- 监管码时间*/ to_char(a.created_dttm, \u0026#39;yyyymmdd hh24:mi:ss\u0026#39;) as create_date_time, -- 订单时间 cgnt.whse, -- 仓库代码 cgnt.season, -- 货主代码 (select company_description from company where parent_company_id = 1 and company_code = cgnt.season) company_description, --货主名称 a.asn_orgn_type as billno_type, -- 订单类型 (select sc.code_desc from sys_code sc where sc.code_type = \u0026#39;022\u0026#39; and sc.code_id = a.asn_orgn_type) as billno_name, l.inbound_outbound_indicator as i_o_flag, -- 出入库类型 decode(l.inbound_outbound_indicator, \u0026#39;I\u0026#39;, \u0026#39;入库\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;出库\u0026#39;) as i_o_flag_type, --入出库类型 l.tc_lpn_id, -- 货箱号 ad.ref_field_3 as cms_billno, -- cms订单号 a.manif_nbr as cms_grpno, -- cms订单组号 a.tc_asn_id as wms_billno, -- wms订单号 ad.sku_id as item_id, -- 商品id cgnt.size_desc, --erp商品代码 ic.description, --品规 cgnt.batch_nbr, --批号 cgnt.gsp_nbr, -- 监管码 cgnt.uom, -- 单位 (select substr(bp.description, instr(bp.description, \u0026#39; \u0026#39;) + 1) from business_partner bp where bp.business_partner_id = a.business_partner_id) as dname, ic.commodity_level_desc, --生产企业 ic.c_qstd, --存储条件 ic.c_appr_code, --注册证号 a.business_partner_id as business_partner_id, -- 客商id substr(bp.description, instr(bp.description, \u0026#39; \u0026#39;) + 1) as vendor_name, --客商名称 ld.std_pack_qty, -- 包装数量 uu.user_last_name || uu.user_first_name as user_name --扫码人 from asn a join asn_detail ad on a.asn_id = ad.asn_id join asn_detail_ref adr on a.asn_id = adr.asn_id join lpn l on l.inbound_outbound_indicator = \u0026#39;I\u0026#39; and a.asn_id = l.asn_id and a.tc_asn_id = l.tc_asn_id join lpn_detail ld on l.lpn_id = ld.lpn_id and ad.sku_id = ld.item_id and ad.batch_nbr = ld.batch_nbr join c_gsp_nbr_trkg cgnt on cgnt.i_o_flag = \u0026#39;I\u0026#39; and a.tc_asn_id = cgnt.rcvd_shpmt_nbr and l.tc_lpn_id = cgnt.cntr_nbr and ld.item_id = cgnt.sku_id and ld.batch_nbr = cgnt.batch_nbr join item_cbo ic on cgnt.sku_id = ic.item_id join ucl_user uu --on cgnt.user_id = uu.user_name on cgnt.scan_user_id = uu.user_name --20257/28 关联扫码人id join business_partner bp on bp.business_partner_id = ad.business_partner_id where a.asn_status = 40 union all select cgnt.create_date_time as create_datetime, -- 监管码时间 /* to_date(cgnt.create_date_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as create_datetime, -- 监管码时间*/ to_char(o.created_dttm, \u0026#39;yyyymmdd hh24:mi:ss\u0026#39;) as create_date_time, -- 订单时间 cgnt.whse, -- 仓库代码 cgnt.season, -- 货主代码 (select company_description from company where parent_company_id = 1 and company_code = cgnt.season) company_description, --货主名称 o.ref_field_2 as billno_type, -- 订单类型 (select sc.code_desc from sys_code sc where sc.code_type = \u0026#39;022\u0026#39; and sc.code_id = o.ref_field_2) as billno_name, l.inbound_outbound_indicator as i_o_flag, -- 出入库类型 decode(l.inbound_outbound_indicator, \u0026#39;I\u0026#39;, \u0026#39;入库\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;出库\u0026#39;) as i_o_flag_type, --入出库类型 l.tc_lpn_id as tc_lpn_id, -- 货箱号 oli.delivery_reference_number as cms_billno, -- cms订单号 o.ref_field_3 as cms_grpno, --cms订单组号 o.tc_order_id as wms_billno, -- wms订单号 ld.item_id as item_id, -- 商品id ic.item_size_desc as size_desc, --erp商品代码 ic.description, --品规 cgnt.batch_nbr, --批号 cgnt.gsp_nbr, -- 监管码 cgnt.uom, -- 单位 (select fa.facility_name from facility_alias fa where fa.facility_alias_id = o.d_facility_alias_id) as dname, ic.commodity_level_desc, --生产企业 ic.c_qstd, --存储条件 ic.c_appr_code, --注册证号 o.d_facility_alias_id as business_partner_id, -- 客商id case when o.tc_company_id = 133 then (select substr(c.company_name, instr(c.company_name, \u0026#39; \u0026#39;, 1, 1) + 1) from company c, orders o1 where o1.tc_company_id = 133 and c.company_code = o.ref_field_7 and o1.order_id = o.order_id) else o.d_facility_name end vendor_name, --客商名称 ld.std_pack_qty, -- 包装数量 uu.user_last_name || uu.user_first_name as user_name --扫码人 from orders o join order_line_item oli on o.order_id = oli.order_id join item_cbo ic on oli.item_name=ic.item_name join lpn l on l.inbound_outbound_indicator = \u0026#39;O\u0026#39; and o.order_id = l.order_id and o.tc_order_id = l.tc_order_id join lpn_detail ld on l.lpn_id = ld.lpn_id and oli.item_id = ld.item_id and oli.batch_nbr = ld.batch_nbr join c_gsp_nbr_trkg cgnt on cgnt.i_o_flag = \u0026#39;O\u0026#39; and o.tc_order_id = cgnt.pkt_ctrl_nbr and l.tc_lpn_id = cgnt.cntr_nbr and ld.item_id = cgnt.sku_id and ld.batch_nbr = cgnt.batch_nbr join item_cbo ic on cgnt.sku_id = ic.item_id join ucl_user uu --on cgnt.user_id = uu.user_name on cgnt.scan_user_id = uu.user_name --20257/28 关联扫码人id where o.do_status = 190 ; SQL\u0026gt; spool off SQL\u0026gt; 本次实际导出的旧 DDL 文件为：\n/tmp/V_YN_GSP_NBR_old_20260521_144846.sql 文件大小约 6.1K，导出的视图开头如下：\nCREATE OR REPLACE FORCE EDITIONABLE VIEW \u0026#34;WMPROD\u0026#34;.\u0026#34;V_YN_GSP_NBR\u0026#34; (\u0026#34;CREATE_DATETIME\u0026#34;, \u0026#34;CREATE_DATE_TIME\u0026#34;, \u0026#34;WHSE\u0026#34;, \u0026#34;SEASON\u0026#34;, \u0026#34;COMPANY_DESCRIPTION\u0026#34;, \u0026#34;BILLNO_TYPE\u0026#34;, \u0026#34;BILLNO_NAME\u0026#34;, \u0026#34;I_O_FLAG\u0026#34;, \u0026#34;I_O_FLAG_TYPE\u0026#34;, \u0026#34;TC_LPN_ID\u0026#34;, \u0026#34;CMS_BILLNO\u0026#34;, \u0026#34;CMS_GRPNO\u0026#34;, \u0026#34;WMS_BILLNO\u0026#34;, \u0026#34;ITEM_ID\u0026#34;, \u0026#34;SIZE_DESC\u0026#34;, \u0026#34;DESCRIPTION\u0026#34;, \u0026#34;BATCH_NBR\u0026#34;, \u0026#34;GSP_NBR\u0026#34;, \u0026#34;UOM\u0026#34;, \u0026#34;DNAME\u0026#34;, \u0026#34;COMMODITY_LEVEL_DESC\u0026#34;, \u0026#34;C_QSTD\u0026#34;, \u0026#34;C_APPR_CODE\u0026#34;, \u0026#34;BUSINESS_PARTNER_ID\u0026#34;, \u0026#34;VENDOR_NAME\u0026#34;, \u0026#34;STD_PACK_QTY\u0026#34;, \u0026#34;USER_NAME\u0026#34;) AS select cgnt.create_date_time as create_datetime, -- 监管码时间 /*to_date(cgnt.create_date_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as create_datetime, -- 监管码时间*/ to_char(a.created_dttm, \u0026#39;yyyymmdd hh24:mi:ss\u0026#39;) as create_date_time, -- 订单时间 cgnt.whse, -- 仓库代码 cgnt.season, -- 货主代码 (select company_description from company where parent_company_id = 1 and company_code = cgnt.season) company_description, --货主名称 a.asn_orgn_type as billno_type, -- 订单类型 (select sc.code_desc from sys_code sc where sc.code_type = \u0026#39;022\u0026#39; and sc.code_id = a.asn_orgn_type) as billno_name, l.inbound_outbound_indicator as i_o_flag, -- 出入库类型 decode(l.inbound_outbound_indicator, \u0026#39;I\u0026#39;, \u0026#39;入库\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;出库\u0026#39;) as i_o_flag_type, --入出库类型 l.tc_lpn_id, -- 货箱号 ad.ref_field_3 as cms_billno, -- cms订单号 a.manif_nbr as cms_grpno, -- cms订单组号 a.tc_asn_id as wms_billno, -- wms订单号 ad.sku_id as item_id, -- 商品id cgnt.size_desc, --erp商品代码 ic.description, --品规 cgnt.batch_nbr, --批号 cgnt.gsp_nbr, -- 监管码 cgnt.uom, -- 单位 (select substr(bp.description, instr(bp.description, \u0026#39; \u0026#39;) + 1) from business_partner bp where bp.business_partner_id = a.business_partner_id) as dname, ic.commodity_level_desc, --生产企业 ic.c_qstd, --存储条件 ic.c_appr_code, --注册证号 a.business_partner_id as business_partner_id, -- 客商id substr(bp.description, instr(bp.description, \u0026#39; \u0026#39;) + 1) as vendor_name, --客商名称 ld.std_pack_qty, -- 包装数量 uu.user_last_name || uu.user_first_name as user_name --扫码人 from asn a join asn_detail ad on a.asn_id = ad.asn_id join asn_detail_ref adr on a.asn_id = adr.asn_id join lpn l on l.inbound_outbound_indicator = \u0026#39;I\u0026#39; and a.asn_id = l.asn_id and a.tc_asn_id = l.tc_asn_id join lpn_detail ld on l.lpn_id = ld.lpn_id and ad.sku_id = ld.item_id and ad.batch_nbr = ld.batch_nbr join c_gsp_nbr_trkg cgnt on cgnt.i_o_flag = \u0026#39;I\u0026#39; and a.tc_asn_id = cgnt.rcvd_shpmt_nbr and l.tc_lpn_id = cgnt.cntr_nbr and ld.item_id = cgnt.sku_id and ld.batch_nbr = cgnt.batch_nbr join item_cbo ic on cgnt.sku_id = ic.item_id join ucl_user uu --on cgnt.user_id = uu.user_name on cgnt.scan_user_id = uu.user_name --20257/28 关联扫码人id join business_partner bp on bp.business_partner_id = ad.business_partner_id where a.asn_status = 40 union all select cgnt.create_date_time as create_datetime, -- 监管码时间 /* to_date(cgnt.create_date_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as create_datetime, -- 监管码时间*/ to_char(o.created_dttm, \u0026#39;yyyymmdd hh24:mi:ss\u0026#39;) as create_date_time, -- 订单时间 cgnt.whse, -- 仓库代码 cgnt.season, -- 货主代码 (select company_description from company where parent_company_id = 1 and company_code = cgnt.season) company_description, --货主名称 o.ref_field_2 as billno_type, -- 订单类型 (select sc.code_desc from sys_code sc where sc.code_type = \u0026#39;022\u0026#39; and sc.code_id = o.ref_field_2) as billno_name, l.inbound_outbound_indicator as i_o_flag, -- 出入库类型 decode(l.inbound_outbound_indicator, \u0026#39;I\u0026#39;, \u0026#39;入库\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;出库\u0026#39;) as i_o_flag_type, --入出库类型 l.tc_lpn_id as tc_lpn_id, -- 货箱号 oli.delivery_reference_number as cms_billno, -- cms订单号 o.ref_field_3 as cms_grpno, --cms订单组号 o.tc_order_id as wms_billno, -- wms订单号 ld.item_id as item_id, -- 商品id ic.item_size_desc as size_desc, --erp商品代码 ic.description, --品规 cgnt.batch_nbr, --批号 cgnt.gsp_nbr, -- 监管码 cgnt.uom, -- 单位 (select fa.facility_name from facility_alias fa where fa.facility_alias_id = o.d_facility_alias_id) as dname, ic.commodity_level_desc, --生产企业 ic.c_qstd, --存储条件 ic.c_appr_code, --注册证号 o.d_facility_alias_id as business_partner_id, -- 客商id case when o.tc_company_id = 133 then (select substr(c.company_name, instr(c.company_name, \u0026#39; \u0026#39;, 1, 1) + 1) from company c, orders o1 where o1.tc_company_id = 133 and c.company_code = o.ref_field_7 and o1.order_id = o.order_id) else o.d_facility_name end vendor_name, --客商名称 ld.std_pack_qty, -- 包装数量 uu.user_last_name || uu.user_first_name as user_name --扫码人 from orders o join order_line_item oli on o.order_id = oli.order_id join item_cbo ic on oli.item_name=ic.item_name join lpn l on l.inbound_outbound_indicator = \u0026#39;O\u0026#39; and o.order_id = l.order_id and o.tc_order_id = l.tc_order_id join lpn_detail ld on l.lpn_id = ld.lpn_id and oli.item_id = ld.item_id and oli.batch_nbr = ld.batch_nbr join c_gsp_nbr_trkg cgnt on cgnt.i_o_flag = \u0026#39;O\u0026#39; and o.tc_order_id = cgnt.pkt_ctrl_nbr and l.tc_lpn_id = cgnt.cntr_nbr and ld.item_id = cgnt.sku_id and ld.batch_nbr = cgnt.batch_nbr join item_cbo ic on cgnt.sku_id = ic.item_id join ucl_user uu --on cgnt.user_id = uu.user_name on cgnt.scan_user_id = uu.user_name --20257/28 关联扫码人id where o.do_status = 190 ; 这说明辅助库中已经拿到了修改前的旧版长视图定义。\n九、备份当前错误版本视图定义 # 在生产库上先把当前错误版本导出保存，方便回退或审计。\nexport ORACLE_SID=wmprod sqlplus / as sysdba set long 1000000 set longchunksize 1000000 set pages 0 set lines 300 set trimspool on set heading off set feedback off exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;SQLTERMINATOR\u0026#39;,true); exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;PRETTY\u0026#39;,true); spool /tmp/V_YN_GSP_NBR_current_wrong.sql select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) from dual; spool off [oracle@wmsdb2019 ~]$ export ORACLE_SID=wmprod [oracle@wmsdb2019 ~]$ sqlplus / as sysdba SQL*Plus: Release 18.0.0.0.0 - Production on Fri May 22 21:40:32 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 SQL\u0026gt; set long 1000000 set longchunksize 1000000 set pages 0 set lines 300 set trimspool on set heading off set feedback offSQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;SQLTERMINATOR\u0026#39;,true); SQL\u0026gt; exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,\u0026#39;PRETTY\u0026#39;,true); SQL\u0026gt; spool /tmp/V_YN_GSP_NBR_current_wrong.sql SQL\u0026gt; select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) from dual; 2 CREATE OR REPLACE FORCE EDITIONABLE VIEW \u0026#34;WMPROD\u0026#34;.\u0026#34;V_YN_GSP_NBR\u0026#34; (\u0026#34;CNTR_NBR\u0026#34;, \u0026#34;SIZE_DESC\u0026#34;, \u0026#34;GSP_NBR\u0026#34;, \u0026#34;RCVD_SHPMT_NBR\u0026#34;, \u0026#34;PKT_CTRL_NBR\u0026#34;) AS select cntr_nbr,size_desc,gsp_nbr,rcvd_shpmt_nbr,pkt_ctrl_nbr from c_gsp_nbr_trkg where whse=\u0026#39;YN2\u0026#39; union all select cntr_nbr,size_desc,brcd as gsp_nbr,rcvd_shpmt_nbr,pkt_ctrl_nbr from c_udi_trkg t where whse=\u0026#39;YN2\u0026#39; ; SQL\u0026gt; spool off SQL\u0026gt; 得到的错误版本文件：\n/tmp/V_YN_GSP_NBR_current_wrong.sql 十、在生产库恢复视图定义 # 先清洗文件文件中的 SQL\u0026gt;、spool off ：\nsed -e \u0026#39;/^SQL\u0026gt;/d\u0026#39; \\ -e \u0026#39;/^[[:space:]]*[0-9][[:space:]]/d\u0026#39; \\ /tmp/V_YN_GSP_NBR_old_20260521_144846.sql \\ \u0026gt; /tmp/V_YN_GSP_NBR_old_clean.sql [oracle@wmsdb2019 tmp]$ sed -e \u0026#39;/^SQL\u0026gt;/d\u0026#39; \\ \u0026gt; -e \u0026#39;/^[[:space:]]*[0-9][[:space:]]/d\u0026#39; \\ \u0026gt; /tmp/V_YN_GSP_NBR_old_20260521_144846.sql \\ \u0026gt; \u0026gt; /tmp/V_YN_GSP_NBR_old_clean.sql [oracle@wmsdb2019 tmp]$ 然后执行：\n@/tmp/V_YN_GSP_NBR_old_clean.sql SQL\u0026gt; @/tmp/V_YN_GSP_NBR_old_clean.sql SQL\u0026gt; 执行后编译视图：\nalter view WMPROD.V_YN_GSP_NBR compile; SQL\u0026gt; alter view WMPROD.V_YN_GSP_NBR compile; SQL\u0026gt; 十一、恢复结果验证 # 11.1 检查对象状态 # set lines 200 pages 100 col owner for a20 col object_name for a40 col object_type for a15 col last_ddl_time for a20 col status for a10 select owner, object_name, object_type, to_char(last_ddl_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) last_ddl_time, status from dba_objects where owner = \u0026#39;WMPROD\u0026#39; and object_name = \u0026#39;V_YN_GSP_NBR\u0026#39; and object_type = \u0026#39;VIEW\u0026#39;; 查询结果：\nOWNER OBJECT_NAME OBJECT_TYPE LAST_DDL_TIME STATUS ------ -------------- ----------- ------------------- ------ WMPROD V_YN_GSP_NBR VIEW 2026-05-22 21:41:34 VALID 说明视图已经重新创建并编译成功。\n11.2 检查当前视图定义 # set long 1000000 set longchunksize 1000000 set pages 0 set lines 300 set trimspool on set heading off set feedback off set echo off select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) from dual; SQL\u0026gt; set long 1000000 set longchunksize 1000000 set pages 0 set lines 300 set trimspool on set heading off set feedback off set echo off select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) from dual;SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; 2 CREATE OR REPLACE FORCE EDITIONABLE VIEW \u0026#34;WMPROD\u0026#34;.\u0026#34;V_YN_GSP_NBR\u0026#34; (\u0026#34;CREATE_DATETIME\u0026#34;, \u0026#34;CREATE_DATE_TIME\u0026#34;, \u0026#34;WHSE\u0026#34;, \u0026#34;SEASON\u0026#34;, \u0026#34;COMPANY_DESCRIPTION\u0026#34;, \u0026#34;BILLNO_TYPE\u0026#34;, \u0026#34;BILLNO_NAME\u0026#34;, \u0026#34;I_O_FLAG\u0026#34;, \u0026#34;I_O_FLAG_TYPE\u0026#34;, \u0026#34;TC_LPN_ID\u0026#34;, \u0026#34;CMS_BILLNO\u0026#34;, \u0026#34;CMS_GRPNO\u0026#34;, \u0026#34;WMS_BILLNO\u0026#34;, \u0026#34;ITEM_ID\u0026#34;, \u0026#34;SIZE_DESC\u0026#34;, \u0026#34;DESCRIPTION\u0026#34;, \u0026#34;BATCH_NBR\u0026#34;, \u0026#34;GSP_NBR\u0026#34;, \u0026#34;UOM\u0026#34;, \u0026#34;DNAME\u0026#34;, \u0026#34;COMMODITY_LEVEL_DESC\u0026#34;, \u0026#34;C_QSTD\u0026#34;, \u0026#34;C_APPR_CODE\u0026#34;, \u0026#34;BUSINESS_PARTNER_ID\u0026#34;, \u0026#34;VENDOR_NAME\u0026#34;, \u0026#34;STD_PACK_QTY\u0026#34;, \u0026#34;USER_NAME\u0026#34;) AS select cgnt.create_date_time as create_datetime, -- 监管码时间 /*to_date(cgnt.create_date_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as create_datetime, -- 监管码时间*/ to_char(a.created_dttm, \u0026#39;yyyymmdd hh24:mi:ss\u0026#39;) as create_date_time, -- 订单时间 cgnt.whse, -- 仓库代码 cgnt.season, -- 货主代码 (select company_description from company where parent_company_id = 1 and company_code = cgnt.season) company_description, --货主名称 a.asn_orgn_type as billno_type, -- 订单类型 (select sc.code_desc from sys_code sc where sc.code_type = \u0026#39;022\u0026#39; and sc.code_id = a.asn_orgn_type) as billno_name, l.inbound_outbound_indicator as i_o_flag, -- 出入库类型 decode(l.inbound_outbound_indicator, \u0026#39;I\u0026#39;, \u0026#39;入库\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;出库\u0026#39;) as i_o_flag_type, --入出库类型 l.tc_lpn_id, -- 货箱号 ad.ref_field_3 as cms_billno, -- cms订单号 a.manif_nbr as cms_grpno, -- cms订单组号 a.tc_asn_id as wms_billno, -- wms订单号 ad.sku_id as item_id, -- 商品id cgnt.size_desc, --erp商品代码 ic.description, --品规 cgnt.batch_nbr, --批号 cgnt.gsp_nbr, -- 监管码 cgnt.uom, -- 单位 (select substr(bp.description, instr(bp.description, \u0026#39; \u0026#39;) + 1) from business_partner bp where bp.business_partner_id = a.business_partner_id) as dname, ic.commodity_level_desc, --生产企业 ic.c_qstd, --存储条件 ic.c_appr_code, --注册证号 a.business_partner_id as business_partner_id, -- 客商id substr(bp.description, instr(bp.description, \u0026#39; \u0026#39;) + 1) as vendor_name, --客商名称 ld.std_pack_qty, -- 包装数量 uu.user_last_name || uu.user_first_name as user_name --扫码人 from asn a join asn_detail ad on a.asn_id = ad.asn_id join asn_detail_ref adr on a.asn_id = adr.asn_id join lpn l on l.inbound_outbound_indicator = \u0026#39;I\u0026#39; and a.asn_id = l.asn_id and a.tc_asn_id = l.tc_asn_id join lpn_detail ld on l.lpn_id = ld.lpn_id and ad.sku_id = ld.item_id and ad.batch_nbr = ld.batch_nbr join c_gsp_nbr_trkg cgnt on cgnt.i_o_flag = \u0026#39;I\u0026#39; and a.tc_asn_id = cgnt.rcvd_shpmt_nbr and l.tc_lpn_id = cgnt.cntr_nbr and ld.item_id = cgnt.sku_id and ld.batch_nbr = cgnt.batch_nbr join item_cbo ic on cgnt.sku_id = ic.item_id join ucl_user uu --on cgnt.user_id = uu.user_name on cgnt.scan_user_id = uu.user_name --20257/28 关联扫码人id join business_partner bp on bp.business_partner_id = ad.business_partner_id where a.asn_status = 40 union all select cgnt.create_date_time as create_datetime, -- 监管码时间 /* to_date(cgnt.create_date_time, \u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) as create_datetime, -- 监管码时间*/ to_char(o.created_dttm, \u0026#39;yyyymmdd hh24:mi:ss\u0026#39;) as create_date_time, -- 订单时间 cgnt.whse, -- 仓库代码 cgnt.season, -- 货主代码 (select company_description from company where parent_company_id = 1 and company_code = cgnt.season) company_description, --货主名称 o.ref_field_2 as billno_type, -- 订单类型 (select sc.code_desc from sys_code sc where sc.code_type = \u0026#39;022\u0026#39; and sc.code_id = o.ref_field_2) as billno_name, l.inbound_outbound_indicator as i_o_flag, -- 出入库类型 decode(l.inbound_outbound_indicator, \u0026#39;I\u0026#39;, \u0026#39;入库\u0026#39;, \u0026#39;O\u0026#39;, \u0026#39;出库\u0026#39;) as i_o_flag_type, --入出库类型 l.tc_lpn_id as tc_lpn_id, -- 货箱号 oli.delivery_reference_number as cms_billno, -- cms订单号 o.ref_field_3 as cms_grpno, --cms订单组号 o.tc_order_id as wms_billno, -- wms订单号 ld.item_id as item_id, -- 商品id ic.item_size_desc as size_desc, --erp商品代码 ic.description, --品规 cgnt.batch_nbr, --批号 cgnt.gsp_nbr, -- 监管码 cgnt.uom, -- 单位 (select fa.facility_name from facility_alias fa where fa.facility_alias_id = o.d_facility_alias_id) as dname, ic.commodity_level_desc, --生产企业 ic.c_qstd, --存储条件 ic.c_appr_code, --注册证号 o.d_facility_alias_id as business_partner_id, -- 客商id case when o.tc_company_id = 133 then (select substr(c.company_name, instr(c.company_name, \u0026#39; \u0026#39;, 1, 1) + 1) from company c, orders o1 where o1.tc_company_id = 133 and c.company_code = o.ref_field_7 and o1.order_id = o.order_id) else o.d_facility_name end vendor_name, --客商名称 ld.std_pack_qty, -- 包装数量 uu.user_last_name || uu.user_first_name as user_name --扫码人 from orders o join order_line_item oli on o.order_id = oli.order_id join item_cbo ic on oli.item_name=ic.item_name join lpn l on l.inbound_outbound_indicator = \u0026#39;O\u0026#39; and o.order_id = l.order_id and o.tc_order_id = l.tc_order_id join lpn_detail ld on l.lpn_id = ld.lpn_id and oli.item_id = ld.item_id and oli.batch_nbr = ld.batch_nbr join c_gsp_nbr_trkg cgnt on cgnt.i_o_flag = \u0026#39;O\u0026#39; and o.tc_order_id = cgnt.pkt_ctrl_nbr and l.tc_lpn_id = cgnt.cntr_nbr and ld.item_id = cgnt.sku_id and ld.batch_nbr = cgnt.batch_nbr join item_cbo ic on cgnt.sku_id = ic.item_id join ucl_user uu --on cgnt.user_id = uu.user_name on cgnt.scan_user_id = uu.user_name --20257/28 关联扫码人id where o.do_status = 190 SQL\u0026gt; 结果显示生产库当前视图已经恢复为旧版长字段定义\n[oracle@wmsdb2019 tmp]$ cat /tmp/V_YN_GSP_NBR_current_wrong.sql SQL\u0026gt; select dbms_metadata.get_ddl(\u0026#39;VIEW\u0026#39;,\u0026#39;V_YN_GSP_NBR\u0026#39;,\u0026#39;WMPROD\u0026#39;) 2 from dual; CREATE OR REPLACE FORCE EDITIONABLE VIEW \u0026#34;WMPROD\u0026#34;.\u0026#34;V_YN_GSP_NBR\u0026#34; (\u0026#34;CNTR_NBR\u0026#34;, \u0026#34;SIZE_DESC\u0026#34;, \u0026#34;GSP_NBR\u0026#34;, \u0026#34;RCVD_SHPMT_NBR\u0026#34;, \u0026#34;PKT_CTRL_NBR\u0026#34;) AS select cntr_nbr,size_desc,gsp_nbr,rcvd_shpmt_nbr,pkt_ctrl_nbr from c_gsp_nbr_trkg where whse=\u0026#39;YN2\u0026#39; union all select cntr_nbr,size_desc,brcd as gsp_nbr,rcvd_shpmt_nbr,pkt_ctrl_nbr from c_udi_trkg t where whse=\u0026#39;YN2\u0026#39; ; SQL\u0026gt; spool off [oracle@wmsdb2019 tmp]$ 这说明生产库当前定义不再是上面错误V_YN_GSP_NBR_current_wrong.sql的 5 字段短版本。\n11.3 实际查询验证 # select count(*) from WMPROD.V_YN_GSP_NBR where rownum \u0026lt;= 1; 返回：\n1 说明视图不仅对象状态为 VALID，实际解析和查询也能正常执行。\n十二、检查并重编译无效对象 # 恢复视图后检查 schema 下无效对象：\nset lines 200 pages 100 col owner for a20 col object_name for a40 col object_type for a20 col status for a10 select owner, object_name, object_type, status from dba_objects where owner = \u0026#39;WMPROD\u0026#39; and status \u0026lt;\u0026gt; \u0026#39;VALID\u0026#39; order by object_type, object_name; 如存在较多无效对象，可以执行：\nexec utl_recomp.recomp_serial(\u0026#39;WMPROD\u0026#39;); 如果重编译后仍有 INVALID 对象，再查询具体错误：\nset lines 200 pages 200 col name for a40 col type for a20 col text for a120 select name, type, line, position, text from dba_errors where owner = \u0026#39;WMPROD\u0026#39; order by name, type, sequence; 十三、清理辅助库 # 确认生产视图恢复完成、业务验证通过后，关闭辅助库：\nexport ORACLE_SID=WMSAUX sqlplus / as sysdba shutdown immediate; exit [oracle@wmsdb2019 ~]$ export ORACLE_SID=WMSAUX [oracle@wmsdb2019 ~]$ sqlplus / as sysdba SQL*Plus: Release 18.0.0.0.0 - Production on Fri May 22 21:43:02 2026 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 SQL\u0026gt; shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL\u0026gt; exit Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 [oracle@wmsdb2019 ~]$ 删除辅助库目录：\nrm -rf /u01/app/oracle/oradata/WMSAUX rm -rf /u01/app/oracle/fast_recovery_area/WMSAUX rm -rf /u01/app/oracle/admin/WMSAUX [oracle@wmsdb2019 ~]$ rm -rf /u01/app/oracle/oradata/WMSAUX [oracle@wmsdb2019 ~]$ rm -rf /u01/app/oracle/fast_recovery_area/WMSAUX [oracle@wmsdb2019 ~]$ rm -rf /u01/app/oracle/admin/WMSAUX [oracle@wmsdb2019 ~]$ 本次实际操作中，WMSAUX 已经正常关闭，并清理了上述目录。\n十四、恢复总结 # 本次故障的核心是生产库中 WMPROD.V_YN_GSP_NBR 视图被误修改，导致原有复杂视图定义被替换成了错误的短版本。由于视图属于数据库字典中的逻辑对象，RMAN 不能像恢复数据文件或表空间一样直接恢复单个视图对象，因此不能在生产库上直接做对象级 RMAN 恢复。\n在不影响生产业务的前提下，最终选择使用 RMAN Duplicate 创建辅助库 的方式进行恢复。通过将辅助库 WMSAUX 恢复到误修改时间 2026-05-21 14:48:47 之前的时间点，再从辅助库中导出旧版视图 DDL，最后回到生产库执行 CREATE OR REPLACE VIEW 覆盖错误定义，实现了单个视图的精准恢复。\n本次恢复过程中有几个关键判断点：\n生产库不能直接回退。 如果使用 PITR 或 Flashback Database，会导致整个生产库回退，影响范围过大，不适合只恢复单个视图的场景。 RMAN 备份和归档必须完整。 通过检查备份摘要和归档日志，确认目标时间点被归档序列覆盖，具备恢复到误修改前时间点的条件。 辅助库恢复时间要早于误操作时间。 本次选择恢复到 2026-05-21 14:45:00，避开了 14:48:47 的 DDL 修改边界，保证导出的视图定义是修改前版本。 RMAN Duplicate 连接方式必须正确。 必须确认 target 连接生产库 WMPROD，auxiliary 连接辅助库 WMSAUX。如果两边都连到生产库，存在严重误操作风险。 恢复后必须做多层验证。 不能只看视图状态是否 VALID，还要通过 DBMS_METADATA.GET_DDL 确认视图定义已经恢复为旧版本，并执行简单查询验证视图可以正常解析和访问。 最终，生产库 WMPROD.V_YN_GSP_NBR 已恢复为误修改前的长版本定义，对象状态为 VALID，实际查询返回正常，说明本次视图恢复成功。\n本案例说明：当生产库中视图、存储过程、函数、包等逻辑对象被误修改，而又没有代码版本或发布脚本可回退时，通过 RMAN Duplicate 恢复辅助库，再从辅助库提取旧对象 DDL，是一种安全、可靠、对生产影响最小的恢复方式。\n","date":"2026-05-22","externalUrl":null,"permalink":"/posts/oracle18c-rman-duplicate-restore-view/","section":"文章","summary":"一次 Oracle 18c 生产恢复实战：业务视图 WMPROD.V_YN_GSP_NBR 被误修改，不采用整库回退，而是使用 RMAN Duplicate 创建辅助库 WMSAUX，恢复到误修改前时间点，提取旧视图定义后精准恢复生产视图。","title":"Oracle 18c 使用 RMAN Duplicate 恢复被误修改视图实战","type":"posts"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/pitr/","section":"Tags","summary":"","title":"PITR","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/rman/","section":"Tags","summary":"","title":"RMAN","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E8%BE%85%E5%8A%A9%E5%BA%93/","section":"Tags","summary":"","title":"辅助库","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E8%A7%86%E5%9B%BE%E6%81%A2%E5%A4%8D/","section":"Tags","summary":"","title":"视图恢复","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/cpu/","section":"Tags","summary":"","title":"CPU","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/categories/linux/","section":"Categories","summary":"","title":"Linux","type":"categories"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":" 一、快速定位总流程 # 排查目标 首选命令 重点看什么 初步判断 系统是否整体繁忙 uptime、top、vmstat 1 load、CPU 使用率、run queue、I/O wait 判断是 CPU 忙、I/O 慢、内存紧张还是进程阻塞 CPU 是否瓶颈 mpstat -P ALL 1 5、pidstat -u 1 5 %usr、%sys、%iowait、%steal、单核是否打满 区分应用消耗、系统调用、I/O 等待、虚拟化抢占 哪个进程吃 CPU top、ps、pidstat PID、线程、CPU 占比 找到具体进程或线程 I/O 是否瓶颈 iostat -x 1 5、pidstat -d 1 5 %util、await、r_await、w_await、队列长度 判断磁盘忙还是响应慢 哪个进程读写磁盘 iotop、pidstat -d、lsof 进程读写速率、文件路径 找到 I/O 来源 内存是否紧张 free -h、vmstat 1、sar -r available、swap、si/so、page fault 判断是否缺内存或频繁换页 哪个进程占内存 ps、top、pmap、smem RSS、PSS、Swap 找出大内存进程 网络是否异常 ss、sar -n DEV,TCP,ETCP、ip -s link 丢包、错误包、重传、连接状态 判断带宽、丢包、重传、连接堆积 抓包定位 tcpdump 源/目的 IP、端口、TCP flags、重传 深入分析网络链路或应用协议 二、常用工具安装 # 系统类型 安装命令 包含工具 RHEL / CentOS / Oracle Linux yum install -y sysstat procps-ng iotop iftop nload tcpdump iproute net-tools lsof psmisc numactl sar、iostat、mpstat、pidstat、top、vmstat、iotop、tcpdump、ss、lsof Rocky / Alma / RHEL 8+ dnf install -y sysstat procps-ng iotop iftop nload tcpdump iproute net-tools lsof psmisc numactl 同上 Ubuntu / Debian apt install -y sysstat procps iotop iftop nload tcpdump iproute2 net-tools lsof psmisc numactl 同上 启用 sysstat 历史采集 systemctl enable --now sysstat 启用 sar 历史性能数据采集 三、CPU 诊断命令 # 3.1 CPU 总体诊断 # 命令 用法示例 参数详解 重点字段 判断标准 uptime uptime 查看系统运行时间、用户数、load average load average: 1min, 5min, 15min load 持续大于 CPU 核数，说明系统有压力；如果 1 分钟高、15 分钟低，可能是短时峰值 lscpu lscpu 查看 CPU 架构、核数、线程数 CPU(s)、Core(s)、Thread(s) 判断 load 是否过高时，要先知道 CPU 逻辑核数 top top 实时查看 CPU、内存、进程 %us、%sy、%wa、%id、load average %us 高：应用消耗；%sy 高：内核消耗；%wa 高：I/O 等待；%id 低：CPU 忙 top -H top -H -p \u0026lt;PID\u0026gt; 查看某个进程下线程 CPU 使用情况 线程级 PID、%CPU Java、Oracle、MySQL 等多线程进程定位热点线程非常有用 mpstat mpstat -P ALL 1 5 每 1 秒采样一次，共 5 次；-P ALL 查看所有 CPU 核 %usr、%sys、%iowait、%steal、%idle 单核 100% 不代表整机 CPU 满；如果某几个核长期满，可能存在单线程瓶颈 vmstat vmstat 1 10 每 1 秒采样一次，共 10 次 r、b、us、sy、id、wa、cs、in r 长期大于 CPU 核数，CPU 排队；wa 高说明 I/O 等待；cs 很高可能上下文切换严重 sar -u sar -u 1 5 查看 CPU 使用率 %user、%system、%iowait、%steal、%idle 和 mpstat 类似，适合当前和历史对比 sar -q sar -q 1 5 查看运行队列和 load runq-sz、plist-sz、ldavg-1 runq-sz 长期高于 CPU 核数，说明 CPU 排队明显 3.2 CPU 进程级定位 # 命令 用法示例 参数详解 重点字段 判断标准 ps ps -eo pid,ppid,user,comm,pcpu,pmem,stat,wchan:32,args --sort=-pcpu 竖线 head -20 按 CPU 使用率倒序查看进程 PID、%CPU、STAT、WCHAN、COMMAND pidstat -u pidstat -u -p ALL 1 5 查看所有进程 CPU 使用情况 %usr、%system、%CPU、CPU 某进程 %CPU 长期高，需要继续分析该进程内部 pidstat -t pidstat -u -t -p \u0026lt;PID\u0026gt; 1 5 -t 查看线程级 CPU TID、%CPU 找具体热点线程 pidstat -w pidstat -w -p ALL 1 5 查看上下文切换 cswch/s、nvcswch/s 自愿/非自愿上下文切换过高，可能锁竞争或线程过多 pidstat -R pidstat -R -p ALL 1 5 查看实时优先级和调度策略 prio、policy 排查异常实时进程抢占 CPU perf top perf top -p \u0026lt;PID\u0026gt; 实时查看进程热点函数 函数名、模块、占比 适合内核/应用深度分析，生产环境慎用，注意开销 3.3 CPU 字段判断标准 # 字段 含义 判断标准 %usr / %user 用户态 CPU 消耗 长期高，通常是业务进程、SQL、应用计算消耗 %sys / %system 内核态 CPU 消耗 长期高，可能是系统调用、网络包处理、文件系统、内核锁、驱动问题 %iowait / %wa CPU 等待 I/O 的时间 长期高，通常不是 CPU 不够，而是磁盘、存储、NFS、数据库 I/O 慢 %idle 空闲 CPU 长期接近 0，CPU 基本打满 %steal 虚拟化环境中被宿主机抢占的 CPU 虚拟机中长期大于 5% 需要关注；大于 10% 往往明显影响性能 load average 平均负载 持续大于 CPU 逻辑核数，说明系统存在排队；但 load 包含 D 状态 I/O 等待，不等同于 CPU 使用率 r 运行队列长度 vmstat 中 r 长期大于 CPU 核数，说明 CPU 排队 b 不可中断睡眠进程数 长期大于 0，通常有 I/O、存储或内核等待 cs 上下文切换次数 突然大幅升高，可能线程过多、锁竞争或频繁调度 in 中断次数 网络或磁盘中断异常升高时，需要结合 mpstat -I、sar -n 继续看 四、I/O 诊断命令 # 4.1 磁盘整体 I/O # 命令 用法示例 参数详解 重点字段 判断标准 iostat iostat -x 1 5 -x 扩展指标；每 1 秒采样一次，共 5 次 %util、await、r_await、w_await、aqu-sz、r/s、w/s 判断磁盘是否忙、响应是否慢 iostat -k iostat -xk 1 5 以 KB 为单位显示吞吐 rkB/s、wkB/s 判断读写吞吐是否接近磁盘或存储上限 iostat -m iostat -xm 1 5 以 MB 为单位显示吞吐 rMB/s、wMB/s 大吞吐场景更直观 sar -d sar -d 1 5 查看块设备 I/O 当前或历史数据 tps、rd_sec/s、wr_sec/s、await、%util 适合看历史 I/O 趋势 vmstat vmstat 1 10 查看系统级 I/O 和等待 bi、bo、wa、b wa 高、b 高，常见于磁盘或存储慢 lsblk lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL 查看块设备、挂载点、磁盘型号 设备名、挂载点、类型 确认业务目录对应哪个磁盘 df df -hT 查看文件系统使用率和类型 Use%、Type、Mounted on 文件系统使用率超过 85% 需要关注，超过 90% 风险较高 du du -sh /path/* 竖线 sort -h 统计目录大小 目录容量 4.2 进程级 I/O 定位 # 命令 用法示例 参数详解 重点字段 判断标准 pidstat -d pidstat -d -p ALL 1 5 查看所有进程磁盘读写 kB_rd/s、kB_wr/s、kB_ccwr/s 找出读写最重的进程 pidstat -d -p pidstat -d -p \u0026lt;PID\u0026gt; 1 5 查看指定进程 I/O 读写速率 判断某进程是否正在大量读写 iotop iotop -oPa -o 只显示有 I/O 的进程；-P 进程级；-a 累计值 DISK READ、DISK WRITE、IO% 直接找 I/O 消耗进程 lsof lsof -p \u0026lt;PID\u0026gt; 查看进程打开的文件 文件路径、FD 类型 找到进程正在访问哪些文件 lsof +D lsof +D /data 查看某目录被哪些进程打开 PID、文件 目录无法卸载、文件被占用时使用 fuser fuser -vm /data 查看访问挂载点的进程 PID、用户、访问类型 判断文件系统被哪些进程占用 dmesg dmesg -T egrep -i \u0026ldquo;error fail reset 4.3 iostat 关键字段判断 # 字段 含义 判断标准 r/s 每秒读请求数 请求数高说明读 IOPS 压力大 w/s 每秒写请求数 请求数高说明写 IOPS 压力大 rkB/s / rMB/s 每秒读取吞吐 接近磁盘/存储带宽上限时，说明吞吐型瓶颈 wkB/s / wMB/s 每秒写入吞吐 大量写入时关注日志盘、归档盘、数据盘 await I/O 平均等待时间，包括排队和服务时间 SSD 通常持续超过 10~20ms 要关注；HDD 持续超过 50ms 要关注；数据库核心盘越低越好 r_await 读 I/O 平均等待时间 高说明读延迟大 w_await 写 I/O 平均等待时间 高说明写延迟大，数据库 redo/归档/数据文件要重点看 aqu-sz 平均 I/O 队列长度 长期偏高说明请求排队严重 %util 设备繁忙度 单盘长期超过 80% 需要关注；长期接近 100% 基本表示设备饱和。但多队列 SSD、SAN、虚拟盘上 %util 不能单独作为唯一判断 svctm 平均服务时间 新版本已不推荐依赖，主要看 await、r_await、w_await、队列和吞吐 五、内存诊断命令 # 5.1 内存整体诊断 # 命令 用法示例 参数详解 重点字段 判断标准 free free -h 人类可读方式显示内存 total、used、free、buff/cache、available、swap 重点看 available，不是单纯看 free free -m free -m MB 单位显示 同上 脚本采集更方便 vmstat vmstat 1 10 查看内存、swap、I/O、CPU free、buff、cache、si、so si/so 持续大于 0，说明发生 swap 换入换出 sar -r sar -r 1 5 查看内存使用情况 %memused、kbmemfree、kbbuffers、kbcached、kbcommit 适合看历史内存趋势 sar -W sar -W 1 5 查看 swap 换页 pswpin/s、pswpout/s 持续有值说明系统正在换页，可能影响性能 sar -B sar -B 1 5 查看分页情况 pgpgin/s、pgpgout/s、pgfault/s、pgmajfault/s pgmajfault/s 高说明大量主缺页，性能风险较高 /proc/meminfo cat /proc/meminfo 查看详细内存状态 MemAvailable、Dirty、Writeback、Slab、SReclaimable、SUnreclaim 深入判断 cache、slab、脏页 top top 后按 M 按内存使用排序 RES、VIRT、SHR、%MEM 找出大内存进程 dmesg dmesg -T 竖线 egrep -i \u0026quot;out of memory 竖线 oom 竖线 killed process\u0026quot; 5.2 进程级内存定位 # 命令 用法示例 参数详解 重点字段 判断标准 ps ps -eo pid,ppid,user,comm,rss,vsz,pmem,args --sort=-rss 竖线 head -20 按 RSS 倒序查看进程 RSS、VSZ、%MEM top top 后按 M 按内存排序 RES、VIRT、SHR 找出占内存最高的进程 pmap pmap -x \u0026lt;PID\u0026gt; 竖线 tail -20 查看进程内存映射 Kbytes、RSS、Dirty smem smem -tk 竖线 sort -nr -k 5 竖线 head 查看 PSS，更适合共享内存场景 numastat numastat -p \u0026lt;PID\u0026gt; 查看进程 NUMA 内存分布 Node0、Node1 分布 NUMA 不均衡可能导致性能下降 slabtop slabtop 查看内核 slab 使用 cache name、object 数量、size slab 异常大可能是 inode/dentry/socket 等内核对象堆积 5.3 内存字段判断标准 # 字段 含义 判断标准 MemAvailable / available 系统估算可用内存 比 free 更重要；低于总内存 10% 要关注，低于 5% 风险较高 free 完全空闲内存 Linux 会用空闲内存做 cache，所以 free 低不一定是问题 buff/cache 文件缓存、块缓存 高通常正常，除非伴随 available 很低和 swap 活跃 Swap used 已使用 swap 使用了 swap 不一定有问题，关键看是否持续 si/so si swap in，每秒从 swap 读入内存 持续大于 0，说明内存压力明显 so swap out，每秒从内存写入 swap 持续大于 0，说明内存不足或回收压力大 pgmajfault/s 主缺页，需要磁盘 I/O 持续高说明内存或文件缓存不足，性能会明显下降 Dirty 脏页，等待写回磁盘 长期很高可能导致写回阻塞 Writeback 正在写回磁盘的内存页 长期高说明磁盘写入压力大 Slab 内核对象缓存 异常高要进一步用 slabtop 看 SUnreclaim 不可回收 slab 持续增长可能存在内核对象泄漏或连接/文件句柄堆积 RSS 进程实际驻留物理内存 判断进程真实内存占用的常用指标 VSZ / VIRT 进程虚拟地址空间 很大不一定代表真实占用大 PSS 按比例分摊共享内存后的占用 多进程共享内存场景更准确 六、网络诊断命令 # 6.1 网络接口与流量 # 命令 用法示例 参数详解 重点字段 判断标准 ip addr ip addr show 查看 IP 地址 IP、网卡状态 确认 IP 是否正确 ip link ip link show 查看网卡链路状态 UP、LOWER_UP 没有 LOWER_UP 可能物理链路异常 ip -s link ip -s link show eth0 查看网卡收发包统计 RX errors、dropped、overruns、TX errors error/drop 持续增长，说明网卡、驱动、队列或链路异常 ethtool ethtool eth0 查看网卡速率、双工、链路 Speed、Duplex、Link detected 速率不对、半双工、Link down 都是异常 ethtool -S ethtool -S eth0 查看网卡详细统计 driver counters 丢包、重传、队列错误等需要关注 sar -n DEV sar -n DEV 1 5 查看网卡吞吐 rxkB/s、txkB/s、rxpck/s、txpck/s、%ifutil %ifutil 高说明带宽接近瓶颈 nload nload eth0 实时查看网卡流量 Incoming、Outgoing 直观看带宽使用 iftop iftop -i eth0 查看主机之间实时流量 源 IP、目的 IP、速率 找出哪个 IP 占用带宽 nethogs nethogs eth0 按进程查看网络流量 PID、进程、流量 找出哪个进程占用网络 6.2 TCP 连接诊断 # 命令 用法示例 参数详解 重点字段 判断标准 ss -s ss -s 查看 socket 汇总 established、timewait、orphaned 连接数异常增长要关注 ss -ant ss -ant 查看所有 TCP 连接 State、Recv-Q、Send-Q、本地/远端地址 Recv-Q 或 Send-Q 长期堆积说明应用处理慢或网络发送慢 ss -lntp ss -lntp 查看监听端口和进程 LISTEN、端口、PID 确认服务是否监听 ss -ant state established ss -ant state established 竖线 wc -l 统计 ESTABLISHED 连接数 连接数量 ss -ant state time-wait ss -ant state time-wait 竖线 wc -l 统计 TIME_WAIT TIME_WAIT 数量 ss -antp ss -antp 竖线 grep :1521 查看指定端口连接 PID、连接状态 netstat -s `netstat -s egrep -i \u0026ldquo;retrans reset listen nstat `nstat -az egrep -i \u0026ldquo;Retrans Reset Timeout 6.3 网络连通性和链路质量 # 命令 用法示例 参数详解 重点字段 判断标准 ping ping -c 10 \u0026lt;IP\u0026gt; 发送 10 个 ICMP 包 packet loss、rtt min/avg/max 丢包大于 1% 要关注；延迟抖动大说明链路不稳定 ping -s ping -s 1472 -M do \u0026lt;IP\u0026gt; 测试 MTU；-M do 禁止分片 是否能 ping 通 用于排查 MTU 问题 traceroute traceroute \u0026lt;IP\u0026gt; 查看路由路径 每跳延迟 定位中间链路问题 mtr mtr -rwzc 100 \u0026lt;IP\u0026gt; 连续探测路由质量 Loss%、Avg、Best、Wrst、StDev 哪一跳开始丢包或延迟升高，可能是问题位置 curl curl -v http://\u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;/ 测试 HTTP 服务 连接、TLS、响应码、耗时 应用层访问验证 telnet telnet \u0026lt;IP\u0026gt; \u0026lt;PORT\u0026gt; 测试 TCP 端口连通性 是否 connected 端口不通可能是防火墙、监听、路由问题 nc nc -vz \u0026lt;IP\u0026gt; \u0026lt;PORT\u0026gt; 测试 TCP 端口 succeeded / failed 比 telnet 更适合脚本化 6.4 抓包分析 # 命令 用法示例 参数详解 适用场景 判断标准 tcpdump tcpdump -i eth0 host 10.1.1.10 抓取与某 IP 相关的数据包 看某主机通信 判断是否有请求、是否有响应 tcpdump tcpdump -i eth0 port 1521 抓取指定端口 Oracle/MySQL/PostgreSQL 等端口排查 确认连接是否到达服务器 tcpdump tcpdump -i eth0 -nn host 10.1.1.10 and port 1521 -nn 不解析域名和端口名 精准抓包 避免 DNS 解析影响 tcpdump tcpdump -i eth0 -nn -s 0 -w /tmp/net.pcap host 10.1.1.10 -s 0 抓完整包；-w 写入文件 后续用 Wireshark 分析 适合复杂网络问题 tcpdump tcpdump -i eth0 -nn 'tcp[tcpflags] \u0026amp; tcp-syn != 0' 抓 SYN 包 判断连接发起情况 只有 SYN 无 SYN/ACK，服务端或链路可能异常 tcpdump tcpdump -i eth0 -nn 'tcp[tcpflags] \u0026amp; tcp-rst != 0' 抓 RST 包 排查连接被重置 大量 RST 说明连接被主动断开 6.5 网络判断标准 # 指标 含义 判断标准 RX errors / TX errors 收发错误包 正常应接近 0；持续增长要查网卡、交换机、线缆、驱动 RX dropped / TX dropped 丢包 持续增长说明网卡队列、内核缓冲、应用处理或链路异常 rxkB/s / txkB/s 网卡吞吐 接近网卡带宽上限时说明带宽瓶颈 %ifutil 网卡利用率 持续超过 70% 要关注，超过 90% 容易出现排队和丢包 RetransSegs TCP 重传 持续增长说明网络丢包、拥塞或对端处理慢 ListenOverflows 监听队列溢出 有增长说明服务端 accept 慢或 backlog 太小 ListenDrops 监听队列丢弃 有增长说明连接可能被内核丢弃 Recv-Q 接收队列 长期不为 0，说明应用读取慢 Send-Q 发送队列 长期不为 0，说明对端接收慢或网络发送阻塞 TIME_WAIT 主动关闭连接后的等待状态 数量很大通常说明短连接多，不一定是故障，要结合端口耗尽、连接失败判断 CLOSE_WAIT 本端未关闭连接 大量 CLOSE_WAIT 通常是应用没有正确关闭 socket SYN-SENT 已发起连接等待响应 大量 SYN-SENT 可能是目标不可达、防火墙丢弃或对端未响应 SYN-RECV 服务端收到 SYN，等待握手完成 大量 SYN-RECV 可能是半连接堆积、攻击或客户端异常 七、常见故障场景与命令组合 # 故障现象 诊断命令组合 分析逻辑 系统卡顿但 CPU 不高 vmstat 1、iostat -x 1、free -h、dmesg -T 看是否 I/O wait 高、swap 活跃、磁盘 timeout CPU 使用率很高 top、mpstat -P ALL 1 5、pidstat -u -p ALL 1 5、ps --sort=-pcpu 先看是用户态、系统态还是单进程打满 load 很高但 CPU idle 也高 vmstat 1、`ps -eo pid,stat,wchan,args grep \u0026quot; D \u0026ldquo;、iostat -x 1` 磁盘响应慢 iostat -x 1 10、pidstat -d 1 10、iotop -oPa、dmesg -T 先看哪个盘慢，再看哪个进程产生 I/O 内存不足 free -h、vmstat 1、sar -W 1 5、ps --sort=-rss、dmesg -T 竖线 grep -i oom 网络连接慢 ping、mtr、ss -antp、sar -n TCP,ETCP 1 5、tcpdump 看延迟、丢包、重传、连接队列 端口不通 ss -lntp、nc -vz IP PORT、iptables -L -n、firewall-cmd --list-all、tcpdump 看服务是否监听、防火墙是否拦截、包是否到达 网络丢包 ip -s link、ethtool -S eth0、sar -n DEV,EDEV 1 5、mtr 看本机网卡错误、驱动统计和链路丢包 数据库连接堆积 `ss -antp grep :1521、ss -s、sar -n TCP,ETCP 1 5` 八、一套生产环境快速巡检命令 # echo \u0026#34;===== basic =====\u0026#34; date hostname uptime lscpu | egrep \u0026#39;CPU\\(s\\)|Core|Thread|Socket|Model name\u0026#39; echo \u0026#34;===== cpu =====\u0026#34; top -b -n 1 | head -30 mpstat -P ALL 1 3 vmstat 1 5 pidstat -u -p ALL 1 3 echo \u0026#34;===== memory =====\u0026#34; free -h vmstat 1 5 cat /proc/meminfo | egrep \u0026#39;MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Writeback|Slab|SReclaimable|SUnreclaim\u0026#39; ps -eo pid,ppid,user,comm,rss,vsz,pmem,args --sort=-rss | head -20 echo \u0026#34;===== io =====\u0026#34; df -hT lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL iostat -x 1 5 pidstat -d -p ALL 1 3 dmesg -T | egrep -i \u0026#39;error|fail|reset|timeout|blk|scsi|nvme|oom|killed process\u0026#39; | tail -100 echo \u0026#34;===== network =====\u0026#34; ip addr show ip -s link ss -s ss -antp | head -50 sar -n DEV,TCP,ETCP 1 3 九、推荐排查顺序 # 步骤 操作 目的 1 uptime、top、vmstat 1 先判断整体瓶颈方向 2 CPU 高时用 mpstat、pidstat、ps 找 CPU 类型和具体进程 3 I/O 高时用 iostat、pidstat -d、iotop 找慢盘和 I/O 来源 4 内存紧张时用 free、vmstat、ps、pmap 判断是否内存不足、是否换页 5 网络异常时用 ss、sar -n、ip -s link、tcpdump 判断连接、丢包、重传、端口问题 6 最后结合 dmesg、系统日志、业务日志 判断是否存在硬件、驱动、内核或应用异常 这份表可以作为 Linux OS 层排障手册的主体框架。\n","date":"2026-05-22","externalUrl":null,"permalink":"/posts/linux-performance-troubleshooting-commands/","section":"文章","summary":"一篇 Linux OS 层性能排障手册，系统梳理 uptime、top、vmstat、mpstat、pidstat、iostat、iotop、free、sar、ss、tcpdump 等命令的用法、关键参数、重点字段和生产判断标准。","title":"Linux 性能故障诊断实战：CPU、I/O、内存与网络排查命令详解","type":"posts"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E7%A3%81%E7%9B%98io/","section":"Tags","summary":"","title":"磁盘IO","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E5%86%85%E5%AD%98/","section":"Tags","summary":"","title":"内存","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E7%BD%91%E7%BB%9C%E6%8E%92%E6%9F%A5/","section":"Tags","summary":"","title":"网络排查","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E6%80%A7%E8%83%BD%E8%AF%8A%E6%96%AD/","section":"Tags","summary":"","title":"性能诊断","type":"tags"},{"content":"","date":"2026-05-22","externalUrl":null,"permalink":"/tags/%E8%BF%90%E7%BB%B4/","section":"Tags","summary":"","title":"运维","type":"tags"},{"content":"","date":"2026-05-19","externalUrl":null,"permalink":"/tags/asmm/","section":"Tags","summary":"","title":"ASMM","type":"tags"},{"content":"","date":"2026-05-19","externalUrl":null,"permalink":"/tags/latch/","section":"Tags","summary":"","title":"Latch","type":"tags"},{"content":"","date":"2026-05-19","externalUrl":null,"permalink":"/tags/mman/","section":"Tags","summary":"","title":"MMAN","type":"tags"},{"content":"","date":"2026-05-19","externalUrl":null,"permalink":"/tags/ora-03135/","section":"Tags","summary":"","title":"ORA-03135","type":"tags"},{"content":" 一、故障现象 # 2026 年 5 月 13 日下午，WMS 系统数据库在 16:50–17:06 左右出现短时间卡顿，应用侧报错：\nORA-03135: connection lost contact Process ID: 0 Session ID: 0 Serial number: 0 现场检查发现，应用服务器到数据库服务器的网络连通性正常：\nping 正常 telnet 数据库监听端口正常 问题持续几分钟后自动恢复，数据库实例没有重启。由于是故障发生后第二天才介入，数据库服务器当时没有安装 OSWatcher / oswbb 这类操作系统历史采集工具，无法完整回放当时 CPU、内存、I/O、进程级资源使用情况。因此本次排查主要依赖以下信息：\n1. Oracle alert 日志 2. 故障时间段 ASH 历史会话等待信息 3. Oracle 内存参数 4. v$sga_resize_ops 中的 SGA resize 记录 5. sysstat/sar 保留下来的 swap 历史数据 二、alert 日志关键时间线 # alert 日志中，故障窗口内有三类重要信息。\n1. 连接超时 # 16:50 以后，alert 日志开始出现连接超时：\n2026-05-13T16:35:12.506429+08:00 Thread 1 advanced to log sequence 58602 (LGWR switch) Current log# 4 seq# 58602 mem# 0: /home/oracle/oracle/app/oradata/WMSPROD/redo04.log 2026-05-13T16:35:12.585976+08:00 TT03 (PID:6908): SRL selected for T-1.S-58602 for LAD:2 2026-05-13T16:35:13.192971+08:00 ARC1 (PID:17839): Archived Log entry 60125 added for T-1.S-58601 ID 0x50fa7345 LAD:1 2026-05-13T16:50:52.780199+08:00 *********************************************************************** Fatal NI connect error 12170. VERSION INFORMATION: TNS for Linux: Version 18.0.0.0.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production Version 18.3.0.0.0 Time: 13-5月 -2026 16:50:52 Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS: 操作超时 ns secondary err code: 12606 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.76.126)(PORT=50927)) 2026-05-13T16:50:52.802481+08:00 WARNING: inbound connection timed out (ORA-3136) 2026-05-13T16:51:05.680349+08:00 *********************************************************************** Fatal NI connect error 12170. VERSION INFORMATION: TNS for Linux: Version 18.0.0.0.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production Version 18.3.0.0.0 Time: 13-5月 -2026 16:51:05 Tracing not turned on. Tns error struct: 2026-05-13T16:51:05.680946+08:00 *********************************************************************** ns main err code: 12535 Fatal NI connect error 12170. TNS-12535: TNS: 操作超时 VERSION INFORMATION: TNS for Linux: Version 18.0.0.0.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production ns secondary err code: 12606 nt main err code: 0 Version 18.3.0.0.0 nt secondary err code: 0 nt OS err code: 0 Time: 13-5月 -2026 16:51:05 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.76.125)(PORT=32992)) 2026-05-13T16:51:05.681668+08:00 WARNING: inbound connection timed out (ORA-3136) Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS: 操作超时 ns secondary err code: 12606 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.76.125)(PORT=33012)) 2026-05-13T16:51:05.682861+08:00 WARNING: inbound connection timed out (ORA-3136) 2026-05-13T16:51:06.750191+08:00 *********************************************************************** 2026-05-13T16:51:06.750193+08:00 *********************************************************************** Fatal NI connect error 12170. Fatal NI connect error 12170. VERSION INFORMATION: TNS for Linux: Version 18.0.0.0.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production VERSION INFORMATION: TNS for Linux: Version 18.0.0.0.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production Version 18.3.0.0.0 Version 18.3.0.0.0 Time: 13-5月 -2026 16:51:06 Time: 13-5月 -2026 16:51:06 Tracing not turned on. Tracing not turned on. Tns error struct: Tns error struct: ns main err code: 12535 ns main err code: 12535 TNS-12535: TNS: 操作超时 TNS-12535: TNS: 操作超时 ns secondary err code: 12606 ns secondary err code: 12606 nt main err code: 0 nt main err code: 0 nt secondary err code: 0 nt secondary err code: 0 nt OS err code: 0 nt OS err code: 0 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.76.125)(PORT=33032)) Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.76.125)(PORT=33054)) 2026-05-13T16:51:06.751531+08:00 WARNING: inbound connection timed out (ORA-3136) 2026-05-13T16:51:06.751552+08:00 WARNING: inbound connection timed out (ORA-3136) 2026-05-13T16:51:06.760173+08:00 *********************************************************************** 这些错误与应用侧 ORA-03135 时间基本吻合。应用端看到的是连接丢失，数据库服务端看到的是入站连接处理超时。\n这类错误说明：\nTCP 连接或连接请求能到达数据库主机，但数据库端无法及时完成入站连接处理。\n因此，排查方向从网络层转向数据库内部等待、后台进程状态、内存管理和操作系统内存压力。\n2. Hang Manager 检测到数据库内部 hang # alert 日志中最关键的信息是16:56:24~16:59:35 DIA0 Hang Manager 报出的 hang chain：\n*********************************************************************** Fatal NI connect error 12170. VERSION INFORMATION: TNS for Linux: Version 18.0.0.0.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 18.0.0.0.0 - Production Version 18.3.0.0.0 Time: 13-5月 -2026 16:54:47 Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS: 操作超时 ns secondary err code: 12606 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.44.150)(PORT=55992)) 2026-05-13T16:54:47.544739+08:00 WARNING: inbound connection timed out (ORA-3136) 2026-05-13T16:56:24.151586+08:00 DIA0 Critical Database Process As Root: Hang ID 280 blocks 59 sessions Final blocker is session ID 827 serial# 50907 OSPID 17153 on Instance 1 No resolution will be attempted by Hang Manager 2026-05-13T16:56:50.127317+08:00 DIA0 Critical Database Process Blocked: Hang ID 280 blocks 59 sessions Final blocker is session ID 827 serial# 50907 OSPID 17153 on Instance 1 No resolution will be attempted by Hang Manager 2026-05-13T16:57:24.327262+08:00 DIA0 Critical Database Process Blocked: Hang ID 280 blocks 93 sessions Final blocker is session ID 827 serial# 50907 OSPID 17153 on Instance 1 No resolution will be attempted by Hang Manager 2026-05-13T16:59:35.273959+08:00 DIA0 Critical Database Process Blocked: Hang ID 280 blocks 354 sessions Final blocker is session ID 827 serial# 50907 OSPID 17153 on Instance 1 No resolution will be attempted by Hang Manager 2026-05-13T17:00:34.444892+08:00 这说明当时数据库内部已经形成明显阻塞链，最终阻塞源是：\nSID : 827 SERIAL# : 50907 OSPID : 17153 Instance : 1 并且阻塞影响范围从59个会话扩大到 354 个会话。\n3. alert 日志提示 heavy swapping # 17:01:37 左右，alert 日志出现：\n2026-05-13T17:00:36.331741+08:00 WARNING: inbound connection timed out (ORA-3136) TNS-12535: TNS: 操作超时 ns secondary err code: 12606 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.76.125)(PORT=33604)) 2026-05-13T17:00:36.332656+08:00 WARNING: inbound connection timed out (ORA-3136) 2026-05-13T17:00:40.371253+08:00 ALTER SYSTEM ARCHIVE LOG 2026-05-13T17:00:40.378963+08:00 Thread 1 cannot allocate new log, sequence 58603 Private strand flush not complete Current log# 4 seq# 58602 mem# 0: /home/oracle/oracle/app/oradata/WMSPROD/redo04.log 2026-05-13T17:00:40.554161+08:00 Thread 1 advanced to log sequence 58603 (LGWR switch) Current log# 5 seq# 58603 mem# 0: /home/oracle/oracle/app/oradata/WMSPROD/redo05.log 2026-05-13T17:00:40.677566+08:00 TT03 (PID:6908): SRL selected for T-1.S-58603 for LAD:2 2026-05-13T17:00:41.181641+08:00 NET (PID:3977): Archived Log entry 60127 added for T-1.S-58602 ID 0x50fa7345 LAD:1 2026-05-13T17:01:37.540212+08:00 WARNING: Heavy swapping observed on system in last 5 mins. Heavy swapping can lead to timeouts, poor performance, and instance eviction. 2026-05-13T17:04:53.657779+08:00 Resize operation completed for file# 3, old size 8396800K, new size 8407040K 2026-05-13T17:42:48.649406+08:00 Thread 1 cannot allocate new log, sequence 58604 Private strand flush not complete Current log# 5 seq# 58603 mem# 0: /home/oracle/oracle/app/oradata/WMSPROD/redo05.log 2026-05-13T17:42:51.719239+08:00 Thread 1 advanced to log sequence 58604 (LGWR switch) Current log# 6 seq# 58604 mem# 0: /home/oracle/oracle/app/oradata/WMSPROD/redo06.log WARNING: Heavy swapping observed on system in last 5 mins.\nHeavy swapping can lead to timeouts, poor performance, and instance eviction.\n这条信息说明 Oracle 自身已经检测到操作系统最近 5 分钟存在严重换页。虽然没有 OSWatcher，但这条告警已经提示操作系统内存压力很可能与本次故障有关。\n4. 初步结论 # 通过告警日志文件，判断数据库主机在 5月13日 16:50–17:01 左右出现短时间严重卡顿/阻塞/内存换页，导致大量客户端连接超时，应用侧表现为 ORA-03135。\n时间 关键现象 判断 16:50:52 开始 Fatal NI connect error 12170、TNS-12535: 操作超时 客户端连接 Oracle 网络层超时 16:50:52–17:00:36 大量 WARNING: inbound connection timed out (ORA-3136) 数据库服务端无法及时完成客户端连接握手 16:56:24–16:59:35 DIA0 Hang Manager 报 Hang ID 280，阻塞会话从 59 增长到 354 数据库内部出现短时间严重 hang/blocking 17:01:37 WARNING: Heavy swapping observed on system in last 5 mins 操作系统发生重度 swap，可能导致超时、性能下降、甚至实例驱逐风险 三、ASH 分析 # 1. 查当时所有 shared pool latch 等待的来源 # 根据alter日志DIA0 Hang Manager 报出的 hang chain先查询 ASH 5月13日 16:45–17:05 查最终阻塞会话当时在干什么\nset lines 300 pages 1000 col sample_time for a20 col username for a20 col machine for a40 col program for a50 col module for a40 col action for a40 col event for a40 col sql_id for a15 col top_level_sql_id for a15 col p1text for a25 col p2text for a25 col p3text for a25 select to_char(ash.sample_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) sample_time, ash.session_id sid, ash.session_serial# serial#, u.username, ash.machine, ash.program, ash.module, ash.action, ash.sql_id, ash.sql_child_number, ash.sql_exec_id, to_char(ash.sql_exec_start,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) sql_exec_start, ash.top_level_sql_id, ash.session_state, ash.event, ash.wait_class, ash.p1text, ash.p1, ash.p2text, ash.p2, ash.p3text, ash.p3 from dba_hist_active_sess_history ash left join dba_users u on ash.user_id = u.user_id where ash.sample_time between to_timestamp(\u0026#39;2026-05-13 16:45:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) and to_timestamp(\u0026#39;2026-05-13 17:05:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) and ash.session_id = 827 and ash.session_serial# = 50907 order by ash.sample_time; 查询结果如下：\nSAMPLE_TIME SID SERIAL# USERNAME MACHINE PROGRAM MODULE ACTION SQL_ID SQL_CHILD_NUMBER SQL_EXEC_ID -------------------- ---------- ---------- -------------------- ---------------------------------------- -------------------------------------------------- ---------------------------------------- ---------------------------------------- --------------- ---------------- ----------- SQL_EXEC_START ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ TOP_LEVEL_SQL_I SESSION_STATE EVENT WAIT_CLASS P1TEXT P1 P2TEXT P2 P3TEXT P3 --------------- ---------------------------- ---------------------------------------- ---------------------------------------------------------------- ------------------------- ---------- ------------------------- ---------- ------------------------- ---------- 2026-05-13 16:48:51 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:49:01 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:49:11 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:49:21 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:49:31 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:49:41 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:49:51 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:50:01 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:50:11 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:50:21 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:50:31 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:50:41 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:50:51 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:51:01 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:51:11 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:51:21 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:51:31 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:51:41 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:51:51 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:52:01 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:52:11 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:52:22 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:52:33 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:52:43 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:52:53 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:53:03 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:53:13 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:53:23 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:53:33 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:53:43 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:53:53 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:54:03 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:54:13 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:54:23 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:54:33 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:54:43 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:54:53 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:55:03 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:55:13 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:55:23 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:55:33 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:55:43 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:55:53 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:56:03 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:56:13 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:56:23 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:56:33 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:56:43 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:56:53 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:57:03 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:57:13 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:57:23 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:57:33 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:57:43 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:57:53 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:58:03 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:58:13 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:58:24 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:58:34 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:58:44 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:58:54 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:59:05 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:59:15 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:59:25 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:59:35 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:59:45 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 16:59:55 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 17:00:05 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 17:00:15 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 17:00:25 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 17:00:35 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 2026-05-13 17:00:45 827 50907 SYS bogon oracle@bogon (MMAN) 0 ON CPU timeout 300 0 0 已选择 72 行。 SQL\u0026gt; 2. 关键发现 # ASH 查询显示：\nSID : 827 SERIAL# : 50907 USERNAME : SYS MACHINE : bogon PROGRAM : oracle@bogon (MMAN) SESSION_STATE : ON CPU SQL_ID : 空 时间范围 : 2026-05-13 16:48:51 ~ 17:00:45 也就是说，告警日志里提到的最终 blocker：\nFinal blocker is session ID 827 serial# 50907 OSPID 17153 实际对应的是：\noracle@bogon (MMAN) MMAN 是 Oracle 的 Memory Manager 内存管理后台进程，负责 SGA 自动内存管理、shared pool / buffer cache / large pool 等内存组件调整。你的文件里 827 会话从 16:48:51 到 17:00:45 一直被 ASH 采样为 ON CPU，没有 SQL_ID，程序名明确是 oracle@bogon (MMAN)。\n这和告警日志完全对得上：16:56:24 开始 DIA0 Hang Manager 报 Hang ID 280，最终 blocker 就是 SID 827 / SERIAL# 50907 / OSPID 17153，到 16:59:35 已经阻塞 354 个会话。\n最终阻塞源是 MMAN是 Oracle 的 Memory Manager 后台进程，负责 SGA 自动内存管理和各组件之间的内存调整。这个发现将问题方向转到了 Oracle 自动内存管理。\n四、内存参数分析：AMM 关闭，ASMM 开启，但 shared_pool_size 为 0 # 检查数据库内存参数：\nset lines 300 pages 1000 col name for a35 col value for a30 col display_value for a40 select name, value, display_value, isdefault from v$parameter where name in ( \u0026#39;memory_target\u0026#39;, \u0026#39;memory_max_target\u0026#39;, \u0026#39;sga_target\u0026#39;, \u0026#39;sga_max_size\u0026#39;, \u0026#39;shared_pool_size\u0026#39;, \u0026#39;shared_pool_reserved_size\u0026#39;, \u0026#39;pga_aggregate_target\u0026#39;, \u0026#39;pga_aggregate_limit\u0026#39;, \u0026#39;use_large_pages\u0026#39; ) order by name; 现场结果：\n参数 值 说明 memory_target 0 AMM 未开启 memory_max_target 0 AMM 未开启 sga_target 35G ASMM 开启 sga_max_size 35G SGA 最大值 35G shared_pool_size 0 shared pool 未设置固定下限 shared_pool_reserved_size 约 185MB 默认值 pga_aggregate_target 7G PGA 目标值 pga_aggregate_limit 20G PGA 上限 use_large_pages TRUE 使用 HugePages 从参数可以判断：\nAMM 未开启： memory_target = 0 memory_max_target = 0 ASMM 已开启： sga_target = 35G sga_max_size = 35G shared pool 未设置明确下限： shared_pool_size = 0 这表示 Oracle 可以在 sga_target=35G 内部自动调整 shared pool、buffer cache、large pool 等组件大小。\n这个配置并不是绝对错误，但对于 WMS 这类连接数多、SQL 解析频繁、library cache 活跃的系统来说，如果 shared_pool_size=0，shared pool 完全交给 Oracle 自动调整，在业务高峰可能存在风险。\n五、关键证据：故障窗口内发生了 SGA resize # 继续查询 v$sga_resize_ops：\nset lines 300 pages 1000 col start_time for a20 col end_time for a20 col component for a35 col oper_type for a20 col oper_mode for a20 col status for a15 select to_char(start_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) start_time, to_char(end_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) end_time, component, oper_type, oper_mode, initial_size/1024/1024 initial_mb, target_size/1024/1024 target_mb, final_size/1024/1024 final_mb, status from v$sga_resize_ops where start_time between to_date(\u0026#39;2026-05-13 16:30:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) and to_date(\u0026#39;2026-05-13 17:10:00\u0026#39;,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) order by start_time; 结果如下：\nSTART_TIME END_TIME COMPONENT OPER_TYPE OPER_MODE INITIAL_MB TARGET_MB FINAL_MB STATUS 2026-05-13 16:48:47 2026-05-13 17:00:50 DEFAULT buffer cache GROW DEFERRED 25344 25472 25472 COMPLETE 2026-05-13 16:48:47 2026-05-13 17:00:50 shared pool SHRINK DEFERRED 7680 7552 7552 COMPLETE 这两条记录非常关键：\nshared pool : 7680 MB -\u0026gt; 7552 MB，缩小 128 MB buffer cache : 25344 MB -\u0026gt; 25472 MB，增大 128 MB 开始时间 : 16:48:47 结束时间 : 17:00:50 执行进程 : MMAN 与 ASH 中 MMAN 从 16:48:51 到 17:00:45 持续处于 ON CPU 的时间完全吻合。\n正常情况下，SGA resize 不应持续 12 分钟，更不应引发 300 多个会话等待 latch: shared pool。因此可以判断，这次 ASMM 自动调整是故障链路中的核心触发点。\n六、OS 层 sar 验证：故障窗口确实存在 swap-in # 由于没有部署 OSWatcher，最初无法回放操作系统详细状态。但后续检查发现，故障当天的 sysstat 采集文件仍然存在：\nls -lh /var/log/sa/sa13 结果：\n-rw-r--r-- 1 root root 1.2M 5月 13 23:50 /var/log/sa/sa13 继续查看故障窗口内的 swap 活动：\nsar -W -f /var/log/sa/sa13 -s 16:30:00 -e 17:10:00 结果：\nLinux 3.10.0-957.el7.x86_64 (bogon) 2026年05月13日 _x86_64_ (32 CPU) 16时30分01秒 pswpin/s pswpout/s 16时40分01秒 5.89 0.20 16时50分01秒 34.98 0.59 17时00分01秒 430.11 0.77 平均时间: 156.93 0.52 字段含义：\n字段 含义 pswpin/s 每秒从 swap 读回内存的页数 pswpout/s 每秒写入 swap 的内存页数 从结果看，故障窗口内 swap-in 明显升高：\n时间 pswpin/s pswpout/s 判断 16:40:01 5.89 0.20 已有少量 swap-in 16:50:01 34.98 0.59 swap-in 升高 17:00:01 430.11 0.77 明显异常，故障核心窗口 平均 156.93 0.52 故障窗口平均 swap-in 偏高 pswpin/s=430.11 表示在对应采样周期内，系统平均每秒从 swap 读回约 430 个内存页。如果按 Linux 常见 4KB page size 粗略估算：\n430.11 pages/s × 4KB ≈ 1.68 MB/s 这说明故障核心窗口内，数据库服务器存在明显 swap-in。对于数据库系统来说，swap-in 会带来明显延迟，尤其当 Oracle 后台进程或关键前台进程访问到已经被换出的内存页时，可能导致响应变慢、持有 latch 时间变长、连接处理超时等问题。\n这与 alert 日志中的 heavy swapping 完全吻合：\nWARNING: Heavy swapping observed on system in last 5 mins. 因此，OS 层 sar 数据补充证明：\n本次故障不只是 Oracle 内部 shared pool resize 卡顿，还叠加了 OS 层 swap-in。swap 活动很可能放大了 MMAN 持有 shared pool latch 的时间，导致大量会话等待和连接超时。\n七、故障链路表格 # 阶段 时间点 / 时间段 证据来源 关键现象 分析判断 1 故障前 参数检查 memory_target=0、sga_target=35G、shared_pool_size=0 AMM 关闭，ASMM 开启，shared pool 未设置明确下限 2 16:48:47 v$sga_resize_ops shared pool SHRINK 7680MB -\u0026gt; 7552MB ASMM 开始自动缩小 shared pool 3 16:48:47 v$sga_resize_ops DEFAULT buffer cache GROW 25344MB -\u0026gt; 25472MB Oracle 将 shared pool 释放的 128MB 转给 buffer cache 4 16:48:51–17:00:45 ASH SID 827 / SERIAL# 50907 为 oracle@bogon (MMAN)，持续 ON CPU 执行 resize 的 MMAN 长时间活跃 5 16:48:51 起 ASH 大量会话等待 latch: shared pool，阻塞源指向 SID 827 MMAN 成为 shared pool latch 阻塞源 6 16:49–16:56 ASH cursor: pin S wait on X、cursor: pin S、library cache: mutex X 增多 shared pool / library cache / cursor 争用开始扩散 7 16:50 以后 alert 日志 Fatal NI connect error 12170、TNS-12535、ORA-3136 数据库端无法及时完成入站连接处理 8 16:56:24 alert 日志 Hang ID 280 blocks 59 sessions，final blocker 为 SID 827 / OSPID 17153 Hang Manager 检测到数据库内部 hang 9 16:59:35 alert 日志 Hang ID 280 blocks 354 sessions 阻塞影响面扩大到 300 多个会话 10 17:00:01 sar -W pswpin/s=430.11 OS 层发生明显 swap-in，可能放大数据库卡顿 11 17:00:50 v$sga_resize_ops SGA resize 状态 COMPLETE shared pool shrink / buffer cache grow 操作完成 12 17:01:37 alert 日志 WARNING: Heavy swapping observed on system in last 5 mins Oracle 检测到最近 5 分钟系统 heavy swapping 13 17:00 以后 ASH / 业务反馈 shared pool latch 阻塞逐步下降，业务逐步恢复 MMAN 释放阻塞后，数据库恢复处理能力 14 应用侧表现 应用日志 ORA-03135，且 Process ID / Session ID / Serial# 均为 0 新连接未完成有效会话建立即超时断开 八、解决问题 # 1. 给 shared pool 设置明确下限 # 当前 shared_pool_size=0，建议设置明确下限，避免 Oracle 在业务高峰自动 shrink shared pool。\n根据本次故障前 shared pool 为 7680MB，建议先设置为 8G：\nalter system set shared_pool_size=8G scope=spfile; 然后安排业务低峰窗口重启数据库生效。\n如果必须在线调整，也可以使用：\nalter system set shared_pool_size=8G scope=both; 但在线调整本身可能触发新的 SGA resize，不建议在业务高峰执行。\n2. 保留 ASMM，但控制关键内存组件下限 # 当前 AMM 已关闭，这是生产库较常见的方向。但在保留 ASMM 的情况下，建议对关键组件设置合理下限：\nshared_pool_size large_pool_size java_pool_size db_cache_size 对于 WMS 这类连接多、游标多、SQL 解析频繁的系统，shared pool 不建议完全交给 Oracle 自动调整。\n3. 检查物理内存是否足够 # 当前数据库参数：\nsga_target = 35G pga_aggregate_target = 7G pga_aggregate_limit = 20G SGA 和 PGA target 合计已经约 42G。如果加上操作系统、Oracle 进程私有内存、监听、Agent、备份、监控等开销，物理内存不足时可能发生 swap。\n建议检查：\nfree -g cat /proc/meminfo | egrep \u0026#34;MemTotal|MemFree|MemAvailable|SwapTotal|SwapFree|HugePages|Commit\u0026#34; sar -r -f /var/log/sa/sa13 -s 16:30:00 -e 17:10:00 sar -q -f /var/log/sa/sa13 -s 16:30:00 -e 17:10:00 重点关注：\nMemAvailable SwapFree pswpin/s pswpout/s %commit runq-sz 4. 排查 shared pool 压力来源 # 检查是否存在大量硬解析、SQL 未绑定变量、子游标过多、对象频繁失效等情况：\nset lines 300 pages 1000 col sql_text for a100 select sql_id, count(*) child_cnt, sum(executions) executions, sum(parse_calls) parse_calls, sum(loads) loads, sum(invalidations) invalidations, max(version_count) version_count, substr(max(sql_text),1,100) sql_text from v$sql group by sql_id having count(*) \u0026gt; 20 order by child_cnt desc; 针对故障期间 ASH 中出现较多的 SQL_ID，可以继续查询 SQL 文本：\nset lines 300 pages 1000 long 100000 col sql_id for a15 col sql_text for a200 select sql_id, dbms_lob.substr(sql_text,4000,1) sql_text from dba_hist_sqltext where sql_id in ( \u0026#39;3fkbgd5c88nbn\u0026#39;, \u0026#39;77gs44zhuh7jn\u0026#39;, \u0026#39;d9q2q82g1tuzx\u0026#39;, \u0026#39;8gmzzh25xx5ys\u0026#39;, \u0026#39;9uapzrwn9k1vq\u0026#39;, \u0026#39;a4c1g6rpjbcpu\u0026#39; ); 5. 监控 SGA resize # 建议建立定期巡检，关注 shared pool 是否频繁 shrink/grow：\nset lines 300 pages 1000 col start_time for a20 col end_time for a20 col component for a30 col oper_type for a15 col status for a15 select to_char(start_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) start_time, to_char(end_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) end_time, component, oper_type, oper_mode, initial_size/1024/1024 initial_mb, target_size/1024/1024 target_mb, final_size/1024/1024 final_mb, status from v$sga_resize_ops where start_time \u0026gt;= sysdate - 7 and component in (\u0026#39;shared pool\u0026#39;,\u0026#39;DEFAULT buffer cache\u0026#39;) order by start_time; 如果 shared pool 经常出现 SHRINK/GROW，说明 ASMM 对 shared pool 调整频繁，需要进一步固定 shared pool 下限或优化 SQL 解析压力。\n6. 部署 OSWatcher 或等效采集 # 本次虽然通过 /var/log/sa/sa13 找到了 swap 证据，但 sar 默认 10 分钟粒度较粗，不能完整还原故障期间每秒级资源状态。\n建议部署：\nOSWatcher / oswbb 或至少定时采集： vmstat iostat sar top ps 建议至少保留 30 天历史数据，便于故障追溯。\n九、总结 # 本次故障不是网络中断，也不是普通业务行锁，而是 Oracle 18c 在关闭 AMM、开启 ASMM 的配置下，由于 shared_pool_size=0，shared pool 没有设置明确下限。故障窗口内 Oracle 自动触发 SGA resize，将 shared pool 缩小并把内存转给 buffer cache。该操作由 MMAN 后台进程执行，期间 MMAN 成为 shared pool latch 阻塞源，导致大量业务会话等待 latch: shared pool、cursor: pin S wait on X、library cache: mutex X 等事件。与此同时，OS 层出现明显 swap-in，进一步放大了数据库卡顿，最终导致新连接无法及时完成登录握手，应用侧表现为 ORA-03135。\n","date":"2026-05-19","externalUrl":null,"permalink":"/posts/oracle18c-wms-ora03135-asmm-shared-pool/","section":"文章","summary":"一次 Oracle 18c 生产故障复盘：WMS 数据库出现 ORA-03135 和 ORA-3136，Hang Manager 指向 MMAN，v$sga_resize_ops 显示 shared pool shrink，sar 证明故障窗口存在明显 swap-in，最终建议固定 shared_pool_size 下限并监控 SGA resize。","title":"Oracle 18c WMS 数据库卡顿故障处理实战：一次 ASMM 调整 shared pool 引发的 ORA-03135","type":"posts"},{"content":"","date":"2026-05-19","externalUrl":null,"permalink":"/tags/shared-pool/","section":"Tags","summary":"","title":"Shared Pool","type":"tags"},{"content":"","date":"2026-05-19","externalUrl":null,"permalink":"/tags/swap/","section":"Tags","summary":"","title":"Swap","type":"tags"},{"content":"","date":"2026-05-17","externalUrl":null,"permalink":"/tags/cpu%E9%AB%98/","section":"Tags","summary":"","title":"CPU高","type":"tags"},{"content":"","date":"2026-05-17","externalUrl":null,"permalink":"/tags/scheduler-job/","section":"Tags","summary":"","title":"Scheduler Job","type":"tags"},{"content":" 一次 Oracle CPU 高故障处理实战：从 Scheduler Job 到 SQL 执行计划优化 # 一、故障现象 # 生产环境 Oracle 数据库出现 CPU 使用率持续偏高，峰值一度接近 90%。从操作系统侧观察，CPU user 使用率高，load average 偏高，多个 oracle 前台进程处于 Running，数据库无明显大面积 I/O 等待，iowait 并不高，说明问题更偏向数据库内部 SQL、PL/SQL、逻辑读、解析或业务并发消耗，而不是底层存储 I/O 瓶颈。\n典型现象如下：\n[oracle@newwmsdb ~]$ top top - 17:06:28 up 115 days, 20:23, 2 users, load average: 28.43, 27.15, 27.62 Tasks: 1949 total, 29 running, 1920 sleeping, 0 stopped, 0 zombie %Cpu(s): 84.6 us, 9.6 sy, 0.0 ni, 1.3 id, 3.5 wa, 0.0 hi, 0.9 si, 0.0 st KiB Mem : 26397451+total, 16179944 free, 10548271+used, 14231185+buff/cache KiB Swap: 16777212 total, 16777212 free, 0 used. 94851072 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8704 oracle 20 0 130.8g 991.0m 814272 R 100.0 0.4 0:03.79 oracle_8704_wmp 9254 oracle 20 0 130.5g 3.2g 3.2g R 100.0 1.3 3:24.66 oracle_9254_wmp 9280 oracle 20 0 130.6g 4.3g 4.2g R 100.0 1.7 6:46.73 oracle_9280_wmp 22876 oracle 20 0 131.1g 1.6g 1.1g R 100.0 0.6 25:46.58 ora_j001_wmprod 26294 oracle 20 0 131.1g 1.2g 788392 R 100.0 0.5 3:22.41 ora_j000_wmprod 27298 oracle 20 0 130.7g 3.5g 3.3g R 100.0 1.4 3:00.25 oracle_27298_wm 8925 oracle 20 0 130.5g 200500 196444 R 94.7 0.1 0:00.96 oracle_8925_wmp 9345 oracle 20 0 130.5g 238664 232172 R 94.7 0.1 0:26.07 oracle_9345_wmp 8883 oracle 20 0 130.5g 244844 240220 R 89.5 0.1 0:01.17 oracle_8883_wmp 9011 oracle 20 0 130.5g 48084 42824 R 78.9 0.0 0:00.18 oracle_9011_wmp 9019 oracle 20 0 130.5g 48304 43660 S 73.7 0.0 0:00.24 oracle_9019_wmp 9009 oracle 20 0 130.5g 50292 45372 S 63.2 0.0 0:00.19 oracle_9009_wmp 9031 oracle 20 0 130.5g 48256 43608 S 57.9 0.0 0:00.20 oracle_9031_wmp 9035 oracle 20 0 130.5g 40548 35472 R 57.9 0.0 0:00.13 oracle_9035_wmp 18976 oracle 20 0 130.5g 4.2g 4.2g S 57.9 1.7 6:48.26 oracle_18976_wm 30540 oracle 20 0 130.5g 1.0g 1.0g R 57.9 0.4 1:52.96 oracle_30540_wm 1 root 20 0 191308 3416 1764 S 52.6 0.0 70933:20 systemd 8987 oracle 20 0 130.5g 51616 46320 R 52.6 0.0 0:00.44 oracle_8987_wmp 9023 oracle 20 0 130.5g 49284 44576 S 47.4 0.0 0:00.19 oracle_9023_wmp 9039 oracle 20 0 130.5g 36304 31436 R 36.8 0.0 0:00.09 oracle_9039_wmp 16939 oracle 20 0 130.5g 1.5g 1.5g R 31.6 0.6 0:24.39 oracle_16939_wm 10923 oracle 20 0 164048 4216 1548 R 21.1 0.0 0:00.06 top 18465 oracle 20 0 130.5g 1.6g 1.6g R 21.1 0.7 5:55.89 oracle_18465_wm 9007 oracle 20 0 130.5g 32424 27956 S 15.8 0.0 0:00.05 oracle_9007_wmp 10895 oracle 20 0 130.5g 33792 28748 S 15.8 0.0 0:00.07 oracle_10895_wm 13617 oracle 20 0 123468 3552 340 S 15.8 0.0 1650:31 logreader 18577 oracle 20 0 130.5g 1.9g 1.8g S 15.8 0.7 9:38.40 oracle_18577_wm 19196 oracle 20 0 123468 3552 340 R 15.8 0.0 1666:35 logreader 25222 oracle 20 0 130.5g 2.4g 2.3g R 15.8 0.9 5:59.17 oracle_25222_wm 10865 oracle 20 0 234724 11092 4496 S 10.5 0.0 12823:07 tnslsnr 10916 oracle 20 0 130.5g 37184 32184 S 10.5 0.0 0:00.04 oracle_10916_wm 10920 oracle 20 0 130.5g 31404 26340 S 10.5 0.0 0:00.04 oracle_10920_wm 10927 oracle 20 0 130.5g 27240 23244 S 10.5 0.0 0:00.02 oracle_10927_wm 10929 oracle 20 0 130.5g 27260 23264 S 10.5 0.0 0:00.02 oracle_10929_wm 10931 oracle 20 0 130.5g 27264 23268 S 10.5 0.0 0:00.02 oracle_10931_wm 10933 oracle 20 0 130.5g 27200 23208 S 10.5 0.0 0:00.02 oracle_10933_wm 10937 oracle 20 0 130.5g 22280 18592 S 10.5 0.0 0:00.02 oracle_10937_wm 10939 oracle 20 0 130.5g 22276 18592 S 10.5 0.0 0:00.02 oracle_10939_wm 11407 oracle 20 0 130.5g 265356 260936 D 10.5 0.1 1567:12 ora_lgwr_wmprod 18769 oracle 20 0 130.5g 1.6g 1.6g S 10.5 0.6 6:00.91 oracle_18769_wm 25276 oracle 20 0 130.5g 3.6g 3.6g R 10.5 1.4 7:37.36 oracle_25276_wm 1003 root 20 0 294716 3664 2556 S 5.3 0.0 48:51.67 abs_deployer 2473 root 20 0 1324136 9676 2244 S 5.3 0.0 919:38.63 edr_monitor 8997 oracle 20 0 130.5g 30988 25576 S 5.3 0.0 0:00.03 oracle_8997_wmp 10935 oracle 20 0 130.5g 22236 18548 R 5.3 0.0 0:00.01 oracle_10935_wm 11314 oracle -2 0 130.5g 20296 16572 S 5.3 0.0 2536:01 ora_vktm_wmprod 11401 oracle 20 0 130.5g 8.6g 8.6g D 5.3 3.4 112:27.65 ora_dbw5_wmprod 11403 oracle 20 0 130.5g 8.7g 8.7g S 5.3 3.4 113:43.95 ora_dbw6_wmprod 18819 oracle 20 0 130.5g 2.8g 2.8g R 5.3 1.1 15:19.46 oracle_18819_wm 18836 oracle 20 0 130.5g 4.6g 4.6g S 5.3 1.8 8:20.55 oracle_18836_wm 25187 oracle 20 0 130.5g 2.7g 2.7g S 5.3 1.1 2:52.53 oracle_25187_wm 25205 oracle 20 0 130.5g 4.1g 4.1g R 5.3 1.6 7:22.86 oracle_25205_wm 25262 oracle 20 0 130.5g 4.3g 4.3g S 5.3 1.7 7:08.06 oracle_25262_wm 25266 oracle 20 0 130.5g 1.3g 1.2g R 5.3 0.5 3:22.55 oracle_25266_wm 25287 oracle 20 0 130.5g 4.0g 4.0g S 5.3 1.6 8:16.27 oracle_25287_wm 25341 oracle 20 0 130.5g 3.5g 3.4g R 5.3 1.4 3:35.16 oracle_25341_wm 30276 oracle 20 0 130.5g 1.0g 1.0g S 5.3 0.4 39:24.45 oracle_30276_wm 30870 oracle 20 0 130.5g 1.3g 1.3g R 5.3 0.5 3:06.89 oracle_30870_wm 2 root 20 0 0 0 0 S 0.0 0.0 7:48.42 kthreadd 4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0.0 0.0 18:02.02 ksoftirqd/0 7 root rt 0 0 0 0 S 0.0 0.0 0:55.58 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 829:22.64 rcu_sched 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain [oracle@newwmsdb ~]$ 二、故障排查 # 通过观察top 系统 load average 在 28 左右，CPU 中 %us 达 84.6%，%id 只有 1.3%，并且多个 Oracle 前台进程、ora_j000_wmprod、ora_j001_wmprod 都接近或达到 100% CPU。\n根据 top 里的 PID定位 SQL # 根据 top 里的 PID 反查对应SID、SQL_ID。比如 top 里看到 PID 8704、9254、9280、22876、26294 CPU 高，可以这样查：\nset lines 300 pages 1000 col username for a15 col program for a35 col machine for a30 col event for a35 col sql_id for a15 col prev_sql_id for a15 select s.sid, s.serial#, p.spid, s.username, s.status, s.machine, s.program, s.module, s.sql_id, s.prev_sql_id, s.event, s.state, s.last_call_et from v$session s, v$process p where s.paddr = p.addr and p.spid in (\u0026#39;8704\u0026#39;,\u0026#39;9254\u0026#39;,\u0026#39;9280\u0026#39;,\u0026#39;22876\u0026#39;,\u0026#39;26294\u0026#39;,\u0026#39;27298\u0026#39;) order by s.last_call_et desc; 你查询到的结果，当前最可疑的几个会话，DBMS_SCHEDULER 的 J000 / J001 正在跑重 SQL\n进程 SID SQL_ID 状态 等待事件 SQL 摘要 判断 ora_j000_wmprod / PID 26294 3186 fb9n9ybz4ww5u ACTIVE db file sequential read INSERT INTO APP_ORDER_STATUS_CHANGE ... Scheduler Job 正在大量插入 ora_j001_wmprod / PID 22876 8607 dtgks897yabva ACTIVE db file sequential read SELECT NVL(SUM(A.INVN_ADJMT_QTY),'0') FROM PIX_TRAN A LEFT JOIN ASN B ... Scheduler Job 查询 PIX_TRAN/ASN 消耗高 这两个 Job 在 top 里之前都是 100% CPU，现在数据库里也能对应到 DBMS_SCHEDULER 模块，说明 定时任务是当前 CPU 高的核心来源之一。\n查当前长时间运行的 Job # set lines 300 pages 1000 col owner for a15 col job_name for a40 col elapsed_time for a25 col cpu_used for a25 col action for a120 select r.owner, r.job_name, r.session_id, r.running_instance, r.elapsed_time, r.cpu_used, s.sql_id, s.event, s.status, s.last_call_et, substr(j.job_action,1,120) action from dba_scheduler_running_jobs r join v$session s on r.session_id = s.sid left join dba_scheduler_jobs j on r.owner = j.owner and r.job_name = j.job_name where r.owner = \u0026#39;WMPROD\u0026#39; order by r.elapsed_time desc; 查询结果如下：\nOWNER\tJOB_NAME\tSESSION_ID RUNNING_INSTANCE ELAPSED_TIME\tCPU_USED\tJOB_TYPE\tPROGRAM_OWNER\tPROGRAM_NAME -------------------- ---------------------------------------- ---------- ---------------- ------------------------- ------------------------- -------------------- -------------------- ---------------------------------------- ACTION ---------------------------------------------------------------------------------------------------------------------------------------------------------------- WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\t5953\t1 +000 00:20:22.22\t+000 00:20:16.82\tPLSQL_BLOCK BEGIN APP_WMSFE_PACKAGE.GET_WMSFE_ASN_STATUS_CHANGE; END; WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\t7763\t1 +000 00:05:48.89\t+000 00:05:47.28\tPLSQL_BLOCK BEGIN APP_WMSFE_PACKAGE.GET_WMSFE_JOB_ASN_ORDERS; END; 查这两个 Job 的调度频率 # 重点看是不是调度太频繁、上一次没跑完下一次又启动、或者白天业务高峰还在跑。\nset lines 300 pages 1000 col owner for a15 col job_name for a40 col enabled for a8 col state for a15 col repeat_interval for a100 col last_start_date for a35 col next_run_date for a35 col run_count for 999999 col failure_count for 999999 select owner, job_name, enabled, state, repeat_interval, last_start_date, next_run_date, run_count, failure_count from dba_scheduler_jobs where owner = \u0026#39;WMPROD\u0026#39; and job_name in (\u0026#39;GET_WMSFE_ASN_STATUS_CHANGE\u0026#39;, \u0026#39;GET_WMSFE_JOB_ASN_ORDERS\u0026#39;); 如果 repeat_interval 很短，比如每 1 分钟、5 分钟跑一次，而单次任务已经跑 20 分钟，这就是典型问题：任务执行时间 \u0026gt; 调度间隔。这种情况下会造成任务堆积、CPU 持续高、应用响应变慢。查询结果如下：\nOWNER\tJOB_NAME\tENABLED STATE REPEAT_INTERVAL\tLAST_START_DATE\tNEXT_RUN_DATE\tRUN_COUNT FAILURE_COUNT --------------- ---------------------------------------- -------- --------------- ---------------------------------------------------------------------------------------------------- ----------------------------------- ----------------------------------- --------- ------------- WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tTRUE\tRUNNING\tFreq=Minutely;Interval=3\t12-MAY-26 06.57.28.208194 PM +08:00 12-MAY-26 06.36.45.000000 PM +08:00\t3302\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tTRUE\tRUNNING\tFreq=MINUTELY;Interval=2\t12-MAY-26 06.51.03.898406 PM +08:00 12-MAY-26 06.39.57.000000 PM +08:00\t8529\t0 任务执行时间已经远大于调度间隔 # 你现在两个 Job 是：\nJob 调度间隔 当前运行时间 CPU 使用时间 当前 SQL GET_WMSFE_ASN_STATUS_CHANGE 每 3 分钟 20 分钟+ 20 分钟+ fb9n9ybz4ww5u，插入 APP_ORDER_STATUS_CHANGE GET_WMSFE_JOB_ASN_ORDERS 每 2 分钟 6 分钟+ 6 分钟+ dtgks897yabva，查询 PIX_TRAN + ASN 两个 Job 的 CPU_USED 基本等于 ELAPSED_TIME，说明它们运行期间几乎一直在吃 CPU；而且执行时间已经超过调度间隔，任务会形成“持续运行、几乎无空窗”的状态。你查到当前 SQL 分别是 dtgks897yabva 和 g14w83s9b652u，等待事件都是 db file sequential read。\n这就是为什么 top 里 ora_j000/ora_j001 会持续高 CPU。\n查这两个 Job 调用 SQL 的执行计划 # 优先查这两个 SQL：\nselect * from table(dbms_xplan.display_cursor(\u0026#39;fb9n9ybz4ww5u\u0026#39;, null, \u0026#39;ALLSTATS LAST +PEEKED_BINDS +OUTLINE\u0026#39;)); select * from table(dbms_xplan.display_cursor(\u0026#39;dtgks897yabva\u0026#39;, null, \u0026#39;ALLSTATS LAST +PEEKED_BINDS +OUTLINE\u0026#39;)); 重点看执行计划里有没有这些问题：\n现象 说明 TABLE ACCESS FULL 全表扫描，可能缺索引或条件不合理 NESTED LOOPS 循环次数巨大 驱动表行数太大，连接顺序可能不合理 INDEX RANGE SCAN 后 TABLE ACCESS BY INDEX ROWID 很多 大量回表，逻辑读/CPU 会高 E-Rows 和 A-Rows 差异很大 统计信息不准 BUFFER_GETS 很高 CPU 高的直接来源之一 db file sequential read 多 大量索引单块读/回表 在查涉及表的索引和统计信息 # 1.APP_ORDER_STATUS_CHANGE # set lines 300 pages 1000 col owner for a15 col table_name for a35 col index_name for a40 col column_name for a35 col status for a10 select i.owner, i.table_name, i.index_name, i.status, i.uniqueness, c.column_name, c.column_position, i.blevel, i.leaf_blocks, i.clustering_factor, i.num_rows, i.last_analyzed from dba_indexes i join dba_ind_columns c on i.owner = c.index_owner and i.index_name = c.index_name where i.table_owner = \u0026#39;WMPROD\u0026#39; and i.table_name = \u0026#39;APP_ORDER_STATUS_CHANGE\u0026#39; order by i.index_name, c.column_position; 查询结果如下：\nOWNER\tTABLE_NAME\tINDEX_NAME\tSTATUS\tUNIQUENESS\tCOLUMN_NAME\tCOLUMN_POSITION BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR NUM_ROWS LAST_ANALYZED --------------- ----------------------------------- ---------------------------------------- ---------- ------------------------------------ ----------------------------------- --------------- ---------- ----------- ----------------- ---------- ------------------- WMPROD\tAPP_ORDER_STATUS_CHANGE APP_ORDER_STATUS_CHANGE_PK\tVALID\tUNIQUE\tAPP_ORDER_STATUS_CHANGE_ID 1\t1\t342 2863 153305 2026-05-11 22:06:15 WMPROD\tAPP_ORDER_STATUS_CHANGE APP_ORDER_STATUS_CHANGE_PK\tVALID\tUNIQUE\tORDER_DTL_NO\t2\t1\t342 2863 153305 2026-05-11 22:06:15 2.PIX_TRAN / ASN # set lines 300 pages 1000 col owner for a15 col table_name for a30 col index_name for a40 col column_name for a35 select i.owner, i.table_name, i.index_name, i.status, i.uniqueness, c.column_name, c.column_position, i.blevel, i.leaf_blocks, i.clustering_factor, i.num_rows, i.last_analyzed from dba_indexes i join dba_ind_columns c on i.owner = c.index_owner and i.index_name = c.index_name where i.table_owner = \u0026#39;WMPROD\u0026#39; and i.table_name in (\u0026#39;PIX_TRAN\u0026#39;,\u0026#39;ASN\u0026#39;) order by i.table_name, i.index_name, c.column_position; 查询结果如下：\nOWNER\tTABLE_NAME\tINDEX_NAME\tSTATUS\tUNIQUENESS\tCOLUMN_NAME\tCOLUMN_POSITION\tBLEVEL LEAF_BLOCKS CLUSTERING_FACTOR NUM_ROWS LAST_ANALYZED --------------- ------------------------------ ---------------------------------------- ---------- ------------------------------------ ----------------------------------- --------------- ---------- ----------- ----------------- ---------- ------------------- WMPROD\tASN\tASN_DFID_IDX\tVALID\tNONUNIQUE\tDESTINATION_FACILITY_ID 1\t2\t3627\t201447\t1255294 2026-05-12 02:00:36 WMPROD\tASN\tASN_OFID_IDX\tVALID\tNONUNIQUE\tORIGIN_FACILITY_ID\t1\t0\t0\t0\t0 2026-05-12 02:00:37 WMPROD\tASN\tASN_PK\tVALID\tUNIQUE\tASN_ID\t1\t2\t2700\t1011132\t1255294 2026-05-12 02:00:41 WMPROD\tASN\tASN_SHPID_IDX\tVALID\tNONUNIQUE\tSHIPMENT_ID\t1\t0\t0\t0\t0 2026-05-12 02:00:36 WMPROD\tASN\tASN_UIDX VALID\tUNIQUE\tTC_ASN_ID\t1\t2\t11273\t1045288\t1268524 2026-05-12 02:00:35 WMPROD\tASN\tASN_UIDX VALID\tUNIQUE\tTC_COMPANY_ID\t2\t2\t11273\t1045288\t1268524 2026-05-12 02:00:35 WMPROD\tASN\tIDX_ASN_TCPDTTM\tVALID\tNONUNIQUE\tTC_COMPANY_ID\t1\t2\t5775\t348899\t1230588 2026-05-12 02:00:42 WMPROD\tASN\tIDX_ASN_TCPDTTM\tVALID\tNONUNIQUE\tSYS_NC00144$\t2\t2\t5775\t348899\t1230588 2026-05-12 02:00:42 WMPROD\tASN\tPE_ASN_LIST_IX\tVALID\tNONUNIQUE\tTC_COMPANY_ID\t1\t2\t7059\t439003\t1255294 2026-05-12 02:00:41 WMPROD\tASN\tPE_ASN_LIST_IX\tVALID\tNONUNIQUE\tINBOUND_REGION_ID\t2\t2\t7059\t439003\t1255294 2026-05-12 02:00:41 WMPROD\tASN\tPE_ASN_LIST_IX\tVALID\tNONUNIQUE\tOUTBOUND_REGION_ID\t3\t2\t7059\t439003\t1255294 2026-05-12 02:00:41 WMPROD\tASN\tPE_ASN_LIST_IX\tVALID\tNONUNIQUE\tASN_ORGN_TYPE\t4\t2\t7059\t439003\t1255294 2026-05-12 02:00:41 WMPROD\tASN\tPE_ASN_LIST_IX\tVALID\tNONUNIQUE\tASN_STATUS\t5\t2\t7059\t439003\t1255294 2026-05-12 02:00:41 WMPROD\tASN\tTM_ASN_IDX1\tVALID\tNONUNIQUE\tASN_LEVEL\t1\t2\t3594\t75094\t1255294 2026-05-12 02:00:39 WMPROD\tASN\tTM_ASN_IDX2\tVALID\tNONUNIQUE\tASN_STATUS\t1\t2\t3493\t118547\t1255294 2026-05-12 02:00:38 WMPROD\tASN\tTM_ASN_IDX3\tVALID\tNONUNIQUE\tASN_TYPE\t1\t2\t3594\t75091\t1255294 2026-05-12 02:00:37 WMPROD\tASN\tTM_ASN_IDX4\tVALID\tNONUNIQUE\tDOCK_DOOR_ID\t1\t0\t0\t0\t0 2026-05-12 02:00:37 WMPROD\tASN\tTM_ASN_IDX5\tVALID\tNONUNIQUE\tMODE_ID 1\t0\t0\t0\t0 2026-05-12 02:00:37 WMPROD\tASN\tTM_ASN_IDX6\tVALID\tNONUNIQUE\tSHIPPING_COST_CURRENCY_CODE\t1\t0\t0\t0\t0 2026-05-12 02:00:37 WMPROD\tASN\tTM_ASN_IDX7\tVALID\tNONUNIQUE\tTC_COMPANY_ID\t1\t2\t3734\t302554\t1255294 2026-05-12 02:00:36 WMPROD\tPIX_TRAN\tPE_PIXTRN_IDX_1\tVALID\tNONUNIQUE\tCASE_NBR\t1\t2\t42220\t2219357\t8425260 2026-05-10 03:50:57 WMPROD\tPIX_TRAN\tPE_PIXTRN_IDX_1\tVALID\tNONUNIQUE\tTRAN_TYPE\t2\t2\t42220\t2219357\t8425260 2026-05-10 03:50:57 WMPROD\tPIX_TRAN\tPE_PIXTRN_IDX_1\tVALID\tNONUNIQUE\tTRAN_CODE\t3\t2\t42220\t2219357\t8425260 2026-05-10 03:50:57 WMPROD\tPIX_TRAN\tPE_PIXTRN_IDX_1\tVALID\tNONUNIQUE\tACTN_CODE\t4\t2\t42220\t2219357\t8425260 2026-05-10 03:50:57 WMPROD\tPIX_TRAN\tPE_PIXTRN_IDX_1\tVALID\tNONUNIQUE\tREF_CODE_ID_5\t5\t2\t42220\t2219357\t8425260 2026-05-10 03:50:57 WMPROD\tPIX_TRAN\tPE_PIX_CASE_IDX_1\tVALID\tNONUNIQUE\tSYS_NC00081$\t1\t3\t67708\t2952932\t8425260 2026-05-10 03:50:59 WMPROD\tPIX_TRAN\tPE_PIX_CASE_IDX_1\tVALID\tNONUNIQUE\tSYS_NC00082$\t2\t3\t67708\t2952932\t8425260 2026-05-10 03:50:59 WMPROD\tPIX_TRAN\tPE_PIX_CASE_IDX_1\tVALID\tNONUNIQUE\tTC_COMPANY_ID\t3\t3\t67708\t2952932\t8425260 2026-05-10 03:50:59 WMPROD\tPIX_TRAN\tPE_PIX_CASE_IDX_1\tVALID\tNONUNIQUE\tWHSE\t4\t3\t67708\t2952932\t8425260 2026-05-10 03:50:59 WMPROD\tPIX_TRAN\tPE_PIX_CASE_IDX_1\tVALID\tNONUNIQUE\tCREATE_DATE_TIME\t5\t3\t67708\t2952932\t8425260 2026-05-10 03:50:59 WMPROD\tPIX_TRAN\tPIXTRAN_CREATEDDTTM_IDX_1\tVALID\tNONUNIQUE\tCREATE_DATE_TIME\t1\t2\t26903\t1461234\t8425260 2026-05-10 03:50:59 WMPROD\tPIX_TRAN\tPIXTRAN_ITEMID_IDX_1\tVALID\tNONUNIQUE\tITEM_ID 1\t2\t20015\t4269182\t6419937 2026-05-10 03:51:00 WMPROD\tPIX_TRAN\tPIXTRAN_PSTATCODEWHSE_IDX_1\tVALID\tNONUNIQUE\tPROC_STAT_CODE\t1\t2\t55066\t1415620\t8425260 2026-05-10 03:51:00 WMPROD\tPIX_TRAN\tPIXTRAN_PSTATCODEWHSE_IDX_1\tVALID\tNONUNIQUE\tWHSE\t2\t2\t55066\t1415620\t8425260 2026-05-10 03:51:00 WMPROD\tPIX_TRAN\tPIXTRAN_PSTATCODEWHSE_IDX_1\tVALID\tNONUNIQUE\tMOD_DATE_TIME\t3\t2\t55066\t1415620\t8425260 2026-05-10 03:51:00 WMPROD\tPIX_TRAN\tPIXTRAN_REFFLDPSTATCODE_IDX_1\tVALID\tNONUNIQUE\tREF_FIELD_3\t1\t2\t50758\t3415884\t8425260 2026-05-10 03:51:01 WMPROD\tPIX_TRAN\tPIXTRAN_REFFLDPSTATCODE_IDX_1\tVALID\tNONUNIQUE\tREF_FIELD_1\t2\t2\t50758\t3415884\t8425260 2026-05-10 03:51:01 WMPROD\tPIX_TRAN\tPIXTRAN_REFFLDPSTATCODE_IDX_1\tVALID\tNONUNIQUE\tPROC_STAT_CODE\t3\t2\t50758\t3415884\t8425260 2026-05-10 03:51:01 WMPROD\tPIX_TRAN\tPIXTRAN_TRANNBR_IDX_1\tVALID\tNONUNIQUE\tTRAN_NBR\t1\t2\t26784\t1492306\t8425260 2026-05-10 03:51:02 WMPROD\tPIX_TRAN\tPIXTRAN_XMLGROUPID_IDX_1 VALID\tNONUNIQUE\tXML_GROUP_ID\t1\t2\t23011\t679095\t8330022 2026-05-10 03:51:02 WMPROD\tPIX_TRAN\tPK_PIX_TRAN_1\tVALID\tUNIQUE\tPIX_TRAN_ID\t1\t2\t18377\t1459923\t8425260 2026-05-10 03:51:03 WMPROD\tPIX_TRAN\tPURGE_IDX_PT_01_1\tVALID\tNONUNIQUE\tTC_COMPANY_ID\t1\t3\t64163\t1577558\t8425260 2026-05-10 03:51:03 WMPROD\tPIX_TRAN\tPURGE_IDX_PT_01_1\tVALID\tNONUNIQUE\tWHSE\t2\t3\t64163\t1577558\t8425260 2026-05-10 03:51:03 WMPROD\tPIX_TRAN\tPURGE_IDX_PT_01_1\tVALID\tNONUNIQUE\tPROC_STAT_CODE\t3\t3\t64163\t1577558\t8425260 2026-05-10 03:51:03 WMPROD\tPIX_TRAN\tPURGE_IDX_PT_01_1\tVALID\tNONUNIQUE\tMOD_DATE_TIME\t4\t3\t64163\t1577558\t8425260 2026-05-10 03:51:03 WMPROD\tPIX_TRAN\tUK_PIX_TRAN_1\tVALID\tUNIQUE\tTRAN_TYPE\t1\t2\t56471\t2910423\t8425260 2026-05-10 03:51:04 WMPROD\tPIX_TRAN\tUK_PIX_TRAN_1\tVALID\tUNIQUE\tTRAN_CODE\t2\t2\t56471\t2910423\t8425260 2026-05-10 03:51:04 WMPROD\tPIX_TRAN\tUK_PIX_TRAN_1\tVALID\tUNIQUE\tTRAN_NBR\t3\t2\t56471\t2910423\t8425260 2026-05-10 03:51:04 WMPROD\tPIX_TRAN\tUK_PIX_TRAN_1\tVALID\tUNIQUE\tPIX_SEQ_NBR\t4\t2\t56471\t2910423\t8425260 2026-05-10 03:51:04 49 rows selected. SQL\u0026gt; 执行计划分析 # fb9n9ybz4ww5u 的SQL语句如下：\nINSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, ORDER_NO, ORDER_DTL_NO, STATUS, STATUS_DESC, STATUS_TIME, OPERATOR, COMMENTS, WAVE_NO, CREATE_DATE_TIME, MAHN_WMSFE_F, MAHN_WMSFE_DTM, FIELD_001, FIELD_002, FIELD_003, FIELD_004, FIELD_005, FIELD_006, FIELD_007, FIELD_008, FIELD_009, FIELD_010) SELECT APP_ORDER_STATUS_CHANGE_ID_SEQ.NEXTVAL, SEASON, WHSE, \u0026#39;1\u0026#39;, TC_ASN_ID, SEQ_NBR, \u0026#39;35\u0026#39;, \u0026#39;ä¸Šæž¶å¼€å§‹\u0026#39;, NVL(CREATE_DATE_TIME, SYSDATE), USER_NAME, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, SYSDATE, \u0026#39;0\u0026#39;, SYSDATE, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39; FROM (SELECT PTT.SEASON, PTT.WHSE, A.TC_ASN_ID, (SELECT NVL(NVL(AD.SEQ_NBR, AD.REF_FIELD_4), \u0026#39;1\u0026#39;) FROM ASN_DETAIL AD WHERE AD.ASN_ID = A.ASN_ID AND ROWNUM \u0026lt; 2) AS SEQ_NBR, PTT.CREATE_DATE_TIME, (SELECT UU.USER_FIRST_NAME || UU.USER_LAST_NAME FROM UCL_USER UU WHERE UU.USER_NAME = PTT.USER_ID AND ROWNUM \u0026lt; 2) AS USER_NAME, ROW_NUMBER() OVER(PARTITION BY PTT.REF_FIELD_1 ORDER BY PTT.CREATE_DATE_TIME) AS RN FROM PIX_TRAN PTT LEFT JOIN ASN A ON A.TC_ASN_ID = PTT.REF_FIELD_1 WHERE PTT.TRAN_TYPE = \u0026#39;608\u0026#39; AND PTT.TRAN_CODE = \u0026#39;12\u0026#39; AND PTT.REF_FIELD_4 = \u0026#39;PP\u0026#39; AND PTT.REF_FIELD_1 = :B1 AND PTT.PROC_STAT_CODE \u0026lt;\u0026gt; 0) WHERE RN = 1 执行计划如下：\nSQL\u0026gt; select * from table(dbms_xplan.display_cursor(\u0026#39;fb9n9ybz4ww5u\u0026#39;, null, \u0026#39;ALLSTATS LAST +PEEKED_BINDS +OUTLINE\u0026#39;)); 2 PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID\tfb9n9ybz4ww5u, child number 0 ------------------------------------- INSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, ORDER_NO, ORDER_DTL_NO, STATUS, STATUS_DESC, STATUS_TIME, OPERATOR, COMMENTS, WAVE_NO, CREATE_DATE_TIME, MAHN_WMSFE_F, MAHN_WMSFE_DTM, FIELD_001, FIELD_002, FIELD_003, FIELD_004, FIELD_005, FIELD_006, FIELD_007, FIELD_008, FIELD_009, FIELD_010) SELECT APP_ORDER_STATUS_CHANGE_ID_SEQ.NEXTVAL, SEASON, WHSE, \u0026#39;1\u0026#39;, TC_ASN_ID, SEQ_NBR, \u0026#39;35\u0026#39;, \u0026#39;涓𸐿𽐿寮濮𸠧, NVL(CREATE_DATE_TIME,SYSDATE), USER_NAME, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, SYSDATE, \u0026#39;0\u0026#39;, SYSDATE, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39; FROM (SELECT PTT.SEASON, PTT.WHSE, A.TC_ASN_ID, (SELECT NVL(NVL(AD.SEQ_NBR, AD.REF_FIELD_4), \u0026#39;1\u0026#39;) FROM ASN_DETAIL AD WHERE AD.ASN_ID = A.ASN_ID AND ROWNUM \u0026lt; 2) AS SEQ_NBR, PTT.CREATE_DATE_TIME, (SELECT UU.USER_FIRST_NAME || UU.USER_LAST_NAME FROM UCL_USER UU WHERE UU.USER_NAME = PTT.USER_ID AND ROWNUM \u0026lt; 2) AS USER_NAME, ROW_NUMBER() OVER(PARTITION BY PTT.REF_FIELD_1 ORDER BY PTT.CREATE_DATE_TIME) AS RN FROM PIX_TRAN PTT LEFT JOIN A Plan hash value: 2327536561 --------------------------------------------------------------------------------------------- | Id | Operation\t| Name\t| E-Rows | --------------------------------------------------------------------------------------------- | 0 | INSERT STATEMENT\t|\t|\t| | 1 | LOAD TABLE CONVENTIONAL\t| APP_ORDER_STATUS_CHANGE\t|\t| |* 2 | COUNT STOPKEY |\t|\t| | 3 | TABLE ACCESS BY INDEX ROWID BATCHED\t| ASN_DETAIL\t|\t1 | |* 4 | INDEX RANGE SCAN\t| TM_ASN_DETAIL_IDX2\t|\t1 | |* 5 | COUNT STOPKEY |\t|\t| | 6 | TABLE ACCESS BY INDEX ROWID\t| UCL_USER\t|\t1 | |* 7 | INDEX UNIQUE SCAN\t| UCL_USER_USRNM_UK\t|\t1 | | 8 | SEQUENCE\t| APP_ORDER_STATUS_CHANGE_ID_SEQ |\t| |* 9 | VIEW |\t|\t1 | |* 10 | WINDOW SORT PUSHED RANK\t|\t|\t1 | | 11 | MERGE JOIN OUTER\t|\t|\t1 | |* 12 | TABLE ACCESS BY INDEX ROWID BATCHED | PIX_TRAN\t|\t1 | |* 13 | INDEX RANGE SCAN | UK_PIX_TRAN_1\t| 53410 | | 14 | BUFFER SORT\t|\t|\t1 | | 15 | TABLE ACCESS BY INDEX ROWID BATCHED| ASN |\t1 | |* 16 | INDEX RANGE SCAN\t| ASN_UIDX\t|\t1 | --------------------------------------------------------------------------------------------- Outline Data ------------- /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS OPTIMIZER_FEATURES_ENABLE(\u0026#39;18.1.0\u0026#39;) DB_VERSION(\u0026#39;18.1.0\u0026#39;) OPT_PARAM(\u0026#39;_optim_peek_user_binds\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing_rel\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_adaptive_cursor_sharing\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_use_feedback\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_px_adaptive_dist_method\u0026#39; \u0026#39;off\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_strans_adaptive_pruning\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_nlj_hj_adaptive_join\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;optimizer_index_caching\u0026#39; 90) FIRST_ROWS(100) OUTLINE_LEAF(@\u0026#34;SEL$5\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$6\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$54D64B3C\u0026#34;) MERGE(@\u0026#34;SEL$64EAE176\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$1\u0026#34;) OUTLINE_LEAF(@\u0026#34;INS$1\u0026#34;) OUTLINE(@\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$64EAE176\u0026#34;) MERGE(@\u0026#34;SEL$2\u0026#34; \u0026gt;\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$2\u0026#34;) FULL(@\u0026#34;INS$1\u0026#34; \u0026#34;APP_ORDER_STATUS_CHANGE\u0026#34;@\u0026#34;INS$1\u0026#34;) NO_ACCESS(@\u0026#34;SEL$1\u0026#34; \u0026#34;from$_subquery$_002\u0026#34;@\u0026#34;SEL$1\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34; (\u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_TYPE\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_CODE\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_NBR\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;PIX_SEQ_NBR\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34; (\u0026#34;ASN\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34; \u0026#34;ASN\u0026#34;.\u0026#34;TC_COMPANY_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) LEADING(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) USE_MERGE_CARTESIAN(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$6\u0026#34; \u0026#34;UU\u0026#34;@\u0026#34;SEL$6\u0026#34; (\u0026#34;UCL_USER\u0026#34;.\u0026#34;USER_NAME\u0026#34;)) INDEX_RS_ASC(@\u0026#34;SEL$5\u0026#34; \u0026#34;AD\u0026#34;@\u0026#34;SEL$5\u0026#34; (\u0026#34;ASN_DETAIL\u0026#34;.\u0026#34;ASN_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$5\u0026#34; \u0026#34;AD\u0026#34;@\u0026#34;SEL$5\u0026#34;) END_OUTLINE_DATA */ Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(ROWNUM\u0026lt;2) 4 - access(\u0026#34;AD\u0026#34;.\u0026#34;ASN_ID\u0026#34;=:B1) 5 - filter(ROWNUM\u0026lt;2) 7 - access(\u0026#34;UU\u0026#34;.\u0026#34;USER_NAME\u0026#34;=:B1) 9 - filter(\u0026#34;RN\u0026#34;=1) 10 - filter(ROW_NUMBER() OVER ( PARTITION BY \u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_1\u0026#34; ORDER BY \u0026#34;PTT\u0026#34;.\u0026#34;CREATE_DATE_TIME\u0026#34;)\u0026lt;=1) 12 - filter((\u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_1\u0026#34;=:B1 AND \u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_4\u0026#34;=\u0026#39;PP\u0026#39; AND \u0026#34;PTT\u0026#34;.\u0026#34;PROC_STAT_CODE\u0026#34;\u0026lt;\u0026gt;0)) 13 - access(\u0026#34;PTT\u0026#34;.\u0026#34;TRAN_TYPE\u0026#34;=\u0026#39;608\u0026#39; AND \u0026#34;PTT\u0026#34;.\u0026#34;TRAN_CODE\u0026#34;=\u0026#39;12\u0026#39;) 16 - access(\u0026#34;A\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1) Note ----- - Warning: basic plan statistics not available. These are only collected when: * hint \u0026#39;gather_plan_statistics\u0026#39; is used for the statement or * parameter \u0026#39;statistics_level\u0026#39; is set to \u0026#39;ALL\u0026#39;, at session or system level SQL_ID\tfb9n9ybz4ww5u, child number 1 ------------------------------------- INSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, ORDER_NO, ORDER_DTL_NO, STATUS, STATUS_DESC, STATUS_TIME, OPERATOR, COMMENTS, WAVE_NO, CREATE_DATE_TIME, MAHN_WMSFE_F, MAHN_WMSFE_DTM, FIELD_001, FIELD_002, FIELD_003, FIELD_004, FIELD_005, FIELD_006, FIELD_007, FIELD_008, FIELD_009, FIELD_010) SELECT APP_ORDER_STATUS_CHANGE_ID_SEQ.NEXTVAL, SEASON, WHSE, \u0026#39;1\u0026#39;, TC_ASN_ID, SEQ_NBR, \u0026#39;35\u0026#39;, \u0026#39;涓𸐿𽐿寮濮𸠧, NVL(CREATE_DATE_TIME,SYSDATE), USER_NAME, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, SYSDATE, \u0026#39;0\u0026#39;, SYSDATE, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39; FROM (SELECT PTT.SEASON, PTT.WHSE, A.TC_ASN_ID, (SELECT NVL(NVL(AD.SEQ_NBR, AD.REF_FIELD_4), \u0026#39;1\u0026#39;) FROM ASN_DETAIL AD WHERE AD.ASN_ID = A.ASN_ID AND ROWNUM \u0026lt; 2) AS SEQ_NBR, PTT.CREATE_DATE_TIME, (SELECT UU.USER_FIRST_NAME || UU.USER_LAST_NAME FROM UCL_USER UU WHERE UU.USER_NAME = PTT.USER_ID AND ROWNUM \u0026lt; 2) AS USER_NAME, ROW_NUMBER() OVER(PARTITION BY PTT.REF_FIELD_1 ORDER BY PTT.CREATE_DATE_TIME) AS RN FROM PIX_TRAN PTT LEFT JOIN A Plan hash value: 2327536561 --------------------------------------------------------------------------------------------- | Id | Operation\t| Name\t| E-Rows | --------------------------------------------------------------------------------------------- | 0 | INSERT STATEMENT\t|\t|\t| | 1 | LOAD TABLE CONVENTIONAL\t| APP_ORDER_STATUS_CHANGE\t|\t| |* 2 | COUNT STOPKEY |\t|\t| | 3 | TABLE ACCESS BY INDEX ROWID BATCHED\t| ASN_DETAIL\t|\t1 | |* 4 | INDEX RANGE SCAN\t| TM_ASN_DETAIL_IDX2\t|\t1 | |* 5 | COUNT STOPKEY |\t|\t| | 6 | TABLE ACCESS BY INDEX ROWID\t| UCL_USER\t|\t1 | |* 7 | INDEX UNIQUE SCAN\t| UCL_USER_USRNM_UK\t|\t1 | | 8 | SEQUENCE\t| APP_ORDER_STATUS_CHANGE_ID_SEQ |\t| |* 9 | VIEW |\t|\t1 | |* 10 | WINDOW SORT PUSHED RANK\t|\t|\t1 | | 11 | MERGE JOIN OUTER\t|\t|\t1 | |* 12 | TABLE ACCESS BY INDEX ROWID BATCHED | PIX_TRAN\t|\t1 | |* 13 | INDEX RANGE SCAN | UK_PIX_TRAN_1\t| 53410 | | 14 | BUFFER SORT\t|\t|\t1 | | 15 | TABLE ACCESS BY INDEX ROWID BATCHED| ASN |\t1 | |* 16 | INDEX RANGE SCAN\t| ASN_UIDX\t|\t1 | --------------------------------------------------------------------------------------------- Outline Data ------------- /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS OPTIMIZER_FEATURES_ENABLE(\u0026#39;18.1.0\u0026#39;) DB_VERSION(\u0026#39;18.1.0\u0026#39;) OPT_PARAM(\u0026#39;_optim_peek_user_binds\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing_rel\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_adaptive_cursor_sharing\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_use_feedback\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_px_adaptive_dist_method\u0026#39; \u0026#39;off\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_strans_adaptive_pruning\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_nlj_hj_adaptive_join\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;optimizer_index_caching\u0026#39; 90) FIRST_ROWS(100) OUTLINE_LEAF(@\u0026#34;SEL$5\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$6\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$54D64B3C\u0026#34;) MERGE(@\u0026#34;SEL$64EAE176\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$1\u0026#34;) OUTLINE_LEAF(@\u0026#34;INS$1\u0026#34;) OUTLINE(@\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$64EAE176\u0026#34;) MERGE(@\u0026#34;SEL$2\u0026#34; \u0026gt;\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$2\u0026#34;) FULL(@\u0026#34;INS$1\u0026#34; \u0026#34;APP_ORDER_STATUS_CHANGE\u0026#34;@\u0026#34;INS$1\u0026#34;) NO_ACCESS(@\u0026#34;SEL$1\u0026#34; \u0026#34;from$_subquery$_002\u0026#34;@\u0026#34;SEL$1\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34; (\u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_TYPE\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_CODE\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_NBR\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;PIX_SEQ_NBR\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34; (\u0026#34;ASN\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34; \u0026#34;ASN\u0026#34;.\u0026#34;TC_COMPANY_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) LEADING(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) USE_MERGE_CARTESIAN(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$6\u0026#34; \u0026#34;UU\u0026#34;@\u0026#34;SEL$6\u0026#34; (\u0026#34;UCL_USER\u0026#34;.\u0026#34;USER_NAME\u0026#34;)) INDEX_RS_ASC(@\u0026#34;SEL$5\u0026#34; \u0026#34;AD\u0026#34;@\u0026#34;SEL$5\u0026#34; (\u0026#34;ASN_DETAIL\u0026#34;.\u0026#34;ASN_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$5\u0026#34; \u0026#34;AD\u0026#34;@\u0026#34;SEL$5\u0026#34;) END_OUTLINE_DATA */ Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(ROWNUM\u0026lt;2) 4 - access(\u0026#34;AD\u0026#34;.\u0026#34;ASN_ID\u0026#34;=:B1) 5 - filter(ROWNUM\u0026lt;2) 7 - access(\u0026#34;UU\u0026#34;.\u0026#34;USER_NAME\u0026#34;=:B1) 9 - filter(\u0026#34;RN\u0026#34;=1) 10 - filter(ROW_NUMBER() OVER ( PARTITION BY \u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_1\u0026#34; ORDER BY \u0026#34;PTT\u0026#34;.\u0026#34;CREATE_DATE_TIME\u0026#34;)\u0026lt;=1) 12 - filter((\u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_1\u0026#34;=:B1 AND \u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_4\u0026#34;=\u0026#39;PP\u0026#39; AND \u0026#34;PTT\u0026#34;.\u0026#34;PROC_STAT_CODE\u0026#34;\u0026lt;\u0026gt;0)) 13 - access(\u0026#34;PTT\u0026#34;.\u0026#34;TRAN_TYPE\u0026#34;=\u0026#39;608\u0026#39; AND \u0026#34;PTT\u0026#34;.\u0026#34;TRAN_CODE\u0026#34;=\u0026#39;12\u0026#39;) 16 - access(\u0026#34;A\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1) Note ----- - Warning: basic plan statistics not available. These are only collected when: * hint \u0026#39;gather_plan_statistics\u0026#39; is used for the statement or * parameter \u0026#39;statistics_level\u0026#39; is set to \u0026#39;ALL\u0026#39;, at session or system level SQL_ID\tfb9n9ybz4ww5u, child number 2 ------------------------------------- INSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, ORDER_NO, ORDER_DTL_NO, STATUS, STATUS_DESC, STATUS_TIME, OPERATOR, COMMENTS, WAVE_NO, CREATE_DATE_TIME, MAHN_WMSFE_F, MAHN_WMSFE_DTM, FIELD_001, FIELD_002, FIELD_003, FIELD_004, FIELD_005, FIELD_006, FIELD_007, FIELD_008, FIELD_009, FIELD_010) SELECT APP_ORDER_STATUS_CHANGE_ID_SEQ.NEXTVAL, SEASON, WHSE, \u0026#39;1\u0026#39;, TC_ASN_ID, SEQ_NBR, \u0026#39;35\u0026#39;, \u0026#39;涓𸐿𽐿寮濮𸠧, NVL(CREATE_DATE_TIME,SYSDATE), USER_NAME, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, SYSDATE, \u0026#39;0\u0026#39;, SYSDATE, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39; FROM (SELECT PTT.SEASON, PTT.WHSE, A.TC_ASN_ID, (SELECT NVL(NVL(AD.SEQ_NBR, AD.REF_FIELD_4), \u0026#39;1\u0026#39;) FROM ASN_DETAIL AD WHERE AD.ASN_ID = A.ASN_ID AND ROWNUM \u0026lt; 2) AS SEQ_NBR, PTT.CREATE_DATE_TIME, (SELECT UU.USER_FIRST_NAME || UU.USER_LAST_NAME FROM UCL_USER UU WHERE UU.USER_NAME = PTT.USER_ID AND ROWNUM \u0026lt; 2) AS USER_NAME, ROW_NUMBER() OVER(PARTITION BY PTT.REF_FIELD_1 ORDER BY PTT.CREATE_DATE_TIME) AS RN FROM PIX_TRAN PTT LEFT JOIN A Plan hash value: 2327536561 --------------------------------------------------------------------------------------------- | Id | Operation\t| Name\t| E-Rows | --------------------------------------------------------------------------------------------- | 0 | INSERT STATEMENT\t|\t|\t| | 1 | LOAD TABLE CONVENTIONAL\t| APP_ORDER_STATUS_CHANGE\t|\t| |* 2 | COUNT STOPKEY |\t|\t| | 3 | TABLE ACCESS BY INDEX ROWID BATCHED\t| ASN_DETAIL\t|\t1 | |* 4 | INDEX RANGE SCAN\t| TM_ASN_DETAIL_IDX2\t|\t1 | |* 5 | COUNT STOPKEY |\t|\t| | 6 | TABLE ACCESS BY INDEX ROWID\t| UCL_USER\t|\t1 | |* 7 | INDEX UNIQUE SCAN\t| UCL_USER_USRNM_UK\t|\t1 | | 8 | SEQUENCE\t| APP_ORDER_STATUS_CHANGE_ID_SEQ |\t| |* 9 | VIEW |\t|\t1 | |* 10 | WINDOW SORT PUSHED RANK\t|\t|\t1 | | 11 | MERGE JOIN OUTER\t|\t|\t1 | |* 12 | TABLE ACCESS BY INDEX ROWID BATCHED | PIX_TRAN\t|\t1 | |* 13 | INDEX RANGE SCAN | UK_PIX_TRAN_1\t| 49706 | | 14 | BUFFER SORT\t|\t|\t1 | | 15 | TABLE ACCESS BY INDEX ROWID BATCHED| ASN |\t1 | |* 16 | INDEX RANGE SCAN\t| ASN_UIDX\t|\t1 | --------------------------------------------------------------------------------------------- Outline Data ------------- /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS OPTIMIZER_FEATURES_ENABLE(\u0026#39;18.1.0\u0026#39;) DB_VERSION(\u0026#39;18.1.0\u0026#39;) OPT_PARAM(\u0026#39;_optim_peek_user_binds\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing_rel\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_adaptive_cursor_sharing\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_use_feedback\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_px_adaptive_dist_method\u0026#39; \u0026#39;off\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_strans_adaptive_pruning\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_nlj_hj_adaptive_join\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;optimizer_index_caching\u0026#39; 90) FIRST_ROWS(100) OUTLINE_LEAF(@\u0026#34;SEL$5\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$6\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$54D64B3C\u0026#34;) MERGE(@\u0026#34;SEL$64EAE176\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) OUTLINE_LEAF(@\u0026#34;SEL$1\u0026#34;) OUTLINE_LEAF(@\u0026#34;INS$1\u0026#34;) OUTLINE(@\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$64EAE176\u0026#34;) MERGE(@\u0026#34;SEL$2\u0026#34; \u0026gt;\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$2\u0026#34;) FULL(@\u0026#34;INS$1\u0026#34; \u0026#34;APP_ORDER_STATUS_CHANGE\u0026#34;@\u0026#34;INS$1\u0026#34;) NO_ACCESS(@\u0026#34;SEL$1\u0026#34; \u0026#34;from$_subquery$_002\u0026#34;@\u0026#34;SEL$1\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34; (\u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_TYPE\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_CODE\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;TRAN_NBR\u0026#34; \u0026#34;PIX_TRAN\u0026#34;.\u0026#34;PIX_SEQ_NBR\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34; (\u0026#34;ASN\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34; \u0026#34;ASN\u0026#34;.\u0026#34;TC_COMPANY_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) LEADING(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;PTT\u0026#34;@\u0026#34;SEL$3\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) USE_MERGE_CARTESIAN(@\u0026#34;SEL$54D64B3C\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$2\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$6\u0026#34; \u0026#34;UU\u0026#34;@\u0026#34;SEL$6\u0026#34; (\u0026#34;UCL_USER\u0026#34;.\u0026#34;USER_NAME\u0026#34;)) INDEX_RS_ASC(@\u0026#34;SEL$5\u0026#34; \u0026#34;AD\u0026#34;@\u0026#34;SEL$5\u0026#34; (\u0026#34;ASN_DETAIL\u0026#34;.\u0026#34;ASN_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$5\u0026#34; \u0026#34;AD\u0026#34;@\u0026#34;SEL$5\u0026#34;) END_OUTLINE_DATA */ Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(ROWNUM\u0026lt;2) 4 - access(\u0026#34;AD\u0026#34;.\u0026#34;ASN_ID\u0026#34;=:B1) 5 - filter(ROWNUM\u0026lt;2) 7 - access(\u0026#34;UU\u0026#34;.\u0026#34;USER_NAME\u0026#34;=:B1) 9 - filter(\u0026#34;RN\u0026#34;=1) 10 - filter(ROW_NUMBER() OVER ( PARTITION BY \u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_1\u0026#34; ORDER BY \u0026#34;PTT\u0026#34;.\u0026#34;CREATE_DATE_TIME\u0026#34;)\u0026lt;=1) 12 - filter((\u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_1\u0026#34;=:B1 AND \u0026#34;PTT\u0026#34;.\u0026#34;REF_FIELD_4\u0026#34;=\u0026#39;PP\u0026#39; AND \u0026#34;PTT\u0026#34;.\u0026#34;PROC_STAT_CODE\u0026#34;\u0026lt;\u0026gt;0)) 13 - access(\u0026#34;PTT\u0026#34;.\u0026#34;TRAN_TYPE\u0026#34;=\u0026#39;608\u0026#39; AND \u0026#34;PTT\u0026#34;.\u0026#34;TRAN_CODE\u0026#34;=\u0026#39;12\u0026#39;) 16 - access(\u0026#34;A\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1) Note ----- - Warning: basic plan statistics not available. These are only collected when: * hint \u0026#39;gather_plan_statistics\u0026#39; is used for the statement or * parameter \u0026#39;statistics_level\u0026#39; is set to \u0026#39;ALL\u0026#39;, at session or system level 。。。省略 分析执行计划发现核心问题在于：\nINDEX RANGE SCAN UK_PIX_TRAN_1 E-Rows 约 5 万+， 谓词里显示：\naccess: PTT.TRAN_TYPE=\u0026#39;608\u0026#39; AND PTT.TRAN_CODE=\u0026#39;12\u0026#39; filter: PTT.REF_FIELD_1=:B1 PTT.REF_FIELD_4=\u0026#39;PP\u0026#39; PTT.PROC_STAT_CODE\u0026lt;\u0026gt;0 也就是说，Oracle 当前用的是 UK_PIX_TRAN_1(TRAN_TYPE, TRAN_CODE, TRAN_NBR, PIX_SEQ_NBR)，只能先按 TRAN_TYPE='608' 和 TRAN_CODE='12' 扫一大批数据，然后再回表过滤 REF_FIELD_1、REF_FIELD_4、PROC_STAT_CODE。这会产生大量单块读和 CPU 消耗。\n而你现有 PIX_TRAN 索引里，虽然有：\nPIXTRAN_REFFLDPSTATCODE_IDX_1(REF_FIELD_3, REF_FIELD_1, PROC_STAT_CODE) PIXTRAN_PSTATCODEWHSE_IDX_1(PROC_STAT_CODE, WHSE, MOD_DATE_TIME) UK_PIX_TRAN_1(TRAN_TYPE, TRAN_CODE, TRAN_NBR, PIX_SEQ_NBR) 但没有一个索引能同时很好覆盖这个 SQL 的核心条件：REF_FIELD_1 + TRAN_TYPE + TRAN_CODE + REF_FIELD_4 + PROC_STAT_CODE + CREATE_DATE_TIME\n针对当前计划里 PIX_TRAN 的谓词：\nPTT.REF_FIELD_1 = :B1 AND PTT.REF_FIELD_4 = \u0026#39;PP\u0026#39; AND PTT.PROC_STAT_CODE \u0026lt;\u0026gt; 0 AND PTT.TRAN_TYPE = \u0026#39;608\u0026#39; AND PTT.TRAN_CODE = \u0026#39;12\u0026#39; ORDER BY PTT.CREATE_DATE_TIME 建议添加这个索引\ncreate index WMPROD.IDX_PIX_TRAN_WMSFE_ASN_01 on WMPROD.PIX_TRAN ( REF_FIELD_1, TRAN_TYPE, TRAN_CODE, REF_FIELD_4, PROC_STAT_CODE, CREATE_DATE_TIME ); 原因：\nREF_FIELD_1 直接按 ASN 单号定位 TRAN_TYPE 固定条件 608 TRAN_CODE 固定条件 12 REF_FIELD_4 固定条件 PP PROC_STAT_CODE 状态过滤 CREATE_DATE_TIME 用于 ROW_NUMBER 排序 不过这个索引需要先评估数据分布。建议先查选择性：\nset lines 300 pages 1000 select count(*) total_rows, count(case when tran_type = \u0026#39;608\u0026#39; and tran_code = \u0026#39;12\u0026#39; then 1 end) cnt_608_12, count(case when tran_type = \u0026#39;608\u0026#39; and tran_code = \u0026#39;12\u0026#39; and ref_field_4 = \u0026#39;PP\u0026#39; and proc_stat_code \u0026lt;\u0026gt; 0 then 1 end) cnt_target from wmprod.pix_tran; select ref_field_1, count(*) cnt from wmprod.pix_tran where tran_type = \u0026#39;608\u0026#39; and tran_code = \u0026#39;12\u0026#39; and ref_field_4 = \u0026#39;PP\u0026#39; and proc_stat_code \u0026lt;\u0026gt; 0 group by ref_field_1 order by count(*) desc fetch first 20 rows only; 如果 REF_FIELD_1 很分散，这个索引效果会比较好。\n查询结果如下：\nPIX_TRAN 总行数 = 8,560,301 TRAN_TYPE=\u0026#39;608\u0026#39; and TRAN_CODE=\u0026#39;12\u0026#39; = 685,717 再加 REF_FIELD_4=\u0026#39;PP\u0026#39; and PROC_STAT_CODE\u0026lt;\u0026gt;0 = 344,304 也就是说，当前执行计划如果走：\nUK_PIX_TRAN_1(TRAN_TYPE, TRAN_CODE, TRAN_NBR, PIX_SEQ_NBR) 它会先扫出大约 68.5 万行，再过滤到 34.4 万行，最后再按 REF_FIELD_1 = :B1 过滤。这个访问路径成本肯定高。索引范围扫描 + 大量回表过滤。\n但你按 REF_FIELD_1 分组后，Top 20 最大值也就：\n210、199、154、144、140... 说明单个 ASN 单号对应的数据量很小。 所以最优访问路径应该是：\n先用 REF_FIELD_1 精准定位 ASN 单号 再过滤 TRAN_TYPE / TRAN_CODE / REF_FIELD_4 / PROC_STAT_CODE PIX_TRAN 应该补一个以 REF_FIELD_1 为前导列的组合索引。\n第二个g14w83s9b652u 的SQL语句如下：\nINSERT INTO APP_ORDER_STATUS_CHANGE ... SELECT ... FROM APP_ASN_RECEIVE AR LEFT JOIN ASN A ON A.TC_ASN_ID = AR.TC_ASN_ID LEFT JOIN COMPANY C ON C.COMPANY_ID = A.TC_COMPANY_ID WHERE AR.TC_ASN_ID = :B1 AND AR.DELETED = 0 AND ROWNUM \u0026lt; 2 执行计划如下：\nSQL\u0026gt; select * from table(dbms_xplan.display_cursor( \u0026#39;g14w83s9b652u\u0026#39;, null, \u0026#39;TYPICAL +PEEKED_BINDS +OUTLINE\u0026#39; )); 2 3 4 5 6 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID\tg14w83s9b652u, child number 0 ------------------------------------- INSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, ORDER_NO, ORDER_DTL_NO, STATUS, STATUS_DESC, STATUS_TIME, OPERATOR, COMMENTS, WAVE_NO, CREATE_DATE_TIME, MAHN_WMSFE_F, MAHN_WMSFE_DTM, FIELD_001, FIELD_002, FIELD_003, FIELD_004, FIELD_005, FIELD_006, FIELD_007, FIELD_008, FIELD_009, FIELD_010) SELECT APP_ORDER_STATUS_CHANGE_ID_SEQ.NEXTVAL, C.COMPANY_CODE, A.DESTINATION_FACILITY_ALIAS_ID, \u0026#39;1\u0026#39;, A.TC_ASN_ID, AR.SEQ_NBR, \u0026#39;15\u0026#39;, \u0026#39;寮濮𸠿𺰿璐?, NVL(AR.CREATE_TIME,SYSDATE), AR.CREATE_USER_NAME, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, SYSDATE, \u0026#39;0\u0026#39;, SYSDATE, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39; FROM APP_ASN_RECEIVE AR LEFT JOIN ASN A ON A.TC_ASN_ID = AR.TC_ASN_ID LEFT JOIN COMPANY C ON C.COMPANY_ID = A.TC_COMPANY_ID WHERE AR.TC_ASN_ID = :B1 AND AR.DELETED = 0 AND ROWNUM \u0026lt; 2 Plan hash value: 3958100088 -------------------------------------------------------------------------------- -------------------------------------------- | Id | Operation\t| Name PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- | Rows | Bytes | Cost (%CPU)| Time\t| -------------------------------------------------------------------------------- -------------------------------------------- | 0 | INSERT STATEMENT\t| |\t|\t| 1207 (100)|\t| | 1 | LOAD TABLE CONVENTIONAL\t| APP_ORDER_STATUS_CHANGE |\t|\t|\t|\t| PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- | 2 | SEQUENCE\t| APP_ORDER_STATUS_CHANGE_ID_S EQ |\t|\t|\t|\t| |* 3 | COUNT STOPKEY\t| |\t|\t|\t|\t| | 4 | NESTED LOOPS OUTER\t| |\t1 |\t87 | 1207 (1)| 00:00:01 | | 5 | MERGE JOIN OUTER\t| |\t1 |\t71 | 1206 (1)| 00:00:01 | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- |* 6 | TABLE ACCESS FULL | APP_ASN_RECEIVE |\t1 |\t42 | 1204 (1)| 00:00:01 | | 7 | BUFFER SORT\t| |\t1 |\t29 |\t2 (0)| 00:00:01 | | 8 | TABLE ACCESS BY INDEX ROWID BATCHED| ASN |\t1 |\t29 |\t2 (0)| 00:00:01 | |* 9 | INDEX RANGE SCAN\t| ASN_UIDX PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- |\t1 |\t|\t1 (0)| 00:00:01 | | 10 | TABLE ACCESS BY INDEX ROWID\t| COMPANY |\t1 |\t16 |\t1 (0)| 00:00:01 | |* 11 | INDEX UNIQUE SCAN | COMPANY_PK |\t1 |\t|\t0 (0)|\t| -------------------------------------------------------------------------------- -------------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Outline Data ------------- /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS OPTIMIZER_FEATURES_ENABLE(\u0026#39;18.1.0\u0026#39;) DB_VERSION(\u0026#39;18.1.0\u0026#39;) OPT_PARAM(\u0026#39;_optim_peek_user_binds\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing\u0026#39; \u0026#39;none\u0026#39;) PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing_rel\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_adaptive_cursor_sharing\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_use_feedback\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_px_adaptive_dist_method\u0026#39; \u0026#39;off\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_strans_adaptive_pruning\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_nlj_hj_adaptive_join\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;optimizer_index_caching\u0026#39; 90) FIRST_ROWS(100) OUTLINE_LEAF(@\u0026#34;SEL$B331CAF9\u0026#34;) MERGE(@\u0026#34;SEL$7237DA6D\u0026#34; \u0026gt;\u0026#34;SEL$5\u0026#34;) OUTLINE_LEAF(@\u0026#34;INS$1\u0026#34;) PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- OUTLINE(@\u0026#34;SEL$5\u0026#34;) OUTLINE(@\u0026#34;SEL$7237DA6D\u0026#34;) MERGE(@\u0026#34;SEL$3\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) MERGE(@\u0026#34;SEL$58A6D7F6\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$58A6D7F6\u0026#34;) MERGE(@\u0026#34;SEL$1\u0026#34; \u0026gt;\u0026#34;SEL$2\u0026#34;) OUTLINE(@\u0026#34;SEL$2\u0026#34;) OUTLINE(@\u0026#34;SEL$1\u0026#34;) FULL(@\u0026#34;INS$1\u0026#34; \u0026#34;APP_ORDER_STATUS_CHANGE\u0026#34;@\u0026#34;INS$1\u0026#34;) PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- FULL(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;AR\u0026#34;@\u0026#34;SEL$2\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34; (\u0026#34;ASN\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34; \u0026#34;ASN\u0026#34;.\u0026#34;TC_COMP ANY_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;C\u0026#34;@\u0026#34;SEL$3\u0026#34; (\u0026#34;COMPANY\u0026#34;.\u0026#34;COMPANY_ID\u0026#34;)) LEADING(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;AR\u0026#34;@\u0026#34;SEL$2\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34; \u0026#34;C\u0026#34;@\u0026#34;SEL$3\u0026#34;) USE_MERGE_CARTESIAN(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34;) USE_NL(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;C\u0026#34;@\u0026#34;SEL$3\u0026#34;) END_OUTLINE_DATA */ PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(ROWNUM\u0026lt;2) 6 - filter((\u0026#34;AR\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1 AND \u0026#34;AR\u0026#34;.\u0026#34;DELETED\u0026#34;=0)) 9 - access(\u0026#34;A\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1) 11 - access(\u0026#34;C\u0026#34;.\u0026#34;COMPANY_ID\u0026#34;=\u0026#34;A\u0026#34;.\u0026#34;TC_COMPANY_ID\u0026#34;) SQL_ID\tg14w83s9b652u, child number 1 ------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- INSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, ORDER_NO, ORDER_DTL_NO, STATUS, STATUS_DESC, STATUS_TIME, OPERATOR, COMMENTS, WAVE_NO, CREATE_DATE_TIME, MAHN_WMSFE_F, MAHN_WMSFE_DTM, FIELD_001, FIELD_002, FIELD_003, FIELD_004, FIELD_005, FIELD_006, FIELD_007, FIELD_008, FIELD_009, FIELD_010) SELECT APP_ORDER_STATUS_CHANGE_ID_SEQ.NEXTVAL, C.COMPANY_CODE, A.DESTINATION_FACILITY_ALIAS_ID, \u0026#39;1\u0026#39;, A.TC_ASN_ID, AR.SEQ_NBR, \u0026#39;15\u0026#39;, \u0026#39;寮濮𸠿𺰿璐?, NVL(AR.CREATE_TIME,SYSDATE), AR.CREATE_USER_NAME, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, SYSDATE, \u0026#39;0\u0026#39;, SYSDATE, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39; FROM APP_ASN_RECEIVE AR LEFT JOIN ASN A ON A.TC_ASN_ID = AR.TC_ASN_ID LEFT JOIN COMPANY C ON C.COMPANY_ID = PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- A.TC_COMPANY_ID WHERE AR.TC_ASN_ID = :B1 AND AR.DELETED = 0 AND ROWNUM \u0026lt; 2 Plan hash value: 3958100088 -------------------------------------------------------------------------------- -------------------------------------------- | Id | Operation\t| Name | Rows | Bytes | Cost (%CPU)| Time\t| PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------- | 0 | INSERT STATEMENT\t| |\t|\t| 1207 (100)|\t| | 1 | LOAD TABLE CONVENTIONAL\t| APP_ORDER_STATUS_CHANGE |\t|\t|\t|\t| | 2 | SEQUENCE\t| APP_ORDER_STATUS_CHANGE_ID_S EQ |\t|\t|\t|\t| PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- |* 3 | COUNT STOPKEY\t| |\t|\t|\t|\t| | 4 | NESTED LOOPS OUTER\t| |\t1 |\t87 | 1207 (1)| 00:00:01 | | 5 | MERGE JOIN OUTER\t| |\t1 |\t71 | 1206 (1)| 00:00:01 | |* 6 | TABLE ACCESS FULL | APP_ASN_RECEIVE PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- |\t1 |\t42 | 1204 (1)| 00:00:01 | | 7 | BUFFER SORT\t| |\t1 |\t29 |\t2 (0)| 00:00:01 | | 8 | TABLE ACCESS BY INDEX ROWID BATCHED| ASN |\t1 |\t29 |\t2 (0)| 00:00:01 | |* 9 | INDEX RANGE SCAN\t| ASN_UIDX |\t1 |\t|\t1 (0)| 00:00:01 | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- | 10 | TABLE ACCESS BY INDEX ROWID\t| COMPANY |\t1 |\t16 |\t1 (0)| 00:00:01 | |* 11 | INDEX UNIQUE SCAN | COMPANY_PK |\t1 |\t|\t0 (0)|\t| -------------------------------------------------------------------------------- -------------------------------------------- Outline Data PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- ------------- /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS OPTIMIZER_FEATURES_ENABLE(\u0026#39;18.1.0\u0026#39;) DB_VERSION(\u0026#39;18.1.0\u0026#39;) OPT_PARAM(\u0026#39;_optim_peek_user_binds\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_extended_cursor_sharing_rel\u0026#39; \u0026#39;none\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_adaptive_cursor_sharing\u0026#39; \u0026#39;false\u0026#39;) PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- OPT_PARAM(\u0026#39;_optimizer_use_feedback\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_px_adaptive_dist_method\u0026#39; \u0026#39;off\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_strans_adaptive_pruning\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;_optimizer_nlj_hj_adaptive_join\u0026#39; \u0026#39;false\u0026#39;) OPT_PARAM(\u0026#39;optimizer_index_caching\u0026#39; 90) FIRST_ROWS(100) OUTLINE_LEAF(@\u0026#34;SEL$B331CAF9\u0026#34;) MERGE(@\u0026#34;SEL$7237DA6D\u0026#34; \u0026gt;\u0026#34;SEL$5\u0026#34;) OUTLINE_LEAF(@\u0026#34;INS$1\u0026#34;) OUTLINE(@\u0026#34;SEL$5\u0026#34;) OUTLINE(@\u0026#34;SEL$7237DA6D\u0026#34;) PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- MERGE(@\u0026#34;SEL$3\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) MERGE(@\u0026#34;SEL$58A6D7F6\u0026#34; \u0026gt;\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$4\u0026#34;) OUTLINE(@\u0026#34;SEL$3\u0026#34;) OUTLINE(@\u0026#34;SEL$58A6D7F6\u0026#34;) MERGE(@\u0026#34;SEL$1\u0026#34; \u0026gt;\u0026#34;SEL$2\u0026#34;) OUTLINE(@\u0026#34;SEL$2\u0026#34;) OUTLINE(@\u0026#34;SEL$1\u0026#34;) FULL(@\u0026#34;INS$1\u0026#34; \u0026#34;APP_ORDER_STATUS_CHANGE\u0026#34;@\u0026#34;INS$1\u0026#34;) FULL(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;AR\u0026#34;@\u0026#34;SEL$2\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34; (\u0026#34;ASN\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34; \u0026#34;ASN\u0026#34;.\u0026#34;TC_COMP PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- ANY_ID\u0026#34;)) BATCH_TABLE_ACCESS_BY_ROWID(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34;) INDEX_RS_ASC(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;C\u0026#34;@\u0026#34;SEL$3\u0026#34; (\u0026#34;COMPANY\u0026#34;.\u0026#34;COMPANY_ID\u0026#34;)) LEADING(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;AR\u0026#34;@\u0026#34;SEL$2\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34; \u0026#34;C\u0026#34;@\u0026#34;SEL$3\u0026#34;) USE_MERGE_CARTESIAN(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;A\u0026#34;@\u0026#34;SEL$1\u0026#34;) USE_NL(@\u0026#34;SEL$B331CAF9\u0026#34; \u0026#34;C\u0026#34;@\u0026#34;SEL$3\u0026#34;) END_OUTLINE_DATA */ Predicate Information (identified by operation id): PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- --------------------------------------------------- 3 - filter(ROWNUM\u0026lt;2) 6 - filter((\u0026#34;AR\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1 AND \u0026#34;AR\u0026#34;.\u0026#34;DELETED\u0026#34;=0)) 9 - access(\u0026#34;A\u0026#34;.\u0026#34;TC_ASN_ID\u0026#34;=:B1) 11 - access(\u0026#34;C\u0026#34;.\u0026#34;COMPANY_ID\u0026#34;=\u0026#34;A\u0026#34;.\u0026#34;TC_COMPANY_ID\u0026#34;) 。。。省略 执行计划里最明显的问题是：\nTABLE ACCESS FULL APP_ASN_RECEIVE filter: AR.TC_ASN_ID = :B1 AND AR.DELETED = 0 Cost: 1200+ 这个 SQL 现在需要的是 APP_ASN_RECEIVE 上的索引。\n优先建议这个\ncreate index WMPROD.IDX_APP_ASN_RECEIVE_01 on WMPROD.APP_ASN_RECEIVE(TC_ASN_ID, DELETED); 另外 APP_ORDER_STATUS_CHANGE.ORDER_NO 包体里大量出现如下SQL：\nFROM APP_ORDER_STATUS_CHANGE A WHERE A.ORDER_NO = P_TC_ASN_ID 但当前 APP_ORDER_STATUS_CHANGE 只有主键索引 (APP_ORDER_STATUS_CHANGE_ID, ORDER_DTL_NO)。建议增加：\ncreate index WMPROD.IDX_AOSC_ORDER_NO_01 on WMPROD.APP_ORDER_STATUS_CHANGE(ORDER_NO); 三、故障解决 # 调整 Job 调度间隔 # 索引优化之前，优先需要避免 Job 继续堆积。如果一个 Job 单次运行 10～20 分钟，却每 2～3 分钟触发一次，那么即使 SQL 优化后，也可能在业务高峰再次堆积。因此将两个 Job 调度间隔调整为 30 分钟，先让系统稳定下来。\nbegin dbms_scheduler.set_attribute( name =\u0026gt; \u0026#39;WMPROD.GET_WMSFE_ASN_STATUS_CHANGE\u0026#39;, attribute =\u0026gt; \u0026#39;repeat_interval\u0026#39;, value =\u0026gt; \u0026#39;FREQ=MINUTELY;INTERVAL=30\u0026#39; ); dbms_scheduler.set_attribute( name =\u0026gt; \u0026#39;WMPROD.GET_WMSFE_JOB_ASN_ORDERS\u0026#39;, attribute =\u0026gt; \u0026#39;repeat_interval\u0026#39;, value =\u0026gt; \u0026#39;FREQ=MINUTELY;INTERVAL=30\u0026#39; ); end; / 创建索引 # 根据 SQL 谓词和关联条件，创建以下索引：\ncreate index WMPROD.IDX_PIX_TRAN_WMSFE_ASN_01 on WMPROD.PIX_TRAN ( REF_FIELD_1, TRAN_TYPE, TRAN_CODE, REF_FIELD_4, PROC_STAT_CODE, CREATE_DATE_TIME ) online; create index WMPROD.IDX_AOSC_ORDER_NO_01 on WMPROD.APP_ORDER_STATUS_CHANGE ( ORDER_NO ) online; create index WMPROD.IDX_APP_ASN_RECEIVE_01 on WMPROD.APP_ASN_RECEIVE ( TC_ASN_ID, DELETED ) online; 创建完成后收集索引统计信息：\nbegin dbms_stats.gather_index_stats( ownname =\u0026gt; \u0026#39;WMPROD\u0026#39;, indname =\u0026gt; \u0026#39;IDX_PIX_TRAN_WMSFE_ASN_01\u0026#39; ); dbms_stats.gather_index_stats( ownname =\u0026gt; \u0026#39;WMPROD\u0026#39;, indname =\u0026gt; \u0026#39;IDX_AOSC_ORDER_NO_01\u0026#39; ); dbms_stats.gather_index_stats( ownname =\u0026gt; \u0026#39;WMPROD\u0026#39;, indname =\u0026gt; \u0026#39;IDX_APP_ASN_RECEIVE_01\u0026#39; ); end; / 四、验证优化效果 # 查 Job 最近一次执行耗时 # set lines 300 pages 1000 col owner for a15 col job_name for a40 col status for a12 col actual_start_date for a35 col run_duration for a25 col cpu_used for a25 col additional_info for a120 select owner, job_name, status, actual_start_date, run_duration, cpu_used, error#, substr(additional_info,1,120) additional_info from dba_scheduler_job_run_details where owner = \u0026#39;WMPROD\u0026#39; and job_name in (\u0026#39;GET_WMSFE_ASN_STATUS_CHANGE\u0026#39;, \u0026#39;GET_WMSFE_JOB_ASN_ORDERS\u0026#39;) order by actual_start_date desc fetch first 20 rows only; 结果如下：\nOWNER\tJOB_NAME\tSTATUS ACTUAL_START_DATE RUN_DURATION\tCPU_USED\tERROR# ADDITIONAL_INFO --------------- ---------------------------------------- ------------ ----------------------------------- ------------------------- ------------------------- ---------- ------------------------------------------------------------------------------------------------------------------------ WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 07.53.57.162100 PM +08:00 +000 00:01:26 +000 00:01:24.26\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 07.42.45.104700 PM +08:00 +000 00:04:32 +000 00:04:31.07\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 07.20.37.431258 PM +08:00 +000 00:14:47 +000 00:05:04.75\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 07.16.48.331879 PM +08:00 +000 00:24:20 +000 00:14:12.86\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 07.11.20.056484 PM +08:00 +000 00:09:17 +000 00:09:16.05\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 07.01.19.775652 PM +08:00 +000 00:10:00 +000 00:09:58.79\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 06.57.28.208280 PM +08:00 +000 00:19:20 +000 00:19:15.89\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 06.51.03.898434 PM +08:00 +000 00:10:16 +000 00:10:09.16\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 06.39.35.485777 PM +08:00 +000 00:11:28 +000 00:11:22.23\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 06.36.30.575480 PM +08:00 +000 00:20:58 +000 00:20:52.48\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 06.27.52.480582 PM +08:00 +000 00:11:43 +000 00:10:37.42\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 06.17.28.586754 PM +08:00 +000 00:10:24 +000 00:10:21.93\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 06.14.39.457713 PM +08:00 +000 00:21:51 +000 00:21:03.08\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 06.06.09.108112 PM +08:00 +000 00:11:19 +000 00:11:02.94\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 05.52.32.919112 PM +08:00 +000 00:22:07 +000 00:21:57.87\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 05.48.44.165838 PM +08:00 +000 00:17:25 +000 00:12:53.41\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 05.28.34.598389 PM +08:00 +000 00:23:58 +000 00:23:47.90\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 05.27.43.404375 PM +08:00 +000 00:21:01 +000 00:15:48.76\t0 WMPROD\tGET_WMSFE_JOB_ASN_ORDERS\tSUCCEEDED 12-MAY-26 05.04.55.458669 PM +08:00 +000 00:22:48 +000 00:15:49.82\t0 WMPROD\tGET_WMSFE_ASN_STATUS_CHANGE\tSUCCEEDED 12-MAY-26 05.03.12.056408 PM +08:00 +000 00:25:22 +000 00:25:08.38\t0 20 rows selected. SQL\u0026gt; 从这组结果看，优化已经明显生效，尤其是两个核心 Job 的执行时间和 SQL 逻辑读都大幅下降。\n最新执行记录：\nJob 优化前典型耗时 最新耗时 最新 CPU 结论 GET_WMSFE_ASN_STATUS_CHANGE 约 20～25 分钟 4分32秒 4分31秒 明显下降 GET_WMSFE_JOB_ASN_ORDERS 约 10～22 分钟 1分26秒 1分24秒 明显下降 之前 GET_WMSFE_ASN_STATUS_CHANGE 多次运行 20 分钟以上，例如 18:36 运行 20分58秒、18:57 运行 19分20秒、19:16 运行 24分20秒；现在最近一次已经降到 4分32秒。GET_WMSFE_JOB_ASN_ORDERS 之前多次在 10 分钟以上，现在最近一次降到 1分26秒。\n在查新索引是否降低了 SQL 消耗 # set lines 300 pages 1000 col sql_id for a15 col last_active_time for a25 col sql_text for a100 select sql_id, child_number, plan_hash_value, executions, round(cpu_time/1000000,2) cpu_sec, round(elapsed_time/1000000,2) ela_sec, buffer_gets, round(buffer_gets / nullif(executions,0),2) gets_per_exec, rows_processed, last_active_time, substr(sql_text,1,100) sql_text from v$sql where sql_id in ( \u0026#39;fb9n9ybz4ww5u\u0026#39;, \u0026#39;dtgks897yabva\u0026#39;, \u0026#39;g14w83s9b652u\u0026#39;, \u0026#39;cpkzgst2mfjms\u0026#39;, \u0026#39;bkwc8nr3k6c53\u0026#39;, \u0026#39;776jksjydvds8\u0026#39; ) order by sql_id, child_number; 查询结果如下：\nSQL_ID\tCHILD_NUMBER PLAN_HASH_VALUE EXECUTIONS CPU_SEC ELA_SEC BUFFER_GETS GETS_PER_EXEC ROWS_PROCESSED LAST_ACTIVE_TIME SQL_TEXT --------------- ------------ --------------- ---------- ---------- ---------- ----------- ------------- -------------- ------------------------- ---------------------------------------------------------------------------------------------------- 776jksjydvds8\t1\t757813248\t14 .49\t1.87\t88302\t6307.29 3 2026-05-12 15:21:55\tDELETE FROM APP_ASN_RECEIVE_ARVL_EXT A WHERE A.ARVL_ID IN (SELECT ID FROM APP_ASN_RECEIVE_ARVL WHERE 776jksjydvds8\t2\t757813248\t8 .28\t.95\t50942\t6367.75 0 2026-05-12 16:58:29\tDELETE FROM APP_ASN_RECEIVE_ARVL_EXT A WHERE A.ARVL_ID IN (SELECT ID FROM APP_ASN_RECEIVE_ARVL WHERE bkwc8nr3k6c53\t1\t1389005756\t14 .32\t.32\t84941\t6067.21 9 2026-05-12 15:21:55\tDELETE FROM APP_ASN_RECEIVE_ARVL A WHERE A.TC_ASN_ID = :B1 bkwc8nr3k6c53\t2\t1389005756\t8 .2\t.2\t49405\t6175.63 4 2026-05-12 16:58:29\tDELETE FROM APP_ASN_RECEIVE_ARVL A WHERE A.TC_ASN_ID = :B1 cpkzgst2mfjms\t0\t1389005756\t868 17.69\t18.47\t5221461\t6015.51 825 2026-05-11 11:39:01\tDELETE FROM app_asn_receive_arvl WHERE (receive_id = :1 ) cpkzgst2mfjms\t1\t1389005756\t405 8.71\t9.26\t2500912\t6175.09 369 2026-05-12 18:28:02\tDELETE FROM app_asn_receive_arvl WHERE (receive_id = :1 ) dtgks897yabva\t0\t3695283177\t921 .09\t.16\t6171\t6.7 921 2026-05-12 19:55:03\tSELECT NVL(SUM(A.INVN_ADJMT_QTY), \u0026#39;0\u0026#39;) FROM PIX_TRAN A LEFT JOIN ASN B ON B.TC_ASN_ID = A.REF_FIELD_ fb9n9ybz4ww5u\t0\t554698197\t1071 .16\t.17\t8712\t8.13 186 2026-05-12 20:14:23\tINSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, g14w83s9b652u\t0\t4012314491\t4964 .17\t.17\t14934\t3.01 1 2026-05-12 20:14:23\tINSERT INTO APP_ORDER_STATUS_CHANGE (APP_ORDER_STATUS_CHANGE_ID, OWNER_NO, FACILITY_NO, ORDER_TYPE, 9 rows selected. SQL\u0026gt; 结论核心 SQL 的逻辑读已经降下来了，你现在 v$sql 里最关键的数据是：\nSQL_ID SQL gets_per_exec 判断 dtgks897yabva PIX_TRAN + ASN 聚合查询 6.7 很低，已优化 fb9n9ybz4ww5u PIX_TRAN -\u0026gt; APP_ORDER_STATUS_CHANGE 插入 8.13 很低，已优化 g14w83s9b652u APP_ASN_RECEIVE -\u0026gt; APP_ORDER_STATUS_CHANGE 插入 3.01 很低，已优化 这说明三个关键 SQL 已经不是高逻辑读 SQL 了。\n尤其是 g14w83s9b652u，之前你看到它对 APP_ASN_RECEIVE 做全表扫描，Cost 1200+；现在 plan_hash_value 已经变成 4012314491，buffer_gets / executions = 3.01，说明它已经生成了新计划，基本可以判断 IDX_APP_ASN_RECEIVE_01 已经生效。\nCPU 高的根因是 WMPROD 接口类 Scheduler Job 调度过密，同时 Job 内部 SQL 缺少合适索引，导致大量逻辑读和 CPU 消耗。通过调整 Job 间隔和补充关键索引，Job 执行时间从 10～25 分钟下降到 1～2 分钟，CPU 压力解除。\n最后总结 # 本次 Oracle CPU 高问题主要是 WMPROD 下 Scheduler Job 调度过密，任务执行时间远大于调度间隔，叠加包内 SQL 访问路径不佳，导致 CPU 长时间被持续消耗；通过调整 Job 调度间隔、补充关键组合索引并收集统计信息后，核心 Job 执行时间从 10～25 分钟下降到 1～2 分钟。\n","date":"2026-05-17","externalUrl":null,"permalink":"/posts/oracle-cpu-high/","section":"文章","summary":"通过操作系统 PID、v$session、dba_scheduler_running_jobs、dbms_xplan 等手段，定位 Oracle CPU 高的根因，并给出 SQL 和索引优化思路。","title":"一次 Oracle CPU 高故障处理实战","type":"posts"},{"content":"","date":"2026-05-14","externalUrl":null,"permalink":"/tags/ora-01110/","section":"Tags","summary":"","title":"ORA-01110","type":"tags"},{"content":"","date":"2026-05-14","externalUrl":null,"permalink":"/tags/ora-01187/","section":"Tags","summary":"","title":"ORA-01187","type":"tags"},{"content":" 一、故障现象 # 接到客户电话反馈说查询视图报错：\nORA-01187: 由于验证测试失败而无法从文件读取 ORA-01110: 数据文件 201: \u0026#39;/u01/app/oracle/oradata/WMPROD/temp01.dbf\u0026#39; 这类报错容易误判为普通数据文件损坏。实际上，如果 ORA-01110 指向的是 临时文件 tempfile，处理思路不要做 recover datafile。 TEMP 文件不保存业务数据，标准处理是重建临时表空间。\n二、处理过程 # 检查 TEMP 当前使用率 # 先看 TEMP 表空间总量、已用、剩余、使用率\nset lines 300 pages 1000 col tablespace_name for a20 select tablespace_name, round(sum(bytes_used + bytes_free) / 1024 / 1024 / 1024, 2) total_gb, round(sum(bytes_used) / 1024 / 1024 / 1024, 2) used_gb, round(sum(bytes_free) / 1024 / 1024 / 1024, 2) free_gb, round(sum(bytes_used) / nullif(sum(bytes_used + bytes_free),0) * 100, 2) used_pct from v$temp_space_header group by tablespace_name order by tablespace_name; 本次现场查询结果类似：\nTABLESPACE_NAME TOTAL_GB USED_GB FREE_GB USED_PCT -------------------- ---------- ---------- ---------- ---------- TEMP 32 32 0 100.00 继续查 tempfile 明细：\nset lines 300 pages 1000 col tablespace_name for a20 col file_name for a120 col autoextensible for a15 select tablespace_name, file_id, file_name, round(bytes / 1024 / 1024 / 1024, 2) size_gb, autoextensible, round(maxbytes / 1024 / 1024 / 1024, 2) max_gb, status from dba_temp_files order by tablespace_name, file_id; 输出查询结果：\nTEMP 1 /u01/app/oracle/oradata/WMPROD/temp01.dbf 32G YES 32G ONLINE 这里有一个关键判断：temp01.dbf 显示 AUTOEXTENSIBLE=YES，但是 MAX_GB=32。说明它已经到最大值，实际上不能继续扩展。\n重建临时表空间 # 1. 创建新临时表空间 # create temporary tablespace TEMP_NEW tempfile \u0026#39;/u01/app/oracle/oradata/WMPROD/temp_new01.dbf\u0026#39; size 31G autoextend off; 再添加第二个 tempfile：\nalter tablespace TEMP_NEW add tempfile \u0026#39;/u01/app/oracle/oradata/WMPROD/temp_new02.dbf\u0026#39; size 31G autoextend off; 2. 切换数据库默认临时表空间 # 先确认当前默认 TEMP：\nselect property_name, property_value from database_properties where property_name = \u0026#39;DEFAULT_TEMP_TABLESPACE\u0026#39;; 切换：\nalter database default temporary tablespace TEMP_NEW; 再次确认：\nselect property_name, property_value from database_properties where property_name = \u0026#39;DEFAULT_TEMP_TABLESPACE\u0026#39;; 结果：\nDEFAULT_TEMP_TABLESPACE TEMP_NEW 3. 检查是否还有用户配置旧 TEMP # set lines 300 pages 1000 col username for a30 col temporary_tablespace for a30 col account_status for a30 select username, temporary_tablespace, account_status from dba_users where temporary_tablespace = \u0026#39;TEMP\u0026#39; order by username; 如果还有业务用户使用旧 TEMP，例如 WMPROD：\nalter user WMPROD temporary tablespace TEMP_NEW; 也可以批量生成：\nset pages 0 lines 300 feedback off heading off verify off select \u0026#39;alter user \u0026#34;\u0026#39; || username || \u0026#39;\u0026#34; temporary tablespace TEMP_NEW;\u0026#39; from dba_users where temporary_tablespace = \u0026#39;TEMP\u0026#39; order by username; 本次处理时，切换默认临时表空间后，查询 dba_users where temporary_tablespace='TEMP' 已经没有记录，说明新会话默认会走 TEMP_NEW。\n删除旧 TEMP 表空间 # 切换完成后尝试删除旧 TEMP：\ndrop tablespace TEMP including contents and datafiles; 如果报：\nORA-60100: dropping temporary tablespace with tablespace ID number (...) is blocked due to sort segments 说明旧 TEMP 仍有 sort segment 或老会话残留。查 gv$sort_segment：\nset lines 300 pages 1000 col tablespace_name for a20 select inst_id, tablespace_name, current_users, total_extents, used_extents, free_extents, round(used_blocks * 8192 / 1024 / 1024, 2) used_mb, round(free_blocks * 8192 / 1024 / 1024, 2) free_mb from gv$sort_segment where tablespace_name = \u0026#39;TEMP\u0026#39; order by inst_id, tablespace_name; 本次现场结果是：\nINST_ID TABLESPACE_NAME CURRENT_USERS TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS USED_MB FREE_MB ------- --------------- ------------- ------------- ------------ ------------ ------- ------- 1 TEMP 1018 33544 1023 32521 1023 32521 这说明旧 TEMP 上仍有 1018 个使用者，不能删除。随后查询 gv$tempseg_usage 也能看到大量 WMPROD 的 INACTIVE JDBC 连接仍然挂在旧 TEMP 上。\n继续查旧 TEMP 的会话来源：\nset lines 300 pages 1000 col username for a20 col machine for a35 col program for a45 col status for a15 select s.username, s.machine, s.program, s.status, count(*) session_count, round(sum(u.blocks * p.value)/1024/1024,2) temp_mb from gv$tempseg_usage u join gv$session s on u.inst_id = s.inst_id and u.session_addr = s.saddr join gv$parameter p on p.inst_id = u.inst_id and p.name = \u0026#39;db_block_size\u0026#39; where u.tablespace = \u0026#39;TEMP\u0026#39; group by s.username, s.machine, s.program, s.status order by session_count desc; 处理选择：\n场景 建议 业务允许重启应用 重启应用连接池，让老连接释放旧 TEMP 业务允许 kill 会话 生成 kill 语句清理旧 TEMP 会话 不允许影响业务 保留旧 TEMP，等低峰窗口重启数据库 生成 kill 语句示例，RAC 环境要带 ,@inst_id：\nset lines 300 pages 0 heading off feedback off verify off spool /tmp/kill_old_temp_sessions_rac.sql select distinct \u0026#39;alter system kill session \u0026#39;\u0026#39;\u0026#39; || s.sid || \u0026#39;,\u0026#39; || s.serial# || \u0026#39;,@\u0026#39; || s.inst_id || \u0026#39;\u0026#39;\u0026#39; immediate;\u0026#39; from gv$tempseg_usage u join gv$session s on u.inst_id = s.inst_id and u.session_addr = s.saddr where u.tablespace = \u0026#39;TEMP\u0026#39; and s.username = \u0026#39;WMPROD\u0026#39; and s.status = \u0026#39;INACTIVE\u0026#39;; spool off 清理后再次确认：\nselect count(*) old_temp_sessions from gv$tempseg_usage where tablespace = \u0026#39;TEMP\u0026#39;; select inst_id, tablespace_name, current_users, used_extents, round(used_blocks * 8192 / 1024 / 1024, 2) used_mb from gv$sort_segment where tablespace_name = \u0026#39;TEMP\u0026#39;; 如果 current_users=0，再执行：\ndrop tablespace TEMP including contents and datafiles; 把 TEMP_NEW 改回 TEMP # 旧 TEMP 删除成功后，为了兼容历史脚本、监控和巡检习惯，建议把 TEMP_NEW 改回 TEMP：\nalter tablespace TEMP_NEW rename to TEMP; 确认默认临时表空间：\nselect property_name, property_value from database_properties where property_name = \u0026#39;DEFAULT_TEMP_TABLESPACE\u0026#39;; 如果仍显示 TEMP_NEW，再执行：\nalter database default temporary tablespace TEMP; 最终确认：\nset lines 300 pages 1000 col tablespace_name for a20 col file_name for a120 select tablespace_name, file_id, file_name, round(bytes/1024/1024/1024,2) size_gb, status from dba_temp_files order by tablespace_name, file_id; 期望结果：\nTABLESPACE_NAME FILE_ID FILE_NAME SIZE_GB STATUS -------------------- ---------- ------------------------------------------------------------ ---------- ---------- TEMP 1 /u01/app/oracle/oradata/WMPROD/temp_new01.dbf 31 ONLINE TEMP 2 /u01/app/oracle/oradata/WMPROD/temp_new02.dbf 31 ONLINE 三、最终结论 # ORA-01187 / ORA-01110 如果指向 TEMP 文件，本质上是 临时文件不可读或校验失败，不是业务数据损坏。处理重点重建临时表空间 TEMP_NEW 并切换默认临时表空间，旧 TEMP 因老连接和 sort segment 残留无法立即删除，最终需要释放老连接/重启后删除，并把 TEMP_NEW 改回 TEMP。\n","date":"2026-05-14","externalUrl":null,"permalink":"/posts/oracle-temp-ora-01187/","section":"文章","summary":"当 ORA-01187 / ORA-01110 指向 Oracle TEMP tempfile 时，处理重点是创建 TEMP_NEW、切换默认临时表空间、释放旧 TEMP 会话、删除旧 TEMP，并最终将 TEMP_NEW 改回 TEMP。","title":"Oracle TEMP 文件报 ORA-01187 / ORA-01110 的处理案例","type":"posts"},{"content":"","date":"2026-05-14","externalUrl":null,"permalink":"/tags/temp%E8%A1%A8%E7%A9%BA%E9%97%B4/","section":"Tags","summary":"","title":"TEMP表空间","type":"tags"},{"content":"","date":"2026-05-14","externalUrl":null,"permalink":"/tags/%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6/","section":"Tags","summary":"","title":"临时文件","type":"tags"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/invalid%E5%AF%B9%E8%B1%A1/","section":"Tags","summary":"","title":"INVALID对象","type":"tags"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/iostat/","section":"Tags","summary":"","title":"Iostat","type":"tags"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/library-cache-lock/","section":"Tags","summary":"","title":"Library Cache Lock","type":"tags"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/library-cache-pin/","section":"Tags","summary":"","title":"Library Cache Pin","type":"tags"},{"content":" 一、故障背景 # 生产数据库为 Oracle 11.2.0.4 RAC 环境。业务侧对表：\nGKSD6.SCM_LOSSINOUT_APPLY_HDR 新增了一个字段：\nBPMID 字段增加后，相关业务包没有完整重新编译和验证，导致部分 PL/SQL 包体失效。后续业务高并发访问时，大量会话调用 GKSD6.SCM_PUBLIC、GKSD6.SCM_PURBILL、FOP_SERVICE 等包，最终引发数据库严重卡顿。\n故障期间，oratop 显示数据库存在大量等待：\nlibrary cache pin library cache lock library cache: mutex X enq: TX - row lock contention 其中 GKSD6.SCM_PUBLIC PACKAGE BODY 和 GKSD6.SCM_PURBILL PACKAGE BODY 最终被确认处于 INVALID 状态；同时大量会话正在调用 SCM_PUBLIC 相关函数和过程，形成 library cache 争用。\n二、故障现象 # 业务反馈数据库很卡，应用响应缓慢，部分操作长时间无返回。\n通过 oratop 可以看到两个明显现象：\n1. 大量 enq: TX - row lock contention 2. 大量 library cache pin / library cache lock 表面上看是行锁问题，例如大量会话等待：\nenq: TX - row lock contention 但进一步分析发现，真正的问题不是单纯行锁，而是：\n部分业务会话持有 DML 行锁 ↓ 这些会话又卡在 library cache pin ↓ 事务无法提交或回滚 ↓ 后续 UPDATE / INSERT 全部等待行锁 ↓ 数据库整体表现为严重卡顿 三、核心故障链路 # 本次故障链路可以概括为：\n表 SCM_LOSSINOUT_APPLY_HDR 新增 BPMID 字段 ↓ 依赖该表或相关视图/包的 PL/SQL 对象失效 ↓ GKSD6.SCM_PUBLIC PACKAGE BODY INVALID GKSD6.SCM_PURBILL PACKAGE BODY INVALID ↓ 业务高并发调用 SCM_PUBLIC / SCM_PURBILL / FOP_SERVICE ↓ Oracle 尝试运行时校验或自动编译失效对象 ↓ 大量 library cache pin / library cache lock ↓ 部分会话已持有 DML 锁，无法继续执行完成 ↓ 引发 enq: TX - row lock contention ↓ 数据库整体卡顿 四、为什么新增字段会导致包体失效 # 正常情况下，单纯给表增加一个普通字段，不一定会导致所有包失效。但在以下场景中，表结构变更很容易引发包体失效或运行时异常：\n场景 说明 包中使用 %ROWTYPE 表结构变化后，依赖包需要重新编译 包中使用 select * into record 字段数量变化可能影响逻辑 包依赖相关视图 表字段变化后视图或包依赖链失效 包体中引用固定字段列表 新字段加入后，相关 insert/select/update 逻辑未同步 发布过程中只改表，未编译包 对象状态遗留为 INVALID 高峰期首次调用失效包 触发 library cache 争用 本次问题中，SCM_PUBLIC 的依赖对象非常多，并且依赖链中包含大量业务表、函数、包、视图等对象。检查结果显示，SCM_PUBLIC 与 SCM_PURBILL 包体均处于 INVALID 状态，而 DBA_ERRORS 查询 SCM_PUBLIC 没有直接错误记录，这种情况经常出现在对象依赖失效、运行时重编译被阻塞、或编译过程被其他会话 pin 住的场景。\n五、判断过程 # 1. 先看数据库主要等待事件 # select inst_id, event, count(*) cnt, max(seconds_in_wait) max_wait_sec from gv$session where event in (\u0026#39;library cache pin\u0026#39;, \u0026#39;library cache lock\u0026#39;, \u0026#39;library cache: mutex X\u0026#39;, \u0026#39;enq: TX - row lock contention\u0026#39;) group by inst_id, event order by inst_id, cnt desc; 如果同时出现：\nlibrary cache pin / lock 很多 enq: TX - row lock contention 很多 要警惕这不是普通行锁，而是 library cache 等待导致持锁会话无法完成。\n2. 查行锁 blocker # set lines 260 pages 1000 col blocker for a20 col holder_user for a15 col holder_event for a35 col holder_sql for a13 col sample_sql for a80 with w as ( select blocking_instance as holder_inst, blocking_session as holder_sid, count(*) as waiters, min(seconds_in_wait) as min_wait_sec, max(seconds_in_wait) as max_wait_sec from gv$session where event = \u0026#39;enq: TX - row lock contention\u0026#39; and blocking_session is not null group by blocking_instance, blocking_session ) select w.holder_inst || \u0026#39;,\u0026#39; || w.holder_sid as blocker, hs.serial#, hp.spid, hs.username as holder_user, hs.status, hs.event as holder_event, hs.sql_id as holder_sql, w.waiters, w.min_wait_sec, w.max_wait_sec, hs.last_call_et, substr(q.sql_text, 1, 80) as sample_sql from w join gv$session hs on hs.inst_id = w.holder_inst and hs.sid = w.holder_sid left join gv$process hp on hp.inst_id = hs.inst_id and hp.addr = hs.paddr left join gv$sqlarea q on q.inst_id = hs.inst_id and q.sql_id = hs.sql_id order by w.waiters desc, w.max_wait_sec desc; 本次发现大量 blocker 是：\nFOP_CMS 用户 fop_service.fop_service_unop library cache pin 说明这些会话不是普通慢 SQL，而是已经被 library cache pin 卡住，同时又持有业务表 DML 锁。\n3. 查对象是否失效 # set lines 200 pages 1000 col owner for a20 col object_name for a35 col object_type for a20 col status for a10 select owner, object_name, object_type, status, created, last_ddl_time from dba_objects where upper(object_name) in ( \u0026#39;FOP_SERVICE\u0026#39;, \u0026#39;FIN_SALINV\u0026#39;, \u0026#39;BPM_XIAOSHOUSP_CC\u0026#39;, \u0026#39;SCM_PUBLIC\u0026#39;, \u0026#39;SCM_PURBILL\u0026#39; ) order by owner, object_name, object_type; 本次关键发现：\nGKSD6.SCM_PUBLIC PACKAGE BODY INVALID GKSD6.SCM_PURBILL PACKAGE BODY INVALID 这基本确认了方向：不是普通行锁，而是包体失效后，高并发调用引发 library cache 争用。\n4. 查编译错误 # set lines 260 pages 1000 col owner for a15 col name for a35 col type for a20 col text for a160 select owner, name, type, line, position, text from dba_errors where owner = \u0026#39;GKSD6\u0026#39; and name in (\u0026#39;SCM_PUBLIC\u0026#39;,\u0026#39;SCM_PURBILL\u0026#39;) order by name, sequence; 本次 SCM_PUBLIC 查询没有明显编译错误记录，说明问题不一定是语法错误，而可能是依赖对象状态异常、运行时重编译冲突，或者编译时被其他会话 pin 住。\n5. 查包依赖对象 # set lines 260 pages 1000 col owner for a15 col name for a35 col type for a20 col referenced_owner for a20 col referenced_name for a40 col referenced_type for a20 select owner, name, type, referenced_owner, referenced_name, referenced_type from dba_dependencies where owner = \u0026#39;GKSD6\u0026#39; and name in (\u0026#39;SCM_PUBLIC\u0026#39;,\u0026#39;SCM_PURBILL\u0026#39;) order by referenced_owner, referenced_name; 如果依赖对象中包含刚刚变更过的表，例如：\nSCM_LOSSINOUT_APPLY_HDR 就要重点怀疑表结构变更导致依赖包失效。\n六、处理过程 # 1. 先阻断新业务连接 # 因为当时大量应用会话正在调用 GKSD6.SCM_PUBLIC，直接编译很容易一直等待 library cache pin。\n生产中建议优先用锁用户方式临时截流：\nalter user GKSD6 account lock; alter user FOP_CMS account lock; alter user TREASURY_CMS account lock; 注意：\n锁用户只能阻止新连接； 不会断开已有会话； 不会自动释放已有行锁。 2. 清理已有持锁和 library cache 等待会话 # 生成 kill 语句：\nset lines 300 pages 1000 col kill_cmd for a90 col username for a15 col event for a35 col sql_text for a100 select s.inst_id, s.sid, s.serial#, p.spid, s.username, s.status, s.event, s.sql_id, s.last_call_et, substr(q.sql_text,1,100) as sql_text, \u0026#39;alter system kill session \u0026#39;\u0026#39;\u0026#39; || s.sid || \u0026#39;,\u0026#39; || s.serial# || \u0026#39;,@\u0026#39; || s.inst_id || \u0026#39;\u0026#39;\u0026#39; immediate;\u0026#39; as kill_cmd from gv$session s left join gv$process p on s.inst_id = p.inst_id and s.paddr = p.addr left join gv$sqlarea q on s.inst_id = q.inst_id and s.sql_id = q.sql_id where s.type = \u0026#39;USER\u0026#39; and s.username in (\u0026#39;GKSD6\u0026#39;,\u0026#39;FOP_CMS\u0026#39;,\u0026#39;TREASURY_CMS\u0026#39;) and ( s.event in (\u0026#39;library cache pin\u0026#39;, \u0026#39;library cache lock\u0026#39;, \u0026#39;library cache: mutex X\u0026#39;, \u0026#39;enq: TX - row lock contention\u0026#39;) or lower(q.sql_text) like \u0026#39;%scm_public%\u0026#39; or lower(q.sql_text) like \u0026#39;%fop_service.fop_service_unop%\u0026#39; or lower(q.sql_text) like \u0026#39;%scm_purbill%\u0026#39; or lower(q.sql_text) like \u0026#39;%fin_salinv%\u0026#39; ) order by s.last_call_et desc; 优先处理：\n1. 正在阻塞编译的 final blocking session 2. 持有 TX 行锁的 holder 3. library cache pin / lock 时间最长的业务会话 4. 正在调用 SCM_PUBLIC / SCM_PURBILL / FOP_SERVICE 的会话 3. 编译失效包 # 先编译依赖包：\nalter package GKSD6.SCM_PURBILL compile body; show errors package body GKSD6.SCM_PURBILL; 再编译核心公共包：\nalter package GKSD6.SCM_PUBLIC compile body; show errors package body GKSD6.SCM_PUBLIC; 本次处理过程中，编译 SCM_PUBLIC 时被一个业务会话阻塞：\nSYS 会话正在执行： alter package GKSD6.SCM_PUBLIC compile body 等待： library cache pin blocking session： INST 1 / SID 705 查询发现 1,705 是 GKSD6 业务会话，正在执行：\nINSERT INTO pub_collection_dtl ... 并等待：\nlatch: row cache objects 处理该 blocker：\nalter system kill session \u0026#39;705,5\u0026#39; immediate; 之后 SCM_PUBLIC 编译成功。\n4. 确认对象状态 # set lines 200 pages 1000 col owner for a15 col object_name for a35 col object_type for a20 col status for a10 col last_ddl_time for a20 select owner, object_name, object_type, status, to_char(last_ddl_time,\u0026#39;yyyy-mm-dd hh24:mi:ss\u0026#39;) last_ddl_time from dba_objects where owner = \u0026#39;GKSD6\u0026#39; and object_name in (\u0026#39;SCM_PUBLIC\u0026#39;,\u0026#39;SCM_PURBILL\u0026#39;) order by object_name, object_type; 最终结果：\nGKSD6.SCM_PUBLIC PACKAGE VALID GKSD6.SCM_PUBLIC PACKAGE BODY VALID GKSD6.SCM_PURBILL PACKAGE VALID GKSD6.SCM_PURBILL PACKAGE BODY VALID 说明核心问题已解决。\n5. 恢复应用用户 # alter user GKSD6 account unlock; alter user FOP_CMS account unlock; alter user TREASURY_CMS account unlock; 七、故障恢复后验证 # 1. 查看等待事件是否下降 # select inst_id, event, count(*) cnt, max(seconds_in_wait) max_wait_sec from gv$session where event in (\u0026#39;library cache pin\u0026#39;, \u0026#39;library cache lock\u0026#39;, \u0026#39;library cache: mutex X\u0026#39;, \u0026#39;enq: TX - row lock contention\u0026#39;) group by inst_id, event order by inst_id, cnt desc; 2. 查看是否仍有行锁 blocker # with w as ( select blocking_instance as holder_inst, blocking_session as holder_sid, count(*) as waiters from gv$session where event = \u0026#39;enq: TX - row lock contention\u0026#39; and blocking_session is not null group by blocking_instance, blocking_session ) select w.holder_inst, w.holder_sid, hs.serial#, hs.username, hs.status, hs.event, hs.sql_id, w.waiters from w join gv$session hs on hs.inst_id = w.holder_inst and hs.sid = w.holder_sid order by w.waiters desc; 3. 查看是否还有 invalid 对象 # select owner, object_name, object_type, status, last_ddl_time from dba_objects where owner in (\u0026#39;GKSD6\u0026#39;,\u0026#39;FOP_CMS\u0026#39;,\u0026#39;TREASURY_CMS\u0026#39;,\u0026#39;SAVEFEGKSD6\u0026#39;) and status \u0026lt;\u0026gt; \u0026#39;VALID\u0026#39; order by owner, object_type, object_name; 八、故障根因总结 # 本次故障的根因可以总结为：\n业务表 SCM_LOSSINOUT_APPLY_HDR 新增 BPMID 字段后， 依赖该表或相关依赖链的 PL/SQL 包未完成重新编译， 导致 GKSD6.SCM_PUBLIC 和 GKSD6.SCM_PURBILL 包体失效。 业务高峰期大量会话并发调用失效包， 触发 library cache pin / lock 争用。 部分业务过程在持有 DML 锁后卡住， 导致后续 UPDATE / INSERT 出现 enq: TX - row lock contention， 最终表现为数据库整体卡顿。 九、经验教训 # 1. 表结构变更后必须检查 invalid 对象 # 任何生产表结构变更后，都要执行：\nselect owner, object_name, object_type, status, last_ddl_time from dba_objects where owner in (\u0026#39;GKSD6\u0026#39;,\u0026#39;FOP_CMS\u0026#39;,\u0026#39;TREASURY_CMS\u0026#39;,\u0026#39;SAVEFEGKSD6\u0026#39;) and status \u0026lt;\u0026gt; \u0026#39;VALID\u0026#39; order by owner, object_type, object_name; 不能只看 DDL 是否执行成功。\n2. 不能让业务高峰期首次调用触发自动编译 # 失效对象如果不提前编译，Oracle 可能在业务首次调用时尝试自动编译。\n低并发时可能无感知，高并发时就可能出现：\nlibrary cache pin library cache lock library cache: mutex X 严重时会放大成全局业务卡顿。\n3. 发布流程中应增加强制编译步骤 # 表结构变更后建议执行：\nalter package GKSD6.SCM_PURBILL compile body; alter package GKSD6.SCM_PUBLIC compile body; 或者对 schema 执行统一编译：\nexec dbms_utility.compile_schema(schema =\u0026gt; \u0026#39;GKSD6\u0026#39;, compile_all =\u0026gt; false); 生产环境建议优先在低峰期执行，并提前评估影响。\n4. 编译前要先控制业务入口 # 如果已经发生大量调用，不建议直接反复编译。\n正确顺序是：\n1. 阻断新连接 2. 清理已有 pin 对象的会话 3. 编译 invalid 对象 4. 验证对象状态 5. 恢复业务连接 5. 不要只杀行锁 waiter # 本次表面有大量：\nenq: TX - row lock contention 但真正根因是：\nlibrary cache pin / lock 所以只杀等待行锁的 waiter 没意义。要找到持锁 holder，以及阻塞编译或 library cache 的 blocker。\n十、建议形成标准变更检查清单 # 以后生产表结构变更后，建议固定执行以下检查：\n-- 1. 查 invalid 对象 select owner, object_name, object_type, status, last_ddl_time from dba_objects where owner in (\u0026#39;GKSD6\u0026#39;,\u0026#39;FOP_CMS\u0026#39;,\u0026#39;TREASURY_CMS\u0026#39;,\u0026#39;SAVEFEGKSD6\u0026#39;) and status \u0026lt;\u0026gt; \u0026#39;VALID\u0026#39; order by owner, object_type, object_name; -- 2. 查变更表影响了哪些对象 select owner, name, type, referenced_owner, referenced_name, referenced_type from dba_dependencies where referenced_owner = \u0026#39;GKSD6\u0026#39; and referenced_name = \u0026#39;SCM_LOSSINOUT_APPLY_HDR\u0026#39; order by owner, name, type; -- 3. 编译核心业务包 alter package GKSD6.SCM_PURBILL compile body; alter package GKSD6.SCM_PUBLIC compile body; -- 4. 查编译错误 select owner, name, type, line, position, text from dba_errors where owner = \u0026#39;GKSD6\u0026#39; order by name, sequence; -- 5. 再次确认 invalid 对象 select owner, object_name, object_type, status, last_ddl_time from dba_objects where owner in (\u0026#39;GKSD6\u0026#39;,\u0026#39;FOP_CMS\u0026#39;,\u0026#39;TREASURY_CMS\u0026#39;,\u0026#39;SAVEFEGKSD6\u0026#39;) and status \u0026lt;\u0026gt; \u0026#39;VALID\u0026#39; order by owner, object_type, object_name; 十一、文章结论 # 本次故障不是单纯的行锁问题，而是一次典型的 表结构变更后依赖包体失效，业务高并发触发 library cache 争用，最终放大为行锁阻塞 的生产事故。\n核心处理思路是：\n先定位 invalid 对象 再确认 library cache 等待 再阻断新业务连接 再清理已有 pin/锁会话 最后按依赖顺序重新编译包体 最终通过编译：\nGKSD6.SCM_PURBILL PACKAGE BODY GKSD6.SCM_PUBLIC PACKAGE BODY 并清理阻塞编译的业务会话后，两个包体恢复 VALID，故障解除。\n","date":"2026-05-09","externalUrl":null,"permalink":"/posts/oracle-package-invalid-library-cache-pin/","section":"文章","summary":"一次由表新增字段引发的 Oracle 生产故障复盘：SCM_PUBLIC、SCM_PURBILL 包体 INVALID，业务高并发触发 library cache 争用，部分会话持有 DML 锁后无法提交，最终形成 enq: TX 行锁阻塞。","title":"Oracle 表结构变更引发包体失效、library cache pin 和行锁阻塞故障处理复盘","type":"posts"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/rac/","section":"Tags","summary":"","title":"RAC","type":"tags"},{"content":" 引言 # 磁盘 I/O 是数据库性能分析中的关键因素之一。数据库的 SQL 执行、数据页读取、redo/归档写入、临时表空间排序、备份恢复等操作都会依赖底层存储性能。在生产环境中，可以通过操作系统层面的 iostat、iotop、pidstat 等工具快速观察磁盘负载、I/O 延迟、吞吐量和进程级 I/O 消耗，从而定位数据库是否存在磁盘 I/O 瓶颈。\niostat 属于 Linux sysstat 工具集，主要用于输出 CPU 与设备 I/O 统计信息。需要注意的是，iostat 默认第一组数据通常是系统启动以来的平均值，容易误导分析；生产排查时建议加 -y 跳过第一组历史平均值，只看实时采样数据。\n一、常用监控命令 # # 每 1 秒显示一次磁盘扩展统计，单位为 MB，跳过启动以来的第一组平均值 iostat -x -d -m -y 1 # 连续采样 10 次，每秒一次 iostat -x -d -m -y 1 10 # 显示所有磁盘和分区 iostat -x -d -m -p ALL -y 1 # 类似 top，按进程查看实时 I/O iotop -oPa # 查看每个进程的 I/O 统计 pidstat -d 1 # 查看 Oracle 数据库进程 I/O pidstat -d -p $(pgrep -d, -f \u0026#34;ora_.*_${ORACLE_SID}\u0026#34;) 1 # 先确认 MySQL 进程名 ps -ef | grep -i mysql | grep -v grep # 查看 MySQL 进程 I/O pidstat -d -p $(pidof mysqld) 1 # 查看 MySQL 进程下所有线程的 I/O pidstat -d -t -p $(pidof mysqld) 1 # 先确认 达梦 进程名 ps -ef | grep -i dmserver | grep -v grep # 查看指定进程 I/O，例如达梦 dmserver pidstat -d -p $(pidof dmserver) 1 # 查看 达梦 进程下所有线程的 I/O pidstat -d -t -p $(pidof dmserver) 1 二、iostat 核心指标解读 # 说明：以下阈值适用于通用数据库环境，重点以 Oracle OLTP/混合负载为基线，同时也适用于达梦、MySQL、PostgreSQL、SQL Server 等数据库的 I/O 初步判断。 实际阈值需要结合磁盘类型、RAID 级别、SAN/存储阵列、虚拟化平台、云盘规格以及业务基线综合判断。\n指标 含义 通用数据库场景参考，以 Oracle 为基线 r/s, w/s 每秒读 / 写请求次数，即 IOPS 反映数据库随机读写压力。单块 10K/15K SAS HDD 通常约 150~300 IOPS；SATA SSD 通常数千到上万 IOPS；企业级 SAS/SATA SSD 可达数万 IOPS；NVMe SSD 可达数十万 IOPS，具体取决于型号、队列深度和阵列能力 rMB/s, wMB/s 每秒读 / 写数据量，即吞吐量 反映数据库大块读写能力。HDD 单盘常见 100250 MB/s；SATA SSD 常见 400550 MB/s；企业级 SAS/SATA SSD 可达 500MB/s~数 GB/s；NVMe SSD 可达数 GB/s %util 设备忙碌时间占比，表示该设备处理 I/O 的时间比例 单块传统磁盘持续 \u0026gt; 80% 需要关注；如果同时 await 升高，通常说明磁盘接近瓶颈。对于 NVMe、多队列设备、SAN、云盘，%util 高不一定代表瓶颈，必须结合 await、aqu-sz 和数据库等待事件判断 await 平均每次 I/O 请求完成时间，单位毫秒，包含排队时间和实际服务时间 数据库最关键指标之一。Oracle redo log、控制文件、数据文件 I/O 都对延迟敏感。NVMe SSD 通常应 \u0026lt; 1ms2ms；企业级 SSD 通常 \u0026lt; 2ms5ms；SATA SSD 通常 \u0026lt; 5ms10ms；HDD 通常 \u0026lt; 10ms20ms。持续 \u0026gt; 20ms 需要重点排查，\u0026gt; 50ms 通常已经明显影响数据库性能 aqu-sz / avgqu-sz 平均 I/O 队列长度，不同 sysstat 版本字段名可能不同 表示设备队列中等待处理的 I/O 数量。持续 \u0026gt; 2 且 await 升高，说明 I/O 开始排队；高并发数据库或高性能阵列中队列可以更高，但前提是 await 仍然稳定 avgrq-sz 平均请求大小，通常以扇区为单位，1 扇区 = 512 字节 可用于判断 I/O 模式。Oracle 常见数据块大小为 8KB，也可能是 16KB、32KB；对应约 16、32、64 个扇区。小请求通常代表随机 I/O，大请求通常代表全表扫描、备份、数据泵、RMAN、并行查询等顺序 I/O rareq-sz, wareq-sz 平均读 / 写请求大小，新版本 sysstat 中更常见 用于区分读请求和写请求的大小。读请求大，可能是全表扫描、并行查询、备份读取；写请求大，可能是数据文件批量写、归档、备份、临时文件写入等 常见磁盘类型参考 # 磁盘 / 存储类型 IOPS 参考 吞吐量参考 延迟参考 数据库适用建议 7.2K SATA HDD 80~150 IOPS 100~180 MB/s 10~20ms 或更高 不建议承载核心数据库随机 I/O，可用于备份、归档、低频数据 10K / 15K SAS HDD 150~300 IOPS 150~250 MB/s 5~15ms 传统数据库环境常见，适合中低并发业务，建议配合 RAID10 SATA SSD 数千到上万 IOPS 400~550 MB/s 0.5~5ms 可用于中小型数据库，性能明显优于 HDD，但写入寿命和稳定性需关注 企业级 SAS SSD 数万 IOPS 500MB/s~数 GB/s 0.2~2ms 适合核心 OLTP 数据库，稳定性和持续写入能力更好 NVMe SSD 数十万 IOPS 数 GB/s 0.05~1ms 适合高并发、低延迟数据库场景，需关注多队列、NUMA、文件系统和调度策略 SAN 存储 取决于控制器、缓存、RAID、后端磁盘 取决于链路和阵列配置 取决于存储负载 企业 Oracle 常见架构，需要结合存储侧指标分析 云盘 / 分布式块存储 取决于购买规格 取决于购买规格 波动较大 重点关注 IOPS、吞吐上限、突发性能、云厂商限速策略 三、关键判断原则与典型现象表 # 现象 判断含义 可能原因 处理方向 %util 高，await 低 设备很忙，但响应速度正常 高性能 SSD、NVMe、多队列存储、SAN 缓存命中较好 不要单独根据 %util 判断瓶颈，继续观察数据库等待事件、SQL 响应时间和业务延迟 %util 高，await 高 磁盘忙且 I/O 响应变慢，存在明显瓶颈风险 磁盘能力不足、I/O 请求集中、存储后端繁忙、多个任务抢占同一磁盘 检查热点磁盘、数据文件、redo log、归档、备份、批处理任务 await 高，%util 不一定高 单次 I/O 延迟高，但设备未必满负载 存储链路抖动、虚拟化存储争用、SAN 后端延迟、云盘限速、磁盘故障 重点排查存储链路、云盘规格、SAN 性能、路径异常、数据库等待事件 aqu-sz / avgqu-sz 高，await 高 I/O 请求已经排队 并发 I/O 过高、存储处理能力不足、数据库大 SQL 或批处理集中运行 降低并发任务、错峰批处理、优化 SQL、提升存储能力 r/s 高，rMB/s 低 小块随机读较多 索引回表多、热点 SQL 高频访问、执行计划不合理、缓存命中率不足 检查索引、执行计划、统计信息、buffer cache 命中情况 r/s 高，await 高 随机读延迟明显 存储随机读能力不足、索引访问离散、数据分布差、热点块争用 优化 SQL 和索引，减少随机回表，检查数据库等待事件 rMB/s 高，avgrq-sz 大 大块顺序读较多 全表扫描、并行查询、RMAN 备份、Data Pump 导出、报表查询 检查大 SQL、并行度、备份任务、报表任务是否与业务高峰冲突 w/s 高，wMB/s 低 小块随机写较多 高频提交、小事务多、索引维护频繁、临时写入频繁 检查提交频率、索引数量、事务设计、临时表空间使用 wMB/s 高，await 高 大量写入且写延迟升高 redo log 写入压力大、归档写入慢、批量 DML、备份或 ETL 写入 检查 redo、归档、批量任务、备份任务、临时表空间和存储写性能 await 高但 rMB/s、wMB/s 不高 吞吐没打满，但延迟很高 随机 I/O、存储抖动、虚拟化争用、云盘 IOPS 限制、磁盘坏道或路径异常 不要只看吞吐，重点排查 IOPS、延迟、队列、存储链路和数据库等待事件 avgrq-sz 较小，r/s 或 w/s 高 小 I/O 压力较大 OLTP 随机访问、索引访问、频繁提交、热点数据访问 关注 IOPS 和延迟，优化 SQL、索引、缓存和事务提交方式 avgrq-sz 较大，rMB/s 或 wMB/s 高 大 I/O 压力较大 全表扫描、并行查询、备份、导入导出、批量装载 关注吞吐能力，检查任务时间窗口和存储带宽 CPU %iowait 高 CPU 大量时间在等待 I/O 完成 数据库 I/O 延迟高、存储响应慢、大量进程等待磁盘 结合 iostat、pidstat、top、数据库等待事件一起分析 pidstat 显示数据库进程读写很高 I/O 主要由数据库产生 SQL、大事务、备份、归档、临时空间、检查点等数据库行为 继续从数据库内部定位具体 SQL、会话、等待事件和对象 pidstat 显示非数据库进程读写很高 I/O 被外部进程抢占 备份脚本、压缩、同步、杀毒、EDR、日志采集、系统任务 调整任务时间，限制 I/O，排除非数据库进程干扰 四、生产环境建议告警阈值 # 说明：以下阈值适用于通用数据库生产环境，重点以 Oracle OLTP/混合负载为基线，同时也适用于 MySQL、PostgreSQL、达梦、SQL Server 等数据库场景。 实际告警阈值不应只依赖固定数值，应结合业务高峰期基线、磁盘类型、RAID/SAN/云盘规格、数据库等待事件和 SQL 响应时间综合判断。\n指标 关注阈值 告警阈值 严重告警阈值 说明 %util 持续 \u0026gt; 70% 持续 \u0026gt; 85% 持续 \u0026gt; 95% 且 await 升高 传统 HDD 或单队列设备上参考价值较高；NVMe、多队列、SAN、云盘环境中不能单独判断瓶颈 await SSD 持续 \u0026gt; 5ms；HDD 持续 \u0026gt; 15ms SSD 持续 \u0026gt; 10ms；HDD 持续 \u0026gt; 20ms 持续 \u0026gt; 50ms 数据库 I/O 排查最关键指标之一，表示平均 I/O 响应时间，包含排队时间和服务时间 aqu-sz / avgqu-sz 持续 \u0026gt; 2 持续 \u0026gt; 5 持续 \u0026gt; 10 且 await 升高 表示 I/O 队列深度。队列高但延迟低，可能是高性能设备正常并发；队列高且延迟高，说明 I/O 排队严重 r/s, w/s 达到历史高峰基线的 70% 达到历史高峰基线的 90% 超过历史高峰并伴随 await 升高 主要反映 IOPS 压力。小块随机读写场景下尤其重要 rMB/s, wMB/s 达到设备或云盘规格上限的 70% 达到规格上限的 85% 达到规格上限的 95% 且业务变慢 主要反映吞吐压力。备份、导入导出、全表扫描、批处理场景下重点关注 avgrq-sz 明显偏离业务基线 小 I/O 数量快速升高或大 I/O 持续打满 请求大小异常变化并伴随延迟升高 用于判断 I/O 类型变化。小请求通常偏随机 I/O，大请求通常偏顺序 I/O CPU %iowait 持续 \u0026gt; 10% 持续 \u0026gt; 20% 持续 \u0026gt; 40% 表示 CPU 等待 I/O 完成的比例。需要结合 iostat、pidstat 和数据库等待事件判断 数据库进程 kB_rd/s、kB_wr/s 明显高于日常基线 长时间维持高位 高 I/O 同时业务响应明显下降 通过 pidstat -d 判断 I/O 是否主要由数据库进程产生 非数据库进程 I/O 出现在业务高峰期 持续抢占磁盘带宽 导致数据库 await 升高 重点检查备份、压缩、同步、杀毒、EDR、日志采集、系统任务 不同磁盘类型的延迟参考 # 磁盘 / 存储类型 正常参考 关注阈值 告警阈值 说明 7.2K SATA HDD 10~20ms \u0026gt; 20ms \u0026gt; 50ms 不建议承载核心数据库随机 I/O 10K / 15K SAS HDD 5~15ms \u0026gt; 15ms \u0026gt; 30ms 传统数据库环境常见，建议配合 RAID10 SATA SSD 0.5~5ms \u0026gt; 5ms \u0026gt; 10ms 适合中小型数据库，需关注持续写入能力 企业级 SAS/SATA SSD 0.2~2ms \u0026gt; 3ms \u0026gt; 5~10ms 适合核心 OLTP 数据库 NVMe SSD 0.05~1ms \u0026gt; 2ms \u0026gt; 5ms 高性能低延迟场景，需结合队列深度判断 SAN 存储 取决于阵列和链路 明显高于历史基线 持续高于基线 2 倍以上 需要结合存储控制器、缓存、RAID、链路和多路径分析 云盘 / 分布式块存储 取决于购买规格 接近规格上限或延迟抖动 持续限速或延迟突增 重点关注 IOPS、吞吐上限、突发积分、云厂商限速策略 告警判断建议 # 生产环境中，不建议只设置单一指标告警。更推荐使用组合条件。\n告警组合 判断含义 建议动作 %util \u0026gt; 85% 且 await \u0026gt; 20ms 磁盘繁忙且 I/O 响应变慢 检查热点磁盘、数据库进程、备份、归档、批处理 aqu-sz \u0026gt; 5 且 await \u0026gt; 20ms I/O 请求排队明显 检查并发任务、存储能力、数据库大 SQL await \u0026gt; 50ms 持续 5 分钟 I/O 延迟严重 立即排查存储、数据库等待事件、系统任务 r/s 高但 rMB/s 不高，且 await 升高 小块随机读压力大 检查 SQL、索引、执行计划、缓存命中率 wMB/s 高且 await 升高 大量写入导致延迟升高 检查日志文件、归档、批量 DML、备份、ETL CPU %iowait \u0026gt; 20% 且 await 升高 系统明显等待磁盘 I/O 结合 iostat、pidstat、数据库等待事件综合定位 非数据库进程 I/O 高且数据库响应变慢 外部任务抢占磁盘 调整备份、压缩、同步、杀毒、日志采集任务 五、总结 # 生产环境中的 I/O 告警不应只看 %util，更应关注 await、aqu-sz、IOPS、吞吐量和数据库内部等待事件的组合变化。对于数据库系统来说，磁盘是否“忙”不是最关键的问题，I/O 延迟是否持续升高、请求是否排队、业务 SQL 是否变慢，才是判断 I/O 瓶颈的核心依据。\n","date":"2026-05-09","externalUrl":null,"permalink":"/posts/database-io-bottleneck-iostat/","section":"文章","summary":"一篇数据库磁盘 I/O 排查方法总结，基于 iostat 核心指标分析磁盘延迟、队列、IOPS、吞吐量和典型生产现象，并给出数据库场景下的告警阈值和判断方法。","title":"数据库磁盘 I/O 瓶颈排查：基于 iostat 的核心指标解读与生产判断方法","type":"posts"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%90%E7%BB%B4/","section":"Tags","summary":"","title":"数据库运维","type":"tags"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/%E8%A1%8C%E9%94%81%E9%98%BB%E5%A1%9E/","section":"Tags","summary":"","title":"行锁阻塞","type":"tags"},{"content":"","date":"2026-05-09","externalUrl":null,"permalink":"/tags/%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90/","section":"Tags","summary":"","title":"性能分析","type":"tags"},{"content":"","date":"2026-05-08","externalUrl":null,"permalink":"/tags/idle-in-transaction/","section":"Tags","summary":"","title":"Idle in Transaction","type":"tags"},{"content":"","date":"2026-05-08","externalUrl":null,"permalink":"/categories/postgresql/","section":"Categories","summary":"","title":"PostgreSQL","type":"categories"},{"content":"","date":"2026-05-08","externalUrl":null,"permalink":"/tags/postgresql/","section":"Tags","summary":"","title":"PostgreSQL","type":"tags"},{"content":" 1. 先确认当前连接数据库 # PostgreSQL 的 information_schema、表结构、锁对象都和当前数据库有关。先确认库：\nSELECT current_database(); 如果不在目标库，先切换：\n\\c fxzxdb 2. 查看当前是否有锁等待 # 这是第一步，先看谁在等锁：\nSELECT pid, usename, application_name, client_addr, state, wait_event_type, wait_event, now() - query_start AS query_age, left(query, 300) AS query FROM pg_stat_activity WHERE datname = current_database() AND wait_event_type = \u0026#39;Lock\u0026#39; ORDER BY query_start; 重点看这些字段：\npid 等锁会话 application_name 客户端来源，例如 DBeaver、ETL 程序 client_addr 客户端 IP state active / idle in transaction wait_event_type Lock 表示正在等锁 wait_event relation 表示等表级锁 query_age 等了多久 query 正在执行什么 SQL 你这次就查到：\nALTER TABLE public.t_ods_fxzx_tsxm_fgs_target ALTER COLUMN prc TYPE numeric USING prc::numeric; 状态是：\nwait_event_type = Lock wait_event = relation 说明这个 DDL 正在等表级锁。\n3. 查询某个 PID 被谁阻塞 # 假设等待锁的 PID 是 29739：\nSELECT a.pid, pg_blocking_pids(a.pid) AS blocking_pids, a.usename, a.application_name, a.client_addr, a.state, a.wait_event_type, a.wait_event, now() - a.query_start AS query_age, left(a.query, 300) AS query FROM pg_stat_activity a WHERE a.pid = 29739; 这次现场查出来：\n29739 | blocking_pids = {22204,28355} 说明 29739 被 22204 和 28355 阻塞。\n4. 查询阻塞源详情 # 拿到 blocking_pids 后，继续查阻塞源：\nSELECT pid, usename, application_name, client_addr, state, wait_event_type, wait_event, now() - xact_start AS xact_age, now() - query_start AS query_age, left(query, 500) AS query FROM pg_stat_activity WHERE pid = ANY(pg_blocking_pids(29739)); 重点判断：\nstate = idle in transaction wait_event_type = Client wait_event = ClientRead xact_age 很长 这类会话一般不是正在执行 SQL，而是事务开着没提交/没回滚，客户端也没继续动作。 它们会继续持有锁，导致 DDL 或后续查询排队。\n你这次的阻塞源就是：\n28355 | idle in transaction | xact_age 17:43:44 22204 | idle in transaction | xact_age 01:34:08 5. 查看某些 PID 持有什么锁 # 如果要进一步确认持锁对象，可以查 pg_locks：\nSELECT l.pid, a.usename, a.client_addr, a.application_name, a.state, l.locktype, l.mode, l.granted, l.relation::regclass AS relation_name, l.transactionid, l.virtualxid, now() - a.xact_start AS xact_age, left(a.query, 300) AS query FROM pg_locks l JOIN pg_stat_activity a ON l.pid = a.pid WHERE a.datname = current_database() AND l.pid IN (22204, 28355, 29739) ORDER BY l.pid, l.granted DESC, relation_name; 常见锁模式：\nAccessShareLock 普通 SELECT 常见 RowExclusiveLock INSERT / UPDATE / DELETE 常见 ShareLock 部分索引、约束操作可能出现 AccessExclusiveLock ALTER TABLE / DROP / TRUNCATE 等 DDL 常见，最重 DDL 等待时，重点看是否在等：\nAccessExclusiveLock ALTER TABLE 通常需要 AccessExclusiveLock，这个锁会和普通 SELECT 的 AccessShareLock 冲突，所以一个长事务 SELECT 没结束，也可能挡住 DDL。\n6. 查完整阻塞关系 # 可以查“谁阻塞谁”：\nSELECT blocked.pid AS blocked_pid, blocked.usename AS blocked_user, blocked.application_name AS blocked_app, blocked.client_addr AS blocked_client, now() - blocked.query_start AS blocked_duration, left(blocked.query, 300) AS blocked_query, blocking.pid AS blocking_pid, blocking.usename AS blocking_user, blocking.application_name AS blocking_app, blocking.client_addr AS blocking_client, blocking.state AS blocking_state, now() - blocking.xact_start AS blocking_xact_age, left(blocking.query, 300) AS blocking_query FROM pg_stat_activity blocked JOIN pg_locks blocked_locks ON blocked_locks.pid = blocked.pid JOIN pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid \u0026lt;\u0026gt; blocked_locks.pid JOIN pg_stat_activity blocking ON blocking.pid = blocking_locks.pid WHERE NOT blocked_locks.granted AND blocking_locks.granted AND blocked.datname = current_database() ORDER BY blocked.query_start; 这个 SQL 适合输出明细，但现场处理时更推荐先用：\npg_blocking_pids(pid) 因为更直接。\n7. 判断是否可以终止阻塞源 # 优先处理这类会话：\nstate = idle in transaction wait_event_type = Client wait_event = ClientRead xact_age 很长 client_addr 是应用服务器或 ETL 服务器 query 是元数据查询、SAVEPOINT、BEGIN 后长时间未结束 这次现场的 967 / 31726 / 22204 / 28355 都属于类似情况。 idle in transaction 的危险点是：SQL 已经不跑了，但事务没结束，锁不会释放。\n8. 终止阻塞源 # 先取消正在执行的 SQL：\nSELECT pg_cancel_backend(22204); SELECT pg_cancel_backend(28355); 但如果状态是 idle in transaction，pg_cancel_backend() 往往没用，因为它没有正在运行的 SQL。 这时需要终止会话，让事务回滚并释放锁：\nSELECT pid, pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid IN (22204, 28355); 也可以直接对某个等待会话的阻塞源执行：\nSELECT pid, pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid = ANY(pg_blocking_pids(29739)); 注意：pg_terminate_backend() 会断开连接，并回滚该会话未提交事务。生产环境建议先确认来源、业务影响，再执行。\n9. 终止后复查锁是否释放 # SELECT pid, usename, application_name, client_addr, state, wait_event_type, wait_event, now() - query_start AS query_age, left(query, 300) AS query FROM pg_stat_activity WHERE datname = current_database() AND wait_event_type = \u0026#39;Lock\u0026#39; ORDER BY query_start; 如果返回：\n(0 rows) 说明当前锁等待已解除。\n10. 确认 DDL 是否执行成功 # 如果是加字段：\nSELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = \u0026#39;public\u0026#39; AND table_name = \u0026#39;t_ods_fxzx_tsxm_hx_sku_kpi\u0026#39; AND column_name = \u0026#39;prc\u0026#39;; 或者：\n\\d+ public.t_ods_fxzx_tsxm_hx_sku_kpi 如果字段不存在，说明原 DDL 没有成功提交，需要重新执行。\n11. 重新执行 DDL 时加超时保护 # 不要直接执行裸 DDL，建议加 lock_timeout：\nSET lock_timeout = \u0026#39;5s\u0026#39;; ALTER TABLE public.t_ods_fxzx_tsxm_hx_sku_kpi ADD COLUMN IF NOT EXISTS prc varchar NULL; 如果拿不到锁，5 秒后失败，不会长时间排队拖死后续查询。\n如果是改字段类型，例如：\nALTER TABLE public.t_ods_fxzx_tsxm_fgs_target ALTER COLUMN prc TYPE numeric USING prc::numeric; 建议先校验数据：\nSELECT prc, count(*) FROM public.t_ods_fxzx_tsxm_fgs_target WHERE prc IS NOT NULL AND btrim(prc) \u0026lt;\u0026gt; \u0026#39;\u0026#39; AND btrim(prc) !~ \u0026#39;^[+-]?([0-9]+(\\.[0-9]+)?|\\.[0-9]+)$\u0026#39; GROUP BY prc ORDER BY count(*) DESC LIMIT 50; 因为 varchar 转 numeric 时，只要有空字符串、中文、逗号金额、N/A、- 等脏值，DDL 就会失败。\n12. 事后预防参数 # 建议给 ETL 用户加空闲事务超时：\nALTER ROLE etl_dev IN DATABASE fxzxdb SET idle_in_transaction_session_timeout = \u0026#39;10min\u0026#39;; 建议加锁等待超时：\nALTER ROLE etl_dev IN DATABASE fxzxdb SET lock_timeout = \u0026#39;30s\u0026#39;; 建议加 SQL 执行超时：\nALTER ROLE etl_dev IN DATABASE fxzxdb SET statement_timeout = \u0026#39;30min\u0026#39;; 这些参数对新连接生效，已有连接需要断开重连。\n标准处理顺序总结 # 1. 确认当前数据库 2. 查 wait_event_type = \u0026#39;Lock\u0026#39; 的会话 3. 用 pg_blocking_pids(pid) 找阻塞源 4. 查阻塞源状态、事务时长、客户端 IP、SQL 5. 判断是否 idle in transaction 6. 必要时 pg_cancel_backend() 7. idle in transaction 无效时 pg_terminate_backend() 8. 复查是否还有 Lock 等待 9. 确认 DDL 是否成功 10. 重新执行 DDL 时加 lock_timeout 11. 事后设置 idle_in_transaction_session_timeout / lock_timeout 这次案例的核心经验是：不要只盯着被阻塞的 DDL，要找根阻塞源。真正该处理的是长时间 idle in transaction 的会话，而不是第一时间杀正在等待的 DDL。\n","date":"2026-05-08","externalUrl":null,"permalink":"/posts/postgresql-lock/","section":"文章","summary":"通过 pg_stat_activity、pg_locks、pg_blocking_pids 定位 PostgreSQL 锁等待和 idle in transaction 阻塞源，并给出生产处理流程。","title":"PostgreSQL 锁排查处理流程","type":"posts"},{"content":"","date":"2026-05-08","externalUrl":null,"permalink":"/tags/%E9%94%81/","section":"Tags","summary":"","title":"锁","type":"tags"},{"content":"","date":"2026-05-08","externalUrl":null,"permalink":"/tags/%E9%98%BB%E5%A1%9E/","section":"Tags","summary":"","title":"阻塞","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":"📌 核心结论前置\nDBA 不会整体消失，但传统 DBA 会被明显重构。未来消失的不是岗位本身，而是只会人工巡检、复制粘贴命令的**\u0026ldquo;数据库操作员\u0026rdquo;**。\n最近关于 AI 替代工作的讨论越来越热。产品经理、程序员、测试工程师……每个技术岗位都在被重新审视。\n那么，数据库工程师 DBA 会不会也被 AI 取代？\n我的判断很明确：\nDBA 不会整体消失，但传统 DBA 会被明显重构。\n更准确地说，未来消失的不是 DBA 这个岗位本身，而是那种只依赖人工巡检、手工备份检查、建用户、跑脚本、处理简单告警的传统运维型 DBA。\n在 AI-first 的工作方式下，大量机械性、重复性、标准化的数据库管理工作，都会被自动化平台、智能运维系统和 AI Agent 接管：\n巡检报告自动生成 日志初步分析与慢 SQL 摘要 备份结果检查与容量趋势预测 常规参数检查与权限脚本生成 AWR / ASH / Statspack 摘要分析 但这并不意味着 DBA 没有价值了。恰恰相反，越是核心的生产数据库，越离不开真正有经验的 DBA。\n因为数据库不是普通软件组件，它承载的是企业最核心的数据资产。一旦发生性能雪崩、主备延迟、数据文件异常、归档爆满、备份不可用、锁等待堆积、数据不一致、误操作恢复等问题——\nAI 可以辅助分析，但不能替 DBA 承担生产责任。\nAI 可以告诉你 Oracle 报错的可能原因，可以总结 PostgreSQL 锁等待链路，可以对达梦数据库的 SQL_HISTORY、归档日志、执行计划做初步分析。\n但在真实生产环境里，这些判断不是知识问答，而是系统性责任：\n是否可以停库？是否可以切备？ 是否需要恢复？是否存在数据丢失风险？ 是否可以执行变更？是否会影响核心业务？ 所以，AI 时代的 DBA 不会消失，而是会从传统的\u0026quot;数据库管理员\u0026quot;，升级为更偏向生产稳定性、数据平台、自动化治理和架构判断的复合型角色。\n换句话说：AI 不会淘汰 DBA，但会淘汰不会使用 AI、不会自动化、不会做系统判断的 DBA。\nDBA 未来的核心竞争力，也不再是记住多少命令，而是在复杂生产环境中，判断数据库为什么出问题，知道如何安全恢复，并能把经验沉淀成自动化平台和标准化能力。\n下面我们就从生产环境职责出发，具体看看：哪些 DBA 工作会被 AI 替代，哪些能力反而会变得更重要。\n🔥 一、哪些 DBA 工作会被 AI 替代？ # 这些工作的替代风险最大：\n日常巡检与巡检报告生成 备份任务检查与表空间使用率统计 慢 SQL 初步分析与 SQL 改写建议 索引建议与权限脚本生成 标准安装部署与参数基线检查 日志初步解读与容量趋势报表 Data Guard 延迟初步判断 简单告警归因与重复性变更脚本 用户创建与 AWR / ASH 摘要分析 比如你现在让 AI 看一段 Oracle alert log、AWR 报告、PostgreSQL 锁等待、达梦 SQL_HISTORY，它已经能做出相当不错的初步分析。\n所以未来公司不太需要大量\u0026quot;人工查一遍、整理一遍、汇报一遍\u0026quot;的 DBA。\n结论：这类工作会被平台化、自动化、Agent 化。\n🛡️ 二、哪些 DBA 能力不会被替代？ # 真正的 DBA 价值，在生产事故和复杂系统里。这些能力 AI 很难完全替代：\n生产事故最终判断与数据库恢复决策 数据一致性判断与性能瓶颈根因定位 复杂 SQL 执行计划分析 RAC / ASM / Data Guard 故障处理 主备切换决策与数据库升级迁移方案设计 存储、网络、OS、数据库联合诊断 高可用架构设计与备份恢复体系设计 核心业务库容量规划 数据库安全与权限治理 跨数据库平台选型 重大变更风险评估 举个例子：\nAI 可以告诉你 ORA-16136、Data Guard apply lag、PostgreSQL lock wait、达梦归档暴涨可能有哪些原因。\n但真正到生产环境，你要判断的是：\n现在能不能停 MRP？ 这个数据文件能不能手工 rename？ 是否需要增量恢复？ 主库业务是否还在持续产生归档？ 当前延迟是否会导致归档空间打满？ 是否可以切备？是否会造成数据丢失？ 是否需要业务停机窗口？ 这些不是简单知识问答，而是生产责任判断。这才是 DBA 的核心壁垒。\n⚠️ 三、最危险的是哪类 DBA？ # 未来最危险的是这种 DBA：\n只会执行标准操作，只会复制粘贴命令 只会看表空间、查 alert 日志、做日常巡检 不会写自动化脚本，不会分析执行计划 不懂 OS / 存储 / 网络，不懂业务链路 不懂云数据库，不懂备份恢复原理 不敢承担生产判断 这类 DBA 本质上是\u0026quot;数据库操作员\u0026quot;。\nAI + 自动化平台 + 云数据库控制台，会大量替代这部分工作。尤其是中小公司，以后可能不会专门招一个传统 DBA。\n💎 四、最安全的是哪类 DBA？ # 未来最安全、甚至更值钱的是这种 DBA：\n懂 Oracle / PostgreSQL / MySQL / 达梦等核心数据库 懂 SQL 优化和执行计划，懂高可用架构 懂备份恢复，懂 Linux / 存储 / 网络 懂自动化脚本，懂监控平台，懂云数据库 懂数据安全，懂业务交易链路 能处理生产事故，能设计数据库架构 能把经验沉淀成工具 简单说：不是靠\u0026quot;记命令\u0026quot;吃饭，而是靠\u0026quot;判断系统问题\u0026quot;吃饭。\n这种 DBA 不会被 AI 淘汰，反而会被 AI 放大。\n🚀 五、DBA 会演化成哪些新岗位？ # 1. DBRE：Database Reliability Engineer # 核心职责从\u0026quot;管理数据库\u0026quot;变成\u0026quot;保障数据库可靠性\u0026quot;。\n可用性、性能、容量、备份恢复 故障演练、监控告警、自动化运维 SLA / SLO 管理、故障复盘 DBRE 更像数据库方向的 SRE。\n2. 数据平台工程师 # 未来很多公司不会只维护单个数据库，而是维护一整套数据平台：\nOLTP / OLAP 数据库、数据同步、数据湖 消息队列、实时计算、数据治理 数据质量、元数据管理 3. 云数据库工程师 / 架构师 # 越来越多数据库运行在云上，需要更懂架构、成本和治理的 DBA：\nRDS / PolarDB / OceanBase / GaussDB / Aurora 云上备份、跨可用区高可用、云数据库容灾 云数据库成本优化与安全 4. AI 数据基础设施工程师 # AI 应用爆发后，会产生新的数据库需求：\n向量数据库、RAG 知识库、Embedding 存储 语义检索、冷热数据分层 模型训练数据管理、AI 应用数据安全 5. AIOps DBA # 未来数据库监控是让 AI Agent 自动分析：\n异常检测、慢 SQL 归因、容量预测 告警收敛、自动生成诊断报告 自动建议修复方案、自动执行低风险变更 DBA 的角色会从\u0026quot;人工处理告警\u0026quot;变成\u0026quot;设计和监督智能运维系统\u0026quot;。\n🎯 六、DBA 未来的能力模型 # 未来 DBA 需要从单纯数据库管理员，升级成复合型模型：\n数据库内核能力 + SQL 优化能力 + 高可用与容灾能力 + Linux / 存储 / 网络能力 + 自动化能力 + 云数据库能力 + 数据安全能力 + AI 工具使用能力 + 生产事故判断能力\n其中最关键的是三项：\n1. SQL 和执行计划能力 # 无论 AI 怎么发展，SQL 性能问题仍然会大量存在。你要能看懂：\n执行计划、索引选择、统计信息、等待事件 锁等待、逻辑读、物理读、排序 Hash Join、Nested Loop、Cardinality Bind Peeking、SQL Plan Baseline、AWR / ASH AI 可以辅助分析，但 DBA 要能判断 AI 的建议是否靠谱。\n2. 备份恢复和高可用能力 # 这是 DBA 最不容易被替代的核心能力。因为恢复失败就是事故。\n你要真正理解：\n全备与增量备份、归档日志与时间点恢复 不完全恢复、Data Guard 与主备切换 RAC / ASM、归档空间与恢复窗口 RPO / RTO 会查命令不够，必须知道每个操作的后果。\n3. 自动化和脚本能力 # 未来 DBA 必须会自动化。至少要掌握：\nShell / Python / SQL 脚本、Ansible 监控 API 与告警平台 巡检自动化、报告自动生成 数据库 Agent 如果还长期靠手工巡检、手工整理 Excel 报告，风险会越来越高。\n📈 七、对 DBA 的现实建议 # 你可以按这个路线升级：\n💡 第一阶段：把传统 DBA 基础打牢 # Oracle / PostgreSQL / MySQL / 达梦（至少精通一到两个） SQL 优化、备份恢复、高可用 锁等待分析、性能诊断、日志分析 Linux 基础、存储和网络基础 这是根。没有这个基础，只学 AI 工具没有意义。\n💡 第二阶段：把日常工作自动化 # 把你每天重复做的事情脚本化：\n数据库巡检、表空间检查、归档检查 Data Guard 延迟检查、慢 SQL 抓取 锁等待分析、备份结果检查 数据库连接数检查、AWR 自动采集 巡检报告生成 目标：先用自动化淘汰自己的低价值工作。\n主动把机械工作交给工具，自己去做更高价值的判断。\n💡 第三阶段：进入 DBRE / 数据平台方向 # 不要只停留在\u0026quot;管库\u0026quot;：\n数据库可靠性、标准化、变更平台 SQL 审核平台、监控平台、容量预测 故障自愈、数据同步平台 数据治理、云数据库架构 这会让你从\u0026quot;操作型 DBA\u0026quot;变成\u0026quot;平台型 DBA\u0026quot;。\n💡 第四阶段：学习 AI 数据基础设施 # 向量数据库（Milvus、pgvector） RAG 与 Embedding Elasticsearch / OpenSearch、ClickHouse 湖仓架构、LLMOps AI 应用数据治理 AI 应用越多，背后越需要可靠的数据基础设施。\n🏁 八、最终结论 # DBA 岗位不会消失。但 DBA 会分化成两类人。\n第一类：传统操作型 DBA\n巡检、备份、建用户、跑脚本、查日志、写报告 → 这类岗位会明显减少。\n第二类：新型数据库工程师\n懂内核、懂性能、懂高可用、懂恢复 懂自动化、懂云、懂 AI 数据基础设施 能处理生产事故、能设计数据平台 → 这类人不会消失，反而会更重要。\n最准确的判断：\nAI 不会淘汰 DBA，但会淘汰不会使用 AI、不会自动化、不会做系统判断的 DBA。\nDBA 未来的核心竞争力，不是记住多少命令，而是：\n在复杂生产环境里， 判断数据库为什么出问题， 知道怎么安全恢复， 并能把经验沉淀成自动化平台。\n对你这种已经在做 Oracle、Data Guard、达梦、PostgreSQL、MongoDB、Linux 诊断的人来说，方向不是离开 DBA，而是升级成：\nDBRE / 数据库架构师 / 数据平台工程师 / AI 数据基础设施工程师\n","date":"2026-05-05","externalUrl":null,"permalink":"/posts/ai-era-dba-future/","section":"文章","summary":"AI 不会淘汰 DBA，但会淘汰不会使用 AI、不会自动化、不会做系统判断的传统操作型 DBA。未来 DBA 会向 DBRE、数据库架构师、数据平台工程师和 AI 数据基础设施工程师演进。","title":"AI 时代，数据库工程师 DBA 会不会消失？","type":"posts"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/dbre/","section":"Tags","summary":"","title":"DBRE","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B7%A5%E7%A8%8B%E5%B8%88/","section":"Tags","summary":"","title":"数据库工程师","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%B9%B3%E5%8F%B0/","section":"Tags","summary":"","title":"数据平台","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/categories/%E8%81%8C%E4%B8%9A%E6%80%9D%E8%80%83/","section":"Categories","summary":"","title":"职业思考","type":"categories"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4/","section":"Tags","summary":"","title":"自动化运维","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/","section":"Tags","summary":"","title":"风险控制","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E8%82%A1%E5%B8%82/","section":"Tags","summary":"","title":"股市","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E4%BA%A4%E6%98%93%E7%BA%AA%E5%BE%8B/","section":"Tags","summary":"","title":"交易纪律","type":"tags"},{"content":"股市不是比拼聪明的地方，而是比拼谁更少犯错的场所。\n在真正投入资金之前，先问自己一个问题：我这种人，适不适合进来？\n很多人进入股市之前，问的第一个问题是：\n买什么股票能赚钱？\n但真正更重要的问题其实是：\n我这种人，适不适合进入股市？\n股市不是一个单纯比拼聪明、学历、勤奋程度的地方。很多在现实生活中很优秀的人，一进股市反而亏得更惨。\n原因并不复杂：现实世界奖励努力和行动，而股市经常惩罚过度努力、过度交易和过度自信。\n从普通散户长期亏损的逻辑来看，真正适合股市的人，大致可以分为三类。\n◆ 第一类人：绝对理性的\u0026quot;冷血机器\u0026quot; # 第一种适合股市的人，是能够把交易彻底系统化的人。\n这类人最大的特点不是聪明，而是纪律性极强。\n普通人炒股，经常是这样的：\n股票上涨时，开始幻想还能翻倍； 股票下跌时，不愿承认判断错误； 跌破止损位时，安慰自己\u0026quot;再等等\u0026quot;； 听到所谓利好消息，又开始加仓摊平成本。 最终，买卖决策不是由交易系统决定，而是由恐惧、贪婪、侥幸心理决定。\n而真正的交易型选手完全不同。\n他们会提前设定清晰规则：\n什么条件买入； 什么条件止盈； 什么条件止损； 单笔亏损最多允许多少； 连续亏损后是否暂停交易； 什么情况下必须空仓。 一旦规则触发，就严格执行，不解释、不幻想、不找借口。\n比如一只股票跌破关键支撑位，普通人会开始到处找利好消息，安慰自己\u0026quot;主力洗盘\u0026quot;\u0026ldquo;马上反弹\u0026rdquo;。\n但冷血型交易者会直接执行止损。\n这并不是因为他们没有情绪，而是因为他们知道：\n在股市里，情绪不是判断力，而是风险源。\n这类人适合的是交易型路线。他们的核心能力不是预测市场，而是让自己成为一个稳定执行系统的人。\n但问题是，这种人极少。\n大多数人嘴上说自己能止损，真到账户亏损的时候，手就软了。大多数人说自己能执行纪律，但连续亏损几次后，就开始怀疑系统、怀疑市场、怀疑人生。\n所以，第一类适合股市的人，必须具备一个非常反人性的能力：\n亏损时不拖延，盈利时不贪婪，系统说走就走。\n做不到这一点，就不要把自己包装成交易者。\n◆ 第二类人：极度耐心的\u0026quot;周期猎手\u0026quot; # 第二种适合股市的人，不一定擅长短线交易，也不一定天天看盘。\n他们真正擅长的是等待。\n股市大部分时间并不是主升浪，而是震荡、回撤、反复试错和情绪消耗。很多散户亏钱，不是因为完全没有看对过方向，而是因为他们在真正的大机会到来之前，已经被市场消耗干净了。\n他们每天看盘，每天交易，每天追热点。\n今天追 AI，明天追新能源，后天追券商，大后天又换成低空经济。看起来很努力，实际上是在不断把本金交给市场当手续费和试错成本。\n周期猎手的打法完全不同。\n他们不急着出手，也不幻想每天赚钱。他们等的是市场周期极端位置：\n市场极度悲观； 大量优质资产被错杀； 投资者普遍谈股色变； 论坛里充满绝望情绪； 估值回到低位； 好公司也被恐慌情绪一起抛售。 这个时候，他们才会慢慢进场。\n买入之后，他们也不会天天盯盘。他们知道自己赚的不是一分钟、一小时、一天的波动，而是周期修复的钱。\n等市场重新转暖，情绪开始升温，媒体开始高喊牛市，身边不炒股的人也开始讨论开户时，他们反而开始警惕。\n别人最绝望的时候，他们出手； 别人最疯狂的时候，他们离场。\n这类人适合的是周期投资路线。\n但这条路线同样很难。\n因为等待本身就是一种能力。空仓一年不动，比每天交易更难。熊市里买入优质资产，比牛市里追涨更难。身边人都赚钱时保持冷静，比亏损时止损更难。\n周期猎手最核心的能力，不是看懂每一根 K 线，而是看懂人性和周期。\n他们不追求每天正确，只追求在大周期里站对位置。\n◆ 第三类人：拥有\u0026quot;场外现金流\u0026quot;的长期玩家 # 第三种适合股市的人，是拥有稳定场外现金流的人。\n这类人和普通散户最大的区别在于：\n他们不是靠股市生活。\n他们的主业足够稳定，现金流足够充沛，投入股市的钱是真正意义上的闲钱。\n这点非常关键。\n很多普通人之所以在股市里心态崩溃，并不是因为技术不够，而是因为资金性质错了。\n他们拿来炒股的钱，可能是：\n买房的钱； 孩子教育的钱； 养老的钱； 借来的钱； 信用卡套出来的钱； 短期内必须用的钱。 这种钱一旦进入股市，人的心态必然变形。\n股票跌 3%，他就坐立不安；股票涨 5%，他就急着落袋为安；横盘几个月，他就焦虑到怀疑人生。\n因为他亏不起，也等不起。\n而真正拥有场外现金流的人不一样。\n他们的钱来自主业，股票只是资产配置的一部分。股价短期波动，不会影响他的房贷、生活、家庭和事业。市场低迷时，他还有持续现金流可以继续买入。市场长期震荡时，他也有能力慢慢等待。\n这就是普通散户和大玩家之间最本质的差距：\n普通人用救命钱进场，大玩家用闲钱进场。\n两者的心态、时间成本和抗风险能力，完全不在一个维度。\n长期来看，股市对这类人更友好。因为他们不急着赚钱，不被短期波动逼迫，也不会因为生活压力在最低点被迫割肉。\n他们真正掌握的是两个底牌：\n低资金成本，以及足够长的时间。\n◆ 三类人背后的共同特征 # 这三类人表面看起来完全不同。\n第一类是交易者，靠纪律和系统；第二类是周期猎手，靠等待和格局；第三类是长期玩家，靠现金流和时间。\n但他们背后有三个共同点。\n1. 都具备反人性能力 # 普通人喜欢追涨杀跌，喜欢听消息，喜欢频繁交易，喜欢证明自己是对的。\n而真正适合股市的人，往往在做相反的事情：\n该止损时止损； 该空仓时空仓； 该等待时等待； 该承认错误时承认错误； 该放弃机会时放弃机会。 股市最难的地方，不是学会多少技术指标，而是控制住自己。\n2. 都知道自己赚的是什么钱 # 很多散户亏钱，是因为他根本不知道自己想赚哪类钱。\n今天想做短线，明天想做价值投资；今天说自己长期持有，跌了两天就割肉；今天说自己做波段，涨了之后又幻想十倍。\n策略混乱，行为就会混乱。\n真正适合股市的人，必须清楚自己赚的是什么钱：\n交易者赚的是规则和执行的钱； 周期猎手赚的是情绪和周期的钱； 长期玩家赚的是企业成长、分红和资产重估的钱。 如果连自己的赚钱模式都说不清，进入股市就是在随机下注。\n3. 都不会被账户波动牵着走 # 普通人盯着账户，情绪跟着 K 线走。\n涨了兴奋，跌了恐慌，横盘焦虑。账户每天波动，心态每天崩溃。\n适合股市的人，必须能把账户波动和生活情绪隔离开。\n这不是天生的，而是长期训练出来的能力。\n◆ 普通人进入股市前，先问自己三个问题 # 在真正投入资金之前，建议每个人先问自己三个问题。\n第一个问题：我能不能严格止损？ # 不是嘴上说能，而是真到账户亏损时能不能执行。\n如果你每次亏损都找理由，每次跌破计划都想再等等，那你不适合做交易。\n第二个问题：我能不能长期等待？ # 如果你一周不交易就难受，一天不看盘就焦虑，看到别人赚钱就忍不住追进去，那你不适合做周期投资。\n第三个问题：我的钱是不是绝对闲钱？ # 如果这笔钱半年内要用，一年内要用，或者亏损会影响生活质量，那它就不是闲钱。\n不是闲钱，就不要进入股市。\n因为股市不会因为你急着赚钱，就给你让路。\n◆ 结论：适合股市的人，首先不是想发财的人 # 什么样的人适合股市？\n不是最聪明的人。不是学历最高的人。不是最勤奋看盘的人。也不是消息最多的人。\n真正适合股市的人，是这三类：\n第一，能够像机器一样执行纪律的人。 第二，能够像猎手一样等待周期的人。 第三，拥有稳定场外现金流、用闲钱长期配置的人。\n如果这三类能力你一种都不具备，那么股市对你来说，大概率不是财富阶梯，而是人性放大器。\n它会放大你的贪婪、恐惧、侥幸和急躁。它会让你在上涨时高估自己，在下跌时否定自己，在震荡时消耗自己。最后，你以为自己是在投资，其实只是在用本金购买教训。\n对多数普通人来说，最稳妥的路径不是急着冲进股市，而是先把主业做好，把现金流做稳，把认知提升，把风险边界建立起来。\n当你不再指望靠股市翻身，不再用救命钱下注，不再被短期波动控制情绪时，你才真正拥有了进入股市的基本资格。\n股市适合的，从来不是急着赚钱的人。 而是那些能控制自己、能等待周期、能承受时间的人。\n注：本文仅为投资认知与风险教育内容，不构成任何具体投资建议。股票市场有风险，任何投资决策都应基于个人风险承受能力、资金性质和独立判断。\n","date":"2026-05-05","externalUrl":null,"permalink":"/posts/gushi/","section":"文章","summary":"从交易纪律、周期等待、场外现金流三个角度，分析什么样的人更适合进入股市，以及普通投资者在入市前应该建立的风险意识。","title":"什么样的人适合股市？","type":"posts"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/categories/%E6%8A%95%E8%B5%84%E8%AE%A4%E7%9F%A5/","section":"Categories","summary":"","title":"投资认知","type":"categories"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E6%8A%95%E8%B5%84%E8%AE%A4%E7%9F%A5/","section":"Tags","summary":"","title":"投资认知","type":"tags"},{"content":"","date":"2026-05-05","externalUrl":null,"permalink":"/tags/%E9%95%BF%E6%9C%9F%E6%8A%95%E8%B5%84/","section":"Tags","summary":"","title":"长期投资","type":"tags"},{"content":"","date":"2026-04-29","externalUrl":null,"permalink":"/tags/%E5%A4%9A%E6%A8%A1%E6%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/","section":"Tags","summary":"","title":"多模态数据库","type":"tags"},{"content":"","date":"2026-04-29","externalUrl":null,"permalink":"/tags/%E5%9B%BD%E4%BA%A7%E6%95%B0%E6%8D%AE%E5%BA%93/","section":"Tags","summary":"","title":"国产数据库","type":"tags"},{"content":"主持人：张乐奕Kamus 云和恩墨联合创始人 资深数据库技术专家\nAI、云数据库、AIGC、多模态数据库和国产数据库快速发展后，DBA 应该如何重新定位自己的能力边界和职业路线 每周更新，扫码👆观看 或是打开微信-视频号-搜索云和恩墨-加关注\n本文是对“云和恩墨-库库快答-张乐奕Kamus篇”系列内容的整理和延展，核心面向当前处于职业转型、技术路线选择和国产数据库学习阶段的 DBA 群体，探讨：AI、云数据库、AIGC、多模态数据库和国产数据库快速发展后，DBA 应该如何重新定位自己的能力边界和职业路线。\n第1期 数据库工程师的职业发展后期是否会自然转向“数据库管理+开发”的复合角色？ # 引言 # 很多 DBA 都在思考一个问题：数据库工程师的职业发展后期，是否会自然转向“数据库管理 + 开发”的复合角色？\n这个问题不能简单理解为“DBA 以后是不是必须会写 Java、Python、Go”。更准确地说，DBA 的未来不是单纯叠加一门开发语言，而是从传统数据库运维角色，逐步升级为具备工具化、自动化和系统化思维的数据库工程师。\n在 AI 编程能力快速提升的背景下，DBA 的核心竞争力正在发生变化：真正重要的，不只是会不会写代码，而是能不能准确描述问题、定义工具、设计诊断流程，并借助 AI 快速把想法落地成脚本、程序或自动化平台。\n一、DBA 角色正在分化：业务 DBA 与运维 DBA # 从职责边界来看，DBA 可以大致分成两类：\n第一类是偏业务侧的 DBA，也可以称为“业务 DBA”。这类角色关注业务系统中的数据库设计，例如表结构设计、索引设计、数据模型设计、业务查询模式、系统架构中的数据流转方式等。它与业务系统设计、应用架构设计、开发实现高度绑定。\n第二类是偏运维侧的 DBA，也就是传统意义上的运维 DBA。它主要关注数据库系统的稳定性、可用性、性能、安全、备份恢复、容量规划、故障诊断和应急处理。\n未来这两类角色的发展方向并不完全一样。\n业务 DBA 的一部分职责会逐渐向业务架构师、应用架构师和高级开发人员靠拢。因为数据模型和业务逻辑绑定越来越紧，很多数据库设计问题不能脱离业务上下文独立完成。因此，表结构如何设计、业务查询如何拆分、数据如何建模，往往会被业务开发团队和架构团队直接接管。\n而运维 DBA 的价值不会消失。只要企业还有数据库系统，只要数据库还承载核心交易、订单、库存、财务、供应链、会员、日志等关键数据，数据库的稳定运行、性能治理、故障恢复和风险控制就仍然需要专业能力。\n二、运维 DBA 的核心价值：让数据库持续、稳定、高效地运行 # 运维 DBA 的核心能力，不是简单执行命令，而是能够判断数据库运行状态，并在问题发生时快速定位根因。\n例如：\n数据库连接数突然升高时，能判断是应用连接池异常、慢 SQL 堵塞、网络抖动，还是数据库参数配置不合理。 系统出现 I/O 等待时，能区分是存储性能瓶颈、SQL 扫描过大、归档日志暴涨，还是备份任务与业务高峰冲突。 SQL 变慢时，能分析执行计划、统计信息、索引选择、等待事件、锁等待和数据分布。 数据库出现异常告警时，能结合 alert 日志、监听日志、系统日志、AWR/ASH、操作系统指标进行综合判断。 这些能力具有明显的经验属性和工程属性。优秀的 DBA 像“匠人”一样，知道数据库系统中哪些现象值得关注，哪些指标之间存在因果关系，哪些故障表象背后可能隐藏更深层的问题。\n这种经验不会因为 AI 出现而失效。相反，AI 会放大 DBA 的经验价值。\n三、为什么 DBA 需要“开发意识” # 过去，一个 DBA 如果想提高效率，通常会依赖已有工具，例如数据库自带的监控工具、第三方运维平台、网上下载的脚本，或者让开发人员帮忙写一些辅助程序。\n但现实问题是：通用工具往往不能完全匹配具体环境。\n不同企业的数据库版本不同、架构不同、业务模型不同、监控体系不同、故障类型不同。一个真正顺手的 DBA 工具，往往需要贴合本企业的实际场景。例如：\n自动生成巡检报告； 批量分析 alert 日志中的异常； 统计连接风暴期间的会话来源； 对比两个数据库中的表结构和数据差异； 自动提取 AWR 中的关键性能指标； 分析归档日志在某个时间段内的增长趋势； 批量检查 RAC、ASM、监听、备份任务和存储链路状态。 这些工具未必需要做成大型平台，很多时候一个 Shell 脚本、Python 脚本、SQL 脚本、HTML 报告生成器、日志分析程序，就能显著提升 DBA 的工作效率。\n因此，未来 DBA 需要具备的并不只是“开发技能”，更是“开发意识”：\n能把重复性工作抽象成流程； 能把故障诊断经验沉淀成脚本； 能把人工检查项转化为自动化巡检； 能把零散 SQL 整理成标准化报告； 能把排障思路设计成可复用工具。 这才是 DBA 与开发能力融合的本质。\n四、AI 改变的是工具生产方式，不是 DBA 的专业判断 # AI 编程能力的提升，使 DBA 不再必须从零开始掌握完整的软件开发体系。\n过去，DBA 想写一个工具，需要自己学习语法、调试代码、处理异常、封装逻辑、设计输出格式。这个过程对非开发岗位来说门槛较高。\n现在，DBA 可以把自己的需求清楚描述给 AI，例如：\n“帮我写一个 Shell 脚本，统计 Oracle alert 日志中某一天每小时 ORA 错误数量。”\n“帮我写一个 Python 程序，读取两个数据库导出的 CSV 文件，比较主键一致但字段值不同的记录。”\n“帮我写一个 SQL，查询 Oracle 当前连接数、会话状态、等待事件和来源机器，并按程序名聚合。”\n“帮我把 AWR 报告中的 DB Time、Top SQL、等待事件、Load Profile 提取成 Markdown 总结。”\nAI 可以快速生成脚本雏形，DBA 再根据实际环境进行验证、调整和固化。这样，DBA 的工具生产效率会大幅提升。\n但需要注意：AI 负责把想法转成代码，DBA 仍然负责判断问题是否成立、逻辑是否正确、指标是否可信、脚本是否安全。\n也就是说，AI 可以帮助 DBA 写工具，但不能替代 DBA 的专业判断。\n五、未来 DBA 的能力模型 # AI 时代的 DBA，能力结构会从单一数据库操作，转向“数据库专业能力 + 自动化工具能力 + 问题抽象能力”的复合模型。\n1. 数据库专业能力 # 这是 DBA 的根基，包括数据库体系结构、SQL 优化、备份恢复、高可用架构、故障诊断、存储机制、锁机制、日志机制、权限安全、参数调优等。\n没有数据库专业能力，工具做得再多也只是表面自动化，无法解决真正复杂的问题。\n2. 问题抽象能力 # DBA 需要能把现场问题抽象成清晰的问题模型。例如：\n问题发生在什么时间窗口？ 影响范围是什么？ 关键指标有哪些？ 需要采集哪些证据？ 哪些现象是原因，哪些只是结果？ 哪些检查步骤可以标准化？ 只有问题描述足够清楚，AI 才能帮助生成有效工具。\n3. 自动化和脚本化能力 # 未来 DBA 不一定要成为专业程序员，但至少要理解脚本、参数、输入输出、日志、异常处理、权限控制和执行风险。\nDBA 可以不手写所有代码，但必须能看懂代码大致逻辑，知道脚本会执行什么命令、访问什么对象、修改什么内容、产生什么影响。\n4. 工具设计能力 # 优秀 DBA 会把经验沉淀成工具。例如：\n巡检工具； 故障信息采集工具； SQL 性能分析工具； 空间容量预测工具； 日志异常分析工具； 数据一致性比对工具； 备份恢复校验工具。 这些工具越贴近实际业务环境，越能体现 DBA 的不可替代价值。\n六、DBA 不需要焦虑“会不会开发”，而要提升“能不能定义工具” # 很多 DBA 对开发能力有焦虑，担心自己不会写代码，未来会被淘汰。\n其实，真正的重点不是 DBA 必须转型成开发，而是 DBA 要具备工具化思维。\n如果一个 DBA 能清楚知道：\n我现在的工作中哪些环节重复度高； 哪些故障可以提前发现； 哪些检查可以自动化； 哪些诊断流程可以标准化； 哪些数据可以形成日报、周报、趋势图； 哪些经验可以沉淀为脚本和工具； 那么这个 DBA 即使不是传统意义上的程序员，也能借助 AI 获得接近开发者的工具生产能力。\n未来 DBA 的差距，很可能不是“谁会写更多代码”，而是“谁能更准确地定义问题、设计流程、沉淀工具”。\n结论 # DBA 的未来不是消失，而是分化和升级。\n业务侧 DBA 的部分职责会逐渐并入业务架构和应用开发体系；而运维 DBA 仍然会作为专业岗位长期存在。只不过，运维 DBA 的能力边界会继续扩展，从传统的数据库管理，延伸到自动化、脚本化、工具化和智能化运维。\nAI 的出现，使 DBA 不必完全依赖开发人员来实现工具。只要 DBA 能清楚描述需求、判断逻辑、验证结果，就可以借助 AI 快速构建属于自己的诊断工具、巡检工具和自动化工具。\n因此，未来优秀 DBA 的核心竞争力，不是简单的“数据库 + 编程语言”，而是“数据库专业判断 + 工具化意识 + AI 协作能力”。\n会使用工具的 DBA，和会创造工具的 DBA，工作效率和职业上限会明显不同。\n在 AI 时代，DBA 最值得培养的能力，是把自己的经验变成工具，把一次次排障沉淀成方法论，把个人手艺升级为可复制、可自动化、可持续改进的工程能力。\n第2期 “单一数据库引擎” 会不会被 “多模态/多引擎融合” 所取代？ # 引言：数据库架构争论正在换问题 # 过去讨论数据库产品形态时，经常会围绕一个问题展开：未来数据库会不会从“单一数据库引擎”，走向“多模态、多引擎融合”？或者反过来说，多模态数据库是否会取代传统单一数据库？\n这个问题表面上是产品形态之争，本质上却是数据库管理对象发生变化之后，评价标准也随之变化。\n如果数据库主要由人来部署、管理和使用，那么“一个数据库做所有事情”与“多个专用数据库组合使用”之间，确实存在明显取舍。但当 AI agent 开始大量创建、调用、管理数据库时，过去围绕人类运维成本形成的争论，可能会被重新定义。\n一、真实业务天然需要多模态能力 # 在真实业务系统中，数据类型从来不是单一的。\n有的业务需要处理数据仓库中的大规模结构化数据，需要 OLAP 类型的分析计算能力；有的业务需要处理 document 文档；有的业务还会涉及图像、向量、上下文、RAG 结果和长期记忆等内容。\n因此，“多模态”并不是数据库厂商制造出来的概念，而是真实业务复杂度自然增长后的结果。\n数据库系统需要面对的不再只是传统表结构数据，还包括文档、图像、向量、上下文、长期记忆和其他非结构化或半结构化数据。只要业务复杂度存在，多模态数据库能力就一定会长期存在。\n二、两种数据库路线：All in One 与专用模块组合 # 面对多模态需求，业界大体形成了两种路线。\n第一种是 All in One。典型思路是把尽可能多的能力放进同一个数据库产品里。Oracle 这类数据库长期强调的一体化能力，就是这种路线的代表。用户只需要管理一个数据库，希望这个数据库能够处理结构化数据、分析计算、文档、空间、图像、向量等多种能力。\n这种路线的优势是统一管理、统一权限、统一备份恢复、统一事务语义和统一运维模型。对很多企业用户来说，管理复杂度低，是非常重要的价值。\n第二种是 专用模块组合。很多互联网企业更倾向于选择一组开源或专用产品，每个产品只专精一个能力。例如，一个组件负责 OLTP，一个组件负责 OLAP，一个组件负责文档，一个组件负责搜索，一个组件负责向量检索，再通过脚本、自动化和平台化方式把它们组织起来。\n这种路线的优势是每个模块可以选择最适合的技术栈，性能和功能边界更清晰，也更容易按场景替换组件。\n所以，单一引擎和多引擎融合并不是简单的技术先进与落后之分，而是两种不同的工程组织方式。\n三、过去的争论，本质上是人类管理成本的争论 # 为什么过去会出现“到底应该一个数据库全包，还是多个专用数据库组合”的争论？\n核心原因在于，数据库最终还是人类在部署、管理和使用。\n有人希望只管理一个数据库，精通一个产品，把备份、监控、权限、审计、性能优化、故障处理都收敛在一个体系里。对这类用户来说，All in One 是理想选择。\n也有人认为，单一产品不可能在所有方向都做到最优。与其依赖一个大而全的数据库，不如选择一组专用产品，再通过脚本、平台、自动化工具来管理这些组件。对这类用户来说，多引擎组合更符合技术效率。\n因此，过去的路线分歧并不只是数据库内核能力之争，更是人类运维复杂度、学习成本、组织能力和自动化水平之间的权衡。\n四、AI Agent 改变了数据库的使用主体 # 当 AI agent 成为数据库的重要使用者后，问题会发生明显变化。\nAI agent 需要数据库保存 persistent memory，需要存储 context 上下文，需要保存 RAG 结果，也需要管理 Vector 向量数据。这些都要求数据库具备持久化、可检索、可管理、可快速创建和可快速销毁的能力。\n更关键的是，AI agent 与人类管理员不同。\n人类管理一百种数据库和管理一种数据库，成本差异巨大。人类需要学习产品、理解参数、处理故障、掌握备份恢复、设计权限和监控体系。\n但对 AI agent 来说，只要接口足够清晰、创建足够方便、生命周期足够自动化，管理一种数据库还是一百种数据库，差异可能并没有人类想象中那么大。\n这意味着过去围绕“人类是否管得过来”的争论，在 AI agent 时代会被弱化。\n五、未来数据库的核心评价标准：是否对 AI Agent 友好 # 未来数据库产品可能不再只追求“对人类更友好”，而要进一步追求“对 AI agent 更友好”。\n对 AI agent 友好的数据库，至少需要具备几个特征：\n低成本创建与销毁\nAI agent 需要能够快速创建临时数据库、临时 schema、临时向量空间或上下文存储区，也需要能够在任务结束后安全销毁。\n清晰的接口和元数据描述\n数据库需要让 agent 能理解自己有哪些能力、有哪些表、有哪些索引、有哪些数据类型，以及适合完成什么任务。\n自动化生命周期管理\n权限、容量、备份、清理、监控、诊断和回收都需要尽可能自动化，而不是依赖人工逐项处理。\n多模态数据支持\n结构化数据、文档、向量、上下文、RAG 结果、日志和业务对象，需要能够被统一或半统一地管理。\n可观测与可解释\nAI agent 使用数据库时，仍然需要知道查询是否低效、数据是否过期、索引是否缺失、资源是否异常。\n未来优秀的数据库，可能不是简单地把所有能力塞进一个产品，也不是简单地把所有模态拆成多个产品，而是要让 AI agent 能够稳定、低成本、可控地使用这些能力。\n六、对 DBA 的启示：运维对象将从“人用数据库”变成“Agent 用数据库” # 这对 DBA 也提出了新的要求。\n过去 DBA 的主要工作对象是业务系统、开发人员和数据库实例。未来 DBA 可能需要进一步面对 AI agent 生成的大量数据库对象、上下文存储、向量索引、临时数据集和自动化任务。\n这意味着 DBA 的能力边界会发生变化：\n- 不仅要理解传统数据库内核、SQL 优化、备份恢复和高可用； - 还要理解向量数据库、RAG 数据链路、上下文存储和 agent 工作流； - 不仅要会处理单个数据库实例的问题； - 还要能设计一套让 agent 安全创建、使用、销毁数据库资源的治理框架。\n未来 DBA 的价值，不只是“把数据库管好”，而是要让人类业务系统和 AI agent 都能安全、高效、可控地使用数据库资源。\n结论：不用纠结形态，应该关注谁在使用数据库 # “单一数据库引擎会不会被多模态、多引擎融合取代”这个问题，未来可能不会再是最关键的问题。\n真正关键的问题是：数据库的主要使用者是谁？\n如果主要使用者是人，那么统一管理、降低复杂度、减少学习成本仍然非常重要。如果主要使用者变成 AI agent，那么数据库是否容易被创建、调用、管理、销毁，是否方便 agent 理解和编排，可能会成为新的核心竞争力。\n因此，未来数据库的竞争，不只是单一引擎和多引擎之争，而是从“对人类友好”走向“对 AI agent 友好”的产品能力之争。\n对于 DBA 来说，也不必只纠结某一种数据库形态是否会胜出。更值得关注的是，如何构建面向 AI agent 的数据库治理能力、自动化能力和可观测能力。谁能把数据库变成 AI 可以安全使用的基础设施，谁就更接近数据库未来的方向。\n第3期 如何对冷热数据进行分区和存储优化？ # 引言：AIGC 正在改变“热数据”和“冷数据”的边界 # 过去 DBA 讨论存储优化时，通常会围绕一个经典问题展开：如何区分热数据和冷数据？\n传统场景下，热数据往往意味着当前业务频繁访问的数据，规模可能是几十 GB、几百 GB，或者几 TB。再往上到十几 TB，很多企业已经会觉得压力很大。如果数据规模达到百 TB 级别，通常就会被划入冷数据或历史数据范围，通过归档、分区、压缩、低成本介质等方式进行管理。\n但在 AIGC 和 AI Agent 时代，这套判断标准正在失效。\nAI 不只是消费数据，它还在持续产生数据。Token、上下文、推理过程、中间结果、memory、RAG 检索结果、向量索引、智能设备日志，这些数据在过去可能根本不存在，或者规模很小。但现在，它们可能在一次任务、一轮对话、一个 Agent 工作流中被快速生成、快速访问、快速叠加。\n这意味着：过去我们认为应该归档的 TB 级数据，在 AI 场景下可能仍然是热数据。\n一、传统冷热分离的经验边界正在被打破 # 在传统数据库运维中，冷热数据划分通常基于几个维度：访问频率、业务时效、数据创建时间、查询场景和存储成本。\n例如：\n最近几天或几个月频繁访问的数据，通常放在高性能存储上； 历史订单、历史日志、历史流水，可以迁移到低成本存储； 在线交易数据优先保障响应时间； 分析型历史数据可以接受较高延迟； SSD 用于核心热数据，HDD 或对象存储用于冷数据。 这套思路在传统业务中是成立的，因为数据增长虽然很快，但总体仍然是“人类业务活动驱动”的增长。\n然而 AIGC 的不同之处在于，它不是简单增加一类业务数据，而是引入了新的数据生产主体：AI。\n以前互联网的数据爆炸，主要是全球几十亿人不断产生内容、行为、交易和日志。现在，如果 AI 系统持续生成内容、上下文、推理链路和中间状态，那么数据增长就不再只是人类规模，而可能变成机器规模、Agent 规模和任务规模。\n二、AI 场景下，大量“中间数据”也可能是热数据 # 很多人看到 AI 最终输出时，看到的只是很短的一段答案。但在答案背后，模型可能已经经历了大量上下文读取、推理、检索、重排、工具调用和中间结果生成。\n最终返回给用户的可能只有几百字，但背后产生、读取和处理的数据，可能是最终答案的数十倍甚至数百倍。\n这些数据不一定都适合永久保存，但在当前任务周期内，它们可能非常“热”：\n当前上下文需要保留； memory 需要被持续读取； Agent 的任务状态需要持久化； RAG 检索结果需要缓存； 向量数据需要反复召回； 推理过程中的中间状态可能会被后续步骤继续使用。 这类数据的典型特点是：生命周期未必长，但访问强度可能很高；数据不一定是传统交易数据，但对当前计算任务非常关键。\n因此，在 AI 场景下，“热数据”的定义不能只看数据创建时间，也不能只套用传统业务访问频率模型。DBA 需要重新理解数据温度：它不仅取决于业务时间，还取决于 AI 工作流、任务上下文和 Agent 生命周期。\n三、几百 TB 可能仍然是热数据，PB 以后才可能变冷 # 传统场景下，百 TB 级数据通常已经足够让企业考虑归档、分层、压缩和冷存储。但在 AIGC 场景下，这个边界可能整体上移。\n如果 AI 在每一次回答前都生成大量中间数据，如果每个 Agent 都有自己的上下文、记忆、检索结果和任务状态，那么热数据规模可能不再是 GB 或 TB 级别，而是几百 TB 级别。\n也就是说，未来可能出现这样一种情况：\n几 TB 不再算大； 十几 TB 只是普通规模； 几百 TB 仍然可能是在线热数据； 只有 PB 级别以后，才开始真正进入冷数据讨论。 这对 DBA 的影响非常直接：过去依靠“热数据上 SSD，冷数据下 HDD”的策略，可能不足以支撑新的数据增长模型。\n因为当热数据规模扩大到几百 TB，甚至 PB 级别时，问题已经不是简单地选择 SSD 还是 HDD，而是整个存储成本模型和数据生命周期模型都要重新设计。\n四、只靠 SSD/HDD 分层，可能无法解决 AIGC 数据爆炸 # 传统冷热分离通常有一个默认假设：热数据占比相对较小，冷数据占比相对较大。\n只要热数据规模可控，就可以把热数据放在高性能介质上，把冷数据放在低成本介质上，从而在性能和成本之间取得平衡。\n但 AIGC 带来的挑战是，热数据本身可能快速膨胀。\n如果 AI 产生的数据中，大量数据在短时间内都需要被访问，那么热数据池会持续扩大。此时，即使全部放在 HDD 上，也不一定能承受整体容量和成本压力；如果放在 SSD 上，成本压力会更加明显。\n所以未来的关键问题，不只是“哪些数据放 SSD，哪些数据放 HDD”，而是：\n数据能不能被更高效地压缩？ 中间数据能不能快速淘汰？ Agent 记忆能不能分层治理？ 上下文数据能不能去重？ 向量索引能不能按价值和时效动态调整？ 临时推理数据是否应该持久化？持久化多久？ 数据生命周期能不能自动化管理？ 这已经超出了传统数据库存储调优的范畴，开始进入数据库、存储系统、AI 工作流和成本治理的交叉领域。\n五、未来可能需要一轮新的“存储革命” # 如果数据规模继续按照 AI 生成的速度增长，仅靠传统分层存储策略可能不够。\n未来真正需要突破的方向，可能包括两个层面。\n第一，是更高压缩率。\nAI 产生的数据中，可能存在大量重复上下文、相似向量、相似文档片段、重复推理模板和冗余中间状态。如果这些数据不能有效压缩和去重，存储成本会快速失控。\n第二，是更高密度的存储介质。\n传统 SSD、HDD 仍然受限于物理介质、成本和能耗。未来如果要承载更大规模的 AI 数据，底层存储介质、存储密度和单位成本都需要进一步突破。\n换句话说，AIGC 时代的存储优化，不只是数据库层面的参数调整，也不只是 DBA 做一次分区、压缩、归档就能解决。它可能需要存储介质、压缩算法、数据组织方式、生命周期策略和数据库管理平台共同演进。\n六、对 DBA 的技术路线启示 # AIGC 数据爆炸并不意味着 DBA 的价值下降，反而意味着 DBA 的技术边界会继续扩大。\n未来 DBA 不能只停留在传统的 SQL 优化、备份恢复、表空间管理和故障处理上，而需要进一步理解数据生命周期和存储成本模型。\n1. 从“数据库管理员”走向“数据生命周期架构师” # DBA 需要从单个实例的容量管理，升级为面向全链路的数据生命周期管理。\n不仅要知道表空间什么时候满，还要知道数据为什么增长、哪些数据有价值、哪些数据可以降级、哪些数据可以压缩、哪些数据应该删除。\n2. 从“冷热分离执行者”走向“数据温度模型设计者” # 传统冷热分离多依赖时间字段和访问频率。AI 场景下，数据温度还要结合任务状态、上下文窗口、Agent 生命周期、向量召回频率和缓存命中率。\nDBA 需要设计更动态的数据温度模型，而不是简单按日期归档。\n3. 从“存储使用者”走向“存储成本治理者” # 未来 DBA 需要更强的成本意识。SSD、HDD、对象存储、归档存储、压缩、去重、分区、分层缓存，都要纳入统一成本视角。\n尤其在 AI 场景下，存储成本不只是容量问题，还会影响训练、推理、检索、缓存和在线服务成本。\n4. 从“传统数据库能力”扩展到“AI 数据基础设施能力” # DBA 需要逐步理解向量数据库、RAG 数据链路、Agent memory、上下文存储、日志型数据、对象存储和流式数据系统。\n未来的数据库工作不再只围绕关系型数据库展开，而是围绕 AI 应用的数据底座展开。\n七、DBA 应该重点补齐哪些能力 # 面向 AIGC 时代，DBA 的技术路线可以重点补齐以下能力：\n数据生命周期治理能力； 分区、压缩、归档、清理策略设计能力； 存储分层与成本评估能力； SQL、日志、上下文、向量数据的综合分析能力； AI Agent memory 和 RAG 数据链路理解能力； 自动化巡检、容量预测和成本告警能力； Python/Shell/SQL 结合的工具化能力； 面向业务的数据价值判断能力。 未来优秀 DBA 的竞争力，不只是“会管理数据库”，而是能不能回答几个更高层的问题：\n数据为什么增长？ 哪些增长是业务必要的？ 哪些增长是 AI 中间过程带来的？ 哪些数据应该保留？ 哪些数据应该压缩？ 哪些数据可以删除？ 哪些数据必须放在高性能介质上？ 整个数据系统的成本是否可持续？ 结论：DBA 的未来，不只是调优数据库，而是治理数据爆炸 # AIGC 带来的变化，不只是数据库容量变大，而是数据生产方式发生了变化。\n过去数据主要由人和业务系统产生；未来大量数据会由 AI、Agent、智能设备和自动化任务产生。数据规模、访问模式、生命周期和价值密度都会发生变化。\n因此，DBA 未来要面对的核心问题，可能不再只是“怎么把数据库跑快”，而是“怎么让数据增长可控、成本可控、生命周期可控”。\n冷热分离仍然重要，但传统冷热分离可能不够了。未来真正重要的是：建立面向 AI 时代的数据温度模型、存储分层模型、压缩去重模型和生命周期治理体系。\n谁能从传统 DBA 走向数据生命周期和 AI 数据基础设施治理，谁就能在 AIGC 时代保持更强的技术竞争力。\n第4期 数据库除了在AI方面扩展，还能向哪些新的方向扩展？ # 引言：数据库的未来，不只是 AI 方向 # 现在谈数据库未来，很多人第一反应就是 AI：向量检索、RAG、AI for DB、DB for AI、智能调优、智能诊断、自然语言查数。\n这些方向当然重要。AI 正在改变数据库的使用方式，也正在改变 DBA 的工作方式。但是，如果只盯着 AI，容易忽略另一个更底层的问题：\n数据库除了向上支持 AI，还要防止被文件系统、操作系统和存储层向上“逆袭”。\n换句话说，数据库未来的竞争不只是“能不能支持 AI”，还包括“数据库自身的核心价值是否仍然不可替代”。\n一、AI for DB 和 DB for AI 都是必要能力，但不是全部 # 数据库向 AI 方向扩展，大体可以分成两类。\n第一类是 AI for DB，也就是用 AI 帮助数据库自己变得更智能。例如自动诊断、自动调参、SQL 优化建议、异常检测、容量预测、故障根因分析等。\n第二类是 DB for AI，也就是数据库为 AI 应用提供基础能力。例如向量检索、上下文存储、RAG 数据管理、模型推理辅助、长期记忆管理等。\n这两类能力都值得做。数据库需要更好地支持 AI，DBA 也需要掌握向量、RAG、上下文、Embedding、模型调用链路等新知识。\n但问题在于，数据库不能把未来全部押在“自己也要具备 AI 处理能力”上。数据库的核心使命不是变成大模型本身，而是要继续做好数据基础设施：安全地存储数据，高效地处理并发，可靠地返回正确结果。\n二、数据库的天然使命：安全、高效、并发、正确 # 从最本质的角度看，数据库要解决的是几个基础问题：\n数据能不能持久化存进去； 数据能不能安全保存； 多个用户能不能高并发访问； 查询结果能不能保持正确； 访问过程能不能被权限、事务和一致性机制保护； 系统发生异常后，能不能恢复到可信状态。 这才是数据库区别于普通文件系统的根本价值。\n一个 JSON 文件也可以存数据。一个程序也可以直接读取文件。小规模、低并发、低一致性要求的场景，甚至不需要数据库也能跑起来。\n但是，一旦大量并发进来，一旦多个进程同时读写，一旦涉及锁冲突、事务隔离、异常恢复、数据一致性和安全访问，普通文件方式就会暴露问题：并发难控制、锁管理复杂、文件可能写坏、回滚能力不足、审计和权限能力弱。\n数据库存在的意义，就是把这些复杂能力系统化、工程化、标准化。\n三、真正的威胁：文件系统、操作系统、存储层正在向上演进 # 很多人认为数据库的主要竞争来自其他数据库产品。但从更长期的技术演进看，数据库还要关注下层基础设施的能力上移。\n传统架构里，数据库在上层，文件系统在数据库下面，操作系统在文件系统下面，存储在更底层。\n数据库负责事务、并发、日志、MVCC、索引、恢复和一致性；文件系统负责文件读写；操作系统负责资源调度；存储负责数据落盘。\n但如果未来文件系统、操作系统甚至存储层也开始具备更强的数据管理能力，比如：\n原子写入； 事务语义； 日志回溯； 多版本管理； 更强并发控制； 数据对象级权限； 类似数据库表的结构化管理能力； 那么一部分原本属于数据库的能力，就可能被下层基础设施吸收。\n这就是所谓的“下面两层向上的逆袭”。\n四、DBOS 的启示：当 OS 天然支持事务时，边界会重新划分 # 现在已经有人在探索 DBOS 这样的方向。它的核心思想不是在操作系统上再运行数据库，而是重新思考操作系统本身：如果 OS 从设计之初就支持事务、表、状态管理和持久化，那系统软件的边界会发生什么变化？\n可以理解为：everything is table。\n如果操作系统天然具备事务能力，所有状态都可以像表一样被管理，应用状态、系统状态、任务状态、日志和数据都进入统一的数据模型，那么传统数据库的一部分职责可能会被重新分配。\n这并不意味着数据库会消失，但意味着数据库不能只盯着传统实例管理。数据库的边界会被重新定义：哪些能力保留在数据库内核，哪些能力下沉到 OS 或存储，哪些能力上升到应用框架和 AI Agent 平台，这些都会发生变化。\n五、对 DBA 的启示：不要只学 AI，也要理解数据库为什么不可替代 # 对 DBA 来说，这个话题有很强的现实意义。\n现在学习 AI 相关数据库能力是必须的。DBA 需要理解向量索引、Embedding、RAG、上下文管理、AI 查询链路、模型调用对数据库的压力，以及 AI 应用对数据生命周期的影响。\n但是，DBA 不能只把技术路线理解成“数据库 + AI”。\n更重要的是，要重新理解数据库的底层价值：\n事务为什么重要； 并发控制为什么重要； MVCC 解决了什么问题； redo/undo/WAL 日志为什么是数据库可靠性的基础； checkpoint、恢复、崩溃一致性如何保证数据可信； 文件系统、操作系统、存储介质分别承担什么职责； 数据库和下层基础设施之间的边界在哪里； 当下层能力增强时，数据库还能提供什么不可替代的价值。 未来 DBA 的竞争力，不只是会不会部署向量数据库，而是能不能理解整个数据基础设施栈。\n六、DBA 技术路线：从实例管理员走向数据基础设施工程师 # 传统 DBA 主要围绕数据库实例工作：安装、备份、监控、调优、排障、高可用、迁移、权限和容量规划。\nAI 和基础设施演进之后，DBA 的技术路线应该继续向外扩展：\n1. 向上理解 AI 数据链路 # DBA 需要理解 AI 应用如何使用数据，包括向量库、RAG、知识库、上下文存储、长期记忆、Embedding 更新、模型推理过程中的读写压力等。\n这决定了 DBA 能否支持 AI 应用稳定运行。\n2. 向下理解操作系统、文件系统和存储 # DBA 不能只停留在 SQL 和数据库参数层面，还要理解 I/O 路径、文件系统缓存、块设备、存储延迟、日志写入、刷盘机制和崩溃一致性。\n这决定了 DBA 能否判断问题到底发生在数据库层，还是文件系统、操作系统、存储层。\n3. 横向理解并发、事务和一致性 # 并发控制、事务隔离、锁、MVCC、日志恢复，是数据库的核心竞争力，也是 DBA 的专业护城河。\n只会看监控指标的 DBA，容易被自动化工具替代；真正理解数据库机制的 DBA，才能在复杂故障中做出判断。\n4. 具备架构判断能力 # 未来企业可能同时使用关系型数据库、文档数据库、向量数据库、对象存储、文件系统、消息队列和 AI Agent 状态存储。\nDBA 需要能判断：哪些数据应该进入数据库，哪些数据适合文件系统，哪些数据适合对象存储，哪些数据需要事务保护，哪些只需要最终一致性。\n这已经不是单纯运维能力，而是数据基础设施架构能力。\n结论：数据库的未来，是向上支持 AI，向下守住核心能力 # 数据库当然要支持 AI，但数据库不能只变成 AI 的附属工具。\n数据库真正要守住的，是安全存储、高并发访问、事务一致性、正确查询结果和可靠恢复能力。这些能力，是数据库区别于普通文件、文件系统和存储服务的核心价值。\n对 DBA 来说，未来的技术路线应该是双向扩展：\n一方面，向上理解 AI 应用，掌握向量、RAG、上下文和 AI 数据治理；\n另一方面，向下理解操作系统、文件系统和存储，掌握事务、并发、日志、MVCC 和崩溃恢复的底层原理。\n真正有竞争力的 DBA，不只是“会管数据库实例”的人，而是能够理解整个数据基础设施栈，并判断数据库在新架构中应该承担什么角色的人。\nAI 是数据库未来的重要方向，但不是唯一方向。数据库更长期的价值，仍然来自它能否安全、高效、正确地承载越来越多的数据和越来越多的并发访问。\n第5期 学完本地数据库运维，怎么高效转向云数据库，二者又该如何结合学习？ # 引言：云数据库不是“从头学一套新数据库” # 很多 DBA 在学完传统本地数据库运维之后，都会遇到一个问题：如果要转向云数据库，是不是意味着过去的 MySQL、PostgreSQL、Oracle、SQL Server 等经验要推倒重来？\n答案是否定的。\n云数据库并不是完全脱离传统数据库体系的新物种。无论它被部署在本地机房，还是被托管在云厂商平台上，数据库的核心问题仍然没有变：数据如何存储，SQL 如何解析，执行计划如何生成，事务如何保证一致性，索引如何发挥作用，日志如何支撑恢复，性能瓶颈如何定位。\n因此，从本地数据库转向云数据库，真正要完成的不是“重新学习数据库”，而是把已有数据库能力迁移到云原生管理模型中。\n一、云数据库的底层概念仍然来自传统数据库 # 如果只是把 MySQL 或 PostgreSQL 放到云上，哪怕云厂商在此基础上做了一些增强或变体，例如类似 Aurora 这样的产品，它的底层数据库概念仍然是熟悉的。\n数据库仍然需要存储引擎，需要 SQL 引擎，需要优化器，需要执行计划，需要缓存、日志、事务、索引和统计信息。慢 SQL 为什么慢，执行计划为什么变化，索引为什么失效，锁等待为什么发生，连接数为什么打满，这些问题并不会因为数据库上了云就消失。\n对于 DBA 来说，这意味着传统数据库基本功仍然是云数据库能力的根基。\n不会 SQL 优化的人，上了云也很难真正做好云数据库优化；不理解事务、锁、日志和执行计划的人，即使会点云控制台，也只是会操作界面，而不是具备数据库治理能力。\n二、云数据库新增的是“云平台组件”和“控制面能力” # 云数据库与本地数据库最大的差异，并不在于 SQL 本身，而在于数据库外围的管理方式发生了变化。\n本地数据库中，DBA 经常直接接触服务器、操作系统、文件系统、存储、多路径、监听、备份目录和系统日志。到了云数据库，很多底层细节被云厂商托管起来，DBA 不再直接登录服务器处理每个细节，而是通过云平台提供的控制面进行管理。\n因此，DBA 需要补充学习的是：\n云数据库实例、规格、参数组、版本和补丁机制； 主备、高可用、多可用区、只读副本和故障切换机制； 云存储、分布式存储、计算存储分离架构； VPC、子网、安全组、白名单、私网连接和公网访问； 云监控、告警、审计、备份恢复和快照； 云厂商提供的 API、SDK、CLI、Terraform 等自动化接口。 这些能力不是替代数据库基本功，而是在数据库基本功之上增加了一层云原生管理能力。\n三、不要只学云控制台，要学云数据库 API # 如果 DBA 只把云数据库理解成“在控制台点几下创建实例”，那就低估了未来云数据库运维的变化。\n过去使用云数据库，很多操作确实可以通过控制台完成：选择实例规格、选择版本、配置存储、设置网络、开启备份、创建只读实例、调整参数组，然后点击下一步完成。\n但在 AI Agent 时代，这种手工点击式操作会越来越弱化。\n未来真正重要的是：云厂商是否提供完整、稳定、可编程的 API；DBA 是否知道如何通过 API 创建、查询、修改、扩缩容、备份、恢复、释放和监控云数据库资源。\n换句话说，DBA 不仅要知道“这个按钮在哪里”，更要知道“这个按钮背后对应哪个 API、哪个参数、哪个权限、哪个资源模型”。\n四、AI Agent 会改变云数据库的管理方式 # 未来数据库创建和管理，很可能不再主要由人手工完成，而是由 AI Agent 调用云厂商 API 自动完成。\n例如，业务需要一个临时测试库，Agent 可以根据需求自动创建云数据库实例；任务结束后，Agent 可以自动释放资源。某个系统读压力升高，Agent 可以根据规则扩展只读副本；某个实例容量接近阈值，Agent 可以触发扩容或归档策略。\n这意味着，云数据库的管理对象会从“人操作控制台”转向“Agent 调用 API”。\n对 DBA 来说，真正需要学习的不只是某个云厂商的界面，而是云数据库的资源模型、API 调用方式、权限边界、自动化流程和安全治理。\n五、DBA 的技术路线：从数据库运维走向云原生数据治理 # 在这个变化下，DBA 的技术路线可以分为四层。\n1. 数据库基本功 # 这是任何路线的基础。包括 SQL 优化、执行计划、索引、事务、锁、日志、备份恢复、高可用、容量规划、参数调优和故障诊断。\n没有这层能力，云数据库只是一个黑盒服务，出了问题只能看控制台告警，无法判断根因。\n2. 云数据库产品能力 # DBA 需要理解云数据库与自建数据库的差异，包括高可用架构、存储架构、备份机制、参数管理、升级机制、监控指标和费用模型。\n尤其要理解云厂商隐藏了哪些底层细节，又暴露了哪些可调能力。\n3. API 与自动化能力 # 未来 DBA 需要掌握云数据库 API、CLI、SDK、Terraform、脚本化巡检、自动化创建、自动扩缩容、自动备份校验和自动化报告生成。\n这不是要求 DBA 转型成纯开发，而是要求 DBA 具备用程序化方式管理数据库资源的能力。\n4. AI Agent 协作能力 # AI Agent 要安全管理数据库，必须依赖清晰的权限、标准化 API、可观测指标和可靠的操作流程。\nDBA 需要设计规则：Agent 能创建什么资源，能修改什么参数，能否删除实例，备份保留多久，操作是否需要审批，异常如何回滚，审计如何记录。\n这将成为未来 DBA 的新价值点。\n六、DBA 应该如何学习云数据库 # 从学习路径上看，不建议直接从云厂商控制台开始背操作步骤，而应该采用“本地概念映射云能力”的方式。\n例如：\n本地数据库的备份恢复，对应云数据库的自动备份、快照、PITR 和跨区域备份； 本地数据库的主备复制，对应云数据库的多可用区、只读副本和故障切换； 本地数据库的参数文件，对应云数据库的参数组； 本地数据库的操作系统监控，对应云平台监控指标； 本地数据库的防火墙和监听配置，对应 VPC、安全组、白名单和 endpoint； 本地脚本运维，对应云 API、CLI、SDK 和 IaC。 这样学习，DBA 能更快把已有经验迁移到云环境，而不是把云数据库当成一个完全陌生的产品。\n结论：云数据库时代，DBA 不是少学了，而是学习对象变了 # 云数据库并不意味着 DBA 可以不懂数据库底层，也不意味着传统 DBA 经验失效。相反，数据库基本功仍然是判断问题、优化性能和保障稳定性的核心。\n真正变化的是管理方式：从登录服务器操作数据库，变成通过云平台、API、自动化工具和 AI Agent 管理数据库资源。\n未来 DBA 的竞争力，不只是会不会点云控制台，而是能不能理解云数据库背后的数据库原理、云架构和 API 控制面。\n更准确地说，AI Agent 时代的 DBA 技术路线应该是：\n数据库基本功 + 云数据库架构理解 + API 自动化能力 + AI Agent 治理能力。\n谁能把传统数据库经验迁移到云原生和自动化体系中，谁就更容易在未来的 DBA 职业发展中占据主动。\n第6期 面对庞大的文档、技术社区和碎片化信息，怎么判断哪些知识值得深入？ # 引言：DBA 面临的不是资料太少，而是资料太多 # 现在的 DBA 学习环境，已经和过去完全不同。\n过去想学习 Oracle、MySQL、PostgreSQL、达梦、MongoDB、RAC、ASM、备份恢复、SQL 优化，最大的问题是资料不好找。现在的问题反过来了：资料太多，文档太多，博客太多，社区讨论太多，短视频、公众号、论坛、官方手册、故障案例、脚本片段到处都是。\n在信息爆炸的时代，DBA 真正困难的不是“有没有资料”，而是：\n哪些资料值得深入？ 哪些内容只是碎片化经验？ 哪些知识和自己的工作目标有关？ 哪些文档应该先看，哪些可以暂时不看？ 如何把分散资料变成一条可执行的学习路线？ 这正是 AI 可以发挥价值的地方。\n一、碎片化资料的最大问题：看得很多，但难以形成体系 # DBA 工作天然容易陷入碎片化学习。\n今天遇到 ORA- 错误，就搜一篇 Oracle 故障文章；明天遇到 PostgreSQL 锁等待，就找一段 SQL；后天遇到达梦归档暴涨，又临时翻官方文档；再过几天遇到 RAC、ASM、监听、连接风暴、AWR、慢 SQL，又继续搜索新的资料。\n这种学习方式有一个明显问题：短期解决问题有效，长期沉淀能力不足。\n因为这些资料之间缺少连接：\n错误现象和底层机制没有连接； 单个脚本和完整诊断流程没有连接； 官方文档和现场案例没有连接； 学习资料和个人技术路线没有连接。 最后的结果就是：收藏夹越来越多，笔记越来越散，但真正能复用的知识体系没有建立起来。\n二、AI 时代，DBA 不必再人工筛选所有资料 # 进入 AI 时代后，DBA 的学习方式应该发生变化。\n过去需要人自己判断：这篇文档值不值得看？这个知识点是不是重点？这个参数和我的场景有没有关系？这个案例能不能复用？\n但现在，AI 可以承担一部分“知识筛选器”的角色。\nDBA 可以把官方文档、技术博客、故障案例、巡检脚本、AWR 报告、告警日志、内部操作手册、数据库参数说明、厂商最佳实践等资料统一交给 AI，然后让 AI 帮助完成初步整理：\n提取核心知识点； 区分基础概念和高级主题； 找出与目标任务相关的章节； 生成学习路径； 总结常见故障模式； 输出排障 checklist； 把零散内容整理成结构化笔记。 这里的关键不是让 AI 替代 DBA 判断所有事情，而是让 AI 帮 DBA 降低资料筛选成本。\n三、真正重要的是先定义目标，而不是先收集资料 # 视频中的一个观点很关键：不要先问“我应该学习什么”，而应该先告诉 AI“我要做什么”。\nDBA 学习资料时，必须带着明确目标。因为数据库知识太庞大，如果没有目标，很容易陷入无边界学习。\n例如：\n目标是“排查 Oracle 连接风暴”，那学习重点应该是 listener.log、v$session、processes/sessions 参数、连接池、LOCAL=NO、网络超时、操作系统资源限制。 目标是“优化 PostgreSQL 锁等待”，那学习重点应该是 pg_locks、pg_stat_activity、事务隔离级别、阻塞链、长事务、索引和执行计划。 目标是“掌握达梦备份恢复”，那学习重点应该是归档、全备、增备、备份集、还原恢复流程、备份任务调度和故障校验。 目标是“学习云数据库”，那学习重点应该是实例规格、参数组、备份策略、高可用架构、VPC、安全组、监控指标、API 和自动化编排。 目标不同，资料的优先级完全不同。\n所以 DBA 使用 AI 学习时，最重要的第一步不是上传资料，而是定义目标：我要解决什么问题？我要掌握什么能力？我要输出什么成果？\n四、NotebookLM、RAG 与个人 DBA 知识库的价值 # 以 NotebookLM 或类似 AI 知识库工具为例，DBA 可以把大量资料集中进去，让 AI 基于这些资料进行问答、总结和规划。\n这类工具对 DBA 尤其有价值，因为 DBA 的知识来源非常复杂：\n官方文档； 厂商白皮书； 内部运维规范； 故障复盘报告； 巡检脚本； SQL 诊断脚本； AWR/ASH 报告； alert 日志； listener 日志； 操作系统日志； 存储和网络排障记录。 过去这些资料分散在不同地方，很难统一检索。未来 DBA 应该逐步构建自己的个人知识库，甚至团队级 DBA 知识库。\n这个知识库不只是“资料仓库”，而应该具备三个能力：\n检索能力：能快速找到与当前问题相关的资料。 总结能力：能把长文档压缩成核心知识点。 规划能力：能根据目标生成学习路线、排障步骤和工具清单。 这本质上就是面向 DBA 的 RAG 能力：把数据库文档和现场经验放进知识库，再让 AI 根据真实问题调用相关资料。\n五、DBA 的学习路线要从“被动搜索”转向“主动编排” # 传统 DBA 学习方式通常是被动的：遇到问题，搜索资料，临时解决。\nAI 时代，DBA 应该把学习路线主动编排出来。\n例如要学习“Oracle 性能诊断”，可以让 AI 根据资料生成以下路线：\n先理解数据库时间模型：DB Time、CPU Time、Wait Time。 再学习等待事件分类：I/O、锁、闩锁、网络、提交、并发。 接着学习 AWR/ASH 的关键章节。 然后学习 Top SQL、执行计划、统计信息和索引选择。 最后结合真实案例做诊断演练。 要学习“达梦数据库运维”，可以生成：\n架构基础； 用户和权限； 表空间和存储； 归档和备份恢复； SQL 性能分析； AWR/监控能力； 故障处理案例； 自动化巡检脚本。 这样学习就不再是碎片堆积，而是围绕目标形成路径。\n六、AI 可以帮 DBA 取舍资料，但不能替代 DBA 验证结论 # 需要注意的是，AI 帮助筛选资料，并不代表 DBA 可以完全放弃判断。\n数据库是高风险系统。任何建议都必须经过验证，尤其是涉及以下内容时：\n参数修改； 索引调整； SQL 改写； 备份恢复； 主备切换； RAC/ASM 操作； 存储扩容； 权限变更； 数据修复。 AI 可以告诉 DBA“哪些知识点值得看”，也可以生成学习计划、排障流程和脚本雏形，但 DBA 必须负责判断：\n资料来源是否可靠； 版本是否匹配； 场景是否一致； 脚本是否安全； 结论是否经过验证； 操作是否可回滚。 未来 DBA 的核心能力，不是盲目相信 AI，而是能用 AI 提高资料处理效率，同时保留专业判断和风险控制能力。\n七、DBA 技术路线的新方向：知识治理能力 # 从技术路线看，DBA 未来不只是管理数据库实例，还要管理知识资产。\n这包括：\n把故障案例沉淀成复盘文档； 把常用 SQL 整理成诊断脚本库； 把巡检步骤标准化为 checklist； 把官方文档整理成专题学习笔记； 把日志分析过程沉淀成自动化工具； 把个人经验沉淀为团队可复用知识库。 也就是说，DBA 的长期竞争力会从“我知道某个问题怎么处理”，升级为“我能把问题处理方法沉淀为体系，让自己、团队和 AI 都能复用”。\n这就是 DBA 的知识治理能力。\n结论：未来 DBA 的差距，不在于谁收藏了更多资料 # 信息爆炸时代，资料本身已经不再稀缺。真正稀缺的是目标定义能力、资料筛选能力、知识结构化能力和验证能力。\nDBA 不应该继续停留在“到处找文章、到处收藏脚本”的阶段，而应该借助 AI，把碎片资料变成结构化知识，把学习目标变成学习路线，把现场经验变成可复用工具。\n未来优秀 DBA 的能力模型会变成：\n数据库专业判断 + 明确目标定义 + AI 知识筛选 + 个人知识库建设 + 实战验证能力。\n在 AI 时代，DBA 不必自己判断所有资料是否值得深入，但必须清楚自己要解决什么问题。只要目标足够明确，AI 就可以帮助 DBA 从庞大的文档、技术社区和碎片化信息中，提取真正有价值的知识，并形成可执行的学习计划。\n这才是 DBA 面对信息爆炸时最值得升级的技术路线。\n第7期 学习数据库是该专精还是广学？精通的标志是什么？ # 引言：DBA 的“精通”标准正在变化 # 过去评价一个 DBA 是否资深，常常会看他掌握了多少数据库产品：Oracle、MySQL、PostgreSQL、SQL Server、达梦、MongoDB、Redis、OceanBase、TiDB……会得越多，似乎越能证明能力越强。\n但在 AI 快速发展的背景下，这个判断标准正在发生变化。\n未来 DBA 的核心竞争力，可能不再是“我能手工操作多少种数据库”，而是“我是否理解数据库问题的本质，是否能判断故障发生的位置，是否能甄别解决方案是否正确，是否能让 AI 安全、准确、快速地完成数据库管理任务”。\n也就是说，DBA 的技术路线正在从“精通多个数据库产品”，转向“精通数据库问题模型 + 精通 AI 协作管理数据库”。\n一、什么才叫精通数据库 # 精通数据库，并不等于知道某个数据库内部所有代码是怎么写的。\n对 DBA 来说，真正的精通，更多体现在问题发生时的判断能力。比如数据库出现故障后，能不能判断问题可能出在哪一层：\nSQL 层； 优化器层； 执行计划层； 事务与锁层； Buffer Cache 或内存层； Redo、Undo、归档日志层； 存储引擎层； 网络、文件系统、操作系统或存储层。 DBA 不一定要知道每一行内核代码如何实现，但至少要理解数据库产品的整体设计，知道它有哪些核心组件，每个组件大致参与什么工作，以及某类问题更可能发生在哪个位置。\n更重要的是，DBA 需要能够寻找解决方案，并判断这个解决方案是否适用于当前环境。\n这才是“精通”的关键：不是死记命令，而是具备定位问题、识别方案、验证结果和回到现场解决问题的能力。\n二、未来不是精通更多数据库，而是精通如何管理数据库 # 过去 DBA 的成长路径通常是：先精通一个数据库，再学习第二个数据库，之后再扩展到第三个数据库。\n这个过程非常耗时。一个努力且具备一定天赋的人，从初步认识一个数据库，到熟悉它，再到真正精通它，通常也需要一到三年时间。如果继续学习第二个、第三个数据库，五六年时间也许只能较深入掌握几个产品。\n但 AI 的学习和知识覆盖速度远高于人类。\nAI 可以在短时间内掌握大量数据库产品的操作文档、命令语法、参数说明、常见故障和处理流程。它不需要像人类一样用几年时间慢慢积累一个产品的使用经验。\n因此，如果 DBA 仍然只把目标设定为“我要再精通几个数据库产品”，就可能面临明显的效率劣势。\n未来更值得投入的是：如何让 AI 帮助自己操作数据库、管理数据库、诊断数据库、生成脚本、整理报告和辅助决策。\n三、AI 时代 DBA 的新能力：会写 Prompt 和 Requirement # AI 并不会自动知道 DBA 想要什么。它需要明确的问题描述、输入条件、边界限制和结果要求。\n因此，未来 DBA 很重要的一项能力，是把数据库问题准确转化为 AI 可以执行的任务。\n例如，不是简单地问：\n数据库慢了怎么办？\n而是要能提出：\n请根据 Oracle 11g RAC 环境，在指定时间窗口内，从 AWR、ASH、alert 日志、监听日志和操作系统指标中提取连接数、等待事件、Top SQL、I/O 等关键证据，生成一份故障分析报告，并标注可能原因和后续验证 SQL。\n这类表达本质上就是面向 AI 的 requirement。\n未来 DBA 不一定要手写所有脚本，但要能清楚定义：\n要解决什么问题； 需要采集哪些证据； 哪些操作只读，哪些操作有风险； 输出格式是什么； 如何验证结果是否可信； 什么情况下必须人工确认。 会写 prompt 只是表层能力，会定义 requirement 才是更高层能力。\n四、不能只会操作 AI，而忘记数据库本身 # AI 带来的另一个风险是：新一代技术人员可能越来越会和 AI 对话，却越来越不了解 AI 背后真正操作的软件系统。\n如果未来所有人都只知道“让 AI 去做”，却不知道 AI 在数据库里执行了什么 SQL、改了什么参数、删除了什么对象、触发了什么风险，那么数据库管理会变得非常危险。\nDBA 必须保留对底层机制的理解。\n例如：\nAI 建议重建索引，DBA 要知道这会带来什么锁、什么日志量、什么空间消耗； AI 建议修改参数，DBA 要知道这个参数是否动态生效，是否影响实例稳定性； AI 建议清理数据，DBA 要知道事务、备份、归档和审计风险； AI 生成 SQL，DBA 要能判断执行计划是否合理，是否会造成全表扫描或锁等待； AI 生成恢复步骤，DBA 要能判断恢复顺序、时间点和数据一致性是否正确。 未来最危险的不是不会用 AI，而是只会用 AI，却失去数据库基本功。\n五、DBA 的技术路线应该如何调整 # 在 AI 时代，DBA 的学习路线不应该简单变成“再多学几个数据库产品”，而应该调整为四个方向。\n1. 继续夯实数据库基本功 # 无论 AI 怎么发展，数据库基本原理仍然是 DBA 的根基。\n必须持续理解：\n事务与一致性； 锁与并发控制； 索引与执行计划； 日志与恢复机制； 内存与缓存结构； 存储引擎与 I/O； 高可用、备份恢复和容灾； 安全、权限和审计。 这些能力决定 DBA 是否能判断 AI 输出是否可靠。\n2. 建立跨数据库的问题模型 # 不要只记某一个数据库的命令，而要抽象共性问题。\n例如：\n连接风暴如何定位； 慢 SQL 如何拆解； 锁等待如何分析； 存储 I/O 瓶颈如何确认； 日志暴涨如何排查； 主备延迟如何判断； 数据不一致如何验证。 一旦形成问题模型，就可以把 Oracle、MySQL、PostgreSQL、达梦等不同数据库中的具体命令映射进去。\n3. 学会让 AI 生成工具，而不是只问答案 # DBA 应该把 AI 当成工具生成器，而不是简单问答机器人。\n比如让 AI 生成：\n巡检脚本； AWR/ASH 分析模板； 慢 SQL 诊断 SQL； alert 日志解析脚本； 数据一致性比对工具； 备份恢复校验 checklist； 数据库故障报告模板。 这样 AI 才能真正变成 DBA 的生产力，而不是停留在“给建议”的层面。\n4. 建立 AI 操作数据库的安全边界 # 未来 AI 可能直接参与数据库运维，但这必须有边界。\nDBA 需要设计：\n哪些操作 AI 只能建议，不能执行； 哪些操作必须人工审批； 哪些账号只能只读； 哪些脚本必须在测试环境验证； 哪些变更必须有回滚方案； 哪些结果必须二次校验。 AI 可以加速运维，但不能绕过数据库治理。\n六、未来 DBA 的价值：成为 AI 与数据库之间的控制层 # 未来真正有价值的 DBA，不是单纯和 AI 比谁知道的数据库产品更多。\nAI 擅长快速读取文档、生成脚本、总结案例和输出方案；DBA 擅长理解现场环境、判断风险、确认边界、验证结果和承担责任。\n因此，DBA 的角色会从“手工操作数据库的人”，升级为“AI 与数据库之间的控制层”。\n这个控制层要负责：\n把业务问题转化为数据库问题； 把数据库问题转化为 AI 可执行任务； 审核 AI 输出是否正确； 控制 AI 操作边界； 将一次故障沉淀为工具和流程； 建立面向 AI 的数据库治理体系。 结论：精通数据库的终点，是掌握问题和工具的控制权 # AI 时代，DBA 不必焦虑自己是否能手工精通所有数据库产品。人类不可能在知识覆盖速度上超过 AI。\n但 DBA 仍然有不可替代的价值：理解数据库运行机制，判断问题发生位置，甄别解决方案是否可靠，定义 AI 的任务边界，并让 AI 安全地参与数据库管理。\n未来 DBA 的技术路线，不是“数据库产品数量竞赛”，而是：\n数据库基本功 + 跨数据库问题模型 + AI Prompt/Requirement 能力 + 自动化工具能力 + 操作安全治理能力。\n谁能把数据库经验转化为 AI 可执行的流程，谁就能在 AI 时代继续保持 DBA 的专业壁垒。\n第8期 国产数据库文档资料相对匮乏，该怎么学习并掌握它？ # 引言：资料少不是最大问题，学习方法才是关键 # 很多 DBA 在学习国产数据库时，都会遇到一个现实问题：官方文档、社区文章、案例资料、故障分析和生产实践，相比 Oracle、MySQL、PostgreSQL 等成熟生态，确实没有那么系统、完整和丰富。\n但这并不意味着国产数据库无法学习，也不意味着 DBA 必须等到资料完全成熟以后再进入。\n真正的问题不是“有没有足够多的文档”，而是 DBA 有没有能力把有限资料拆解、验证、补全，并沉淀成自己的知识体系。\n对于 DBA 来说，国产数据库学习路线不能只停留在“看官方文档”和“记命令”层面，而应该升级为一种问题驱动、实验验证、知识沉淀和 AI 辅助分析结合的学习方式。\n一、国产数据库文档并不是完全缺失，而是深度和案例不足 # 现在很多国产数据库的文档已经比早期丰富很多。安装部署、基本 SQL、备份恢复、高可用配置、参数说明、监控命令、运维操作等内容，通常都能在官方文档中找到。\n但从 DBA 的角度看，问题在于文档往往更偏“功能说明”和“使用方法”，而生产环境真正需要的内容往往更深。\n例如，一个备份命令，文档可能告诉你如何执行，但 DBA 还需要继续知道：\n它备份的到底是哪些数据对象？ 是全量备份还是增量备份？ 是否依赖归档日志？ 是否支持时间点恢复？ 备份期间对业务性能有没有影响？ 备份失败后应该看哪些日志？ 备份文件损坏时如何校验？ 在主备、集群、分布式架构下是否有额外限制？ 这些内容如果文档没有完全展开，就需要 DBA 通过实验、案例、对比和复盘来补全。\n因此，国产数据库学习的难点，不只是文档数量少，而是文档背后的设计思路、异常场景和生产案例还不够充分。\n二、不要用“我要学国产数据库”这种大目标开始 # 很多人学习国产数据库时，容易把目标定得过大，比如“我要学达梦”“我要学 OceanBase”“我要学人大金仓”“我要学 GaussDB”。\n这种目标过于笼统，很容易陷入资料堆积，却不知道从哪里下手。\n更有效的方法是把学习目标拆成具体 DBA 场景：\n安装部署怎么做？ 参数体系怎么理解？ 用户权限怎么管理？ 表空间和存储结构怎么规划？ 备份恢复怎么验证？ 主备或集群高可用怎么切换？ SQL 执行计划怎么看？ 慢 SQL 怎么诊断？ 锁等待怎么分析？ 日志文件在哪里？ 常见报错如何定位？ 当目标被拆成具体问题，文档就不再是一堆杂乱资料，而会变成可检索、可验证、可沉淀的学习对象。\nDBA 学数据库，不应从“产品名称”开始，而应从“运维场景”和“故障场景”开始。\n三、文档只是入口，实验才是掌握数据库的关键 # 数据库是强实践型技术。只看文档，很难真正掌握。\n尤其是国产数据库，当文档没有提供足够多生产案例时，DBA 更要主动在测试环境中构建实验场景。\n例如学习备份恢复时，不能只执行一次备份命令就结束。至少应该验证：\n全量备份能否成功恢复； 增量备份是否依赖前序备份； 归档缺失时恢复会出现什么错误； 指定时间点恢复是否可用； 备份任务失败后日志如何定位； 磁盘空间不足时数据库如何报错； 主库、备库、集群节点上的备份行为是否一致。 学习 SQL 优化时，也不能只看执行计划命令。还要验证索引、统计信息、数据分布、连接方式、排序、聚合、并行执行等因素对执行计划的影响。\n实验的价值在于，它能把文档中的静态描述变成 DBA 自己掌握的动态经验。\n四、AI 可以弥补资料不足，但不能替代 DBA 验证 # AI 对 DBA 学习国产数据库有很大帮助。\n它最有价值的地方，不是直接给出一个看似标准的答案，而是帮助 DBA 把问题继续拆深。\n例如你可以把官方文档中的一段内容交给 AI，然后让它帮你分析：\n这个功能解决什么问题？ 关键参数有哪些？ 每个参数可能影响什么？ 生产环境使用时有哪些风险？ 和 Oracle、MySQL、PostgreSQL 的类似功能有什么区别？ 应该设计哪些实验来验证这个功能？ 如果执行失败，应该检查哪些日志和系统视图？ 这样，AI 就不是简单的“问答工具”，而是帮助 DBA 构建学习路径、测试 checklist 和知识框架的助手。\n但必须强调：AI 不能替代 DBA 的验证。\n国产数据库版本差异、企业定制特性、参数默认值、部署架构、操作系统环境都可能影响最终结果。AI 生成的结论必须回到真实数据库环境中验证。\n未来优秀 DBA 的能力，不是盲目信任 AI，而是会用 AI 提高问题拆解效率，再用实验和日志验证结论。\n五、DBA 应该建立自己的国产数据库知识库 # 面对资料分散的问题，DBA 最重要的能力之一，是建立自己的知识库。\n一个可用的知识库，不只是收藏链接，而应该按 DBA 工作场景组织内容。\n建议每个功能至少整理以下内容：\n功能目标：这个功能解决什么问题； 基本命令：最小可执行操作步骤； 参数说明：关键参数含义和风险； 实验步骤：如何在测试环境复现； 日志位置：失败后应该看哪些日志； 系统视图：如何查询运行状态； 异常场景：常见错误和处理方法； 性能影响：对 CPU、内存、I/O、锁、日志的影响； 对比分析：和 Oracle、MySQL、PostgreSQL 的差异； 生产建议：上线前检查项和回退方案。 当 DBA 把每一次安装、每一次备份、每一次报错、每一次性能问题都沉淀下来，个人知识库就会逐渐超过零散搜索结果的价值。\n这也是国产数据库学习中非常关键的一点：不要只是消费文档，要生产自己的文档。\n六、DBA 技术路线：从“查资料”升级为“构建方法论” # 在国产数据库生态还在持续完善的阶段，DBA 的技术路线应该发生变化。\n过去，很多 DBA 依赖成熟数据库生态：官方文档、MOS、社区博客、案例库、论坛问答、第三方工具都非常丰富。遇到问题时，往往可以快速搜索到类似案例。\n但在国产数据库环境下，不能完全依赖这种方式。\nDBA 需要具备更强的底层问题分析能力：\n能看懂数据库基本架构； 能理解事务、日志、锁、索引、执行计划和存储机制； 能根据现象推导可能的故障层级； 能通过实验验证猜想； 能把一次问题处理过程整理成可复用文档； 能借助 AI 把零散信息组织成系统知识。 这意味着 DBA 的技术路线，要从“查资料型 DBA”升级为“方法论型 DBA”。\n真正掌握国产数据库的人，不一定是看过最多文档的人，而是能把文档、实验、日志、案例和 AI 辅助分析整合成体系的人。\n七、建议的学习路径 # 对于 DBA 来说，可以按以下路径学习国产数据库：\n第一阶段，建立基础环境。完成单机安装、客户端连接、用户创建、表空间或存储配置、基本 SQL 操作。\n第二阶段，掌握日常运维。重点学习启动停止、参数配置、日志位置、会话管理、权限管理、空间管理和简单监控。\n第三阶段，验证备份恢复。必须亲自做全量备份、增量备份、归档恢复、时间点恢复、恢复失败处理和备份校验。\n第四阶段，学习高可用架构。理解主备、集群、分布式架构、故障切换、数据同步和脑裂防护。\n第五阶段，进入性能诊断。学习执行计划、索引、统计信息、慢 SQL、锁等待、I/O 等待、内存使用和系统视图。\n第六阶段，沉淀知识库。把所有实验过程、报错信息、处理脚本和经验总结整理成个人可检索文档。\n第七阶段，引入 AI 辅助。用 AI 帮助拆解文档、生成实验步骤、补充检查清单、整理排障流程，但最终结论必须通过真实环境验证。\n结论：国产数据库学习的核心，是把有限资料变成自己的体系 # 国产数据库文档资料相对匮乏，是一个现实问题，但它不是不可跨越的问题。\n对于 DBA 来说，真正有效的学习方法不是等待资料变得完美，而是主动把问题拆小、把文档读深、把实验做实、把结果记录下来。\n未来 DBA 学习国产数据库的核心能力，不只是会查官方文档，而是能把官方文档、个人实验、故障案例、生产经验和 AI 辅助分析整合成自己的知识体系。\n谁能完成这个过程，谁就不只是“会用国产数据库”，而是真正具备理解、验证、诊断和掌握国产数据库的能力。\n","date":"2026-04-29","externalUrl":null,"permalink":"/posts/dba-kamus-career-roadmap/","section":"文章","summary":"AI、云数据库、AIGC、多模态数据库和国产数据库快速发展后，DBA 需要从传统数据库运维升级为具备自动化、AI 协作、云数据库、数据生命周期治理和数据基础设施架构能力的复合型工程师。","title":"云和恩墨库库快答 Kamus 篇观看有感：AI 时代 DBA 的职业路线","type":"posts"},{"content":"","date":"2026-04-29","externalUrl":null,"permalink":"/tags/%E4%BA%91%E6%95%B0%E6%8D%AE%E5%BA%93/","section":"Tags","summary":"","title":"云数据库","type":"tags"},{"content":"","date":"2026-04-29","externalUrl":null,"permalink":"/tags/%E8%81%8C%E4%B8%9A%E5%8F%91%E5%B1%95/","section":"Tags","summary":"","title":"职业发展","type":"tags"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/dds/","section":"Tags","summary":"","title":"DDS","type":"tags"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/categories/mongodb/","section":"Categories","summary":"","title":"MongoDB","type":"categories"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/mongodb/","section":"Tags","summary":"","title":"MongoDB","type":"tags"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/mongodump/","section":"Tags","summary":"","title":"Mongodump","type":"tags"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/mongorestore/","section":"Tags","summary":"","title":"Mongorestore","type":"tags"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/%E5%8D%8E%E4%B8%BA%E4%BA%91/","section":"Tags","summary":"","title":"华为云","type":"tags"},{"content":" 一、项目背景与方案选择 # 在 MongoDB 兼容数据库的跨云迁移场景中，常见方案主要有两类：\n基于复制服务的全量 + 增量迁移 基于 mongodump / mongorestore 的逻辑全量迁移 本文记录的是一次 “华为云 DDS → 天翼云 DDS” 的跨云迁移实践。综合源端与目标端约束、本次数据规模、停机窗口和实施复杂度，最终采用了 基于 mongodump / mongorestore 的逻辑全量迁移方案：\n在华为云 DDS 源端执行 mongodump --archive --gzip 导出 在天翼云 DDS 目标端执行 mongorestore --archive --gzip 恢复 通过集合、索引和关键对象核验迁移结果 该方案的优点是实施简单、操作透明、适合一次性全量切换；需要注意的是，它通常要求停写窗口，不适用于严格零停机迁移。\n二、迁移前必须明确的约束 # 1. 源端约束：华为云 DDS # 在基于 mongodump / mongorestore 的迁移方式下，源端需重点关注以下边界条件：\n该方案本质上是全量迁移 为保证一致性，迁移前应尽量停止源端业务写入 建议在业务低峰期执行导出与切换 系统库不应作为迁移对象，不支持迁移系统库 admin 和 local 客户端工具版本应与实例版本保持兼容，根据华为云DDS 版本进行工具下载，本次我们迁移的DDS 4.2/4.0版本，用到链接验证工具MongoDB Shell下载对应的版本，MongoDB Command Line Database Tools Download导出导入工具下载对应的版本 此外，在实际执行过程中，如果导出在接近结束时失败，还应优先检查执行主机的磁盘空间是否充足，并预留必要冗余。\n2. 目标端约束：天翼云 DDS # 目标端的关键约束同样需要在迁移前确认：\n不支持高版本向低版本迁移 不支持系统库迁移 用户和角色需要在目标端手动创建 业务对象迁移的核心范围通常为：集合、索引、视图 这意味着，即使源端导出归档中包含了 admin.system.users、admin.system.roles 等系统对象，恢复到目标端时也不应直接恢复系统库内容。目标端所需账号、权限和角色，应通过平台能力或手工方式补齐。\n三、迁移环境说明 # 1. 源端环境 # 本次实操中，源端为华为云 DDS 文档数据库实例，其中本文以 dds-fros 为例进行演示。\n使用 mongosh 连接源端：\nmongosh \u0026#34;mongodb://127.0.0.1:27017\u0026#34; mongosh \u0026#34;mongodb://user:password@127.0.0.1:27017/admin\u0026#34; mongosh --host 127.0.0.1 --port 27017 在云数据库环境中，通常可直接使用具备读写权限的迁移账号（比如rwuser用户）连接实例。本文实际连接示例如下：\nroot@gkfx-sz01p-ecs-uat-his-ecs-dev:~# mongosh \u0026#34;mongodb://rwuser:*******@123.249.113.188:8635/admin?authSource=admin\u0026#34; Current Mongosh Log ID: 69ea1a7775987a754645bcba Connecting to: mongodb://\u0026lt;credentials\u0026gt;@123.249.113.188:8635/admin?authSource=admin\u0026amp;directConnection=true\u0026amp;appName=mongosh+1.10.6 Using MongoDB: 4.2.0 Using Mongosh: 1.10.6 mongosh 2.8.2 is available for download: https://www.mongodb.com/try/download/shell For mongosh info see: https://docs.mongodb.com/mongodb-shell/ [direct: mongos] admin\u0026gt; 查看数据库列表：\n[direct: mongos] admin\u0026gt; show dbs admin 262 B ccm 257 B ccm2 27.40 MiB config 356.12 KiB dms 419.56 MiB dms-test 384.22 MiB form-builder 269 B freehealth 303.78 KiB fros 16.24 KiB fros-test 19.30 KiB gyyy 262 B stream 260 B test 267 B [direct: mongos] admin\u0026gt; 查看 ccm2 数据库中的集合：\n[direct: mongos] admin\u0026gt; use ccm2 switched to db ccm2 [direct: mongos] ccm2\u0026gt; show collections _Idempotency _Join:city:Province _Join:disease:TagDefinition _Join:diseaseManagement_:Patient _Join:diseaseManagementDefinition_:Organization _Join:district:City _Join:planDefinition:DiseaseManagementDefinition _Join:role:PractitionerRole _Join:task:DiseaseManagement _Role _SCHEMA _Session _User BasicInfoDefinition City CodeableConcept Disease DiseaseManagement DiseaseManagementDefinition DiseaseManagementIndicator District Doctor Game Generate_MongoLastResumeData Generate_PatientObservation Indicator IndicatorDefinition Location Observation Organization Patient PatientIndicator PatientIndicatorLog PlanDefinition Practitioner PractitionerRole Province Questionnaire QuestionnaireResponse RemoteStudy Report Reservation RoleDefinition Room Schedule Sms Tag TagDefinition Task Test system.profile [direct: mongos] ccm2\u0026gt; 为了便于迁移后核验，建议在源端提前记录每个业务库的集合数量。本文使用以下脚本统计各库集合数：\nconst conn = db.getMongo(); conn.getDBs().databases.forEach(({ name }) =\u0026gt; { const curDb = conn.getDB(name); const collCount = curDb.getCollectionInfos( { type: \u0026#34;collection\u0026#34; }, { nameOnly: true } ).length; print(`${name}: ${collCount}`); }); 源端统计结果如下：\n[direct: mongos] ccm2\u0026gt; use admin switched to db admin [direct: mongos] admin\u0026gt; const conn = db.getMongo(); [direct: mongos] admin\u0026gt; [direct: mongos] admin\u0026gt; conn.getDBs().databases.forEach(({ name }) =\u0026gt; { ... const curDb = conn.getDB(name); ... const collCount = curDb.getCollectionInfos( ... { type: \u0026#34;collection\u0026#34; }, ... { nameOnly: true } ... ).length; ... ... print(`${name}: ${collCount}`); ... }); admin: 5 ccm: 2 ccm2: 51 config: 14 dms: 53 dms-test: 53 form-builder: 7 freehealth: 3 fros: 11 fros-test: 2 gyyy: 6 stream: 3 test: 5 [direct: mongos] admin\u0026gt; 建议将需要迁移的业务库集合数量提前保存，作为迁移后核验的基础指标。\n2. 目标端环境 # 目标端为天翼云 DDS 文档数据库实例 GKFX-SZP-DDS-PDT-HIS-dds-fros。本文场景中，目标端启用了 TLS/SSL 连接，因此在客户端侧需要准备服务端证书文件。\n注意我们这里目标环境是开启SSL，所以要下载服务端证书，传到客户端进行校验\n实际连接目标端的命令如下：\nroot@gkfx-sz01p-ecs-uat-his-ecs-dev:~# mongosh \u0026#34;mongodb://rwuser:******@10.190.18.168:8635/admin?authSource=admin\u0026#34; --tls --tlsAllowInvalidHostnames --tlsCAFile /root/dds_bak/ca-dds.crt Current Mongosh Log ID: 69ea102264e5cab4ea53a766 Connecting to: mongodb://\u0026lt;credentials\u0026gt;@10.190.18.168:8635/admin?authSource=admin\u0026amp;directConnection=true\u0026amp;tls=true\u0026amp;tlsAllowInvalidHostnames=true\u0026amp;tlsCAFile=%2Froot%2Fdds_bak%2Fca-dds.crt\u0026amp;appName=mongosh+1.10.6 Using MongoDB: 4.2.0 Using Mongosh: 1.10.6 mongosh 2.8.2 is available for download: https://www.mongodb.com/try/download/shell For mongosh info see: https://docs.mongodb.com/mongodb-shell/ [direct: mongos] admin\u0026gt; 查看目标端数据库列表：\n[direct: mongos] admin\u0026gt; show dbs admin 262 B config 38.58 KiB [direct: mongos] admin\u0026gt; 注意 本文环境中使用了 --tlsAllowInvalidHostnames，原因是服务端证书主机名与实际连接地址不完全匹配。该参数适合临时验证或受控环境排障使用；在正式生产中，更推荐使用与证书一致的域名进行连接，避免长期依赖放宽校验参数。\n四、源端导出：执行 mongodump # 1. 导出命令 # 本文源端使用 mongodump --archive --gzip 进行整实例逻辑导出。实际执行如下：\nroot@gkfx-sz01p-ecs-uat-his-ecs-dev:~# mongodump --version mongodump version: 100.12.2 git version: f76a3ae4029780f61c49cbd39b7336f8d9c30ed0 Go version: go1.23.8 os: linux arch: amd64 compiler: gc root@gkfx-sz01p-ecs-uat-his-ecs-dev:~# cd dds_bak/ root@gkfx-sz01p-ecs-uat-his-ecs-dev:~/dds_bak# mongodump --uri=\u0026#34;mongodb://rwuser:******@123.249.113.188:8635/?authSource=admin\u0026#34; --archive=dds-fros_full_20260423.gz --gzip \u0026gt;\u0026gt; dds-fros_full_20260423.log 2\u0026gt;\u0026amp;1 该方式的优点是：\n生成单一归档文件，便于管理 配合 --gzip 可降低归档体积 适合跨环境传输与恢复 2. 导出过程观察 # 导出过程中可在另一窗口实时观察日志：\ntail -f dds-fros_full_20260423.log 日志片段如下：\nLast login: Thu Apr 23 20:30:33 2026 from 117.186.13.106 root@gkfx-sz01p-ecs-uat-his-ecs-dev:~# cd dds_bak/ root@gkfx-sz01p-ecs-uat-his-ecs-dev:~/dds_bak# tail -f dds-fros_full_20260423.log 2026-04-23T20:43:20.832+0800 [###########.............] dms.Observation 121742/247927 (49.1%) 2026-04-23T20:43:20.832+0800 2026-04-23T20:43:22.785+0800 [########################] dms-test.Observation 180802/180802 (100.0%) 2026-04-23T20:43:22.889+0800 done dumping dms-test.Observation (180802 documents) 2026-04-23T20:43:22.889+0800 writing ccm2.Indicator to archive \u0026#39;dds-fros_full_20260423.gz\u0026#39; 2026-04-23T20:43:23.832+0800 [........................] dms.QuestionnaireResponse 5560/247297 (2.2%) 2026-04-23T20:43:23.832+0800 [........................] dms-test.QuestionnaireResponse 5560/181185 (3.1%) 2026-04-23T20:43:23.832+0800 [###########.............] dms.Observation 121742/247927 (49.1%) 2026-04-23T20:43:23.832+0800 [........................] ccm2.Indicator 101/126910 (0.1%) 2026-04-23T20:43:23.832+0800 2026-04-23T20:43:26.832+0800 [........................] dms.QuestionnaireResponse 5560/247297 (2.2%) 2026-04-23T20:43:26.832+0800 [........................] dms-test.QuestionnaireResponse 5560/181185 (3.1%) 2026-04-23T20:43:26.833+0800 [###########.............] dms.Observation 121742/247927 (49.1%) 2026-04-23T20:43:26.833+0800 [........................] ccm2.Indicator 101/126910 (0.1%) 2026-04-23T20:43:26.833+0800 2026-04-23T20:43:29.832+0800 [........................] dms.QuestionnaireResponse 5560/247297 (2.2%) 2026-04-23T20:43:29.832+0800 [........................] dms-test.QuestionnaireResponse 5560/181185 (3.1%) 2026-04-23T20:43:29.832+0800 [###########.............] dms.Observation 121742/247927 (49.1%) 2026-04-23T20:43:29.832+0800 [........................] ccm2.Indicator 101/126910 (0.1%) 2026-04-23T20:43:29.832+0800 ^C root@gkfx-sz01p-ecs-uat-his-ecs-dev:~/dds_bak# 从导出日志可以确认以下事实：\n源端业务库中的多个集合被持续写入归档文件 导出过程能够显示集合级进度与已完成对象 日志中还出现了系统对象，如： admin.system.users admin.system.roles admin.system.version 这说明本次导出归档中不仅包含业务库数据，也包含了部分系统元数据。\n3. 导出结论 # 结合导出日志，可以得出以下结论：\n本次 mongodump 导出已正常完成 dump 归档中包含业务库数据及其相关元数据 归档中同时包含系统用户、角色等系统级对象，但这些内容不应在目标端直接恢复 五、目标端恢复：执行 mongorestore # 1. 恢复策略 # 由于目标端不支持系统库迁移，同时目标端用户和角色需要手工创建，因此恢复时不能直接整包无选择恢复，而应采用业务库白名单恢复。\n本文恢复命令如下：\nmongorestore --host 10.190.18.168 --port 8635 --ssl --tlsInsecure --sslCAFile ca-dds.crt --authenticationDatabase admin -u rwuser --password=\u0026#39;******\u0026#39; --archive=dds-fros_full_20260423.gz --gzip --nsInclude=\u0026#39;ccm.*\u0026#39; --nsInclude=\u0026#39;ccm2.*\u0026#39; --nsInclude=\u0026#39;dms.*\u0026#39; --nsInclude=\u0026#39;dms-test.*\u0026#39; --nsInclude=\u0026#39;form-builder.*\u0026#39; --nsInclude=\u0026#39;freehealth.*\u0026#39; --nsInclude=\u0026#39;fros.*\u0026#39; --nsInclude=\u0026#39;fros-test.*\u0026#39; --nsInclude=\u0026#39;gyyy.*\u0026#39; --nsInclude=\u0026#39;stream.*\u0026#39; --nsInclude=\u0026#39;test.*\u0026#39; \u0026gt;\u0026gt; restore_dds_fros_full_20260423.log 2\u0026gt;\u0026amp;1 这条命令的核心思路是：\n使用白名单方式，仅恢复业务库 显式排除 admin、config、local 等系统库 保证恢复对象范围与目标端约束一致 说明 文中的 mongosh 连接示例采用了 --tls 写法，而 mongorestore 示例中使用了 --ssl / --sslCAFile。在实际工具中这类参数通常存在兼容关系，但在正式实施文档中，建议统一工具参数风格，并明确说明证书校验策略。本文保留实操原始命令，以便完整还原执行过程。\n2. 恢复过程观察 # 恢复过程中可通过以下命令实时查看日志：\ntail -f restore_dds_fros_full_20260423.log 日志片段如下：\nroot@gkfx-sz01p-ecs-uat-his-ecs-dev:~/dds_bak# tail -f restore_dds_fros_full_20260423.log 2026-04-23T22:46:37.365+0800 index: \u0026amp;idx.IndexDocument{Options:primitive.M{\u0026#34;background\u0026#34;:true, \u0026#34;name\u0026#34;:\u0026#34;reqId_1\u0026#34;, \u0026#34;ns\u0026#34;:\u0026#34;form-builder._Idempotency\u0026#34;, \u0026#34;sparse\u0026#34;:true, \u0026#34;unique\u0026#34;:true, \u0026#34;v\u0026#34;:2}, Key:primitive.D{primitive.E{Key:\u0026#34;reqId\u0026#34;, Value:1}}, PartialFilterExpression:primitive.D(nil)} 2026-04-23T22:46:37.365+0800 index: \u0026amp;idx.IndexDocument{Options:primitive.M{\u0026#34;background\u0026#34;:true, \u0026#34;expireAfterSeconds\u0026#34;:0, \u0026#34;name\u0026#34;:\u0026#34;ttl\u0026#34;, \u0026#34;ns\u0026#34;:\u0026#34;form-builder._Idempotency\u0026#34;, \u0026#34;sparse\u0026#34;:true, \u0026#34;v\u0026#34;:2}, Key:primitive.D{primitive.E{Key:\u0026#34;expire\u0026#34;, Value:1}}, PartialFilterExpression:primitive.D(nil)} 2026-04-23T22:46:37.366+0800 no indexes to restore for collection gyyy.template 2026-04-23T22:46:37.366+0800 no indexes to restore for collection gyyy.test 2026-04-23T22:46:37.366+0800 restoring indexes for collection gyyy.ehr from metadata 2026-04-23T22:46:37.366+0800 index: \u0026amp;idx.IndexDocument{Options:primitive.M{\u0026#34;background\u0026#34;:true, \u0026#34;name\u0026#34;:\u0026#34;identifier\u0026#34;, \u0026#34;ns\u0026#34;:\u0026#34;gyyy.ehr\u0026#34;, \u0026#34;unique\u0026#34;:true, \u0026#34;v\u0026#34;:2}, Key:primitive.D{primitive.E{Key:\u0026#34;identifier\u0026#34;, Value:1}}, PartialFilterExpression:primitive.D(nil)} 2026-04-23T22:46:37.378+0800 no indexes to restore for collection gyyy.opt 2026-04-23T22:46:37.378+0800 no indexes to restore for collection gyyy.ethnic 2026-04-23T22:46:37.378+0800 no indexes to restore for collection fros-test.ehr 2026-04-23T22:46:41.113+0800 2431940 document(s) restored successfully. 0 document(s) failed to restore. ^C root@gkfx-sz01p-ecs-uat-his-ecs-dev:~/dds_bak# 从恢复日志中可以确认：\n11 个业务库均已纳入恢复范围 恢复过程中未观察到失败记录 日志明确显示多个集合正在从元数据恢复索引 最终恢复统计为： 2431940 document(s) restored successfully 0 document(s) failed to restore 这说明本次恢复整体完成情况良好。\n3. 关于系统用户与权限 # 这里需要明确区分两个层面：\n源端归档中是否包含系统用户和角色 # 包含。\n因为导出日志中已出现：\nadmin.system.users admin.system.roles admin.system.version 目标端是否恢复了系统用户和角色 # 没有恢复。\n原因并非数据缺失，而是恢复策略有意规避了系统库：\n恢复命令仅对白名单业务库执行 --nsInclude 恢复日志未显示 admin.system.users、admin.system.roles 进入恢复流程 目标端本身也不支持直接迁移系统库对象 因此，本次迁移中：\nMongoDB 系统级用户/角色：源端归档中存在，但目标端不恢复 业务库中的应用级集合，如 _User、_Role、RoleDefinition 等，作为业务数据的一部分被正常恢复 六、迁移结果校验 # 恢复完成后，需要从多个维度验证迁移结果，而不仅仅依赖日志结论。\n1. 校验数据库是否已恢复 # 连接目标端\nroot@gkfx-sz01p-ecs-uat-his-ecs-dev:~/dds_bak# mongosh \u0026#34;mongodb://rwuser:******@10.190.18.168:8635/admin?authSource=admin\u0026#34; --tls --tlsAllowInvalidHostnames --tlsCAFile /root/dds_bak/ca-dds.crt Current Mongosh Log ID: 69ea17f42a1c583ab4f5c435 Connecting to: mongodb://\u0026lt;credentials\u0026gt;@10.190.18.168:8635/admin?authSource=admin\u0026amp;directConnection=true\u0026amp;tls=true\u0026amp;tlsAllowInvalidHostnames=true\u0026amp;tlsCAFile=%2Froot%2Fdds_bak%2Fca-dds.crt\u0026amp;appName=mongosh+1.10.6 Using MongoDB: 4.2.0 Using Mongosh: 1.10.6 mongosh 2.8.2 is available for download: https://www.mongodb.com/try/download/shell For mongosh info see: https://docs.mongodb.com/mongodb-shell/ [direct: mongos] admin\u0026gt; 查看数据库列表：\n[direct: mongos] admin\u0026gt; show dbs admin 262 B ccm 257 B ccm2 44.71 MiB config 38.58 KiB dms 360.96 MiB dms-test 154.04 MiB form-builder 269 B freehealth 287.84 KiB fros 16.24 KiB fros-test 257 B gyyy 57.63 KiB stream 260 B test 267 B [direct: mongos] admin\u0026gt; 可以看到，目标端业务数据库均已出现。\n说明 show dbs 中显示的库大小受底层存储、压缩、索引重建和碎片等因素影响。跨环境迁移后，数据库大小不完全一致并不必然表示数据异常。因此，容量只可作为参考指标，不能单独作为一致性结论依据。\n2. 校验集合清单是否一致 # 以 ccm2 为例：\n[direct: mongos] admin\u0026gt; use ccm2 switched to db ccm2 [direct: mongos] ccm2\u0026gt; show collections _Idempotency _Join:city:Province _Join:disease:TagDefinition _Join:diseaseManagement_:Patient _Join:diseaseManagementDefinition_:Organization _Join:district:City _Join:planDefinition:DiseaseManagementDefinition _Join:role:PractitionerRole _Join:task:DiseaseManagement _Role _SCHEMA _Session _User BasicInfoDefinition City CodeableConcept Disease DiseaseManagement DiseaseManagementDefinition DiseaseManagementIndicator District Doctor Game Generate_MongoLastResumeData Generate_PatientObservation Indicator IndicatorDefinition Location Observation Organization Patient PatientIndicator PatientIndicatorLog PlanDefinition Practitioner PractitionerRole Province Questionnaire QuestionnaireResponse RemoteStudy Report Reservation RoleDefinition Room Schedule Sms Tag TagDefinition Task Test system.profile [direct: mongos] ccm2\u0026gt; 从集合清单看，目标端与源端保持一致。\n3. 校验各业务库集合数量 # 在目标端再次执行集合统计脚本：\nconst conn = db.getMongo(); conn.getDBs().databases.forEach(({ name }) =\u0026gt; { const curDb = conn.getDB(name); const collCount = curDb.getCollectionInfos( { type: \u0026#34;collection\u0026#34; }, { nameOnly: true } ).length; print(`${name}: ${collCount}`); }); 目标端输出结果如下：\n[direct: mongos] ccm2\u0026gt; use admin switched to db admin [direct: mongos] admin\u0026gt; const conn = db.getMongo(); [direct: mongos] admin\u0026gt; [direct: mongos] admin\u0026gt; conn.getDBs().databases.forEach(({ name }) =\u0026gt; { ... const curDb = conn.getDB(name); ... const collCount = curDb.getCollectionInfos( ... { type: \u0026#34;collection\u0026#34; }, ... { nameOnly: true } ... ).length; ... ... print(`${name}: ${collCount}`); ... });const conn = db.getMongo(); admin: 5 ccm: 2 ccm2: 51 config: 14 dms: 53 dms-test: 53 form-builder: 7 freehealth: 3 fros: 11 fros-test: 2 gyyy: 6 stream: 3 test: 5 [direct: mongos] admin\u0026gt; 与源端统计结果一致。\n4. 建议补充的深度校验项 # 在正式生产切换前，建议进一步增加以下核验动作：\n对关键集合执行 countDocuments() 对比 对关键集合索引执行 getIndexes() 对比 抽样比对关键业务数据，例如按 _id 或业务主键检查若干记录 对应用侧执行读写验证或关键接口冒烟测试 示例：\nuse ccm2 db.Patient.countDocuments() db.Patient.getIndexes() db.Patient.findOne() 这些校验项能够比“仅比较集合数量”提供更强的一致性证明。\n七、推荐的标准实施步骤 # 综合本次实践，推荐将类似跨云迁移流程标准化为以下步骤：\n步骤 1：确认版本与工具兼容性 # 确认源端与目标端版本兼容 确认 mongosh、mongodump、mongorestore 版本与实例兼容 确认目标端 TLS/SSL 连接要求 步骤 2：确认迁移窗口并停写 # 选择业务低峰期 停止源端业务写入 固定切换窗口，避免导出期间继续产生增量 步骤 3：执行源端导出 # 使用 mongodump --archive --gzip 导出 实时观察导出日志 记录源端数据库、集合数量与关键集合文档数 步骤 4：准备目标端账号与连接能力 # 提前确认目标端账号权限 准备 CA 证书等连接材料 若目标端不支持系统库迁移，提前规划账号和角色创建方式 步骤 5：仅恢复业务库 # 使用 --nsInclude 明确业务库白名单 避免恢复 admin、config、local 实时观察恢复日志并确认失败数为 0 步骤 6：执行迁移后核验 # 核验数据库是否已出现 核验集合数量是否一致 核验关键集合文档数、索引、抽样数据是否一致 验证业务应用连接与核心功能 步骤 7：切换与回退准备 # 在目标端验证通过后进行应用切换 如发现重大差异，保留源端作为回退入口 在确认业务稳定前，不要立即销毁源端数据或归档文件 八、最终结论 # 结合源端导出日志、目标端恢复日志以及迁移后核验结果，本次 “华为云 DDS → 天翼云 DDS” 的迁移实践可以得出以下结论：\n方案选择合理 基于 mongodump / mongorestore 的逻辑全量迁移，适用于本次存在停写窗口、希望降低迁移成本的跨云迁移场景。 源端导出成功 本次导出的归档文件已正常生成，且包含业务库数据及系统级元数据。 目标端恢复策略正确 通过 --nsInclude 精确恢复业务库，规避了系统库恢复风险，符合目标端约束要求。 业务库恢复完成 恢复日志显示全部业务库已纳入恢复范围，且恢复结果为 0 document(s) failed to restore。 索引已随恢复流程重建 恢复日志中多次出现 restoring indexes for collection ... from metadata，说明目标端已执行索引恢复。 系统用户和角色未恢复到目标端 这是基于目标端限制和恢复策略刻意设计的结果，目标端系统账号与权限需单独创建。 迁移结果符合预期 从数据库列表、集合清单、集合数量和恢复日志来看，本次迁移整体成功；在正式切流前，仍建议结合关键集合文档数、索引和业务抽样进一步完成最终验收。 ","date":"2026-04-23","externalUrl":null,"permalink":"/posts/huawei-dds-to-ctyun-dds-migration/","section":"文章","summary":"一次 MongoDB 兼容 DDS 跨云迁移实战：源端华为云 DDS 使用 mongodump –archive –gzip 导出，目标端天翼云 DDS 使用 mongorestore 按业务库白名单恢复，并完成集合、索引和关键数据核验。","title":"华为云 DDS 迁移到天翼云 DDS：基于 mongodump / mongorestore 的实战指南","type":"posts"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB/","section":"Tags","summary":"","title":"数据库迁移","type":"tags"},{"content":"","date":"2026-04-23","externalUrl":null,"permalink":"/tags/%E5%A4%A9%E7%BF%BC%E4%BA%91/","section":"Tags","summary":"","title":"天翼云","type":"tags"},{"content":"","date":"2026-04-21","externalUrl":null,"permalink":"/categories/%E4%BC%81%E4%B8%9A%E7%AE%A1%E7%90%86/","section":"Categories","summary":"","title":"企业管理","type":"categories"},{"content":"","date":"2026-04-21","externalUrl":null,"permalink":"/tags/%E6%95%B0%E7%A7%91%E5%85%AC%E5%8F%B8/","section":"Tags","summary":"","title":"数科公司","type":"tags"},{"content":"","date":"2026-04-21","externalUrl":null,"permalink":"/tags/%E6%95%B0%E5%AD%97%E5%8C%96%E8%BD%AC%E5%9E%8B/","section":"Tags","summary":"","title":"数字化转型","type":"tags"},{"content":"","date":"2026-04-21","externalUrl":null,"permalink":"/tags/%E5%A4%AE%E5%9B%BD%E4%BC%81/","section":"Tags","summary":"","title":"央国企","type":"tags"},{"content":"这几年，央企、国企扎堆成立数科公司。\n名字一个比一个新，定位一个比一个高：数字科技、产业互联网、智慧平台、科技创新引擎……几乎每一家在成立之初，都带着很强的市场化期待。很多公司不只是想服务集团内部，更想走向外部市场，做产品、做品牌、做收入，最终成长为真正独立的科技公司。\n这个梦，当然很大，也很诱人。\n但真正的问题是：很多央国企数科公司，怕的并不是“转不了型”，而是一旦离开母公司的持续喂养，才发现自己并没有准备好独立生存。\n说得更直白一点：\n**很多公司做的是 A 级梦想，走的却是 B 级命运。**不是不努力，也不是没人干活，而是从一开始，定位就错了。\n一、为什么数科公司总觉得自己“应该能打市场”？ # 原因其实并不复杂。\n大多数数科公司在成立初期，日子都不会太差。母公司给项目、给预算、给资源、给场景，还给品牌信用。报表看起来不错，收入也不难看，团队很容易形成一种判断：\n我们挺强。\n我们这套能力是有竞争力的。\n我们应该能去市场上打一打。\n问题就在这里。\n这些成绩里，到底有多少来自真正的市场竞争力？又有多少，其实来自母公司的订单输送、资源保护和信任背书？\n很多时候，团队分不清。\n于是，在“内部成功”的环境里，慢慢长出了一个“外部扩张”的梦想。等到真要脱离体系、独立面对市场时，才突然发现：过去挣到的钱，不完全是靠自己打下来的。\n这就是很多央国企数科公司最现实、也最尖锐的风险——断奶风险。\n二、真正的问题，不是能力不够，而是“命”和“梦”不一致 # 很多人讨论数科公司转型时，习惯先找执行问题：\n是不是产品不够强？\n是不是销售不够懂市场？\n是不是组织效率不高？\n是不是技术团队太偏交付？\n这些问题当然都存在，但它们往往不是最根本的。\n更深层的问题是：很多数科公司的梦想，和它天生更适合走的路，并不是一回事。\n有些公司天生更适合做集团内部能力平台。\n有些公司更适合承担阶段性的专项任务。\n有些公司也许确实有机会走向市场，但必须极度聚焦，在狭窄赛道里打穿。\n可现实里，很多公司明明更像“内部引擎命”，却偏偏想做“市场明星梦”。\n这才是最大的悲剧。\n不是公司不够伟大，而是战略错位。不是输给了竞争对手，而是输给了自己的定位误判。\n三、央国企数科公司，大概率只有三种命运 # 如果把这类公司的结局做一个更冷静的归类，大致会走向三条路。\n1. 市场明星型 # 这是最光鲜的一种。\n真正靠产品、能力和交付，在市场上独立拿客户、做收入、树品牌，最后成长为有市场竞争力的科技公司。\n但这条路最难。不是不能走，而是极少数公司才能走出来。\n2. 内部平台型 # 这类公司未必追求全面市场化，而是把集团内部数字化能力服务到极致，成为母公司离不开的技术平台、能力底座或数字引擎。\n这条路听起来不如“市场明星”那么性感，但很可能更真实，也更有价值。\n3. 特定任务型 # 还有一类公司，存在的意义并不是长期做大，而是完成某个阶段性任务：\n比如数据整合、专项转型、系统打通、能力搭建。它更像一个特定历史阶段的组织载体，而不是一个天然要长期独立扩张的商业主体。\n这三种命运，本身没有高低之分。\n真正危险的是：明明应该走第二条或第三条路，却非要按第一条路去设计战略、搭组织、做考核、讲故事。\n四、为什么很多数科公司一出生就容易“拧巴”？ # 因为它从出生开始，往往就被同时塞进了三种冲突角色。\n母公司通常既希望它：\n一方面像成本中心。要稳定、可控、别出事、别失控。\n一方面又像利润中心。要赚钱、要增长、要有外部收入、别一直靠输血。\n另一方面还希望它像创新平台。要布局未来、搞产品、做技术沉淀、承担战略性探索。\n问题在于，这三种逻辑本来就是互相拉扯的。\n成本中心强调稳。\n利润中心强调快。\n创新平台强调长期投入和不确定性。\n一个组织如果同时背着这三套目标、三套文化、三套考核，最后大概率会变成谁也不像。\n很多数科公司的“拧巴感”，并不是管理动作不到位，而是底层逻辑本来就冲突。\n五、压住市场化的，不只是能力，还有三把“锁” # 很多公司嘴上说要市场化，实际上却被几把锁牢牢锁住。\n第一把锁：定价不市场化 # 很多项目不是按产品价值、客户价值定价，而是按投入多少人天、多少成本，再加一点利润去核价。\n这样的定价逻辑，会把团队一步步带向“项目公司”的方向，而不是“产品公司”的方向。\n因为只要堆人就能算钱，团队就不会真正关心：\n客户到底为什么买单？\n这个能力能不能复用？\n毛利怎么提升？\n产品怎么标准化？\n第二把锁：资产无法沉淀，产品化很难成立 # 很多公司每做一个项目，基本都像重新开始。\nA 项目是一套代码。\nB 项目又重做一遍。\nC 项目还是重新造轮子。\n最后看起来项目很多、交付很忙、团队很累，但真正能沉淀下来的产品资产并不多。\n没有复用，就没有规模化。\n没有标准化，就没有产品化。\n没有产品化，所谓市场扩张，最后很可能只是把一个又一个定制项目搬到外面去做。\n第三把锁：机制跟不上市场化要求 # 真正的市场化，不只是喊口号，更需要真正市场化的人才、激励和授权。\n如果薪酬总额受限、激励方式单一、组织授权不足，那公司很难吸引和留住能打硬仗、敢冒风险、愿意长期做产品的人。\n说白了就是：\n想要创业式结果，却不给创业式机制。\n这本身就是矛盾。\n六、最大的优势，往往也是最大的障碍 # 很多央国企数科公司最大的优势，是离业务近、离场景近、离母公司的核心流程近。\n它们熟悉体系、熟悉流程、熟悉行业，也有真实场景支撑。\n但问题是，这些优势一旦走向市场，也可能立刻变成障碍。\n因为外部市场会问：\n你的能力能不能脱离母公司场景复制？\n你做的东西，到底是行业共性产品，还是体系内专属方案？\n母公司最核心的流程和能力，真的愿意被外部化吗？\n外部客户会不会天然把你看成“带背景的特殊玩家”？\n也就是说，内部有价值，不等于外部可变现。体系内成立，不等于市场上也成立。\n七、真正跑出来的公司，往往不是“大而全”，而是“窄而深” # 当然，也不是所有数科公司都没有机会。\n真正跑出来的公司，通常都有一个共同点：聚焦。\n不是今天做平台，明天做产品，后天做咨询，大后天做集成；而是先找到一个自己最有把握、最有场景、最有壁垒的位置，然后深扎下去。\n可能是某个行业。\n可能是某类交付能力。\n可能是某个细分产品。\n也可能是先把现金流做稳，再逐步沉淀可复制能力。\n真正能活下来的，不是“什么都想做”的公司，而是“知道自己该做什么、不该做什么”的公司。\n八、也许，我们一开始就用错了尺子 # 今天很多人评价数科公司，第一反应就是看它有没有做出外部收入、有没有形成市场化品牌、有没有像互联网或民营软件公司那样跑出来。\n但这把尺子，未必适合所有央国企数科公司。\n更值得问的问题也许是：\n它有没有成为集团真正离不开的能力平台？\n它有没有把某一个关键能力做到不可替代？\n它有没有在清晰的位置上建立起长期价值？\n如果答案是肯定的，那它未必失败。\n相反，有些公司表面上讲着很大的市场化故事，实际上内部价值没有做深、外部能力也没做成，两头都不到岸，这才是真正的问题。\n九、对数科公司 CEO 来说，最重要的一步，是先认命 # 这里说的“认命”，不是认输。\n而是认清自己的组织到底是什么命。\n如果你的命是内部平台，那就不要一边靠母公司输血，一边幻想自己马上成为市场明星；先把内部平台做到极致，做到不可替代，做到母公司离不开。\n如果你确实要走向市场，也不是不行，但必须先回答几个问题：\n你的能力是否可复制？\n你的产品是否能脱离单一场景？\n你的组织机制是否真的支持市场化？\n你的战略是否足够聚焦？\n这些问题没有回答清楚，所谓转型，很容易最后只变成一句口号。\n十、真正该思考的，不是“要不要转型”，而是“断奶后怎么活” # 关于央国企数科公司的讨论，最容易跑偏的地方，就是把问题理解成“转不转型”。\n其实更本质的问题是：\n如果有一天，母公司不再继续喂养你，你还能不能活？你会以什么形态活？\n是成为真正的市场化公司？\n还是扎扎实实做集团内部平台？\n还是完成历史任务后，自然回归另一种组织形态？\n这才是每一家数科公司都绕不过去的问题。\n也是所有管理者、从业者，最应该尽早想明白的问题。\n因为很多时候，最怕的不是没梦想。最怕的是，拿着不属于自己的剧本，拼命往前演。\n","date":"2026-04-21","externalUrl":null,"permalink":"/posts/yangqishuke/","section":"文章","summary":"从战略定位、内部平台、市场化机制、产品化能力和断奶风险等角度，分析央国企数科公司的真实困境与可能出路。","title":"央国企数科公司，真正怕的不是转型，而是“断奶”","type":"posts"},{"content":"","date":"2026-04-21","externalUrl":null,"permalink":"/tags/%E6%88%98%E7%95%A5%E5%AE%9A%E4%BD%8D/","section":"Tags","summary":"","title":"战略定位","type":"tags"},{"content":"","date":"2026-04-21","externalUrl":null,"permalink":"/tags/%E7%BB%84%E7%BB%87%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"组织管理","type":"tags"},{"content":"","date":"2026-04-06","externalUrl":null,"permalink":"/tags/ora-12547/","section":"Tags","summary":"","title":"ORA-12547","type":"tags"},{"content":"","date":"2026-04-06","externalUrl":null,"permalink":"/tags/oracle_home/","section":"Tags","summary":"","title":"ORACLE_HOME","type":"tags"},{"content":"","date":"2026-04-06","externalUrl":null,"permalink":"/tags/orainventory/","section":"Tags","summary":"","title":"OraInventory","type":"tags"},{"content":" 前言 # 运维人员误改 /u01 目录 owner 和权限后，报错 ORA-12547: TNS: lost contact\n线上出这类问题，第一眼很容易被报错带偏。\n看到：\nsqlplus / as sysdba ORA-12547: TNS: lost contact 很多人第一反应会去怀疑监听、网络、实例状态，甚至怀疑数据库文件坏了。 但如果事故前刚做过下面这种操作：\nchown -R test:test /u01 chmod -R 777 /u01 那基本就不用往网络方向想了，十有八九就是 Oracle 软件目录和运行目录的 owner、group、权限被改坏了。\n这类问题我自己更愿意把它归类成“目录权限事故”，不是数据库故障本身，而是数据库运行环境先被人动坏了。\n一、这类问题为什么会报 ORA-12547 # ORA-12547: TNS: lost contact 这个报错本身比较迷惑，看上去像连接中断，实际上很多时候是 本地 Oracle 进程根本没有正常拉起来。\n尤其是执行：\n[oracle@centos7:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 6 18:42:39 2026 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-12547: TNS:lost contact Enter user-name: ERROR: ORA-12547: TNS:lost contact Enter user-name: ERROR: ORA-12547: TNS:lost contact SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus [oracle@centos7:/home/oracle]$ 这种本地登录时，如果 Oracle 的可执行文件、依赖库、目录归属或者运行目录权限被改坏，sqlplus 这边看到的结果往往就是一句 lost contact。\n简单说，不是 SQL*Plus 不会连，而是它把本地进程拉起来以后，对方刚起来就挂了。\n如果前面有人把整个 /u01 都执行了：\n[root@centos7:/root]# chown -R test:test /u01 [root@centos7:/root]# chmod -R 777 /u01 [root@centos7:/root]# 那受影响的一般不只是一个文件，而是整个 Oracle 目录树，包括：\n/u01/app/oracle /u01/app/oraInventory ORACLE_HOME ORACLE_HOME/bin ORACLE_HOME/lib ORACLE_BASE/diag ORACLE_BASE/admin ORACLE_BASE/fast_recovery_area 所以这类问题，不能按“单文件权限错了”去理解。\n二、这种事故最容易走错的一步 # 最容易犯的错误，是一看到 ORA-12547，马上去修：\nchown oracle:oinstall $ORACLE_HOME/bin/oracle chmod 6751 $ORACLE_HOME/bin/oracle 然后立刻就去试：\nsqlplus / as sysdba 这个动作在“单个 binary 被改坏”的场景里有时候是对的。 但如果事故前提是整个 /u01 都被递归执行了 chown -R 和 chmod -R 777，那这一步通常不够。\n因为这个时候坏掉的绝对不止 bin/oracle 一个文件。\n也就是说，不能把“修 bin/oracle”写成第一步。第一步应该先把 Oracle 的目录体系拉回正常，再处理关键 binary。\n三、正确的处理思路 # 我更建议按下面这个顺序来。\n1. 先确认这是不是整个目录树都被改过 # 先把基础信息看清楚，不要一上来就乱改。\n[oracle@centos7:/home/oracle]$ cat /etc/oraInst.loc inventory_loc=/u01/app/oraInventory inst_group=oinstall [oracle@centos7:/home/oracle]$ id oracle uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba) [oracle@centos7:/home/oracle]$ ls -ld /u01 /u01/app /u01/app/oracle /u01/app/oraInventory drwxrwxrwx. 3 test test 17 Apr 6 17:35 /u01 drwxrwxrwx. 4 test test 40 Apr 6 17:35 /u01/app drwxrwxrwx. 9 test test 132 Apr 6 18:33 /u01/app/oracle drwxrwxrwx. 5 test test 89 Apr 6 17:36 /u01/app/oraInventory [oracle@centos7:/home/oracle]$ ls -l $ORACLE_HOME/bin/oracle -rwxrwxrwx. 1 test test 239501576 Apr 6 17:36 /u01/app/oracle/product/11.2.0/db/bin/oracle [oracle@centos7:/home/oracle]$ stat -c \u0026#39;%U %G %a %n\u0026#39; $ORACLE_HOME/bin/oracle test test 777 /u01/app/oracle/product/11.2.0/db/bin/oracle [oracle@centos7:/home/oracle]$ 这里主要看三件事：\n第一、oracle 用户还在不在正确的组里。 第二、/u01/app/oracle 和 /u01/app/oraInventory 现在到底属于谁。 第三、$ORACLE_HOME/bin/oracle 是不是已经被改成了普通用户，而且特殊权限位也没了。\n如果你看到类似这种情况：\n/u01/app/oracle test:test /u01/app/oraInventory test:test $ORACLE_HOME/bin/oracle test:test 777 那基本可以直接判断：这不是单点故障，是整个目录树都被搞过了。\n2. 第一件事，先把 Oracle 目录树 owner/group 拉回来 # 如果确认前面执行过：\nchown -R test:test /u01 那第一步就应该先恢复 Oracle 目录树的归属，而不是先修改某一个 binary。\n用 root 执行：\nexport ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db chown -R oracle:oinstall /u01/app/oracle chown -R oracle:oinstall /u01/app/oraInventory [root@centos7:/root]# export ORACLE_BASE=/u01/app/oracle [root@centos7:/root]# export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db [root@centos7:/root]# chown -R oracle:oinstall /u01/app/oracle [root@centos7:/root]# chown -R oracle:oinstall /u01/app/oraInventory [root@centos7:/root]# 如果 /u01 和 /u01/app 也被改乱了，顺手把上层目录也摆正：\nchown root:root /u01 chmod 755 /u01 chown root:root /u01/app chmod 755 /u01/app [root@centos7:/root]# chown root:root /u01 [root@centos7:/root]# chmod 755 /u01 [root@centos7:/root]# chown root:root /u01/app [root@centos7:/root]# chmod 755 /u01/app [root@centos7:/root]# 这一步非常关键。因为 Oracle 软件 owner、Inventory、Oracle Base、Oracle Home 这些东西，本来就应该是一套一致的归属体系。只修一个文件，意义不大。\n3. 然后把目录权限从 777 收回来 # 既然前面做过：\nchmod -R 777 /u01 那接下来必须把目录权限先收回来。\n但是注意，不要再来一次：\nchmod -R 755 /u01 这类一把梭的命令最容易把本来应该保留的特殊权限位一起抹平。\n我习惯先只处理目录：\nfind /u01/app/oracle -type d -exec chmod 755 {} \\; find /u01/app/oraInventory -type d -exec chmod 755 {} \\; [root@centos7:/root]# find /u01/app/oracle -type d -exec chmod 755 {} \\; [root@centos7:/root]# find /u01/app/oraInventory -type d -exec chmod 755 {} \\; [root@centos7:/root]# 先保证目录是正常可进入、可遍历的，不再是到处 777 的状态。\n4. 再修关键 binary # 把目录体系和 owner/group 先拉回来以后，再回头修关键二进制文件，这个顺序才合理。\n至少先修这些：\nchown oracle:oinstall $ORACLE_HOME/bin/oracle chmod 6751 $ORACLE_HOME/bin/oracle [ -f $ORACLE_HOME/bin/orapwd ] \u0026amp;\u0026amp; chown oracle:oinstall $ORACLE_HOME/bin/orapwd \u0026amp;\u0026amp; chmod 751 $ORACLE_HOME/bin/orapwd [ -f $ORACLE_HOME/bin/nid ] \u0026amp;\u0026amp; chown oracle:oinstall $ORACLE_HOME/bin/nid \u0026amp;\u0026amp; chmod 751 $ORACLE_HOME/bin/nid [ -f $ORACLE_HOME/bin/wrap ] \u0026amp;\u0026amp; chown oracle:oinstall $ORACLE_HOME/bin/wrap \u0026amp;\u0026amp; chmod 751 $ORACLE_HOME/bin/wrap [root@centos7:/root]# chown oracle:oinstall $ORACLE_HOME/bin/oracle [root@centos7:/root]# chmod 6751 $ORACLE_HOME/bin/oracle [root@centos7:/root]# [ -f $ORACLE_HOME/bin/orapwd ] \u0026amp;\u0026amp; chown oracle:oinstall $ORACLE_HOME/bin/orapwd \u0026amp;\u0026amp; chmod 751 $ORACLE_HOME/bin/orapwd [root@centos7:/root]# [ -f $ORACLE_HOME/bin/nid ] \u0026amp;\u0026amp; chown oracle:oinstall $ORACLE_HOME/bin/nid \u0026amp;\u0026amp; chmod 751 $ORACLE_HOME/bin/nid [root@centos7:/root]# [ -f $ORACLE_HOME/bin/wrap ] \u0026amp;\u0026amp; chown oracle:oinstall $ORACLE_HOME/bin/wrap \u0026amp;\u0026amp; chmod 751 $ORACLE_HOME/bin/wrap [root@centos7:/root]# 这里面最关键的肯定是 bin/oracle。如果这个文件 owner、group 和模式位不对，本地登录经常就直接挂。\n5. 不要偷懒，继续扫一遍残留文件 # 做到这里还不能急着说修好了。因为这种事故里，经常还会有少量文件残留成原来的错误 owner，比如：\n某几个 binary 某几个 .so jdk 下面的某个库文件 lib 目录下的某个共享库 所以我一般会再扫一遍：\nfind $ORACLE_HOME \\( -user test -o -group test \\) | head -100 find /u01/app/oraInventory \\( -user test -o -group test \\) | head -100 [root@centos7:/root]# find $ORACLE_HOME \\( -user test -o -group test \\) | head -100 [root@centos7:/root]# find /u01/app/oraInventory \\( -user test -o -group test \\) | head -100 [root@centos7:/root]# 如果还有输出，就继续清到没有为止。\n四、什么时候再去试 sqlplus # 到这里再切回 oracle 用户去试，才比较合理：\nsu - oracle sqlplus / as sysdba [root@centos7:/root]# su - oracle [oracle@centos7:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 6 20:43:23 2026 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; 如果这时能看到：\nConnected to an idle instance. 那说明前面这层 ORA-12547 基本已经过掉了。\n五、如果能连上 idle instance，但 startup 又报错 # 这个场景很常见。\n很多时候 ORA-12547 解决以后，sqlplus / as sysdba 已经能进了，但一执行 startup，又报：\nORA-48141: error creating directory during ADR initialization ORA-48189: OS command to create directory failed Linux-x86_64 Error: 13: Permission denied 这个本质上还是权限问题，只不过这次卡在了 ORACLE_BASE 的运行目录。\n最常见的就是这些地方：\n/u01/app/oracle/diag /u01/app/oracle/admin /u01/app/oracle/cfgtoollogs /u01/app/oracle/fast_recovery_area 这些目录如果还是 test:test，或者 Oracle 用户没有写权限，实例在启动时就会因为 ADR 初始化失败而报错。\n所以这时候不要想太多，先查：\nls -ld /u01/app/oracle ls -ld /u01/app/oracle/diag ls -ld /u01/app/oracle/admin ls -ld /u01/app/oracle/fast_recovery_area 只要看到 owner 不对，就继续修：\nchown -R oracle:oinstall /u01/app/oracle 确认没有残留后，再重新启动数据库。\n[oracle@centos7:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 6 20:43:23 2026 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup ORACLE instance started. Total System Global Area 2471931904 bytes Fixed Size\t2255752 bytes Variable Size\t620758136 bytes Database Buffers\t1828716544 bytes Redo Buffers\t20201472 bytes Database mounted. Database opened. SQL\u0026gt; 六、数据库起来以后，再看 listener # 数据库能正常 startup 以后，再去处理监听：\nlsnrctl start [oracle@centos7:/home/oracle]$ lsnrctl start LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 06-APR-2026 20:47:14 Copyright (c) 1991, 2013, Oracle. All rights reserved. Starting /u01/app/oracle/product/11.2.0/db/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 11.2.0.4.0 - Production System parameter file is /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/centos7/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos7)(PORT=1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 06-APR-2026 20:47:16 Uptime 0 days 0 hr. 0 min. 5 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/centos7/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos7)(PORT=1521))) The listener supports no services The command completed successfully [oracle@centos7:/home/oracle]$ 刚启动 listener 时，如果看到：\nThe listener supports no services 这个时候先别误判成新故障。 很多时候只是 listener 刚起来，实例服务还没注册进去。\n等一会儿再查一次，或者到数据库里执行：\nalter system register; [oracle@centos7:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 6 20:48:13 2026 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL\u0026gt; alter system register; System altered. SQL\u0026gt; 然后再看：\nlsnrctl status [oracle@centos7:/home/oracle]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 06-APR-2026 20:48:35 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 06-APR-2026 20:47:16 Uptime 0 days 0 hr. 1 min. 18 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/centos7/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos7)(PORT=1521))) Services Summary... Service \u0026#34;orcl\u0026#34; has 1 instance(s). Instance \u0026#34;orcl\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orclXDB\u0026#34; has 1 instance(s). Instance \u0026#34;orcl\u0026#34;, status READY, has 1 handler(s) for this service... The command completed successfully [oracle@centos7:/home/oracle]$ 正常的话，就能看到：\nService \u0026#34;orcl\u0026#34; has 1 instance(s). Instance \u0026#34;orcl\u0026#34;, status READY 到这里，基本就算收工了。\n七、最后一定要做的两件事 # 1. 确认已经没有残留的错误 owner/group # find /u01/app/oracle \\( -user test -o -group test \\) find /u01/app/oraInventory \\( -user test -o -group test \\) [root@centos7:/root]# find /u01/app/oracle \\( -user test -o -group test \\) [root@centos7:/root]# find /u01/app/oraInventory \\( -user test -o -group test \\) [root@centos7:/root]# 最好都没有输出。\n2. 确认关键 binary 已经恢复 # stat -c \u0026#39;%U %G %a %n\u0026#39; $ORACLE_HOME/bin/oracle [root@centos7:/root]# stat -c \u0026#39;%U %G %a %n\u0026#39; $ORACLE_HOME/bin/oracle oracle oinstall 6751 /u01/app/oracle/product/11.2.0/db/bin/oracle [root@centos7:/root]# 至少要确认 owner、group、模式位都已经回到 Oracle 正常使用的状态，而不是还挂着 test:test 或普通权限。\n八、以后怎么避免再出这种事 # 说实话，这种事一旦发生，排起来都不难，真正难的是防止再来一次。\n我的建议很简单：\n第一、不要对 /u01 这种挂载点做无差别的递归 chown 和 chmod。 第二、不要把 Oracle 软件目录当普通业务目录处理。 第三、凡是涉及 ORACLE_HOME、ORACLE_BASE、oraInventory 的变更，先留快照，至少知道原来的 owner、group 和模式是什么。 第四，改完以后第一时间验证：\nsqlplus / as sysdba lsnrctl status 别等业务报错了才知道出事。\n九、另一种解决方案 # 也就是MOS上KB147561这篇文章。文章描述了如果有之前的目录权限的快照或者你重新安装和当前一样规划目录的Oracle软件，直接给出抓取权限快照 + 生成恢复脚本的方法：permission.pl 会生成 permission- 和 restore-perm-.cmd，用于按当时抓取到的 owner/group/mode 恢复；它还特别说明，这个脚本是恢复到抓取时的状态，不是重置成某个通用默认值。 恢复步骤如下：\n# 上传permission.pl文件到恢复快照或者重新安装和当前一样规划目录的Oracle软件的主机上，执行permission.pl捕获/u01目录所有权限。 [oracle@centos7new:/home/oracle]$ cd /home/oracle/script/ [oracle@centos7new:/home/oracle/script]$ chmod 755 permission.pl [oracle@centos7new:/home/oracle/script]$ ./permission.pl /u01 Following log files are generated logfile : permission-Mon-Apr-06-22-10-48-2026 Command file : restore-perm-Mon-Apr-06-22-10-48-2026.cmd Linecount : 39509 [oracle@centos7new:/home/oracle/script]$ 然后把restore-perm-Mon-Apr-06-22-10-48-2026.cmd文件上传到误改权限的主机上\n# 确认目录和权限已经被破坏，执行restore-perm-Mon-Apr-06-22-10-48-2026.cmd，恢复正常 [oracle@centos7:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 6 22:24:03 2026 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-12547: TNS:lost contact Enter user-name: ERROR: ORA-12547: TNS:lost contact Enter user-name: ERROR: ORA-12547: TNS:lost contact SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus [oracle@centos7:/home/oracle]$ ls -lh $ORACLE_HOME/bin/oracle -rwxrwxrwx. 1 test test 229M Apr 6 17:36 /u01/app/oracle/product/11.2.0/db/bin/oracle [oracle@centos7:/home/oracle/script]$ exit [root@centos7:/root]# chmod +x restore-perm-Mon-Apr-06-22-10-48-2026.cmd [root@centos7:/root]# ./restore-perm-Mon-Apr-06-22-10-48-2026.cmd [root@centos7:/root]# su - oracle [oracle@centos7:/home/oracle]$ ls -lh $ORACLE_HOME/bin/oracle -rwsr-s--x. 1 oracle oinstall 229M Apr 6 17:36 /u01/app/oracle/product/11.2.0/db/bin/oracle [oracle@centos7:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Apr 6 22:26:08 2026 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup ORACLE instance started. Total System Global Area 2471931904 bytes Fixed Size\t2255752 bytes Variable Size\t620758136 bytes Database Buffers\t1828716544 bytes Redo Buffers\t20201472 bytes Database mounted. Database opened. SQL\u0026gt; exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@centos7:/home/oracle]$ lsnrctl start LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 06-APR-2026 22:26:20 Copyright (c) 1991, 2013, Oracle. All rights reserved. Starting /u01/app/oracle/product/11.2.0/db/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 11.2.0.4.0 - Production System parameter file is /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/centos7/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos7)(PORT=1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 06-APR-2026 22:26:20 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/centos7/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos7)(PORT=1521))) The listener supports no services The command completed successfully [oracle@centos7:/home/oracle]$ 文末分享MOS中的权限提取permission.pl脚本 下载链接 方便读者在有限的条件下挽救环境，快速恢复数据库可用。\n十、总结 # 这次故障表面上看是 ORA-12547: TNS: lost contact，但本质并不是监听问题，也不是数据库文件本身损坏，而是运维人员误对 /u01 整个目录执行了递归 chown 和 chmod，把 Oracle 的软件目录、Inventory、关键 binary 以及运行目录的 owner、group 和权限体系全部打乱了。\n","date":"2026-04-06","externalUrl":null,"permalink":"/posts/oracle-ora-12547-permission-restore/","section":"文章","summary":"一次 Oracle 目录权限事故复盘：误执行 chown -R 和 chmod -R 破坏 /u01 权限体系，引发 ORA-12547。通过恢复 ORACLE_HOME、ORACLE_BASE、oraInventory、bin/oracle 权限以及运行目录权限，最终恢复数据库和监听。","title":"从 ORA-12547 到数据库恢复：一次目录 owner 与权限误改的完整排障记录","type":"posts"},{"content":"","date":"2026-04-06","externalUrl":null,"permalink":"/tags/%E6%9D%83%E9%99%90%E6%81%A2%E5%A4%8D/","section":"Tags","summary":"","title":"权限恢复","type":"tags"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/linux%E8%BF%90%E7%BB%B4/","section":"Tags","summary":"","title":"Linux运维","type":"tags"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/rclone/","section":"Tags","summary":"","title":"Rclone","type":"tags"},{"content":" 一、前言 # 这几年，越来越多原本部署在本地机房的系统开始迁移到云上，随之而来的图片、日志、备份包、归档文件等非结构化数据，也越来越多地存放在对象存储中。对象存储容量大、扩展方便、便于通过 API 和工具进行管理，因此在数据备份、恢复、跨云迁移和异地灾备等场景中应用非常广泛。\n在实际工作中，很多场景并不是简单的“把文件传上云”这么单一，而是涉及本地到云、云到本地、云到云之间的数据复制、迁移、增量同步和一致性校验。特别是在多云环境下，如何选择一个统一、稳定、便于自动化的工具，往往直接影响迁移效率和实施成本。\nrclone 就是在这类场景中非常实用的一款工具。它支持多种对象存储和云存储协议，命令风格统一，既适合日常文件管理，也适合批量迁移和脚本化运维。本文将从 rclone 是什么、能做什么、如何安装配置以及基本命令使用等方面进行介绍，最后结合华为云 OBS 迁移到阿里云 OSS 的案例，演示一个常见的跨云对象存储迁移流程。\n二、rclone 是什么 # rclone 是一个命令行工具，用来管理云存储上的文件。官方把它定位为云厂商网页存储界面的增强替代品，支持 70 多种云存储、对象存储和传输协议，包括 S3 兼容对象存储、Google Drive、OneDrive、FTP、SFTP、WebDAV 等。它提供类似 rsync、cp、mv、ls、mount、rm 的云端版本命令，并支持脚本化、API 调用、校验和验证、断点续传/重试、加密、挂载等能力。\nrclone 官方主页明确列出了阿里云 OSS 和华为云 OBS 都在支持列表里；OBS 在 rclone 中通过 S3 backend 的 HuaweiOBS provider 配置，OSS 则通过 S3 backend 的 Alibaba provider 配置。\n三、rclone 能干什么 # 在实际使用中，rclone 主要有以下几类典型用途：把本地文件备份到云上、从云上恢复文件、云到云迁移、把多个云盘或对象存储挂载成磁盘、做对象清单/容量分析、以及对数据做加密后再传输。官方还强调它会尽量保留时间戳、校验哈希，支持 check 做完整性校验，并且在条件允许时可进行 provider-to-provider 传输而不落本地磁盘。\n在跨云对象存储迁移场景中，rclone 具有较好的适配性，因为它同时支持华为 OBS 和阿里 OSS，而且命令风格统一，迁移、校验、增量同步都能用同一套工具完成。\n四、适用于什么场景 # rclone 常见的应用场景包括：\n对象存储迁移：例如 OBS → OSS、OSS → S3、S3 → MinIO。 备份与归档：把服务器目录定时备份到对象存储，或者把对象存储再复制一份到另一个云。 灾备与多云：一个桶作为生产，一个桶作为异地/异云备份。 校验与巡检：迁移后用 rclone check 比较源和目标的大小与哈希。 脚本自动化：Shell、PowerShell、定时任务、CI/CD 都能调用。 五、如何安装 # 5.1 Linux / macOS / BSD # 官方推荐的简便方式是安装脚本：\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 如果你想装 beta 版：\nsudo -v ; curl https://rclone.org/install.sh | sudo bash -s beta 安装脚本会先检查当前版本，若已满足条件则不会重复下载。\nLinux 也可以直接下预编译包再手动复制到 /usr/bin/：\ncurl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip unzip rclone-current-linux-amd64.zip cd rclone-*-linux-amd64 sudo cp rclone /usr/bin/ sudo chown root:root /usr/bin/rclone sudo chmod 755 /usr/bin/rclone 装完后官方建议直接执行 rclone config 开始配置。\n5.2 Windows # Windows 可以直接下载预编译 rclone.exe，也可以用包管理器安装：\nwinget install Rclone.Rclone 或：\nchoco install rclone 如果你后面要用 rclone mount，官方说明 Windows 还需要安装 WinFsp。\n5.3 安装后的检查 # rclone version 六、如何配置和基本使用 # 6.1 配置入口 # rclone 的配置文件保存各种 remote 的认证信息。最常见的配置入口是：\nrclone config 配置文件默认通常在：\nWindows：%APPDATA%/rclone/rclone.conf Linux/macOS：~/.config/rclone/rclone.conf 也可以用下面命令查看当前实际路径：\nrclone config file 如果想先创建一个空配置文件，可以执行：\nrclone config touch 这些都来自官方 usage 文档。\n6.2 配置文件安全 # 需要注意的是，rclone.conf 中保存着云存储认证信息，应妥善保管。你可以在 rclone config 里选择 s) Set configuration password 给整个配置文件加密。\n6.3 remote 路径语法 # rclone 最重要的路径格式是：\n本地目录：/path/to/dir 远端目录：remote:path/to/dir 也就是说，如果你配置了一个名叫 obs-src 的 remote，那么 obs-src:bucket-name/path 就表示这个 remote 下的某个桶和路径。官方也说明大多数 backend 推荐用 remote:path/to/dir 这种格式。\n6.4 基本命令 # 官方 usage 文档给的基础例子是：\nrclone ls remote:path rclone copy /local/path remote:path rclone sync --interactive /local/path remote:path 其中最常用的几个命令，可以这样理解：ls 用来列对象，copy 用来复制新增或变化的文件但不删除目标端已有文件，sync 会把目标端改成和源端一致，必要时会删除目标端多余文件。\n你可以先记住这几个高频命令：\nrclone listremotes # 看已配置的 remote rclone lsd obs-src: # 列出 remote 下的桶/目录 rclone ls obs-src:mybucket/path # 列出对象 rclone size obs-src:mybucket/path # 看对象数和总大小 rclone copy SRC DST -P # 复制，不删目标 rclone sync SRC DST --dry-run # 先演练同步 rclone check SRC DST # 校验源目标是否一致 copy 官方支持 -P/--progress 显示实时进度，也支持 --dry-run 先演练；sync 官方特别提示因为可能造成数据丢失，应该先用 --dry-run 或 --interactive 测试；check 会比较大小和哈希，并且不会修改源或目标。\n七、实战案例：华为云 OBS 迁移到阿里云 OSS # 以下结合实际场景，介绍一套常见的迁移实施方法。\n7.1 迁移前准备 # 你需要准备：\n华为云 OBS 的 access_key_id 和 secret_access_key 阿里云 OSS 的 access_key_id 和 secret_access_key 源桶名称、目标桶名称 两边桶所在区域对应的 endpoint 一台运行 rclone 的中转主机，这里我们准备一台linux虚拟机 rclone 官方说明它在条件允许时可做 provider-to-provider 传输而不落本地磁盘；但对于 OBS → OSS 这类跨云迁移，实际执行时我建议你仍按“数据会经过运行 rclone 的这台机器”来规划带宽、网络位置和运行时长，这样更稳妥。\n厂商 桶名称 目录 Endpoint(终端节点) access_key_id secret_access_key 华为云 OBS my-obs-bucket-sy path-prefix obs.cn-east-3.myhuaweicloud.com HPUA05SZWCS1A5H5I6SO ****** 阿里云 OSS my-oss-bucket-sy path-prefix oss-cn-shanghai.aliyuncs.com LTAI5tK6ihgas6mDGw7c7Wrv ****** 7.2 中转主机上安装rclone # 在rclone 的中转主机上安装\n[root@rockylinux9 ~]# curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 26.8M 100 26.8M 0 0 7989k 0 0:00:03 0:00:03 --:--:-- 7989k [root@rockylinux9 ~]# unzip rclone-current-linux-amd64.zip Archive: rclone-current-linux-amd64.zip creating: rclone-v1.73.3-linux-amd64/ inflating: rclone-v1.73.3-linux-amd64/rclone.1 inflating: rclone-v1.73.3-linux-amd64/README.html inflating: rclone-v1.73.3-linux-amd64/rclone inflating: rclone-v1.73.3-linux-amd64/git-log.txt inflating: rclone-v1.73.3-linux-amd64/README.txt [root@rockylinux9 ~]# cd rclone-v1.73.3-linux-amd64/ [root@rockylinux9 rclone-v1.73.3-linux-amd64]# ll 总用量 83844 -rw-r--r-- 1 root root 4628 3月 24 02:51 git-log.txt -rwxr-xr-x 1 root root 76480696 3月 24 02:56 rclone -rw-r--r-- 1 root root 3043385 3月 24 02:34 rclone.1 -rw-r--r-- 1 root root 3549157 3月 24 02:34 README.html -rw-r--r-- 1 root root 2763817 3月 24 02:34 README.txt [root@rockylinux9 rclone-v1.73.3-linux-amd64]# sudo cp rclone /usr/bin/ [root@rockylinux9 rclone-v1.73.3-linux-amd64]# sudo chown root:root /usr/bin/rclone [root@rockylinux9 rclone-v1.73.3-linux-amd64]# sudo chmod 755 /usr/bin/rclone [root@rockylinux9 rclone-v1.73.3-linux-amd64]# cd ~ [root@rockylinux9 ~]# rclone version rclone v1.73.3 - os/version: rocky 9.7 (64 bit) - os/kernel: 5.14.0-611.5.1.el9_7.x86_64 (x86_64) - os/type: linux - os/arch: amd64 - go/version: go1.25.8 - go/linking: static - go/tags: none [root@rockylinux9 ~]# 建议的 remote 命名\n源端：obs-src\n目标端：oss-dst\n7.3 配置华为云 OBS # 首先创建一个空配置文件\n[root@rockylinux9 ~]# rclone config file Configuration file doesn\u0026#39;t exist, but rclone will use this path: /root/.config/rclone/rclone.conf [root@rockylinux9 ~]# rclone config touch 2026/03/25 22:28:09 NOTICE: Config file \u0026#34;/root/.config/rclone/rclone.conf\u0026#34; not found - using defaults [root@rockylinux9 ~]# ls -l /root/.config/rclone/rclone.conf -rw------- 1 root root 0 3月 25 22:28 /root/.config/rclone/rclone.conf [root@rockylinux9 ~]# 官方给出的 OBS 配置形式是：\n[obs] type = s3 provider = HuaweiOBS access_key_id = your-access-key-id secret_access_key = your-secret-access-key region = af-south-1 endpoint = obs.af-south-1.myhuaweicloud.com acl = private 而且官方列出了华为 OBS 的 provider 名就是 HuaweiOBS，region/endpoint 要按你的区域替换，例如文档中可见：\ncn-east-3 ↔ obs.cn-east-3.myhuaweicloud.com cn-east-2 ↔ obs.cn-east-2.myhuaweicloud.com cn-north-1 ↔ obs.cn-north-1.myhuaweicloud.com cn-north-4 ↔ obs.cn-north-4.myhuaweicloud.com cn-south-1 ↔ obs.cn-south-1.myhuaweicloud.com ap-southeast-1 ↔ obs.ap-southeast-1.myhuaweicloud.com。 所以你可以直接写成例如华东-上海一 的配置如下：\n[root@rockylinux9 ~]# vi /root/.config/rclone/rclone.conf [root@rockylinux9 ~]# cat /root/.config/rclone/rclone.conf [obs-src] type = s3 provider = HuaweiOBS access_key_id = HPUA05SZWCS1A5H5I6SO secret_access_key = ****** region = cn-east-3 endpoint = obs.cn-east-3.myhuaweicloud.com acl = private [root@rockylinux9 ~]# 验证配置是否成功\n[root@rockylinux9 ~]# rclone listremotes obs-src: [root@rockylinux9 ~]# rclone lsd obs-src: -1 2026-03-25 21:23:23 -1 my-obs-bucket-sy [root@rockylinux9 ~]# rclone ls obs-src:my-obs-bucket-sy [root@rockylinux9 ~]# 上传3个本地测试文件到华为云桶里\n[root@rockylinux9 ~]# ll 总用量 32032 -rw-------. 1 root root 1328 3月 22 21:42 anaconda-ks.cfg -rw-r--r-- 1 root root 1767897 3月 25 22:41 day-01.png -rw-r--r-- 1 root root 2833397 3月 25 22:41 day-02.png -rw-r--r-- 1 root root 6554 3月 25 22:42 Oracle备份恢复技术实践.md -rw-r--r-- 1 root root 28184295 3月 25 21:54 rclone-current-linux-amd64.zip drwxr-xr-x 2 root root 92 3月 24 02:56 rclone-v1.73.3-linux-amd64 [root@rockylinux9 ~]# rclone copy /root/day-01.png obs-src:my-obs-bucket-sy/path-prefix [root@rockylinux9 ~]# rclone copy /root/day-02.png obs-src:my-obs-bucket-sy/path-prefix [root@rockylinux9 ~]# rclone copy /root/Oracle备份恢复技术实践.md obs-src:my-obs-bucket-sy/path-prefix [root@rockylinux9 ~]# rclone size obs-src:my-obs-bucket-sy/path-prefix Total objects: 3 Total size: 4.394 MiB (4607848 Byte) [root@rockylinux9 ~]# rclone ls obs-src:my-obs-bucket-sy/path-prefix 6554 Oracle备份恢复技术实践.md 1767897 day-01.png 2833397 day-02.png [root@rockylinux9 ~]# 7.4 配置阿里云 OSS # 官方给出的 OSS 配置方式是 S3 backend + provider = Alibaba。文档示例中的 remote 最终如下：\n[oss] type = s3 provider = Alibaba env_auth = false access_key_id = accesskeyid secret_access_key = secretaccesskey endpoint = oss-cn-hangzhou.aliyuncs.com acl = private storage_class = Standard rclone 文档里也列了多个阿里云 endpoint，例如：\noss-cn-hangzhou.aliyuncs.com oss-cn-shanghai.aliyuncs.com oss-cn-qingdao.aliyuncs.com oss-cn-beijing.aliyuncs.com oss-cn-shenzhen.aliyuncs.com oss-cn-guangzhou.aliyuncs.com oss-cn-hongkong.aliyuncs.com。 所以你可以按实际目标区域华东2-(上海)写成：\n[root@rockylinux9 ~]# vi /root/.config/rclone/rclone.conf [root@rockylinux9 ~]# cat /root/.config/rclone/rclone.conf [obs-src] type = s3 provider = HuaweiOBS access_key_id = HPUA05SZWCS1A5H5I6SO secret_access_key = ****** region = cn-east-3 endpoint = obs.cn-east-3.myhuaweicloud.com acl = private [oss-dst] type = s3 provider = Alibaba env_auth = false access_key_id = LTAI5tK6ihgas6mDGw7c7Wrv secret_access_key = ****** endpoint = oss-cn-shanghai.aliyuncs.com acl = private [root@rockylinux9 ~]# 如果目标桶已经提前建好，而你的账号没有建桶权限，可以在对应 remote 里加：\nno_check_bucket = true 因为官方说明这个参数可以让 rclone 不去检查或创建 bucket，在已知桶存在、或账号无建桶权限时会有用。\n7.5 先检查 remote 是否通 # 先看 remote 有没有配置成功：\n[root@rockylinux9 ~]# rclone listremotes obs-src: oss-dst: [root@rockylinux9 ~]# 再分别列桶：\n[root@rockylinux9 ~]# rclone lsd obs-src: -1 2026-03-25 21:23:23 -1 my-obs-bucket-sy [root@rockylinux9 ~]# rclone lsd oss-dst: -1 2026-03-25 21:33:50 -1 my-oss-bucket-sy [root@rockylinux9 ~]# 然后确认源路径大小：\n[root@rockylinux9 ~]# rclone size obs-src:my-obs-bucket-sy/path-prefix Total objects: 3 Total size: 4.394 MiB (4607848 Byte) [root@rockylinux9 ~]# rclone size oss-dst:my-oss-bucket-sy/path-prefix Total objects: 0 Total size: 0 B (0 Byte) [root@rockylinux9 ~]# 这些用法都符合官方的 subcommands 和 remote:path 语法。\n7.6 正式迁移：先 dry-run，再 copy # 我的建议是：第一次迁移先用 copy，不要一上来用 sync。因为 copy 不会删目标端已有对象，而 sync 会把目标端改成与源一致，存在删除风险。官方也是这么定义这两个命令的。\n先演练：\nrclone copy obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix --dry-run -P [root@rockylinux9 ~]# rclone copy obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix --dry-run -P 2026/03/25 22:57:44 NOTICE: Oracle备份恢复技术实践.md: Skipped copy as --dry-run is set (size 6.400Ki) 2026/03/25 22:57:44 NOTICE: day-01.png: Skipped copy as --dry-run is set (size 1.686Mi) 2026/03/25 22:57:44 NOTICE: day-02.png: Skipped copy as --dry-run is set (size 2.702Mi) Transferred: 4.394 MiB / 4.394 MiB, 100%, 0 B/s, ETA - Checks: 0 / 0, -, Listed 3 Transferred: 3 / 3, 100% Elapsed time: 0.0s 2026/03/25 22:57:44 NOTICE: Transferred: 4.394 MiB / 4.394 MiB, 100%, 0 B/s, ETA - Checks: 0 / 0, -, Listed 3 Transferred: 3 / 3, 100% Elapsed time: 0.0s [root@rockylinux9 ~]# 确认没问题后正式执行：\nrclone copy obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix -P --log-file ./rclone-obs2oss.log --log-level INFO [root@rockylinux9 ~]# rclone copy obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix -P --log-file ./rclone-obs2oss.log --log-level INFO Transferred: 4.394 MiB / 4.394 MiB, 100%, 0 B/s, ETA - Checks: 0 / 0, -, Listed 3 Transferred: 3 / 3, 100% Elapsed time: 0.4s [root@rockylinux9 ~]# cat ./rclone-obs2oss.log 2026/03/25 23:08:41 INFO : Oracle备份恢复技术实践.md: Copied (new) 2026/03/25 23:08:41 INFO : day-02.png: Copied (new) 2026/03/25 23:08:41 INFO : day-01.png: Copied (new) 2026/03/25 23:08:41 INFO : Transferred: 4.394 MiB / 4.394 MiB, 100%, 0 B/s, ETA - Checks: 0 / 0, -, Listed 3 Transferred: 3 / 3, 100% Elapsed time: 0.4s [root@rockylinux9 ~]# 如果你要迁整个桶根目录，就把 path-prefix 去掉：\nrclone copy obs-src:my-obs-bucket-sy oss-dst:my-oss-bucket-sy -P --log-file ./rclone-obs2oss.log --log-level INFO 官方文档强调：copy 复制的是目录内容，不是把源目录名再包一层复制过去。\n7.7 迁移后校验 # 最稳妥的方式是迁完后做 check：\nrclone check obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix [root@rockylinux9 ~]# rclone check obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix 2026/03/25 23:11:12 NOTICE: S3 bucket my-oss-bucket-sy path path-prefix: 0 differences found 2026/03/25 23:11:12 NOTICE: S3 bucket my-oss-bucket-sy path path-prefix: 3 matching files [root@rockylinux9 ~]# 如果你只想快速看大小是否一致，可以先：\nrclone check obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix --size-only [root@rockylinux9 ~]# rclone check obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix --size-only 2026/03/25 23:11:57 NOTICE: S3 bucket my-oss-bucket-sy path path-prefix: 0 differences found 2026/03/25 23:11:57 NOTICE: S3 bucket my-oss-bucket-sy path path-prefix: 3 matching files [root@rockylinux9 ~]# 官方说明 check 会比较大小和哈希，记录差异，而且不会修改源或目标。\n7.8 后续增量同步 # 在华为云上先增加一个文件day-03.png，同时修改一个文件Oracle备份恢复技术实践.md 。\n[root@rockylinux9 ~]# echo \u0026#34;孙莹测试修改文件\u0026#34; \u0026gt;\u0026gt; Oracle备份恢复技术实践.md [root@rockylinux9 ~]# ll 总用量 32052 -rw-------. 1 root root 1328 3月 22 21:42 anaconda-ks.cfg -rw-r--r-- 1 root root 1767897 3月 25 22:41 day-01.png -rw-r--r-- 1 root root 2833397 3月 25 22:41 day-02.png -rw-r--r-- 1 root root 14007 3月 25 23:14 day-03.png -rw-r--r-- 1 root root 6601 3月 25 23:15 Oracle备份恢复技术实践.md -rw-r--r-- 1 root root 28184295 3月 25 21:54 rclone-current-linux-amd64.zip -rw-r----- 1 root root 1585 3月 25 23:08 rclone-obs2oss.log drwxr-xr-x 2 root root 92 3月 24 02:56 rclone-v1.73.3-linux-amd64 [root@rockylinux9 ~]# rclone copy /root/day-03.png obs-src:my-obs-bucket-sy/path-prefix [root@rockylinux9 ~]# rclone copy /root/Oracle备份恢复技术实践.md obs-src:my-obs-bucket-sy/path-prefix [root@rockylinux9 ~]# rclone ls obs-src:my-obs-bucket-sy/path-prefix 6601 Oracle备份恢复技术实践.md 1767897 day-01.png 2833397 day-02.png 14007 day-03.png [root@rockylinux9 ~]# 首轮全量迁移结束后，后面如果只是做补差，可以继续用：\n# 增量复制，不删目标 rclone copy obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix -P --log-file ./rclone-obs2oss.log --log-level INFO [root@rockylinux9 ~]# rclone copy obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix -P --log-file ./rclone-obs2oss.log --log-level INFO Transferred: 20.125 KiB / 20.125 KiB, 100%, 0 B/s, ETA - Checks: 3 / 3, 100%, Listed 7 Transferred: 2 / 2, 100% Elapsed time: 0.1s [root@rockylinux9 ~]# cat ./rclone-obs2oss.log 2026/03/25 23:08:41 INFO : Oracle备份恢复技术实践.md: Copied (new) 2026/03/25 23:08:41 INFO : day-02.png: Copied (new) 2026/03/25 23:08:41 INFO : day-01.png: Copied (new) 2026/03/25 23:08:41 INFO : Transferred: 4.394 MiB / 4.394 MiB, 100%, 0 B/s, ETA - Checks: 0 / 0, -, Listed 3 Transferred: 3 / 3, 100% Elapsed time: 0.4s 2026/03/25 23:22:51 INFO : day-03.png: Copied (new) 2026/03/25 23:22:51 INFO : Oracle备份恢复技术实践.md: Copied (replaced existing) 2026/03/25 23:22:51 INFO : Transferred: 20.125 KiB / 20.125 KiB, 100%, 0 B/s, ETA - Checks: 3 / 3, 100%, Listed 7 Transferred: 2 / 2, 100% Elapsed time: 0.1s [root@rockylinux9 ~]# 只有当你明确希望“目标端完全镜像源端，并删除目标端多余对象”时，才考虑：\n# 严格同步，会删目标多余文件 rclone sync obs-src:my-obs-bucket-sy/path-prefix oss-dst:my-oss-bucket-sy/path-prefix --dry-run 确认演练结果无误后，再去掉 --dry-run。因为官方明确写了 sync 会删除目标端多余内容。\n7.9 落地建议 # 在生产环境实施时，建议按以下顺序进行：\n安装 rclone，跑 rclone version 执行 rclone config 配好 obs-src 和 oss-dst 先 rclone lsd / rclone size 验证源目标可访问 用 rclone copy --dry-run 演练 正式 rclone copy 用 rclone check 校验 后续需要补差时继续 copy 只有明确要做镜像删除时才用 sync。 八、总结 # rclone 是一款轻量、通用且非常适合脚本化运维的云存储管理工具。对于对象存储场景而言，它不仅能够完成本地到云、云到本地的数据传输，也能够胜任云到云之间的跨平台迁移、增量同步和一致性校验等工作。尤其在多云环境下，rclone 通过统一的命令体系屏蔽了不同云厂商之间的部分接口差异，能够有效降低迁移和运维的复杂度。\n本文从 rclone 的基本概念、适用场景、安装方式、配置方法和常用命令入手，结合华为云 OBS 迁移到阿里云 OSS 的实战案例，演示了一套较为完整的跨云对象存储迁移流程。通过实际操作可以看到，在完成 remote 配置、连通性验证、迁移演练、正式复制和结果校验之后，rclone 可以较为高效地完成对象迁移任务；而在后续业务持续变化的情况下，也可以继续使用 copy 实现增量补传，或在严格镜像场景下使用 sync 做全量一致性同步。\n在实际生产环境中，建议始终遵循“先验证、再演练、后执行、最后校验”的原则：先确认源端和目标端均可正常访问，再通过 --dry-run 预演迁移动作，正式执行后结合日志和 rclone check 做结果核对。这样既能够提高迁移过程的可控性，也能够最大程度降低误操作和数据不一致带来的风险。\n总体来看，rclone 非常适合作为对象存储迁移、备份、同步和灾备场景中的基础工具。对于需要在不同云厂商对象存储之间进行数据流转的运维人员和实施人员来说，熟练掌握 rclone 的配置方法和常用命令，将会显著提升日常工作的效率和稳定性。\n","date":"2026-03-25","externalUrl":null,"permalink":"/posts/rclone-obs-to-oss-migration/","section":"文章","summary":"一篇 rclone 跨云对象存储迁移实战文档，基于华为云 OBS 到阿里云 OSS 的场景，演示 remote 配置、对象复制、迁移校验、增量补传和 sync 使用风险。","title":"rclone 跨云对象存储迁移实战：华为云 OBS 到阿里云 OSS","type":"posts"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/%E9%98%BF%E9%87%8C%E4%BA%91oss/","section":"Tags","summary":"","title":"阿里云OSS","type":"tags"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/","section":"Tags","summary":"","title":"对象存储","type":"tags"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/%E5%8D%8E%E4%B8%BA%E4%BA%91obs/","section":"Tags","summary":"","title":"华为云OBS","type":"tags"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/%E8%B7%A8%E4%BA%91%E8%BF%81%E7%A7%BB/","section":"Tags","summary":"","title":"跨云迁移","type":"tags"},{"content":"","date":"2026-03-25","externalUrl":null,"permalink":"/tags/%E4%BA%91%E5%AD%98%E5%82%A8/","section":"Tags","summary":"","title":"云存储","type":"tags"},{"content":"","date":"2026-03-17","externalUrl":null,"permalink":"/tags/blkup2/","section":"Tags","summary":"","title":"BLKUP2","type":"tags"},{"content":"","date":"2026-03-17","externalUrl":null,"permalink":"/tags/dbms_sqltune/","section":"Tags","summary":"","title":"DBMS_SQLTUNE","type":"tags"},{"content":" 前言 # 随着数字化转型和信创替代持续推进，越来越多业务系统开始从传统Oracle数据库迁移到国产数据库平台。数据库迁移完成并不意味着性能问题自然消失，尤其是一些在原有环境中执行正常的 SQL，迁移后可能因为优化器策略、索引设计或执行路径差异而出现明显性能下降。\n本文结合一次真实的达梦慢 SQL 优化案例展开分析。某条查询语句在 Oracle 中执行仅需 0.3 秒，而在达梦中却需要 133 秒才能返回结果。通过 SQL Monitor、执行计划、表结构和索引设计分析，最终定位到问题根因是 SHOP_SALE_ORDER_DETAIL 表在缺少合适联合索引的情况下发生了大量 BLKUP2 回表操作。通过补充联合索引并重新收集统计信息，SQL 执行时间最终下降到毫秒级。本文将完整记录问题定位、原因分析和优化过程，给类似场景提供一个可复用的排查思路。\n问题描述 # 同样的 SQL 语句，在 Oracle 中执行仅需 0.3 秒，而在达梦中执行耗时约 134 秒。SQL语句如下：\nselect * from ( select TMP.*, ROWNUM as ROW_ID from ( select t.*, li.item_detail_name as statusDescIn, lo.item_detail_name as statusDescOut, li.sort_code as sortCodeIn, lo.sort_code as sortCodeOut from v_logis_shop_sale_order_detail t left join c_logistics_in li on t.logis_status_code_in = li.item_detail_code left join c_logistics_out lo on t.logis_status_code_out = lo.item_detail_code where t.SO_ID = \u0026#39;0002603046042426\u0026#39; order by SO_DET_NO asc ) TMP where ROWNUM \u0026lt;= 15 ) where ROW_ID \u0026gt; 0 使用 DBMS_SQLTUNE 定位慢 SQL # DBMS_SQLTUNE 包提供一系列实时 SQL 监控的方法。当 SQL 监控功能开启后，DBMS_SQLTUNE 包可以实时监控 SQL 执行过程中的信息，包括：执行时间、执行代价、执行用户、统计信息等情况。\nALTER SESSION SET \u0026#39;MONITOR_SQL_EXEC\u0026#39; = 1; \u0026lt;执行待优化SQL\u0026gt; select DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=\u0026gt;1213701) from dual; 先在会话级开启 SQL 监控参数 MONITOR_SQL_EXEC=1\nALTER SESSION SET \u0026#39;MONITOR_SQL_EXEC\u0026#39; = 1; 执行待优化SQL，记住执行号下图红色部分。\nselect * from (select tmp.*, rownum as row_id from (select t.*, li.item_detail_name as statusdescin, lo.item_detail_name as statusdescout, li.sort_code as sortcodein, lo.sort_code as sortcodeout from v_logis_shop_sale_order_detail t left join c_logistics_in li on t.logis_status_code_in = li.item_detail_code left join c_logistics_out lo on t.logis_status_code_out = lo.item_detail_code where t.so_id = \u0026#39;0002603046042426\u0026#39; order by so_det_no asc) tmp where rownum \u0026lt;= 15) where row_id \u0026gt; 0 执行DBMS_SQLTUNE.REPORT_SQL_MONITOR，能够获取 IO 操作量，查看真实执行计划，每个操作符消耗占比和相应的花费时间，每个操作符执行的次数，双击红色部分\u0026lt;长文本\u0026gt;。如下图\nselect DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=\u0026gt;14763931) from dual; 我们可以得到DBMS_SQLTUNE完整的报告，我们另存为文本。打开文本文件如下：\n报告如下：\nSQL Monitoring Report SQL Text ------------------------------ select * from (select tmp.*, rownum as row_id from (select t.*, li.item_detail_name as statusdescin, lo.item_detail_name as statusdescout, li.sort_code as sortcodein, lo.sort_code as sortcodeout from v_logis_shop_sale_order_detail t left join c_logistics_in li on t.logis_status_code_in = li.item_detail_code left join c_logistics_out lo on t.logis_status_code_out = lo.item_detail_code where t.so_id = \u0026#39;0002603046042426\u0026#39; order by so_det_no asc) tmp where rownum \u0026lt;= 15) where row_id \u0026gt; 0 Global Information ------------------------------ Status : DONE (ALL ROWS) Session : RIS (281434248978120:157948) SQL ID : 1596 SQL Execution ID : 14763931 Execution Started : 2026-03-17 19:26:25 Duration : 133.983008s Program : manager.exe Global Stats ========================================================= | Affected | Bytes | Bytes | Physical | Logical | | Rows | Allocate | Free | Read(page) | Read(page) | ========================================================= | 0 | 0 | 0 | 0 | 40046153 | ========================================================= SQL Plan Monitoring Details ======================================================================================================================================= | Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Activity | Activity Detail | | | | | (Estim) | | Active(s) | Active | | (Actual) | (%) | (# samples) | ======================================================================================================================================= | 0 | DLCK | | | | 0.000009 | +133.982851 | 2 | | 0.00 | | | 1 | NSET2 | | 1 | 147 | 0.000145 | +133.982738 | 3 | 1 | 0.00 | | | 2 | PIPE2 | | 1 | 147 | 0.000001 | +133.982738 | 5 | 1 | 0.00 | | | 3 | PIPE2 | | 1 | 144 | 0.000001 | +133.982737 | 5 | 1 | 0.00 | | | 4 | PRJT2 | | 1 | 141 | 0.000004 | +133.982736 | 4 | 1 | 0.00 | | | 5 | SLCT2 | | 1 | 141 | 0.000020 | +133.982733 | 4 | 1 | 0.00 | | | 6 | PRJT2 | | 15 | 141 | 0.000005 | +133.982732 | 4 | 1 | 0.00 | | | 7 | RN | | 15 | 141 | 0.000017 | +133.982725 | 4 | 1 | 0.00 | | | 8 | PRJT2 | | 15 | 141 | 0.000006 | +133.982723 | 4 | 1 | 0.00 | | | 9 | TOPN2 | | 15 | 141 | 0.000031 | +133.982707 | 4 | 1 | 0.00 | | | 10 | NLLO2 | | 300 | 141 | 0.000038 | +133.982704 | 6 | 1 | 0.00 | | | 11 | NLLO2 | | 300 | 72 | 0.000016 | +133.982701 | 5 | 1 | 0.00 | | | 12 | PRJT2 | | 300 | 4 | 0.000217 | +133.982699 | 4 | 1 | 0.00 | | | 13 | IJI2 | | 300 | 4 | 0.000015 | +133.982696 | 6 | 1 | 0.00 | | | 14 | SLCT2 | | 300 | 2 | 0.342479 | +133.982695 | 44486 | 1 | 0.26 | | | 15 | BLKUP2 | SHOP_SALE_ORDER_DETAIL | 300 | 2 | 132.934822 | +133.982694 | 88968 | 13344613 | 99.27 | | | 16 | SSCN | SHOP_SALE_ORDER_DETAIL | 300 | 2 | 0.630153 | +133.982692 | 44484 | 13344613 | 0.47 | | | 17 | BLKUP2 | SHOP_GOODS | 1 | 1 | 0.000016 | +133.128555 | 4 | 1 | 0.00 | | | 18 | SSEK2 | SHOP_GOODS | 1 | 1 | 0.000050 | +133.128555 | 2 | 1 | 0.00 | | | 19 | PRJT2 | | 1 | 1 | 0.000001 | +133.128338 | 2 | | 0.00 | | | 20 | SLCT2 | | 1 | 1 | 0.000001 | +133.128338 | 2 | | 0.00 | | | 21 | IJI2 | | 1 | 1 | 0.000000 | +133.128338 | 4 | | 0.00 | | | 22 | BLKUP2 | BASE_DATAITEM | 1 | 1 | 0.000012 | +133.128338 | 4 | 1 | 0.00 | | | 23 | SSEK2 | BASE_DATAITEM | 1 | 1 | 0.000013 | +133.128338 | 2 | 1 | 0.00 | | | 24 | BLKUP2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000000 | +133.128337 | 2 | | 0.00 | | | 25 | SLCT2 | | 1 | 1 | 0.000010 | +133.128337 | 3 | | 0.00 | | | 26 | SSEK2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000023 | +133.128336 | 2 | 8 | 0.00 | | | 27 | PRJT2 | | 1 | 1 | 0.000002 | +133.128553 | 4 | 1 | 0.00 | | | 28 | SLCT2 | | 1 | 1 | 0.000007 | +133.128552 | 4 | 1 | 0.00 | | | 29 | IJI2 | | 1 | 1 | 0.000002 | +133.128552 | 6 | 1 | 0.00 | | | 30 | BLKUP2 | BASE_DATAITEM | 1 | 1 | 0.000033 | +133.128552 | 4 | 1 | 0.00 | | | 31 | SSEK2 | BASE_DATAITEM | 1 | 1 | 0.000007 | +133.128552 | 2 | 1 | 0.00 | | | 32 | BLKUP2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000015 | +133.128551 | 4 | 1 | 0.00 | | | 33 | SLCT2 | | 1 | 1 | 0.000006 | +133.128551 | 4 | 1 | 0.00 | | | 34 | SSEK2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000017 | +133.128550 | 2 | 7 | 0.00 | | | 35 | SPL2 | | | 3 | 0.000001 | +133.128268 | 4 | | 0.00 | | | 36 | PRJT2 | | 1 | 3 | 0.000001 | +133.128268 | 4 | 1 | 0.00 | | | 37 | AAGR2 | | 1 | 3 | 0.000009 | +133.128268 | 4 | 1 | 0.00 | | | 38 | PRJT2 | | 1 | 3 | 0.000012 | +133.128265 | 4 | 6 | 0.00 | | | 39 | SLCT2 | | 1 | 3 | 0.000014 | +133.128265 | 4 | 6 | 0.00 | | | 40 | BLKUP2 | SHOP_LOGIS_STATUS_OUT | 2911 | 3 | 0.000065 | +133.128265 | 4 | 6 | 0.00 | | | 41 | SSEK2 | SHOP_LOGIS_STATUS_OUT | 2911 | 3 | 0.000026 | +133.128264 | 2 | 6 | 0.00 | | | 42 | SPL2 | | | 2 | 0.000009 | +133.128125 | 4 | | 0.00 | | | 43 | PRJT2 | | 1 | 2 | 0.000003 | +133.128125 | 4 | 1 | 0.00 | | | 44 | AAGR2 | | 1 | 2 | 0.000008 | +133.128124 | 3 | 1 | 0.00 | | | 45 | PRJT2 | | 1 | 2 | 0.000001 | +133.128115 | 2 | | 0.00 | | | 46 | SLCT2 | | 1 | 2 | 0.000001 | +133.128115 | 2 | | 0.00 | | | 47 | BLKUP2 | SHOP_LOGIS_STATUS_IN | 2213 | 2 | 0.000001 | +133.128115 | 2 | | 0.00 | | | 48 | SSEK2 | SHOP_LOGIS_STATUS_IN | 2213 | 2 | 0.000026 | +133.128088 | 1 | | 0.00 | | ======================================================================================================================================= 这条SQL整体执行时间133s\nBLKUP2 SHOP_SALE_ORDER_DETAIL = 132.93s，占 99.27%，执行 88968 次，实际累计处理量到 13344613。\n也就是说，虽然你最后只取 15 行，但数据库为了拿到这 15 行，前面在 SHOP_SALE_ORDER_DETAIL 上做了非常大量的扫描 + 回表。监控里该节点的累计实际处理量到了 13344613，而且 BLKUP2 执行了 88968 次，这是非常典型的“索引不匹配 + 宽表回表”现象。\n相关对象与数据规模分析 # 我们分析SQL主要可以看到v_logis_shop_sale_order_detail和c_logistics_in，c_logistics_out这几个表关联查询，v_logis_shop_sale_order_detail是一个视图，记录数11341732。\nselect count(1) from v_logis_shop_sale_order_detail; select count(1) from c_logistics_in; select count(1) from c_logistics_out; 视图描述如下，视图核心表就是SHOP_SALE_ORDER_DETAIL\nCREATE OR REPLACE VIEW \u0026#34;RIS\u0026#34;.\u0026#34;V_LOGIS_SHOP_SALE_ORDER_DETAIL\u0026#34; (\u0026#34;SO_DET_ID\u0026#34;,\u0026#34;SO_ID\u0026#34;,\u0026#34;SO_CAT\u0026#34;,\u0026#34;SO_TYPE\u0026#34;,\u0026#34;SO_NO\u0026#34;,\u0026#34;SO_DET_NO\u0026#34;,\u0026#34;SO_DATE\u0026#34;,\u0026#34;SO_RELEASE_ID\u0026#34;,\u0026#34;SO_DET_STATUS\u0026#34;,\u0026#34;SO_DET_DESC\u0026#34;,\u0026#34;SO_GRP_ID\u0026#34;,\u0026#34;SO_SUB_GRP_ID\u0026#34;,\u0026#34;SUBMIT_BY\u0026#34;,\u0026#34;SUBMIT_DATE\u0026#34;,\u0026#34;LOGIS_STATUS\u0026#34;,\u0026#34;DOC_DEF_ID\u0026#34;,\u0026#34;ORDER_ID\u0026#34;,\u0026#34;ORDER_DET_ID\u0026#34;,\u0026#34;BUY_ORG_ID\u0026#34;,\u0026#34;STP_ORG_ID\u0026#34;,\u0026#34;SELL_ORG_ID\u0026#34;,\u0026#34;SELL_DEPT_ID\u0026#34;,\u0026#34;SELL_DEPT_CODE\u0026#34;,\u0026#34;SELL_DEPT_NAME\u0026#34;,\u0026#34;SELL_CST_CODE\u0026#34;,\u0026#34;SELL_CST_NAME\u0026#34;,\u0026#34;SELL_ADDR_ID\u0026#34;,\u0026#34;SELL_ADDR_CODE\u0026#34;,\u0026#34;SELL_ADDR_NAME\u0026#34;,\u0026#34;SELL_MEMBER_ID\u0026#34;,\u0026#34;SELL_MEMBER_CODE\u0026#34;,\u0026#34;SELL_MEMBER_NAME\u0026#34;,\u0026#34;SELL_GOODS_ID\u0026#34;,\u0026#34;SELL_GOODS_CODE\u0026#34;,\u0026#34;SELL_GOODS_NAME\u0026#34;,\u0026#34;SELL_GOODS_SPEC\u0026#34;,\u0026#34;SELL_GOODS_PACK_UNIT\u0026#34;,\u0026#34;SELL_GOODS_PACK_NUM\u0026#34;,\u0026#34;SELL_GOODS_BRAND\u0026#34;,\u0026#34;SELL_GOODS_RATIFIER\u0026#34;,\u0026#34;SELL_QTY\u0026#34;,\u0026#34;LOTO_NO\u0026#34;,\u0026#34;PRD_DATE\u0026#34;,\u0026#34;END_DATE\u0026#34;,\u0026#34;TAX_PRC\u0026#34;,\u0026#34;TAX_RATE\u0026#34;,\u0026#34;AMOUNT\u0026#34;,\u0026#34;TX_PRC\u0026#34;,\u0026#34;TX_AMOUNT\u0026#34;,\u0026#34;TAX\u0026#34;,\u0026#34;OUTER_NO\u0026#34;,\u0026#34;OUTER_DET_NO\u0026#34;,\u0026#34;RECIPE_NO\u0026#34;,\u0026#34;ORDER_FROM\u0026#34;,\u0026#34;INVOICE_CODE\u0026#34;,\u0026#34;INVOICE_NO\u0026#34;,\u0026#34;INVOICE_DATE\u0026#34;,\u0026#34;INVOICE_AMOUNT\u0026#34;,\u0026#34;MAP_FLAG\u0026#34;,\u0026#34;MAP_STATUS\u0026#34;,\u0026#34;MAP_CODE\u0026#34;,\u0026#34;MAP_DESC\u0026#34;,\u0026#34;IS_COLD_CHAIN\u0026#34;,\u0026#34;IS_TICKET\u0026#34;,\u0026#34;IS_MAP_TICKET\u0026#34;,\u0026#34;IS_MAP_BOX\u0026#34;,\u0026#34;TENANT_ID\u0026#34;,\u0026#34;CREATE_BY\u0026#34;,\u0026#34;CREATE_DATE\u0026#34;,\u0026#34;UPDATE_BY\u0026#34;,\u0026#34;UPDATE_DATE\u0026#34;,\u0026#34;EXP_STATUS\u0026#34;,\u0026#34;EXP_BATCHID\u0026#34;,\u0026#34;EXP_BY\u0026#34;,\u0026#34;EXP_DATE\u0026#34;,\u0026#34;EXP_RESULT\u0026#34;,\u0026#34;DET_ATTR1\u0026#34;,\u0026#34;DET_ATTR2\u0026#34;,\u0026#34;DET_ATTR3\u0026#34;,\u0026#34;DET_ATTR4\u0026#34;,\u0026#34;DET_ATTR5\u0026#34;,\u0026#34;LOGIS_OU_CODE\u0026#34;,\u0026#34;LOGIS_ORDER_NO\u0026#34;,\u0026#34;LOGIS_ORDER_DET_NO\u0026#34;,\u0026#34;GOODS_SEARCH_NAME\u0026#34;,\u0026#34;LOGIS_STATUS_CODE_IN\u0026#34;,\u0026#34;LOGIS_STATUS_CODE_OUT\u0026#34;) AS select a.SO_DET_ID, a.SO_ID, a.SO_CAT, a.SO_TYPE, a.SO_NO, a.SO_DET_NO, a.SO_DATE, a.SO_RELEASE_ID, a.SO_DET_STATUS, a.SO_DET_DESC, a.SO_GRP_ID, a.SO_SUB_GRP_ID, a.SUBMIT_BY, a.SUBMIT_DATE, a.LOGIS_STATUS, a.DOC_DEF_ID, a.ORDER_ID, a.ORDER_DET_ID, a.BUY_ORG_ID, a.STP_ORG_ID, a.SELL_ORG_ID, a.SELL_DEPT_ID, a.SELL_DEPT_CODE, a.SELL_DEPT_NAME, a.SELL_CST_CODE, a.SELL_CST_NAME, a.SELL_ADDR_ID, a.SELL_ADDR_CODE, a.SELL_ADDR_NAME, a.SELL_MEMBER_ID, a.SELL_MEMBER_CODE, a.SELL_MEMBER_NAME, a.SELL_GOODS_ID, a.SELL_GOODS_CODE, a.SELL_GOODS_NAME, a.SELL_GOODS_SPEC, a.SELL_GOODS_PACK_UNIT, a.SELL_GOODS_PACK_NUM, a.SELL_GOODS_BRAND, a.SELL_GOODS_RATIFIER, a.SELL_QTY, a.LOTO_NO, a.PRD_DATE, a.END_DATE, a.TAX_PRC, a.TAX_RATE, a.AMOUNT, a.TX_PRC, a.TX_AMOUNT, a.TAX, a.OUTER_NO, a.OUTER_DET_NO, a.RECIPE_NO, a.order_from, a.INVOICE_CODE, a.INVOICE_NO, a.INVOICE_DATE, a.INVOICE_AMOUNT, a.MAP_FLAG, a.MAP_STATUS, a.MAP_CODE, a.MAP_DESC, a.IS_COLD_CHAIN, a.IS_TICKET, a.IS_MAP_TICKET, a.IS_MAP_BOX, a.TENANT_ID, a.CREATE_BY, a.CREATE_DATE, a.UPDATE_BY, a.UPDATE_DATE, a.EXP_STATUS, a.EXP_BATCHID, a.EXP_BY, a.EXP_DATE, a.EXP_RESULT, a.DET_ATTR1, a.DET_ATTR2, a.DET_ATTR3, a.DET_ATTR4, a.DET_ATTR5, a.LOGIS_OU_CODE, a.LOGIS_ORDER_NO, a.LOGIS_ORDER_DET_NO, b.GOODS_SEARCH_NAME, (select nvl(max(to_number(status_code)),\u0026#39;0\u0026#39;) from shop_logis_status_in lsi where /*lsi.bill_type=a.so_type*/ 1=1 and lsi.logis_ou_code = a.logis_ou_code and lsi.logis_order_no = a.logis_order_no and lsi.logis_order_det_no = a.logis_order_det_no and a.so_type=\u0026#39;21\u0026#39;) as logis_status_code_in, --销售退货最新物流状态 (select nvl(max(to_number(status_code)),\u0026#39;0\u0026#39;) from shop_logis_status_out lso where /*lso.bill_type=a.so_type*/ 1=1 and lso.logis_ou_code = a.logis_ou_code and lso.logis_order_no = a.logis_order_no and lso.logis_order_det_no = a.logis_order_det_no and a.so_type=\u0026#39;20\u0026#39;) as logis_status_code_out --销售出库最新物流状态 from SHOP_SALE_ORDER_DETAIL a, SHOP_GOODS b where a.SELL_GOODS_ID = b.GOODS_ID ; COMMENT ON COLUMN RIS.V_LOGIS_SHOP_SALE_ORDER_DETAIL.\u0026#34;TENANT_ID\u0026#34; IS \u0026#39;租户ID\u0026#39;; 查询SHOP_SALE_ORDER_DETAIL表记录数是13344613\n查看SHOP_SALE_ORDER_DETAIL描述如下\nCREATE TABLE \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34; ( \u0026#34;SO_DET_ID\u0026#34; NVARCHAR(36) NOT NULL, \u0026#34;SO_ID\u0026#34; NVARCHAR(36), \u0026#34;SO_CAT\u0026#34; NVARCHAR(20), \u0026#34;SO_TYPE\u0026#34; NVARCHAR(20), \u0026#34;SO_NO\u0026#34; NVARCHAR(100), \u0026#34;SO_DET_NO\u0026#34; NVARCHAR(100), \u0026#34;SO_DATE\u0026#34; TIMESTAMP(0), \u0026#34;SO_RELEASE_ID\u0026#34; NVARCHAR(100), \u0026#34;SO_DET_STATUS\u0026#34; NUMBER(2,0), \u0026#34;SO_DET_DESC\u0026#34; NVARCHAR(255), \u0026#34;SO_GRP_ID\u0026#34; NVARCHAR(50), \u0026#34;SO_SUB_GRP_ID\u0026#34; NVARCHAR(50), \u0026#34;SUBMIT_BY\u0026#34; NVARCHAR(36), \u0026#34;SUBMIT_DATE\u0026#34; TIMESTAMP(0), \u0026#34;LOGIS_STATUS\u0026#34; NVARCHAR(20), \u0026#34;DOC_DEF_ID\u0026#34; NVARCHAR(64) NOT NULL, \u0026#34;ORDER_ID\u0026#34; NVARCHAR(50), \u0026#34;ORDER_DET_ID\u0026#34; NVARCHAR(50), \u0026#34;BUY_ORG_ID\u0026#34; NVARCHAR(36), \u0026#34;STP_ORG_ID\u0026#34; NVARCHAR(36), \u0026#34;SELL_ORG_ID\u0026#34; NVARCHAR(36), \u0026#34;SELL_DEPT_ID\u0026#34; NVARCHAR(50), \u0026#34;SELL_DEPT_CODE\u0026#34; NVARCHAR(50), \u0026#34;SELL_DEPT_NAME\u0026#34; NVARCHAR(255), \u0026#34;SELL_CST_CODE\u0026#34; NVARCHAR(50), \u0026#34;SELL_CST_NAME\u0026#34; NVARCHAR(255), \u0026#34;SELL_ADDR_ID\u0026#34; NVARCHAR(36), \u0026#34;SELL_ADDR_CODE\u0026#34; NVARCHAR(100), \u0026#34;SELL_ADDR_NAME\u0026#34; NVARCHAR(300), \u0026#34;SELL_MEMBER_ID\u0026#34; NVARCHAR(36), \u0026#34;SELL_MEMBER_CODE\u0026#34; NVARCHAR(50), \u0026#34;SELL_MEMBER_NAME\u0026#34; NVARCHAR(300), \u0026#34;SELL_GOODS_ID\u0026#34; NVARCHAR(36), \u0026#34;SELL_GOODS_CODE\u0026#34; NVARCHAR(100), \u0026#34;SELL_GOODS_NAME\u0026#34; NVARCHAR(255), \u0026#34;SELL_GOODS_SPEC\u0026#34; NVARCHAR(100), \u0026#34;SELL_GOODS_PACK_UNIT\u0026#34; NVARCHAR(50), \u0026#34;SELL_GOODS_PACK_NUM\u0026#34; NUMBER(10,0), \u0026#34;SELL_GOODS_BRAND\u0026#34; NVARCHAR(255), \u0026#34;SELL_GOODS_RATIFIER\u0026#34; NVARCHAR(100), \u0026#34;SELL_QTY\u0026#34; NUMBER(10,2) DEFAULT 0, \u0026#34;LOTO_NO\u0026#34; NVARCHAR(100), \u0026#34;PRD_DATE\u0026#34; TIMESTAMP(0), \u0026#34;END_DATE\u0026#34; TIMESTAMP(0), \u0026#34;TAX_PRC\u0026#34; NUMBER(18,6), \u0026#34;TAX_RATE\u0026#34; NUMBER(10,6), \u0026#34;AMOUNT\u0026#34; NUMBER(10,2), \u0026#34;TX_PRC\u0026#34; NUMBER(18,6), \u0026#34;TX_AMOUNT\u0026#34; NUMBER(10,2), \u0026#34;TAX\u0026#34; NUMBER(10,2), \u0026#34;OUTER_NO\u0026#34; NVARCHAR(100), \u0026#34;OUTER_DET_NO\u0026#34; NVARCHAR(100), \u0026#34;RECIPE_NO\u0026#34; NVARCHAR(90), \u0026#34;ORDER_FROM\u0026#34; NVARCHAR(90), \u0026#34;INVOICE_CODE\u0026#34; NVARCHAR(50), \u0026#34;INVOICE_NO\u0026#34; NVARCHAR(50), \u0026#34;INVOICE_DATE\u0026#34; TIMESTAMP(0), \u0026#34;INVOICE_AMOUNT\u0026#34; NUMBER(22,2), \u0026#34;MAP_FLAG\u0026#34; NUMBER(1,0) DEFAULT 0, \u0026#34;MAP_STATUS\u0026#34; NVARCHAR(2) DEFAULT 0, \u0026#34;MAP_CODE\u0026#34; NVARCHAR(50), \u0026#34;MAP_DESC\u0026#34; NVARCHAR(400), \u0026#34;IS_COLD_CHAIN\u0026#34; NVARCHAR(20), \u0026#34;IS_TICKET\u0026#34; NUMBER(1,0), \u0026#34;IS_MAP_TICKET\u0026#34; NUMBER(1,0) DEFAULT 1, \u0026#34;IS_MAP_BOX\u0026#34; NUMBER(1,0) DEFAULT 0, \u0026#34;TENANT_ID\u0026#34; NVARCHAR(64) DEFAULT \u0026#39;000\u0026#39;, \u0026#34;CREATE_BY\u0026#34; NVARCHAR(50), \u0026#34;CREATE_DATE\u0026#34; TIMESTAMP(0) DEFAULT SYSDATE, \u0026#34;UPDATE_BY\u0026#34; NVARCHAR(50), \u0026#34;UPDATE_DATE\u0026#34; TIMESTAMP(0) DEFAULT SYSDATE, \u0026#34;EXP_STATUS\u0026#34; NVARCHAR(2) DEFAULT 0, \u0026#34;EXP_BATCHID\u0026#34; NVARCHAR(36), \u0026#34;EXP_BY\u0026#34; NVARCHAR(100), \u0026#34;EXP_DATE\u0026#34; TIMESTAMP(0), \u0026#34;EXP_RESULT\u0026#34; NVARCHAR(500), \u0026#34;DET_ATTR1\u0026#34; NVARCHAR(250), \u0026#34;DET_ATTR2\u0026#34; NVARCHAR(250), \u0026#34;DET_ATTR3\u0026#34; NVARCHAR(250), \u0026#34;DET_ATTR4\u0026#34; NVARCHAR(250), \u0026#34;DET_ATTR5\u0026#34; NVARCHAR(250), \u0026#34;LOGIS_OU_CODE\u0026#34; NVARCHAR(20), \u0026#34;LOGIS_ORDER_NO\u0026#34; NVARCHAR(100), \u0026#34;LOGIS_ORDER_DET_NO\u0026#34; NVARCHAR(100), \u0026#34;BUY_CST_CODE\u0026#34; NVARCHAR(40), \u0026#34;BUY_CST_NAME\u0026#34; NVARCHAR(200), \u0026#34;BUY_GOODS_ID\u0026#34; NVARCHAR(50), \u0026#34;BUY_GOODS_CODE\u0026#34; NVARCHAR(100), \u0026#34;BUY_GOODS_NAME\u0026#34; NVARCHAR(255), \u0026#34;BUY_GOODS_SPEC\u0026#34; NVARCHAR(100), \u0026#34;BUY_GOODS_UNIT\u0026#34; NVARCHAR(50), \u0026#34;BUY_GOODS_BRAND\u0026#34; NVARCHAR(255), \u0026#34;BUY_QTY\u0026#34; NUMBER(10,0) DEFAULT 0, \u0026#34;BUY_TAX_PRC\u0026#34; NUMBER(16,6), \u0026#34;BUY_ADDR_ID\u0026#34; NVARCHAR(100), \u0026#34;BUY_ADDR_CODE\u0026#34; NVARCHAR(100), \u0026#34;BUY_ADDR_NAME\u0026#34; NVARCHAR(300), \u0026#34;BUY_RECEIVE_QTY\u0026#34; NUMBER(10,2) DEFAULT 0, \u0026#34;BUY_REFUSE_QTY\u0026#34; NUMBER(10,2) DEFAULT 0, \u0026#34;BUY_RETURN_QTY\u0026#34; NUMBER(10,2) DEFAULT 0, \u0026#34;BUY_RECEIVE_STATUS\u0026#34; NVARCHAR(2) DEFAULT \u0026#39;00\u0026#39;, \u0026#34;BUY_RECEIVE_DESC\u0026#34; NVARCHAR(255), \u0026#34;BUY_RECEIVE_BY\u0026#34; NVARCHAR(50), \u0026#34;BUY_RECEIVE_DATE\u0026#34; TIMESTAMP(0), \u0026#34;BUY_CHG\u0026#34; NUMBER(10,2) DEFAULT 1, \u0026#34;SELL_CHG\u0026#34; NUMBER(10,2) DEFAULT 1, \u0026#34;BUY_GOODS_RATIFIER\u0026#34; NVARCHAR(100), \u0026#34;SO_SERIAL\u0026#34; NVARCHAR(100), \u0026#34;BUY_CARTON_NBR\u0026#34; NUMBER(11,0), \u0026#34;SELL_CARTON_NBR\u0026#34; NUMBER(11,0), \u0026#34;SO_BARCODE_TYPE\u0026#34; NVARCHAR(8), \u0026#34;SO_BARCODE\u0026#34; NVARCHAR(200), \u0026#34;SKU_ID\u0026#34; NVARCHAR(36), \u0026#34;SKU_CODE\u0026#34; NVARCHAR(60), CONSTRAINT \u0026#34;PK_SHOP_SALE_ORDER_DETAIL\u0026#34; NOT CLUSTER PRIMARY KEY(\u0026#34;SO_DET_ID\u0026#34;) USING INDEX TABLESPACE \u0026#34;RISIDX\u0026#34; ) STORAGE(ON \u0026#34;RIS\u0026#34;, CLUSTERBTR) ; COMMENT ON TABLE RIS.SHOP_SALE_ORDER_DETAIL IS \u0026#39;采购方销售单表\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;AMOUNT\u0026#34; IS \u0026#39;含税金额\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_ADDR_CODE\u0026#34; IS \u0026#39;采购方地址码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_ADDR_ID\u0026#34; IS \u0026#39;采购方地址码ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_ADDR_NAME\u0026#34; IS \u0026#39;采购方采购方地址\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_CARTON_NBR\u0026#34; IS \u0026#39;采购方每箱可装数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_CHG\u0026#34; IS \u0026#39;采购方转换比\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_CST_CODE\u0026#34; IS \u0026#39;采购方编码(销售方在采购方系统编码)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_CST_NAME\u0026#34; IS \u0026#39;采购方名称(销售方在采购方系统名称)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_BRAND\u0026#34; IS \u0026#39;采购方生产厂家\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_CODE\u0026#34; IS \u0026#39;采购方商品编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_ID\u0026#34; IS \u0026#39;采购方商品ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_NAME\u0026#34; IS \u0026#39;采购方商品名称\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_RATIFIER\u0026#34; IS \u0026#39;采购方批准文号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_SPEC\u0026#34; IS \u0026#39;采购方规格\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_GOODS_UNIT\u0026#34; IS \u0026#39;采购方单位\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_ORG_ID\u0026#34; IS \u0026#39;购买方公司ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_QTY\u0026#34; IS \u0026#39;采购方数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_RECEIVE_BY\u0026#34; IS \u0026#39;采购方验收人\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_RECEIVE_DATE\u0026#34; IS \u0026#39;采购方验收时间\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_RECEIVE_DESC\u0026#34; IS \u0026#39;采购方验收备注\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_RECEIVE_QTY\u0026#34; IS \u0026#39;采购方实收数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_RECEIVE_STATUS\u0026#34; IS \u0026#39;采购方验收状态(00 待提交 10 已提交未验收 20 验收中 30 已验收 98 已作废 99 拒收)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_REFUSE_QTY\u0026#34; IS \u0026#39;采购方拒收数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_RETURN_QTY\u0026#34; IS \u0026#39;采购方退货数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;BUY_TAX_PRC\u0026#34; IS \u0026#39;采购方含税单价\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;CREATE_BY\u0026#34; IS \u0026#39;操作人\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;CREATE_DATE\u0026#34; IS \u0026#39;创建时间\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;DET_ATTR1\u0026#34; IS \u0026#39;扩展1\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;DET_ATTR2\u0026#34; IS \u0026#39;扩展2\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;DET_ATTR3\u0026#34; IS \u0026#39;扩展3\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;DET_ATTR4\u0026#34; IS \u0026#39;扩展4\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;DET_ATTR5\u0026#34; IS \u0026#39;扩展5\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;DOC_DEF_ID\u0026#34; IS \u0026#39;单据类型(DOC_DEF.DOC_DEF_ID)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;END_DATE\u0026#34; IS \u0026#39;效期\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;EXP_BATCHID\u0026#34; IS \u0026#39;MQ发送批次号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;EXP_BY\u0026#34; IS \u0026#39;MQ发送人\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;EXP_DATE\u0026#34; IS \u0026#39;MQ推送时间\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;EXP_RESULT\u0026#34; IS \u0026#39;MQ反馈消息\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;EXP_STATUS\u0026#34; IS \u0026#39;MQ发送状态(0未发送 1已发送 2失败)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;INVOICE_AMOUNT\u0026#34; IS \u0026#39;发票金额\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;INVOICE_CODE\u0026#34; IS \u0026#39;发票编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;INVOICE_DATE\u0026#34; IS \u0026#39;发票日期\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;INVOICE_NO\u0026#34; IS \u0026#39;发票号码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;IS_COLD_CHAIN\u0026#34; IS \u0026#39;是否冷链\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;IS_MAP_BOX\u0026#34; IS \u0026#39;配送单与装箱单是否匹配(0未匹配 1已匹配\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;IS_MAP_TICKET\u0026#34; IS \u0026#39;是否匹配两票制(0不匹配 1匹配)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;IS_TICKET\u0026#34; IS \u0026#39;是否两票制(1：两票制2：非两票制3：急抢救药品)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;LOGIS_ORDER_DET_NO\u0026#34; IS \u0026#39;物流货主细单编号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;LOGIS_ORDER_NO\u0026#34; IS \u0026#39;物流货主总单号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;LOGIS_OU_CODE\u0026#34; IS \u0026#39;物流货主编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;LOGIS_STATUS\u0026#34; IS \u0026#39;物流状态\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;LOTO_NO\u0026#34; IS \u0026#39;批号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;MAP_CODE\u0026#34; IS \u0026#39;SCM对码--对码错误代码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;MAP_DESC\u0026#34; IS \u0026#39;SCM对码--数据对码结果\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;MAP_FLAG\u0026#34; IS \u0026#39;SCM对码--购买方与销售方是否需对码(0 不需对码 1需对码)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;MAP_STATUS\u0026#34; IS \u0026#39;SCM对码--是否已对码( 0 未匹配 1已匹配 )\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;ORDER_DET_ID\u0026#34; IS \u0026#39;采购订单明细ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;ORDER_FROM\u0026#34; IS \u0026#39;订单来源(10 PC、20 H5、30 IOS、40 安卓、50接口)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;ORDER_ID\u0026#34; IS \u0026#39;采购订单ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;OUTER_DET_NO\u0026#34; IS \u0026#39;外部销售单明细编号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;OUTER_NO\u0026#34; IS \u0026#39;外部销售单编号(第三方配送单号)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;PRD_DATE\u0026#34; IS \u0026#39;生产日期\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;RECIPE_NO\u0026#34; IS \u0026#39;处方号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_ADDR_CODE\u0026#34; IS \u0026#39;销售方地址码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_ADDR_ID\u0026#34; IS \u0026#39;销售方地址ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_ADDR_NAME\u0026#34; IS \u0026#39;销售方地址\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_CARTON_NBR\u0026#34; IS \u0026#39;销售方每箱可装数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_CHG\u0026#34; IS \u0026#39;销售方转换比\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_CST_CODE\u0026#34; IS \u0026#39;销售方购买方编码(采购方在销售方系统编码)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_CST_NAME\u0026#34; IS \u0026#39;销售方购买方名称(采购方在销售方系统名称)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_DEPT_CODE\u0026#34; IS \u0026#39;销售方部门编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_DEPT_ID\u0026#34; IS \u0026#39;销售方部门ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_DEPT_NAME\u0026#34; IS \u0026#39;销售方部门编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_BRAND\u0026#34; IS \u0026#39;销售方生产厂家\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_CODE\u0026#34; IS \u0026#39;销售方商品编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_ID\u0026#34; IS \u0026#39;销售方商品ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_NAME\u0026#34; IS \u0026#39;销售方商品名称\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_PACK_NUM\u0026#34; IS \u0026#39;销售方包装数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_PACK_UNIT\u0026#34; IS \u0026#39;销售方包装单位\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_RATIFIER\u0026#34; IS \u0026#39;批准文号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_GOODS_SPEC\u0026#34; IS \u0026#39;销售方规格\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_MEMBER_CODE\u0026#34; IS \u0026#39;销售方销售员编码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_MEMBER_ID\u0026#34; IS \u0026#39;销售方销售员ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_MEMBER_NAME\u0026#34; IS \u0026#39;销售方销售员姓名\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_ORG_ID\u0026#34; IS \u0026#39;销售方公司ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SELL_QTY\u0026#34; IS \u0026#39;销售方发货数量\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_BARCODE\u0026#34; IS \u0026#39;配送明细条码\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_BARCODE_TYPE\u0026#34; IS \u0026#39;配送明细条码类型(01:GS1条码:02 HIBC条码 99 企业自定义)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_CAT\u0026#34; IS \u0026#39;配送单类别(crm 医院与配送商 srm 供应商与配送商)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_DATE\u0026#34; IS \u0026#39;配送时间\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_DET_DESC\u0026#34; IS \u0026#39;备注\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_DET_ID\u0026#34; IS \u0026#39;配送单明细ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_DET_NO\u0026#34; IS \u0026#39;配送单明细号（ERP销售订单执行号）\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_DET_STATUS\u0026#34; IS \u0026#39;配送单状态( 0录入 1已提交,待审核 2已审核 9作废)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_GRP_ID\u0026#34; IS \u0026#39;配送单分组ID(送货单ID shop_sale_order_dispatch.dispatch_id)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_ID\u0026#34; IS \u0026#39;配送单ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_NO\u0026#34; IS \u0026#39;配送单号\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_RELEASE_ID\u0026#34; IS \u0026#39;销售订单为空；销退唯一ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_SERIAL\u0026#34; IS \u0026#39;配送明细对应的顺序号，同一个配送单下必须唯一(市平台要求)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_SUB_GRP_ID\u0026#34; IS \u0026#39;配送单子分组ID(扩展字段)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SO_TYPE\u0026#34; IS \u0026#39;配送单类型(20 销售单 21 销售退货单)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;STP_ORG_ID\u0026#34; IS \u0026#39;送达方公司ID(三方协议)\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SUBMIT_BY\u0026#34; IS \u0026#39;提交人\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;SUBMIT_DATE\u0026#34; IS \u0026#39;提交日期\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;TAX\u0026#34; IS \u0026#39;税额\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;TAX_PRC\u0026#34; IS \u0026#39;含税单价\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;TAX_RATE\u0026#34; IS \u0026#39;税率\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;TENANT_ID\u0026#34; IS \u0026#39;租户ID\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;TX_AMOUNT\u0026#34; IS \u0026#39;无税金额\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;TX_PRC\u0026#34; IS \u0026#39;无税单价\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;UPDATE_BY\u0026#34; IS \u0026#39;修改人\u0026#39;; COMMENT ON COLUMN RIS.SHOP_SALE_ORDER_DETAIL.\u0026#34;UPDATE_DATE\u0026#34; IS \u0026#39;修改时间\u0026#39;; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_BUYORGID\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;BUY_ORG_ID\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_GOODCODE\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SELL_GOODS_CODE\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_GOODID\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SELL_GOODS_ID\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_LOGISNO\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;LOGIS_ORDER_NO\u0026#34; ASC,\u0026#34;LOGIS_ORDER_DET_NO\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_SODATE\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SO_DATE\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_SODETNO\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SO_DET_NO\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_SOID\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SO_ID\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_SONO\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SO_NO\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; CREATE OR REPLACE INDEX \u0026#34;RIS\u0026#34;.\u0026#34;IDX_SALE_ORDER_DETAIL_SOTYPE\u0026#34; ON \u0026#34;RIS\u0026#34;.\u0026#34;SHOP_SALE_ORDER_DETAIL\u0026#34;(\u0026#34;SO_TYPE\u0026#34; ASC) STORAGE(ON \u0026#34;RISIDX\u0026#34;, CLUSTERBTR) ; 执行计划分析与根因定位 # 这条 SQL 的核心部分是：\nwhere t.so_id = \u0026#39;0002603046042426\u0026#39; order by so_det_no asc) tmp where rownum \u0026lt;= 15) 但基表 SHOP_SALE_ORDER_DETAIL 现在只有：\nSO_ID 单列索引 SO_DET_NO 单列索引 没有 (SO_ID, SO_DET_NO) 这样的联合索引。\n同时查的是视图 V_LOGIS_SHOP_SALE_ORDER_DETAIL，这个视图复杂，它除了从 SHOP_SALE_ORDER_DETAIL 取列，还：\n关联 SHOP_GOODS 对 SHOP_LOGIS_STATUS_IN 做相关子查询 对 SHOP_LOGIS_STATUS_OUT 做相关子查询 所以优化器现在很可能是在做这种事：\n主表走的是 IDX_SALE_ORDER_DETAIL_SOID 单列索引，然后立刻接了 BLKUP2 回表。 再回表取 t.* 再排序 SO_DET_NO 最后才截 15 行 这就是为什么 明明只查 15 行，却跑了 133 秒。\n根因并不是查询结果只有 15 行，而是优化器只能利用 SO_ID 单列索引，无法同时满足 SO_ID 过滤与 SO_DET_NO 排序，导致在宽表 SHOP_SALE_ORDER_DETAIL 上产生大量 BLKUP2 回表和后续排序开销。\n优化方案与验证结果 # 先建联合索引\nCREATE INDEX RIS.IDX_SOD_SOID_DETNO_ID ON RIS.SHOP_SALE_ORDER_DETAIL(SO_ID, SO_DET_NO, SO_DET_ID); 这个索引的作用：\nSO_ID：过滤 SO_DET_NO：排序 SO_DET_ID：后续回表/关联更顺手 这样优化器才有机会变成：\n按 SO_ID + SO_DET_NO 直接有序拿前 15 个明细，再做后续处理\n而不是现在这种先扫很多再排序。\n手动分析表\ndbms_stats.gather_table_stats(ownname =\u0026gt; \u0026#39;RIS\u0026#39;,tabname =\u0026gt; \u0026#39;SHOP_SALE_ORDER_DETAIL\u0026#39; ,estimate_percent =\u0026gt; 100 ,method_opt =\u0026gt; \u0026#39;FOR ALL COLUMNS SIZE AUTO\u0026#39; ,cascade =\u0026gt; true, degree =\u0026gt; 8); 最后执行SQL\nselect * from (select tmp.*, rownum as row_id from (select t.*, li.item_detail_name as statusdescin, lo.item_detail_name as statusdescout, li.sort_code as sortcodein, lo.sort_code as sortcodeout from v_logis_shop_sale_order_detail t left join c_logistics_in li on t.logis_status_code_in = li.item_detail_code left join c_logistics_out lo on t.logis_status_code_out = lo.item_detail_code where t.so_id = \u0026#39;0002603046042426\u0026#39; order by so_det_no asc) tmp where rownum \u0026lt;= 15) where row_id \u0026gt; 0 如图所示\n从客户端工具界面看，SQL 返回时间约为 23 毫秒；从达梦 SQL Monitor 的服务端监控结果看，SQL 执行时长为 0.001182 秒，逻辑读只有46个页。\nSQL Monitoring Report SQL Text ------------------------------ select * from (select tmp.*, rownum as row_id from (select t.*, li.item_detail_name as statusdescin, lo.item_detail_name as statusdescout, li.sort_code as sortcodein, lo.sort_code as sortcodeout from v_logis_shop_sale_order_detail t left join c_logistics_in li on t.logis_status_code_in = li.item_detail_code left join c_logistics_out lo on t.logis_status_code_out = lo.item_detail_code where t.so_id = \u0026#39;0002603046042426\u0026#39; order by so_det_no asc) tmp where rownum \u0026lt;= 15) where row_id \u0026gt; 0 Global Information ------------------------------ Status : DONE (ALL ROWS) Session : RIS (281434248978120:157948) SQL ID : 1596 SQL Execution ID : 14763934 Execution Started : 2026-03-17 20:52:38 Duration : 0.001182s Program : manager.exe Global Stats ========================================================= | Affected | Bytes | Bytes | Physical | Logical | | Rows | Allocate | Free | Read(page) | Read(page) | ========================================================= | 0 | 0 | 0 | 0 | 46 | ========================================================= SQL Plan Monitoring Details ==================================================================================================================================== | Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Activity | Activity Detail | | | | | (Estim) | | Active(s) | Active | | (Actual) | (%) | (# samples) | ==================================================================================================================================== | 0 | DLCK | | | | 0.000010 | +0.001082 | 2 | | 0.89 | | | 1 | NSET2 | | 1 | 3 | 0.000100 | +0.001009 | 3 | 1 | 8.91 | | | 2 | PIPE2 | | 1 | 3 | 0.000001 | +0.001009 | 5 | 1 | 0.09 | | | 3 | PIPE2 | | 1 | 3 | 0.000000 | +0.001009 | 5 | 1 | 0.00 | | | 4 | PRJT2 | | 1 | 2 | 0.000006 | +0.001009 | 4 | 1 | 0.53 | | | 5 | SLCT2 | | 1 | 2 | 0.000017 | +0.001008 | 4 | 1 | 1.52 | | | 6 | PRJT2 | | 1 | 2 | 0.000005 | +0.001006 | 4 | 1 | 0.45 | | | 7 | RN | | 1 | 2 | 0.000017 | +0.000999 | 4 | 1 | 1.52 | | | 8 | PRJT2 | | 1 | 2 | 0.000004 | +0.000998 | 4 | 1 | 0.36 | | | 9 | SORT3 | | 1 | 2 | 0.000294 | +0.000971 | 4 | 1 | 26.20 | | | 10 | NLLO2 | | 1 | 1 | 0.000045 | +0.000762 | 6 | 1 | 4.01 | | | 11 | NLLO2 | | 1 | 1 | 0.000010 | +0.000761 | 5 | 1 | 0.89 | | | 12 | PRJT2 | | 1 | 1 | 0.000176 | +0.000761 | 4 | 1 | 15.69 | | | 13 | IJI2 | | 1 | 1 | 0.000010 | +0.000761 | 6 | 1 | 0.89 | | | 14 | BLKUP2 | SHOP_SALE_ORDER_DETAIL | 1 | 1 | 0.000113 | +0.000760 | 4 | 1 | 10.07 | | | 15 | SSEK2 | SHOP_SALE_ORDER_DETAIL | 1 | 1 | 0.000044 | +0.000759 | 2 | 1 | 3.92 | | | 16 | BLKUP2 | SHOP_GOODS | 1 | 1 | 0.000011 | +0.000758 | 4 | 1 | 0.98 | | | 17 | SSEK2 | SHOP_GOODS | 1 | 1 | 0.000016 | +0.000758 | 2 | 1 | 1.43 | | | 18 | PRJT2 | | 1 | 1 | 0.000000 | +0.000545 | 2 | | 0.00 | | | 19 | SLCT2 | | 1 | 1 | 0.000002 | +0.000544 | 2 | | 0.18 | | | 20 | IJI2 | | 1 | 1 | 0.000001 | +0.000544 | 4 | | 0.09 | | | 21 | BLKUP2 | BASE_DATAITEM | 1 | 1 | 0.000008 | +0.000544 | 4 | 1 | 0.71 | | | 22 | SSEK2 | BASE_DATAITEM | 1 | 1 | 0.000010 | +0.000544 | 2 | 1 | 0.89 | | | 23 | BLKUP2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000000 | +0.000543 | 2 | | 0.00 | | | 24 | SLCT2 | | 1 | 1 | 0.000008 | +0.000543 | 3 | | 0.71 | | | 25 | SSEK2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000018 | +0.000543 | 2 | 8 | 1.60 | | | 26 | PRJT2 | | 1 | 1 | 0.000001 | +0.000756 | 4 | 1 | 0.09 | | | 27 | SLCT2 | | 1 | 1 | 0.000004 | +0.000755 | 4 | 1 | 0.36 | | | 28 | IJI2 | | 1 | 1 | 0.000002 | +0.000755 | 6 | 1 | 0.18 | | | 29 | BLKUP2 | BASE_DATAITEM | 1 | 1 | 0.000004 | +0.000755 | 4 | 1 | 0.36 | | | 30 | SSEK2 | BASE_DATAITEM | 1 | 1 | 0.000006 | +0.000755 | 2 | 1 | 0.53 | | | 31 | BLKUP2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000014 | +0.000754 | 4 | 1 | 1.25 | | | 32 | SLCT2 | | 1 | 1 | 0.000004 | +0.000754 | 4 | 1 | 0.36 | | | 33 | SSEK2 | BASE_DATAITEM_DETAIL | 1 | 1 | 0.000012 | +0.000753 | 2 | 7 | 1.07 | | | 34 | SPL2 | | | 1 | 0.000001 | +0.000492 | 4 | | 0.09 | | | 35 | PRJT2 | | 1 | 1 | 0.000001 | +0.000492 | 4 | 1 | 0.09 | | | 36 | AAGR2 | | 1 | 1 | 0.000006 | +0.000491 | 4 | 1 | 0.53 | | | 37 | PRJT2 | | 1 | 1 | 0.000009 | +0.000489 | 4 | 6 | 0.80 | | | 38 | SLCT2 | | 1 | 1 | 0.000015 | +0.000489 | 4 | 6 | 1.34 | | | 39 | BLKUP2 | SHOP_LOGIS_STATUS_OUT | 1 | 1 | 0.000062 | +0.000488 | 4 | 6 | 5.53 | | | 40 | SSEK2 | SHOP_LOGIS_STATUS_OUT | 1 | 1 | 0.000020 | +0.000488 | 2 | 6 | 1.78 | | | 41 | SPL2 | | | 1 | 0.000006 | +0.000369 | 4 | | 0.53 | | | 42 | PRJT2 | | 1 | 1 | 0.000003 | +0.000368 | 4 | 1 | 0.27 | | | 43 | AAGR2 | | 1 | 1 | 0.000006 | +0.000367 | 3 | 1 | 0.53 | | | 44 | PRJT2 | | 1 | 1 | 0.000000 | +0.000361 | 2 | | 0.00 | | | 45 | SLCT2 | | 1 | 1 | 0.000001 | +0.000360 | 2 | | 0.09 | | | 46 | BLKUP2 | SHOP_LOGIS_STATUS_IN | 1 | 1 | 0.000000 | +0.000360 | 2 | | 0.00 | | | 47 | SSEK2 | SHOP_LOGIS_STATUS_IN | 1 | 1 | 0.000019 | +0.000340 | 1 | | 1.69 | | ==================================================================================================================================== 另外在SQL整体写法上，最外层select * from (。。。) where ROW_ID \u0026gt; 0 其实不用再套的，这个条件没有任何过滤作用，可以删除这层嵌套。\n优化前后对比表 # 指标 优化前 优化后 SQL 总执行时间 133.98s 0.001182s 逻辑读 40046153 46 主要瓶颈 BLKUP2大量回表 BLKUP2 回表代价已大幅下降，整体访问成本显著降低 访问路径 SO_ID 单列索引 + 回表 + 排序 联合索引快速定位 总结 # 本次慢 SQL 优化的关键，不在于 SQL 返回结果只有多少行，而在于数据库为了得到这 15 行结果，实际走了怎样的访问路径。通过 DBMS_SQLTUNE 监控报告可以看到，问题 SQL 的主要耗时集中在 SHOP_SALE_ORDER_DETAIL 表的 BLKUP2 操作上，说明优化器虽然使用了 SO_ID 单列索引进行过滤，但由于缺少同时支持 SO_ID 和 SO_DET_NO 的联合索引，仍然需要对宽表进行大量回表，并在之后完成排序和取前 N 行。\n针对这一问题，本文通过补充联合索引 IDX_SOD_SOID_DETNO_ID，并重新收集 SHOP_SALE_ORDER_DETAIL 的统计信息，使优化器能够以更合理的方式访问数据。优化后，SQL 执行时间从 133 秒下降到毫秒级，逻辑读从 40046153 页下降到 46 页，性能提升非常明显。\n这个案例说明，在达梦数据库中分析慢 SQL 时，不能只看 SQL 文本本身，更要结合 SQL Monitor、执行计划、表结构、数据规模和索引设计综合判断。对于“过滤 + 排序 + 分页”这类常见业务查询，如果缺少合适的联合索引，即使最终只返回极少量数据，也可能在底层付出极高的扫描和回表代价。掌握这类问题的分析方法，比单纯解决某一条 SQL 更有实际价值。希望本次实战分析给各位小伙伴带来帮助😀\n","date":"2026-03-17","externalUrl":null,"permalink":"/posts/dm-blkup2-sql-optimization/","section":"文章","summary":"一次达梦 SQL 优化实战：SQL 最终只返回 15 行，但因缺少 SO_ID、SO_DET_NO 联合索引，在 SHOP_SALE_ORDER_DETAIL 宽表上产生大量 BLKUP2 回表。通过新增联合索引和收集统计信息，逻辑读从 40046153 页降到 46 页。","title":"达梦 SQL 优化实战：一次 BLKUP2 回表代价过高问题的定位与解决","type":"posts"},{"content":"","date":"2026-03-11","externalUrl":null,"permalink":"/tags/aas/","section":"Tags","summary":"","title":"AAS","type":"tags"},{"content":"","date":"2026-03-11","externalUrl":null,"permalink":"/tags/oratop/","section":"Tags","summary":"","title":"Oratop","type":"tags"},{"content":" oratop是什么 # oratop 是 Oracle 提供的一个类 Linux top 的文本界面工具，既能跑在 RAC 也能跑在 单实例上，用来实时观察数据库负载与热点，特别适合在“故障现场 / CPU 飙高 / 响应变慢”时快速定向问题。\n命令行模式 # 使用命令行方式如下：\nexport ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/19.3.0/dbhome_1 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/suptools/oratop:$PATH oratop -h oratop 支持类似 sqlplus 的登录方式，常见参数如下：\n-i：刷新间隔（默认 5 秒）\n-r：Section 3 等待事件切换为 Real-Time（默认是累计 Cumulative）\n-s：Section 4 切到 SQL 模式（默认是 session/process 模式）\n-f：132 列详细模式（默认 80 列标准模式）\n-b -n -o：批处理模式、循环次数、输出到文件\n使用详解 # 登录支持类似sqlplus的登录方式，示例如下：\n# 本地连接 列详细模式 oratop / as sysdba -f # 远程连接（EZConnect / TNS 都可） oratop username/password@tns_alias oratop sys@172.16.8.74:1521/orcl as sysdba -f 注意远程以 sysdba 连接时，需要配置 REMOTE_LOGIN_PASSWORDFILE 并准备 password file。\n启动后界面被固定拆成 4 块\nDatabase（数据库概览） Instance Activity（实例负载指标） DB Wait Events（类似 AWR 的 Top 等待/耗时事件） Process 或 SQL（Top 会话/Top SQL） 指标详解 # Database（数据库概览） # up：实例已运行时间（uptime）\nins：实例数（RAC 环境会 \u0026gt;1）\nsn：当前总会话数\nus：活跃会话数（active sessions）\nmt：监控运行时间（monitoring time）\nfra：FRA 使用率（%）\ner：incident/error 数（如果有）\n%db：数据库使用率/占用概览（某些版本显示）\nInstance Activity（实例负载指标） # CPU / Load / 并发 # %CPU：主机 CPU 使用率（整体 OS 视角） LOAD：OS Load Average（一般看它是否明显高于 CPU 核数） %DCU / %DCP：数据库实例 CPU 使用占主机 CPU 的比例 新版里经常看到 %DCP，官方说明是“database instance cpu usage as %CPU of host”。 AAS 拆分（理解瓶颈的核心） # AAS：AAS（Avg active sessions）：平均活跃会话数 ASC：ASC（Active sessions on CPU）：在 CPU 上跑的活跃会话数 ASI：ASI（Avg active sessions waiting on I/O）：等待 I/O 的活跃会话数 ASW：ASW（Avg active sessions waiting）：其它等待导致的活跃会话数 ISW：ISW（Inactive sessions waiting or sleeping）：不活跃但在等/睡眠的会话数 REDO：REDO（Redo created per sec）：每秒 redo 产生量 TEMP：TEMP（Temp space used）：临时表空间使用 I/O 吞吐与延迟 # MBPS：MBPS（I/O throughput）：吞吐 MB/s IOPS：IOPS（I/O requests/sec）：每秒 I/O 请求数 IORT：IORT（I/O Response Time）：平均同步单块读延迟（single-block read latency） R/S、W/S：R/S、W/S（Physical read/write total IO request/sec）：物理读/写请求速率 LIO：LIO（Logical reads/sec）：逻辑读速率 GCPS：GCPS（GC CR+current block received/sec）：RAC 跨实例块传输速率 内存/连接/业务量 # %FRE：%FRE（Shared pool free %）：共享池空闲比例\nPGA：PGA（Total PGA allocated）：总 PGA 分配\nNETV：NETV（Network traffic bytes/sec）：网络流量\nUTPS：UTPS（User trans/sec）：用户事务数/秒\nUCPS：UCPS（User calls/sec）：用户调用/秒\nSORT：SQRT（SQL service response time/call）：平均每次调用 SQL 服务响应时间\nDCTR：**Database CPU (%Host) **：数据库 CPU 占比（DB Time 中 CPU 占比，算力）\nDWTR：**Database WAIT (%Host) **：等待在主机视角的占比（DB Time 中等待占比，等待）\nDCTP和DWTR这两个本质上来自 Oracle 的系统指标（V$SYSMETRIC 一类的指标体系）。\noratop 后缀表示量级/时间单位，比如：\n容量：k/M/G/T（KB/MB/GB/TB…） 时间：u/m/s/t/h/d（微秒/毫秒/秒/分钟/小时/天…） 参数快速判断 # AAS 明显上升，且 ASC 高、%CPU 高 → CPU 受限优先\nAAS 上升但 ASI 高、IORT 高 → I/O 受限优先\nAAS 上升且 ASW 高，但 I/O 不高 → 锁/并发/提交/集群等待优先（去看 Top 等待/耗时事件）\nREDO 高 + 伴随提交相关等待 → 关注提交/日志写\nGC 指标高（RAC）→ 关注跨实例热点块/全局缓存等待\nDB Wait Events（Top 等待事件） # EVENT (C)：Cumulative：是“自数据库上次重启以来的累计”。EVENT (RT)：Real-Time：更适合现场抓“此刻正在拖慢系统”的 Top waits（用 r 或启动参数 -r 切换）Wait event name：等待事件名 SESSION：Sessions waiting：正在等待该事件的会话数 WAIT：Total number of waits：等待次数 TIME：Total wait time：总等待时间 AVG：Avg wait time：平均等待时间 %DBT：% of database time：占 DB time 的比例 WAIT_CLASS：Wait class：等待分类（User I/O、System I/O、Concurrency…） PROCESS/SQL 模式（Top 会话/Top SQL） # SID：会话 ID SPID：OS 进程号 USERNAME：数据库用户名 PROGRAM：程序名（可用 m 切到 MODULE/ACTION） OPN：DML操作（INS、SEL、UPD、DEL…） E/T：会话已运行时间 %CPU：该会话 CPU 占用 %LIO：该会话逻辑读速率占用 PGA：该会话 PGA SQLID/BLOCKER：当前 SQL 或阻塞者 STS：会话状态（ACT、INA…） STE：会话等待状态（RUN、WAI…） WAIT_CLASS：会话等待类型 %CPU：该会话 CPU 占用 EVENT/OBJECT NAME：当前等待事件名 W/T：当前等待时长 默认是会话模式按p也可以切换成会话模式，适合定位“哪个 SID / 哪个程序 / 哪个模块”慢，影响数据库性能\n按s可以切换进入到SQL模式，适合定位“哪条 SQL_ID 是罪魁祸首”\n按 x 输入 SQL_ID 看计划：用于快速判断“全表扫/索引失效/并行过度/Join 路径异常”等方向\n快速排查流程 # 看实例负载指标CPU 高？I/O 延迟高？AAS 是“CPU 型”还是“等待型”？ 看Top等待事件按 r 切 RT抓当下 Top waits（别只看累计） 看Top 会话/Top SQL，先定位Top 会话/Top SQL，必要时 x 看执行计划否符合预期（索引、并行、Join 路径） 按 t 检查表空间，快速确认临时表空间/表空间使用 总结 # oratop 可以理解为 Oracle 的数据库版 top：用一张屏把当前负载是否异常、异常来自 CPU 还是等待、到底是谁（会话/SQL）在拖慢串起来，特别适合在故障现场快速定向，再配合 AWR/ASH、v$session / v$sql / v$active_session_history 等视图做深入验证和落地优化。\n文末分享 Oracle 11g 版本 oratop 下载链接，方便读者在老版本环境快速上手。\n","date":"2026-03-11","externalUrl":null,"permalink":"/posts/oracle-oratop-performance-guide/","section":"文章","summary":"一篇 Oracle oratop 实战指南：用类 top 的方式实时观察数据库负载，快速判断问题来自 CPU、I/O、锁等待、提交、RAC GC，还是具体会话和 SQL_ID。","title":"oratop 实战指南：一屏读懂 Oracle 性能","type":"posts"},{"content":"","date":"2026-03-11","externalUrl":null,"permalink":"/tags/%E7%AD%89%E5%BE%85%E4%BA%8B%E4%BB%B6/","section":"Tags","summary":"","title":"等待事件","type":"tags"},{"content":"","date":"2026-03-08","externalUrl":null,"permalink":"/tags/centos-7/","section":"Tags","summary":"","title":"CentOS 7","type":"tags"},{"content":"","date":"2026-03-08","externalUrl":null,"permalink":"/categories/vastbase/","section":"Categories","summary":"","title":"Vastbase","type":"categories"},{"content":"","date":"2026-03-08","externalUrl":null,"permalink":"/tags/vastbase/","section":"Tags","summary":"","title":"Vastbase","type":"tags"},{"content":"","date":"2026-03-08","externalUrl":null,"permalink":"/tags/vastbase-g100/","section":"Tags","summary":"","title":"Vastbase G100","type":"tags"},{"content":" 前言 # 随着数字化转型与信创替代持续推进，数据库国产化已经从“选型验证”逐步走向“规模落地”。海量数据库 Vastbase G100 作为国产数据库产品中的重要代表，近几年在产品成熟度、生态建设和企业落地方面都取得了较快进展。Vastbase G100 v2.2 于 2023 年 12 月通过国测，Vastbase G100 v3.0 又于 2024 年 9 月再次通过国测；同时，本人所在单位的部分系统也已经迁移到 Vastbase G100，并保持了较为平稳的运行状态。\n过去一段时间，很多 DBA 和开发人员在学习 Vastbase G100 时，最大的痛点之一并不是产品本身，而是安装包获取不便、资料分散、实操案例不足。如今，官网知识中心逐步完善，安装介质、操作指南、数据迁移和应用开发等资料也更加完整，这使得学习和验证 Vastbase G100 的门槛明显降低。\n本文将结合一次真实安装过程，基于 CentOS 7.9 单机场景，系统梳理 Vastbase G100 V3 的安装与验证流程。内容包括安装前环境准备、第三方依赖安装、系统参数配置、静默安装参数编写、installer 执行、数据库启停验证，以及连接数据库后的基本操作。希望通过这篇文章，为初次接触 Vastbase G100 的 DBA、运维人员和开发人员提供一份可参考、可复现、可排错的实战笔记。\n软件下载 # 可以登录官网的软件下载，下载海光、英特尔x86_Linux 版本：V3.0.8PSU4。介质名称：Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar\n安装环境与目标 # 本次部署目标是：在 Linux 单机环境中，使用脚本完成 Vastbase G100 V3 安装、初始化、启动和基础验证。\nCPU 内存 硬盘 操作系统 安装目录 数据目录 默认端口 2c 8G 50G CentOS 7.9 /home/vastbase/local/vastbase /home/vastbase/data/vastbase 5432 准备安装 # 本文介绍使用installer安装单机版Vastbase前需要完成的环境准备和相关配置。\n挂载本地源 # 在根目录创建 mnt 目录用于挂载本地镜像。\nmkdir /mnt 在 /etc/yum.repos.d 目录下创建 repo 配置。\ncat \u0026gt;\u0026gt; /etc/yum.repos.d/local.repo \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; [local] name=Local Repository baseurl=file:///mnt enabled=1 gpgcheck=0 EOF 将安装镜像挂载到 mnt 目录。\nmount -o loop CentOS-7-x86_64-Everything-2009.iso /mnt 清除 yum 缓存并生成新的缓存。\nyum clean all yum makecache 第三方依赖包 # yum install -y zlib-devel libaio libuuid readline-devel krb5-libs libicu libxslt tcl perl openldap pam openssl-devel libxml2 bzip2 系统和环境配置 # 防火墙配置 # 在普遍场景中，数据库的业务服务和数据库节点的网络联通都是在安全域内完成数据交互。\n为了保证Vastbase的正常使用，需要将节点间的访问端口打通才可以保证读写请求、数据心跳等信息的正常传输。如果没有特殊安全的要求，建议关闭目标节点的防火墙。\n检查防火墙状态（以 CentOS 7 操作系统为例，不同操作系统的命令可能不同）。\nsudo firewall-cmd --state sudo systemctl status firewalld.service 关闭防火墙服务。\nsudo systemctl stop firewalld.service 关闭防火墙自动启动服务。\nsudo systemctl disable firewalld.service 关闭透明大页 # 开启透明大页可能会对数据库性能产生负面影响。编辑 service 文件，将如下内容放入文件中。\nvi /etc/systemd/system/disable-thp.service [Unit] Description=Disable Transparent Huge Pages (THP) [Service] Type=simple ExecStart=/bin/sh -c \u0026#34;echo \u0026#39;never\u0026#39; \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled \u0026amp;\u0026amp; echo \u0026#39;never\u0026#39; \u0026gt; /sys/kernel/mm/transparent_hugepage/defrag\u0026#34; [Install] WantedBy=multi-user.target 修改完成后，执行如下命令加载系统服务，并设置开机自启动。\nsystemctl daemon-reload systemctl start disable-thp systemctl enable disable-thp 查看THP状态，当返回结果均为always madvise [never]时表示成功设置透明大页永久关闭。\ncat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag 时区配置 # 数据库默认时区为中国时区，如果操作系统时区和数据库默认时区不一致，会导致数据库日志显示时间和实际时间不一致。\n可通过以下命令查看操作系统当前的时区。\ntimedatectl 将/usr/share/zoneinfo/目录下的时区文件拷贝为/etc/localtime文件，从而设置时区和时间。\ncp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime IPC参数配置 # 当RemoveIPC=yes时，操作系统会在用户退出时，删除该用户的IPC资源（共享内存段和信号量），从而使得 Vastbase服务器使用的IPC资源被清理，可能引发数据库宕机，所以需要设置 RemoveIPC 参数为no。\n进入/etc/systemd/logind.conf文件，在配置文件末尾新增配置RemoveIPC=no，若文件中已设置则跳过本步骤。\nvi /etc/systemd/logind.conf 进入/usr/lib/systemd/system/systemd-logind.service文件，新增或修改配置RemoveIPC=no，若文件中已设置则跳过本步骤。\nvi /usr/lib/systemd/system/systemd-logind.service 重新加载配置参数。\nsystemctl daemon-reload systemctl restart systemd-logind 检查修改是否生效。\n由于CentOS操作系统环境的removeIPC默认为关闭，则执行如下语句是无返回结果的。用户在确保步骤1至步骤3已执行的前提下，可正常安装数据库。\nloginctl show-session | grep RemoveIPC systemctl show systemd-logind | grep RemoveIPC 内核参数配置 # 为了优化系统性能、确保稳定性，并满足数据库对资源管理的特殊需求。用户应该对操作系统的内核参数配置进行合理配置，这关系到数据库的启动和使用时的资源配置。\n设置内核参数前需参考，结合实际情况调节参数大小，否则会影响数据库的安装部署，以下示例仅供参考。\n（root 用户执行）编译内核参数配置文件/etc/sysctl.conf，将内核信息写入文件末尾。\n其中关键配置项含义如下，建议用户在配置时着重关注：\nvm.dirty_background_bytes：该参数表示触发回刷的脏页数据量，超过该参数，脏页刷到磁盘，单位：Btye。\nkernel.shmmin参数用于设置系统可以创建的共享内存段的数量。通常取默认值：4096，单位：个。\nkernel.shmall 参数用于设置一个共享内存段内可以分配的共享内存页的最大数量。共享内存页是共享内存段中的最小可管理单元。建议取值为：系统内存*0.8/PAGE_SIZE，单位为 Byte。\n0.8 为推荐配置，\n注意事项：该参数设置太小有可能导致数据库启动报错。若 kernel.shmall 设置的过小，可能会导致操作系统无法为 Vastbase数据库分配其所需的共享内存，导致数据库启动失败。\nkernel.shmmax参数用于设置单个共享内存段可拥有的最大尺寸。建议取值为：系统内存*0.5，单位：Byte。\n注意事项：\n数据库参数设置 Vastbase数据库需要使用的共享内存大小，建议 kernel.shmmax 设置的单个共享内存段大小可覆盖Vastbase数据库需要使用的共享内存大小。 数据库参数设置 Vastbase数据库可用的最大物理内存，此值与 Vastbase所需的共享内存共同决定 Vastbase数据库在运行时可以使用的内存总量，若设置不合理可能导致操作系统OOM (Out of Memory) 问题。 cat \u0026gt;\u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; #Vastbase setting fs.aio-max-nr=1048576 fs.file-max= 76724600 kernel.sem = 4096 2097152000 4096 512000 kernel.shmall = 26843545 # pages, 80% MEM or higher kernel.shmmax = 68719476736 # bytes, 50% MEM or higher kernel.shmmin = 819200 net.core.netdev_max_backlog = 10000 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 4194304 net.core.somaxconn = 4096 net.ipv4.tcp_fin_timeout = 5 vm.dirty_background_bytes = 409600000 vm.dirty_expire_centisecs = 3000 vm.dirty_ratio = 80 vm.dirty_writeback_centisecs = 50 vm.overcommit_memory = 0 vm.swappiness = 0 net.ipv4.ip_local_port_range = 40000 65535 fs.nr_open = 20480000 EOF 重载配置，使其在不关机的情况下生效。\nsysctl -p SELinux配置 # 若为开启状态则临时关闭SELinux。/etc/selinux/config将 SELINUX=enforcing 修改为 SELINUX=disabled。\nsetenforce 0 sed -ri \u0026#39;s/SELINUX=enforcing/SELINUX=disabled/\u0026#39; /etc/selinux/config sestatus 设置主机名 # #根据您的ip地址主机名进行相应修改 hostnamectl set-hostname testdb-host cat \u0026gt;\u0026gt; /etc/hosts \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; 192.168.18.133 testdb-host EOF 远程登录配置 # 集群部署时需要 root 帐户远程登录访问权限，可以通过如下步骤设置使用 root 用户远程登录。\n修改 PermitRootLogin 配置，允许用户远程登录。打开 sshd_config 文件。将 PermitRootLogin no 注释。将 PermitRootLogin 改为 yes。\nvi /etc/ssh/sshd_config #PermitRootLogin no PermitRootLogin yes 重启ssh使命令生效。\nservice sshd restart 命令行安装 # 静默安装 # 静默安装简化了标准命令行安装，省去了程序与用户的交互过程。用户可预先将安装参数配置到参数文件db_install.rsp中，即新增并编辑静默安装参数文件，并指定参数文件的路径，在安装时程序自动读取文件以获取安装参数，完成数据库安装。\n静默交互安装支持 实例化 与 非实例化 两种模式：\n实例化：安装数据库，并进行初始化。 非实例化：仅安装数据库所需的二进制文件，不进行数据库初始化。 本次安装 以 实例化 为主要流程进行介绍。\n创建数据库安装用户和目录 # 以root用户登录操作系统。创建数据库安装用户（可自定义），设定初始密码（需要重复输入2次且完全一致）。\nuseradd -m vastbase passwd vastbase 创建数据库coredump目录。\nmkdir -p /home/vastbase/data/db_coredump chmod 770 /home/vastbase/data chown vastbase:vastbase /home/vastbase/data 创建数据库数据目录（可自定义）。如果不执行，则安装数据库时将采用默认安装目录。\nmkdir -p /home/vastbase/data/vastbase chmod 700 /home/vastbase/data/vastbase chown -R vastbase:vastbase /home/vastbase/data/vastbase 创建数据库软件目录（可自定义）。如果不执行，则安装数据库时将采用默认安装目录。\nmkdir -p /home/vastbase/local/vastbase chown -R vastbase:vastbase /home/vastbase 修改资源限制 # 以root用户登录操作系统。执行 vi /etc/security/limits.conf ，在文件末尾添加如下内容，保存退出。\nvi /etc/security/limits.conf vastbase soft nproc unlimited vastbase hard nproc unlimited vastbase soft stack unlimited vastbase hard stack unlimited vastbase soft core unlimited vastbase hard core unlimited vastbase soft memlock unlimited vastbase hard memlock unlimited vastbase soft nofile 1024000 vastbase hard nofile 1024000 解压安装包 # 以root用户登录操作系统。创建目录（/soft/vb），解压安装包，以root用户赋予数据库安装用户vastbase操作的权限。\n将获取的安装包（本安装以Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar为例，实际安装以获取安装包名称为准）和license文件上传到/soft/vb（路径可自定义，如果有的话）。\nmkdir -p /soft/vb cd /soft/vb tar -xf Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar chown -R vastbase:vastbase /soft/vb/ chmod -R 775 /soft/vb/ 新增并编辑静默安装参数文件 # 参数文件所在路径可自定义，本文以参数文件路径取/soft/vb/进行实例化安装为例。用户需根据实际安装情况修改参数文件取值。\n编辑参数文件db_install.rsp。\ncd /soft/vb/ vi db_install.rsp vastbase_password=Vbase@123 encryption_key=Aa123456 vastbase_home=/home/vastbase/local/vastbase vastbase_data=/home/vastbase/data/vastbase port=5432 max_connections=100 shared_buffers=200 db_compatibility=A isinitdb=true 参数说明\n以下列出了静默安装支持修改的参数，如果用户在参数文件中配置了其他参数，为无效值。\n参数文件名必须为db_install.rsp，参数文件格式以步骤4配置示例为准，若名称或格式不对，则将出现报错并退出静默安装。\n参数文件的末尾不能有空行。\nvastbase_password\n指定实例化数据库时默认用户的密码。\n必填项，如果未配置则将报错并退出静默安装。\n密码有效值必须满足如下条件：\n包含大写字母、小写字母和数字。 长度不能小于8。 不能与用户名相同。 encryption_key\n指定数据库加密密钥。\n选填项，未配置时则默认使用vastbase_password的值。\n密码有效值必须满足如下条件：\n包含大写字母、小写字母和数字。 长度不能小于8。 不能与用户名相同。 vastbase_home\n指定数据库安装目录。\n选填项。若配置的目录不是绝对路径，则在安装程序（即vastbase_installer）当前所在的目录新建该目录。未配置时默认值为/home/用户名/local/vastbase。\n用户指定配置的目录或默认目录/home/用户名/local/vastbase，需满足如下条件：\n若目录存在则必须为空。 该目录必须为安装用户有读写权限的目录。 vastbase_data\n指定数据库安装目录。\n选填项。若配置的目录不是绝对路径，则在安装程序当前所在的目录新建该目录。未配置时默认值为/home/用户名/data/vastbase。\n用户指定配置的目录或默认目录/home/用户名/data/vastbase，需满足如下条件：\n若目录存在则必须为空。 该目录必须为安装用户有读写权限的目录。 port\n指定数据库端口号。\n选填项。默认值为5432。\n该参数值必须是大于0，小于65535的整数。\nmax_connections\n指定数据库最大连接数。\n选填项，默认值为500.\n该参数值必须是大于0的整数。\nshared_buffers\n指定共享内存大小，单位为MB。\n选填项，默认为安装数据库的机器内存的四分之一。\n该参数值不能小于0。\nisinitdb\n指定是否初始化数据库实例。\n必填项，如果未配置则将报错并退出静默安装。\n取值包括如下两种：\ntrue：表示进行实例化安装。 false：表示进行非实例化安装。 执行安装脚本 # 切换到数据库安装用户vastbase。执行安装程序，程序流程参见安装过程。\nsu - vastbase cd /soft/vb/vastbase-installer/ ./vastbase_installer --silent -responseFile /soft/vb/db_install.rsp ./vastbase_installer 后面可以指定不同的参数，具体说明如下：\n参数 说明 \u0026ndash;silent 必须通过-responseFile指定静默安装的参数文件，且必须是绝对路径。 -multi-pkg 用于安装可选page size的数据库，此类数据库的安装包名称带有multi标识。若执行上述命令，则安装过程的第一步为选择page size，可选值有8/16/32，其中8为默认值。 \u0026ndash;uninstall 卸载数据库（不可与其他参数同时使用） 当./vastbase_installer后不指定参数时，即默认为交互式安装。\n回显信息 # 在安装过程中，包括如下流程：\n1、程序检查安装包完整性。\n2、检查静默安装参数是否正确，当参数取值不正确或不属于允许修改的参数时，程序会做出相应提醒。\n3、显示系统配置信息、依赖检查结果和安装环境准备结果。检查IPC参数、CPU指令。\n4、安装数据库并检查磁盘IO调度算法。显示安装概要信息。\n5、安装完成。\n设置Core_Pattern # 为记录数据库异常停机信息，执行如下命令设定Core_pattern路径为vastbase组用户可写的路径。以root用户登录操作系统。执行如下操作完成设置。\necho \u0026#34;/omTmp/corefile/core-%e-%p-%t\u0026#34; \u0026gt; /proc/sys/kernel/core_pattern 本语句中/omTmp/corefile/为系统自动创建的默认coredump目录。\n用户可手动创建的coredump目录（此目录应提前创建，且vastbase组用户可写），此时需对应修改echo语句中路径：echo \u0026quot;自定义目录/core-%e-%p-%t\u0026quot; \u0026gt; /proc/sys/kernel/core_pattern\n初始化环境变量 # 以vastbase用户登录操作系统。执行如下命令初始化数据库环境变量。\nsource ~/.bashrc 启动Vastbase # vb_ctl start 停止数据库服务\nvb_ctl stop 重启数据库服务\nvb_ctl restart 显示数据库状态\nvb_ctl status 连接Vastbase # 配置远程连接数据库 # 如果主机需要远程连接数据库，必须在数据库系统的配置文件中增加此主机的信息，并且进行客户端接入认证。详情请参阅管理员指南的配置客户端接入认证。\n配置文件（默认名称为pg_hba.conf）存放在数据库的数据目录里。hba（host-based authentication）表示是基于主机的认证。\nvi $PGDATA/pg_hba.conf #如下为示例配置，表示配置允许来自IP地址xx.xx.xx.xx的客户端通过vastbase用户连接到所有数据库，并且连接方式为trust，即不需要密码验证。 host all vastbase xx.xx.xx.xx/32 trust 使用vsql连接数据库 # 使用vsql连接数据库，已确认连接信息，包括连接的IP、数据库名称与数据库端口。运行以下命令连接数据库。数据库安装完成后，默认存在名为postgres的数据库。第一次连接数据库时可以连接到此数据库。\nvsql -d postgres -p 5432 开始使用Vastbase # 在开始使用数据库之前，确保您已经顺利安装、启动并连接到数据库。\n创建数据库 # 创建一个新的数据库testdb1。\nCREATE DATABASE testdb1; 创建数据库testdb2，并指定所有者为dbuser。\n创建用户。\nCREATE USER dbuser PASSWORD \u0026#39;Vbase@123\u0026#39;; 创建数据库。\nCREATE DATABASE testdb2 OWNER dbuser TEMPLATE template0; 查看数据库列表（vsql客户端可用）\n\\l 清理测试环境\nDROP DATABASE testdb1; DROP DATABASE testdb2; DROP USER dbuser; 创建表 # 创建普通表。\nCREATE TABLE customer_t1 ( c_customer_sk integer not null, c_customer_id char(6) not null, c_first_name varchar(20) , c_last_name varchar(20) , c_country varchar(20) ); 创建表，并指定c_state字段的缺省值为GA。\nCREATE TABLE customer_t2 ( c_customer_sk integer not null, c_customer_id char(6) not null, c_first_name varchar(20) , c_last_name varchar(20) , c_state CHAR(2) DEFAULT \u0026#39;GA\u0026#39;, c_country varchar(20) ); 执行元命令列举表。常见的查看对象元命令可参考查看对象。\n\\dt 执行元命令查看表结构。\n\\d tablename 创建一个有主键约束的表。\nCREATE TABLE customer_t3 ( c_customer_sk integer PRIMARY KEY, c_customer_id char(6) not null, c_first_name varchar(20) , c_last_name varchar(20) , c_country varchar(20) ); 定义一个检查列约束。\nCREATE TABLE public.customer_t4 ( c_customer_sk integer CHECK (c_customer_sk \u0026gt; 0), c_customer_id char(6) not null, c_first_name varchar(20) CHECK (c_first_name is not null), c_last_name varchar(20) , c_country varchar(20) ); 向表中增加一个varchar列。\nALTER TABLE customer_t1 ADD c_company varchar(30); 给表增加一个检查约束。\nALTER TABLE customer_t2 ADD CONSTRAINT c_CONSTR_KEY4 CHECK (c_customer_sk \u0026gt;10); 给一个已存在字段添加非空约束。\nALTER TABLE customer_t3 ALTER COLUMN c_country SET NOT NULL; 重命名已存在的表。\nALTER TABLE customer_t4 RENAME TO newtab; 清理测试环境。\nDROP TABLE customer_t1; DROP TABLE customer_t2; DROP TABLE customer_t3; DROP TABLE newtab; 本文简单介绍如何向表中插入数据和更新表中数据等相关操作。\n向表中插入数据 # 在创建一个表后，表中并没有数据，在使用这个表之前，需要向表中插入数据。\n创建表customer36。\nCREATE TABLE customer36 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6)); 向表customer36中插入一行数据。\n方法一：数据值是按照这些字段在表中出现的顺序列出的，并且用逗号分隔。通常数据值是文本（常量），但也允许使用标量表达式。\nINSERT INTO customer36(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, \u0026#39;hello\u0026#39;, \u0026#39;Grace\u0026#39;); 方法二：如果已经知道表中字段的顺序，也可无需列出表中的字段。\nINSERT INTO customer36 VALUES (3769, \u0026#39;hello\u0026#39;, \u0026#39;Grace\u0026#39;); 方法三：如果不知道所有字段的数值，可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。\nINSERT INTO customer36 (c_customer_sk, c_first_name) VALUES (3769, \u0026#39;Grace\u0026#39;); 向表中插入多行数据。\nINSERT INTO customer36 (c_customer_sk, c_customer_id, c_first_name) VALUES(6885, \u0026#39;maps\u0026#39;, \u0026#39;Joes\u0026#39;), (4321, \u0026#39;tpcds\u0026#39;, \u0026#39;Lily\u0026#39;), (9527, \u0026#39;world\u0026#39;, \u0026#39;James\u0026#39;); 如果需要向表中插入多条数据，除此命令外，也可以多次执行插入一行数据命令实现，但是建议使用此命令可以提升效率。\n从指定表插入数据到当前表。例如，在数据库中创建了一个表customer36的备份表customer37，现在需要将表customer36中的数据插入到表customer37中，则可以执行如下命令。\nCREATE TABLE customer37 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6) ); INSERT INTO customer37 SELECT * FROM customer36; 更新表中数据 # 根据需要，可以更新单独一行，所有行或者指定部分行的表中数据。还可以独立更新每个字段，其他字段则不受影响。\nSQL通常不会为数据行提供唯一标识，因此无法直接声明需要更新哪一行，但可以声明一个被更新的行必须满足的条件。如果表中有一个主键，可以指定准确的行。\n更新表customer36中c_customer_sk为9527的地域为9876。\nUPDATE customer36 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527; 更新表中c_customer_sk字段的所有值为增加100。\nUPDATE customer36 SET c_customer_sk = c_customer_sk + 100; 在这里省略了WHERE子句，表示表中的所有行都要被更新。如果出现了WHERE子句，那么只有匹配其条件的行才会被更新。在SET子句中的等号是一个赋值，而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试，许多其他的操作符也可以使用。\n更新表中的多个字段。\nUPDATE customer36 SET c_customer_id = \u0026#39;Admin\u0026#39;, c_first_name = \u0026#39;Local\u0026#39; WHERE c_customer_sk = 4421; 查看数据 # 在查看数据之前，确保已经完成本文示例中向表中插入数据和更新表中数据的操作。\n查询表customer36的数据行数。\nSELECT count(*) FROM customer36; 返回结果如下：\ncount ------- 6 (1 row) 查询表customer36的所有数据。如果没有完成向表中插入数据中重复插入数据的操作，以下步骤的返回结果可能略有差异。\nSELECT * FROM customer36; 返回结果如下：\nc_customer_sk | c_customer_id | c_first_name ---------------+---------------+-------------- 3869 | hello | Grace 3869 | hello | Grace 3869 | | Grace 6985 | maps | Joes 9976 | world | James 4421 | Admin | Local (6 rows) 查询字段c_customer_sk的数据。\nSELECT c_customer_sk FROM customer36; 返回结果如下：\nc_customer_sk --------------- 3869 3869 3869 6985 9976 4421 (6 rows) 过滤字段c_customer_sk的重复数据。\nSELECT DISTINCT( c_customer_sk ) FROM customer36; 返回结果如下：\nc_customer_sk --------------- 9976 6985 3869 4421 (4 rows) 查询字段c_customer_sk为3869的所有数据。\nSELECT * FROM customer36 WHERE c_customer_sk = 3869; 返回结果如下：\nc_customer_sk | c_customer_id | c_first_name ---------------+---------------+-------------- 3869 | hello | Grace 3869 | hello | Grace 3869 | | Grace (3 rows) 按照字段c_customer_sk进行排序。\nSELECT * FROM customer36 ORDER BY c_customer_sk; 返回结果如下：\nc_customer_sk | c_customer_id | c_first_name ---------------+---------------+-------------- 3869 | hello | Grace 3869 | hello | Grace 3869 | | Grace 4421 | Admin | Local 6985 | maps | Joes 9976 | world | James (6 rows) 删除表中数据 # 在删除表中数据之前，确保已经完成本文示例中向表中插入数据和更新表中数据的操作。\n根据需要可以删除匹配条件的一组行或者一次删除表中的所有行。\nSQL不能直接访问独立的行，只能通过声明被删除的行匹配的条件。如果表中有一个主键，可以指定准确的行。\n删除表customer36中所有c_customer_sk为3869的记录。\nDELETE FROM customer36 WHERE c_customer_sk = 3869; 删除表中所有的行。建议使用truncate，详情可参考TRUNCATE。\nDELETE FROM customer37; 或者\nTRUNCATE TABLE customer37; 清理测试环境。\nDROP TABLE customer36,customer37; 查看对象 # vsql工具提供了元命令可帮助管理员查看数据库对象信息。有关元命令的详细信息，常用的查看对象元命令如下：\n描述 元命令 查看帮助信息 ? 查看数据库 \\l 列举表 \\dt 查看表结构 \\d tablename 列举schema \\dn 查看索引 \\di 切换数据库 \\c dbname 查看帮助信息 # 使用\\? 查看所有可执行的命令，使用此命令输出结果较多，会分屏显示，可以按空格键分页，按q退出当前内容查看。\n\\? 查看数据库 # \\l 列举表 # \\dt 查看表结构 # \\d tablename 列举schema # \\dn 查看索引 # \\di 切换数据库 # \\c dbname 总结 # 本文围绕 Vastbase G100 V3 单机场景，完整梳理了从环境准备到安装验证的全过程，包括本地源挂载、第三方依赖安装、防火墙与透明大页处理、时区与 IPC 参数配置、内核参数调整、SELinux 与主机名设置等关键前置步骤；随后介绍了安装用户与目录创建、静默安装参数文件 db_install.rsp 的编写、vastbase_installer 的执行方式，以及安装完成后的环境变量初始化、数据库启停、远程连接和 vsql 基本使用方法。\n总体来说，Vastbase G100 V3 已经具备了较完整的安装资料和操作路径。对于希望学习国产数据库、参与信创项目，或者正在做数据库替代验证的技术人员来说，单机安装是最合适的入门方式。建议先通过单机环境把安装、启停、连接和基础对象操作跑通，再进一步深入到性能调优、备份恢复、高可用和迁移改造等更高阶场景。\n另赠送Vastbase G100 V3 for Linux 单机一键静默安装脚本\n#!/usr/bin/env bash # ============================================================ # Vastbase G100 3.0.x for Linux 单机一键静默安装脚本（EL7 优化最终版） # 适用：CentOS/RHEL/OL 7.x（也可兼容多数 RHEL 系） # 特性： # 1) 完整日志：控制台 + 文件双写 # 2) 出错自动打印行号、命令、关键上下文 # 3) 自动探测安装包路径（PKG_DIR / 当前目录 / 脚本目录） # 4) 修复安装器需在自身目录启动的问题 # 5) 避免 db_install.rsp 被解压步骤删除 # 6) EL7 兼容：RemoveIPC / THP / sysctl / locale 处理 # 7) 默认附带小内存启动参数，适合 4GB 测试机 # # 用法： # chmod +x install_vastbase_g100_v3_final_el7.sh # ./install_vastbase_g100_v3_final_el7.sh # ============================================================ set -Eeuo pipefail # ------------------------------ # 可配置参数 # ------------------------------ VB_USER=\u0026#34;vastbase\u0026#34; VB_GROUP=\u0026#34;vastbase\u0026#34; # 安装包常用位置： # 1) PKG_DIR/${PKG_FILE} # 2) 当前执行目录/${PKG_FILE} # 3) 脚本所在目录/${PKG_FILE} PKG_DIR=\u0026#34;/opt/vastbase_pkg\u0026#34; PKG_FILE=\u0026#34;Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar\u0026#34; BASE_DIR=\u0026#34;/home/${VB_USER}\u0026#34; WORK_DIR=\u0026#34;/opt/vastbase_work\u0026#34; VB_HOME=\u0026#34;${BASE_DIR}/local/vastbase\u0026#34; VB_DATA=\u0026#34;${BASE_DIR}/data/vastbase\u0026#34; VB_CORE=\u0026#34;${BASE_DIR}/corefile\u0026#34; RSP_FILE=\u0026#34;${BASE_DIR}/db_install.rsp\u0026#34; PORT=\u0026#34;5432\u0026#34; DB_COMPATIBILITY=\u0026#34;A\u0026#34; IS_INITDB=\u0026#34;true\u0026#34; OPEN_REMOTE_ACCESS=\u0026#34;yes\u0026#34; INSTALLER_CMD=\u0026#34;\u0026#34; # 小内存测试机默认值（建议保守） # 4GB 虚拟机建议保持以下值；内存 \u0026gt;= 8GB 可自行调大 MAX_CONNECTIONS=\u0026#34;10\u0026#34; SHARED_BUFFERS=\u0026#34;64\u0026#34; # installer 应答文件通常写整数，单位 MB LOW_MEM_MODE=\u0026#34;yes\u0026#34; MAX_PROCESS_MEMORY=\u0026#34;3072MB\u0026#34; CSTORE_BUFFERS=\u0026#34;16MB\u0026#34; WAL_BUFFERS=\u0026#34;4MB\u0026#34; MAX_LOCKS_PER_TRANSACTION=\u0026#34;16\u0026#34; MAX_PRED_LOCKS_PER_TRANSACTION=\u0026#34;16\u0026#34; WORK_MEM=\u0026#34;1MB\u0026#34; MAINTENANCE_WORK_MEM=\u0026#34;32MB\u0026#34; MAX_PREPARED_TRANSACTIONS=\u0026#34;0\u0026#34; # 请自行修改密码 VB_PASSWORD=\u0026#39;Aa123456!\u0026#39; ENCRYPTION_KEY=\u0026#39;Aa123456!\u0026#39; # 日志目录 LOG_DIR=\u0026#34;/var/log/vastbase\u0026#34; LOG_FILE=\u0026#34;${LOG_DIR}/install_vastbase_$(date +%F_%H%M%S).log\u0026#34; INSTALLER_LOG=\u0026#34;${LOG_DIR}/vastbase_installer_$(date +%F_%H%M%S).log\u0026#34; # ------------------------------ # 日志与错误处理 # ------------------------------ COLOR_INFO=\u0026#39;[1;32m\u0026#39; COLOR_WARN=\u0026#39;[38;5;208m\u0026#39; COLOR_ERRO=\u0026#39;[1;31m\u0026#39; COLOR_RESET=\u0026#39;[0m\u0026#39; timestamp() { date \u0026#34;+%F %T\u0026#34; } init_logging() { mkdir -p \u0026#34;${LOG_DIR}\u0026#34; touch \u0026#34;${LOG_FILE}\u0026#34; chmod 600 \u0026#34;${LOG_FILE}\u0026#34; exec \u0026gt; \u0026gt;(tee -a \u0026#34;${LOG_FILE}\u0026#34;) 2\u0026gt;\u0026amp;1 echo -e \u0026#34;============================================================\u0026#34; echo -e \u0026#34;${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) 日志文件: ${LOG_FILE}\u0026#34; echo -e \u0026#34;${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) 安装器日志: ${INSTALLER_LOG}\u0026#34; echo -e \u0026#34;${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) 脚本路径: $0\u0026#34; echo -e \u0026#34;============================================================\u0026#34; } log() { echo -e \u0026#34;${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) $*\u0026#34;; } warn() { echo -e \u0026#34;${COLOR_WARN}[WARN]${COLOR_RESET} $(timestamp) $*\u0026#34;; } err() { echo -e \u0026#34;${COLOR_ERRO}[ERRO]${COLOR_RESET} $(timestamp) $*\u0026#34; \u0026gt;\u0026amp;2; } run_step() { local step_name=\u0026#34;$1\u0026#34; shift log \u0026#34;\u0026gt;\u0026gt;\u0026gt; 开始: ${step_name}\u0026#34; \u0026#34;$@\u0026#34; log \u0026#34;\u0026lt;\u0026lt;\u0026lt; 完成: ${step_name}\u0026#34; } dump_files() { echo \u0026#34;---------------- FILE SNAPSHOT BEGIN ----------------\u0026#34; echo \u0026#34;PKG_DIR=${PKG_DIR}\u0026#34; echo \u0026#34;PKG_FILE=${PKG_FILE}\u0026#34; echo \u0026#34;WORK_DIR=${WORK_DIR}\u0026#34; echo \u0026#34;VB_HOME=${VB_HOME}\u0026#34; echo \u0026#34;VB_DATA=${VB_DATA}\u0026#34; echo \u0026#34;RSP_FILE=${RSP_FILE}\u0026#34; echo ls -ld \u0026#34;${PKG_DIR}\u0026#34; 2\u0026gt;/dev/null || true ls -l \u0026#34;${PKG_DIR}\u0026#34; 2\u0026gt;/dev/null || true ls -ld \u0026#34;${WORK_DIR}\u0026#34; 2\u0026gt;/dev/null || true ls -l \u0026#34;${WORK_DIR}\u0026#34; 2\u0026gt;/dev/null || true ls -ld \u0026#34;${VB_HOME}\u0026#34; 2\u0026gt;/dev/null || true ls -ld \u0026#34;${VB_DATA}\u0026#34; 2\u0026gt;/dev/null || true [[ -f \u0026#34;${RSP_FILE}\u0026#34; ]] \u0026amp;\u0026amp; ls -l \u0026#34;${RSP_FILE}\u0026#34; || true echo \u0026#34;---------------- FILE SNAPSHOT END ------------------\u0026#34; } dump_context() { echo \u0026#34;---------------- CONTEXT BEGIN ----------------\u0026#34; echo \u0026#34;TIME: $(timestamp)\u0026#34; echo \u0026#34;USER: $(id -un)\u0026#34; echo \u0026#34;PWD : $(pwd)\u0026#34; echo \u0026#34;SHELL: ${SHELL:-unknown}\u0026#34; echo dump_files echo echo \u0026#34;[INFO] 主日志最后 80 行：\u0026#34; tail -n 80 \u0026#34;${LOG_FILE}\u0026#34; 2\u0026gt;/dev/null || true echo echo \u0026#34;[INFO] 安装器日志最后 80 行：\u0026#34; tail -n 80 \u0026#34;${INSTALLER_LOG}\u0026#34; 2\u0026gt;/dev/null || true echo \u0026#34;---------------- CONTEXT END ------------------\u0026#34; } on_error() { local exit_code=$? local line_no=${1:-unknown} err \u0026#34;脚本执行失败，退出码=${exit_code}，失败行号=${line_no}，失败命令=${BASH_COMMAND}\u0026#34; dump_context exit \u0026#34;${exit_code}\u0026#34; } trap \u0026#39;on_error $LINENO\u0026#39; ERR # ------------------------------ # 工具函数 # ------------------------------ require_root() { if [[ \u0026#34;$(id -u)\u0026#34; -ne 0 ]]; then err \u0026#34;请使用 root 执行该脚本。\u0026#34; exit 1 fi } detect_pm() { if command -v dnf \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then PM=\u0026#34;dnf\u0026#34; elif command -v yum \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then PM=\u0026#34;yum\u0026#34; else PM=\u0026#34;\u0026#34; fi } detect_locale_value() { if locale -a 2\u0026gt;/dev/null | grep -qi \u0026#39;^en_US\\.UTF-8$\u0026#39;; then echo \u0026#34;en_US.UTF-8\u0026#34; elif locale -a 2\u0026gt;/dev/null | grep -qi \u0026#39;^en_US\\.utf8$\u0026#39;; then echo \u0026#34;en_US.utf8\u0026#34; elif locale -a 2\u0026gt;/dev/null | grep -qi \u0026#39;^C\\.UTF-8$\u0026#39;; then echo \u0026#34;C.UTF-8\u0026#34; else echo \u0026#34;C\u0026#34; fi } find_package() { local script_dir script_dir=$(cd \u0026#34;$(dirname \u0026#34;$0\u0026#34;)\u0026#34; \u0026amp;\u0026amp; pwd) local candidates=( \u0026#34;${PKG_DIR}/${PKG_FILE}\u0026#34; \u0026#34;$(pwd)/${PKG_FILE}\u0026#34; \u0026#34;${script_dir}/${PKG_FILE}\u0026#34; ) local c for c in \u0026#34;${candidates[@]}\u0026#34;; do if [[ -f \u0026#34;${c}\u0026#34; ]]; then echo \u0026#34;${c}\u0026#34; return 0 fi done return 1 } # 注释掉已有参数，避免重复值误导 comment_out_key() { local file=\u0026#34;$1\u0026#34; local key=\u0026#34;$2\u0026#34; if [[ -f \u0026#34;${file}\u0026#34; ]]; then sed -ri \u0026#34;/^[[:space:]#]*${key}[[:space:]]*=/ s/^/# old by script: /\u0026#34; \u0026#34;${file}\u0026#34; || true fi } set_conf() { local file=\u0026#34;$1\u0026#34; local key=\u0026#34;$2\u0026#34; local val=\u0026#34;$3\u0026#34; comment_out_key \u0026#34;${file}\u0026#34; \u0026#34;${key}\u0026#34; echo \u0026#34;${key} = ${val}\u0026#34; \u0026gt;\u0026gt; \u0026#34;${file}\u0026#34; } # ------------------------------ # 安装前准备 # ------------------------------ install_deps() { detect_pm if [[ -z \u0026#34;${PM}\u0026#34; ]]; then warn \u0026#34;未检测到 yum/dnf，跳过依赖自动安装，请手工补齐依赖。\u0026#34; return 0 fi log \u0026#34;安装常见依赖包...\u0026#34; # EL7 不再安装 glibc-langpack-en，避免 No package 错误 ${PM} install -y \\ tar gzip which hostname sudo \\ zlib-devel libaio libuuid readline-devel \\ krb5-libs libicu libxslt tcl perl \\ openldap pam openssl-devel libxml2 bzip2 } create_user_and_dirs() { log \u0026#34;创建用户与目录...\u0026#34; getent group \u0026#34;${VB_GROUP}\u0026#34; \u0026gt;/dev/null || groupadd \u0026#34;${VB_GROUP}\u0026#34; id \u0026#34;${VB_USER}\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || useradd -m -g \u0026#34;${VB_GROUP}\u0026#34; \u0026#34;${VB_USER}\u0026#34; mkdir -p \u0026#34;${PKG_DIR}\u0026#34; \u0026#34;${WORK_DIR}\u0026#34; \u0026#34;${VB_HOME}\u0026#34; \u0026#34;${VB_DATA}\u0026#34; \u0026#34;${VB_CORE}\u0026#34; chown -R \u0026#34;${VB_USER}:${VB_GROUP}\u0026#34; \u0026#34;${BASE_DIR}\u0026#34; \u0026#34;${PKG_DIR}\u0026#34; \u0026#34;${WORK_DIR}\u0026#34; chmod 755 \u0026#34;${PKG_DIR}\u0026#34; \u0026#34;${WORK_DIR}\u0026#34; } set_limits() { log \u0026#34;配置资源限制...\u0026#34; cat \u0026gt;/etc/security/limits.d/99-vastbase.conf \u0026lt;\u0026lt;EOF2 ${VB_USER} soft nproc unlimited ${VB_USER} hard nproc unlimited ${VB_USER} soft nofile 1024000 ${VB_USER} hard nofile 1024000 ${VB_USER} soft stack unlimited ${VB_USER} hard stack unlimited ${VB_USER} soft core unlimited ${VB_USER} hard core unlimited ${VB_USER} soft memlock unlimited ${VB_USER} hard memlock unlimited EOF2 } set_sysctl() { log \u0026#34;配置内核参数...\u0026#34; cat \u0026gt;/etc/sysctl.d/99-vastbase.conf \u0026lt;\u0026lt;\u0026#39;EOF2\u0026#39; fs.aio-max-nr=1048576 fs.file-max= 76724600 kernel.sem = 4096 2097152000 4096 512000 kernel.shmall = 26843545 # pages, 80% MEM or higher kernel.shmmax = 68719476736 # bytes, 50% MEM or higher kernel.shmmni = 819200 net.core.netdev_max_backlog = 10000 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 4194304 net.core.somaxconn = 4096 net.ipv4.tcp_fin_timeout = 5 vm.dirty_background_bytes = 409600000 vm.dirty_expire_centisecs = 3000 vm.dirty_ratio = 80 vm.dirty_writeback_centisecs = 50 vm.overcommit_memory = 0 vm.swappiness = 0 net.ipv4.ip_local_port_range = 40000 65535 fs.nr_open = 20480000 EOF2 sysctl --system } disable_firewall_selinux() { log \u0026#34;关闭防火墙与 SELinux...\u0026#34; systemctl disable --now firewalld 2\u0026gt;/dev/null || warn \u0026#34;firewalld 未运行或关闭失败，已忽略\u0026#34; if command -v setenforce \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then setenforce 0 2\u0026gt;/dev/null || warn \u0026#34;setenforce 0 执行失败，已忽略\u0026#34; fi if [[ -f /etc/selinux/config ]]; then sed -ri \u0026#39;s/^SELINUX=.*/SELINUX=disabled/g\u0026#39; /etc/selinux/config || warn \u0026#34;修改 /etc/selinux/config 失败，已忽略\u0026#34; fi } disable_thp() { log \u0026#34;关闭透明大页 THP...\u0026#34; cat \u0026gt;/etc/systemd/system/disable-thp.service \u0026lt;\u0026lt;\u0026#39;EOF2\u0026#39; [Unit] Description=Disable Transparent Huge Pages After=network.target [Service] Type=oneshot ExecStart=/bin/sh -c \u0026#39;test -f /sys/kernel/mm/transparent_hugepage/enabled \u0026amp;\u0026amp; echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled || true\u0026#39; ExecStart=/bin/sh -c \u0026#39;test -f /sys/kernel/mm/transparent_hugepage/defrag \u0026amp;\u0026amp; echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/defrag || true\u0026#39; RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF2 systemctl daemon-reload systemctl enable disable-thp.service || warn \u0026#34;enable disable-thp.service 失败，已忽略\u0026#34; systemctl start disable-thp.service || warn \u0026#34;start disable-thp.service 失败，已忽略\u0026#34; } set_removeipc() { log \u0026#34;配置 RemoveIPC=no ...\u0026#34; # 1) /etc/systemd/logind.conf if [[ -f /etc/systemd/logind.conf ]]; then sed -ri \u0026#39;s/^[#[:space:]]*RemoveIPC=.*/RemoveIPC=no/\u0026#39; /etc/systemd/logind.conf || true grep -q \u0026#39;^RemoveIPC=no$\u0026#39; /etc/systemd/logind.conf || echo \u0026#39;RemoveIPC=no\u0026#39; \u0026gt;\u0026gt; /etc/systemd/logind.conf else cat \u0026gt;/etc/systemd/logind.conf \u0026lt;\u0026lt;\u0026#39;EOF2\u0026#39; [Login] RemoveIPC=no EOF2 fi # 2) /etc/systemd/logind.conf.d/ mkdir -p /etc/systemd/logind.conf.d cat \u0026gt;/etc/systemd/logind.conf.d/vastbase.conf \u0026lt;\u0026lt;\u0026#39;EOF2\u0026#39; [Login] RemoveIPC=no EOF2 # 3) /usr/lib/systemd/system/systemd-logind.service if [[ -f /usr/lib/systemd/system/systemd-logind.service ]]; then if grep -q \u0026#39;^RemoveIPC=\u0026#39; /usr/lib/systemd/system/systemd-logind.service; then sed -ri \u0026#39;s/^[#[:space:]]*RemoveIPC=.*/RemoveIPC=no/\u0026#39; /usr/lib/systemd/system/systemd-logind.service || true else sed -ri \u0026#39;/^\\[Service\\]/a RemoveIPC=no\u0026#39; /usr/lib/systemd/system/systemd-logind.service || true fi fi systemctl daemon-reload systemctl restart systemd-logind || warn \u0026#34;restart systemd-logind 失败，已忽略\u0026#34; log \u0026#34;验证 RemoveIPC 配置...\u0026#34; grep -n \u0026#39;RemoveIPC\u0026#39; /etc/systemd/logind.conf 2\u0026gt;/dev/null || true grep -n \u0026#39;RemoveIPC\u0026#39; /etc/systemd/logind.conf.d/vastbase.conf 2\u0026gt;/dev/null || true grep -n \u0026#39;RemoveIPC\u0026#39; /usr/lib/systemd/system/systemd-logind.service 2\u0026gt;/dev/null || true } set_profile() { log \u0026#34;配置 ${VB_USER} 环境变量...\u0026#34; local profile_file=\u0026#34;${BASE_DIR}/.bashrc\u0026#34; local locale_value locale_value=$(detect_locale_value) grep -q \u0026#34;VASTBASE ENV BEGIN\u0026#34; \u0026#34;${profile_file}\u0026#34; 2\u0026gt;/dev/null || cat \u0026gt;\u0026gt;\u0026#34;${profile_file}\u0026#34; \u0026lt;\u0026lt;EOF2 # ===== VASTBASE ENV BEGIN ===== export GAUSSHOME=${VB_HOME} export VB_HOME=${VB_HOME} export PGDATA=${VB_DATA} export VB_DATA=${VB_DATA} export PGPORT=${PORT} export PATH=\\$GAUSSHOME/bin:\\$PATH export LD_LIBRARY_PATH=\\$GAUSSHOME/lib:\\$LD_LIBRARY_PATH export LANG=${locale_value} export LC_ALL=${locale_value} # ===== VASTBASE ENV END ===== EOF2 chown \u0026#34;${VB_USER}:${VB_GROUP}\u0026#34; \u0026#34;${profile_file}\u0026#34; } # ------------------------------ # 解包与安装 # ------------------------------ write_rsp() { log \u0026#34;生成静默安装应答文件 ${RSP_FILE} ...\u0026#34; cat \u0026gt;\u0026#34;${RSP_FILE}\u0026#34; \u0026lt;\u0026lt;EOF2 vastbase_password=${VB_PASSWORD} encryption_key=${ENCRYPTION_KEY} vastbase_home=${VB_HOME} vastbase_data=${VB_DATA} port=${PORT} max_connections=${MAX_CONNECTIONS} shared_buffers=${SHARED_BUFFERS} db_compatibility=${DB_COMPATIBILITY} isinitdb=${IS_INITDB} EOF2 chown \u0026#34;${VB_USER}:${VB_GROUP}\u0026#34; \u0026#34;${RSP_FILE}\u0026#34; chmod 600 \u0026#34;${RSP_FILE}\u0026#34; } unpack_pkg() { local pkg pkg=$(find_package) || { err \u0026#34;未找到安装包：${PKG_FILE}\u0026#34; err \u0026#34;请把安装包放在以下任一位置：\u0026#34; err \u0026#34; 1) ${PKG_DIR}/${PKG_FILE}\u0026#34; err \u0026#34; 2) $(pwd)/${PKG_FILE}\u0026#34; err \u0026#34; 3) $(cd \u0026#34;$(dirname \u0026#34;$0\u0026#34;)\u0026#34; \u0026amp;\u0026amp; pwd)/${PKG_FILE}\u0026#34; exit 1 } log \u0026#34;解压安装包：${pkg}\u0026#34; rm -rf \u0026#34;${WORK_DIR:?}/\u0026#34;* tar -xf \u0026#34;${pkg}\u0026#34; -C \u0026#34;${WORK_DIR}\u0026#34; chown -R \u0026#34;${VB_USER}:${VB_GROUP}\u0026#34; \u0026#34;${WORK_DIR}\u0026#34; } detect_installer() { if [[ -n \u0026#34;${INSTALLER_CMD}\u0026#34; ]]; then echo \u0026#34;${INSTALLER_CMD}\u0026#34; return 0 fi local candidates=( \u0026#34;${WORK_DIR}/vastbase-installer/vastbase_installer\u0026#34; \u0026#34;${WORK_DIR}/vastbase_installer\u0026#34; \u0026#34;${WORK_DIR}/installer/vastbase_installer\u0026#34; \u0026#34;${WORK_DIR}/script/vastbase_installer\u0026#34; \u0026#34;${WORK_DIR}/install/vastbase_installer\u0026#34; ) local f for f in \u0026#34;${candidates[@]}\u0026#34;; do if [[ -x \u0026#34;${f}\u0026#34; ]]; then echo \u0026#34;${f}\u0026#34; return 0 fi done f=$(find \u0026#34;${WORK_DIR}\u0026#34; -maxdepth 4 -type f \\( -name \u0026#34;vastbase_installer\u0026#34; -o -name \u0026#34;install.sh\u0026#34; \\) | head -n 1 || true) if [[ -n \u0026#34;${f}\u0026#34; ]]; then chmod +x \u0026#34;${f}\u0026#34; || true echo \u0026#34;${f}\u0026#34; return 0 fi return 1 } run_installer() { local installer installer_dir installer_name installer=$(detect_installer) || { err \u0026#34;未探测到安装器，请先手工查看 ${WORK_DIR} 下的实际安装入口。\u0026#34; exit 1 } installer_dir=$(dirname \u0026#34;${installer}\u0026#34;) installer_name=$(basename \u0026#34;${installer}\u0026#34;) log \u0026#34;使用安装器：${installer}\u0026#34; log \u0026#34;安装器目录：${installer_dir}\u0026#34; log \u0026#34;安装器日志：${INSTALLER_LOG}\u0026#34; [[ -f \u0026#34;${RSP_FILE}\u0026#34; ]] || { err \u0026#34;应答文件不存在：${RSP_FILE}\u0026#34; exit 1 } if [[ -d \u0026#34;${installer_dir}/locales\u0026#34; ]]; then log \u0026#34;检测到 locales 目录：${installer_dir}/locales\u0026#34; else warn \u0026#34;未检测到 locales 目录：${installer_dir}/locales\u0026#34; ls -l \u0026#34;${installer_dir}\u0026#34; || true fi # 注意：必须切到安装器目录执行，否则可能报 locales 目录不存在 if [[ \u0026#34;${installer_name}\u0026#34; == \u0026#34;vastbase_installer\u0026#34; ]]; then su - \u0026#34;${VB_USER}\u0026#34; -c \u0026#34;cd \u0026#39;${installer_dir}\u0026#39; \u0026amp;\u0026amp; ./\u0026#39;${installer_name}\u0026#39; --silent -responseFile \u0026#39;${RSP_FILE}\u0026#39;\u0026#34; \\ 2\u0026gt;\u0026amp;1 | tee -a \u0026#34;${INSTALLER_LOG}\u0026#34; else su - \u0026#34;${VB_USER}\u0026#34; -c \u0026#34;cd \u0026#39;${installer_dir}\u0026#39; \u0026amp;\u0026amp; ./\u0026#39;${installer_name}\u0026#39; --silent -responseFile \u0026#39;${RSP_FILE}\u0026#39;\u0026#34; \\ 2\u0026gt;\u0026amp;1 | tee -a \u0026#34;${INSTALLER_LOG}\u0026#34; fi } post_install_check() { [[ -x \u0026#34;${VB_HOME}/bin/vsql\u0026#34; ]] || { err \u0026#34;安装未完成：${VB_HOME}/bin/vsql 不存在\u0026#34;; exit 1; } [[ -x \u0026#34;${VB_HOME}/bin/vb_ctl\u0026#34; ]] || { err \u0026#34;安装未完成：${VB_HOME}/bin/vb_ctl 不存在\u0026#34;; exit 1; } } # ------------------------------ # 安装后配置 # ------------------------------ post_install_tune() { local conf=\u0026#34;${VB_DATA}/postgresql.conf\u0026#34; if [[ ! -f \u0026#34;${conf}\u0026#34; ]]; then warn \u0026#34;未找到 postgresql.conf，跳过安装后调优\u0026#34; return 0 fi log \u0026#34;执行安装后参数调优...\u0026#34; if [[ \u0026#34;${LOW_MEM_MODE}\u0026#34; == \u0026#34;yes\u0026#34; ]]; then log \u0026#34;启用小内存模式参数...\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;max_process_memory\u0026#34; \u0026#34;${MAX_PROCESS_MEMORY}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;shared_buffers\u0026#34; \u0026#34;${SHARED_BUFFERS}MB\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;cstore_buffers\u0026#34; \u0026#34;${CSTORE_BUFFERS}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;max_connections\u0026#34; \u0026#34;${MAX_CONNECTIONS}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;max_prepared_transactions\u0026#34; \u0026#34;${MAX_PREPARED_TRANSACTIONS}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;wal_buffers\u0026#34; \u0026#34;${WAL_BUFFERS}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;max_locks_per_transaction\u0026#34; \u0026#34;${MAX_LOCKS_PER_TRANSACTION}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;max_pred_locks_per_transaction\u0026#34; \u0026#34;${MAX_PRED_LOCKS_PER_TRANSACTION}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;work_mem\u0026#34; \u0026#34;${WORK_MEM}\u0026#34; set_conf \u0026#34;${conf}\u0026#34; \u0026#34;maintenance_work_mem\u0026#34; \u0026#34;${MAINTENANCE_WORK_MEM}\u0026#34; fi if [[ \u0026#34;${OPEN_REMOTE_ACCESS}\u0026#34; == \u0026#34;yes\u0026#34; ]]; then set_conf \u0026#34;${conf}\u0026#34; \u0026#34;listen_addresses\u0026#34; \u0026#34;\u0026#39;*\u0026#39;\u0026#34; fi } post_config() { local hba=\u0026#34;${VB_DATA}/pg_hba.conf\u0026#34; if [[ \u0026#34;${OPEN_REMOTE_ACCESS}\u0026#34; == \u0026#34;yes\u0026#34; \u0026amp;\u0026amp; -f \u0026#34;${hba}\u0026#34; ]]; then log \u0026#34;放通远程 md5 接入...\u0026#34; grep -q \u0026#34;host all all 0.0.0.0/0 md5\u0026#34; \u0026#34;${hba}\u0026#34; 2\u0026gt;/dev/null || echo \u0026#34;host all all 0.0.0.0/0 md5\u0026#34; \u0026gt;\u0026gt; \u0026#34;${hba}\u0026#34; grep -q \u0026#34;host all all ::/0 md5\u0026#34; \u0026#34;${hba}\u0026#34; 2\u0026gt;/dev/null || echo \u0026#34;host all all ::/0 md5\u0026#34; \u0026gt;\u0026gt; \u0026#34;${hba}\u0026#34; chown \u0026#34;${VB_USER}:${VB_GROUP}\u0026#34; \u0026#34;${hba}\u0026#34; fi } start_and_verify() { log \u0026#34;启动数据库并验证...\u0026#34; su - \u0026#34;${VB_USER}\u0026#34; -c \u0026#34; source ~/.bashrc vb_ctl start sleep 5 vb_ctl status vsql -d postgres -p ${PORT} -c \u0026#39;select version();\u0026#39; \u0026#34; } print_summary() { log \u0026#34;安装流程执行完毕。\u0026#34; log \u0026#34;主日志：${LOG_FILE}\u0026#34; log \u0026#34;安装器日志：${INSTALLER_LOG}\u0026#34; log \u0026#34;常用命令：\u0026#34; echo \u0026#34; su - ${VB_USER}\u0026#34; echo \u0026#34; source ~/.bashrc\u0026#34; echo \u0026#34; vb_ctl start\u0026#34; echo \u0026#34; vb_ctl stop\u0026#34; echo \u0026#34; vb_ctl restart\u0026#34; echo \u0026#34; vb_ctl status\u0026#34; echo \u0026#34; vsql -d postgres -p ${PORT}\u0026#34; } main() { init_logging run_step \u0026#34;检查 root\u0026#34; require_root run_step \u0026#34;安装依赖\u0026#34; install_deps run_step \u0026#34;创建用户和目录\u0026#34; create_user_and_dirs run_step \u0026#34;配置 limits\u0026#34; set_limits run_step \u0026#34;配置 sysctl\u0026#34; set_sysctl run_step \u0026#34;关闭防火墙和 SELinux\u0026#34; disable_firewall_selinux run_step \u0026#34;关闭 THP\u0026#34; disable_thp run_step \u0026#34;配置 RemoveIPC\u0026#34; set_removeipc run_step \u0026#34;配置环境变量\u0026#34; set_profile run_step \u0026#34;解压安装包\u0026#34; unpack_pkg run_step \u0026#34;生成应答文件\u0026#34; write_rsp run_step \u0026#34;执行安装器\u0026#34; run_installer run_step \u0026#34;安装后检查\u0026#34; post_install_check run_step \u0026#34;安装后调优\u0026#34; post_install_tune run_step \u0026#34;放通远程访问\u0026#34; post_config run_step \u0026#34;启动并验证\u0026#34; start_and_verify print_summary } main \u0026#34;$@\u0026#34; ","date":"2026-03-08","externalUrl":null,"permalink":"/posts/vastbase-g100-v3-install-centos7/","section":"文章","summary":"一篇 Vastbase G100 V3 单机安装实战文档，覆盖 CentOS 7.9 环境准备、THP、RemoveIPC、内核参数、静默安装、数据库启动验证、远程连接配置，以及一键静默安装脚本。","title":"Vastbase G100 V3 单机静默安装实战：CentOS 7.9 环境","type":"posts"},{"content":"","date":"2026-03-08","externalUrl":null,"permalink":"/tags/%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85/","section":"Tags","summary":"","title":"静默安装","type":"tags"},{"content":"","date":"2026-03-08","externalUrl":null,"permalink":"/tags/%E4%BF%A1%E5%88%9B/","section":"Tags","summary":"","title":"信创","type":"tags"},{"content":"","date":"2026-02-25","externalUrl":null,"permalink":"/tags/hwm/","section":"Tags","summary":"","title":"HWM","type":"tags"},{"content":" 引言 # 在 Oracle DBA 的日常工作中，空间管理是最常见、也最容易被误解的主题之一。\n“表空间满了怎么办？”\n“删除了大量数据，为什么磁盘空间没变？”\n“碎片到底要不要整理？”\n这些问题几乎每个 DBA 都会遇到。很多时候，问题不在于不会操作，而在于没有分清不同层级的“空间”到底指什么：是段内空闲、表空间空闲，还是操作系统可见的磁盘空间？\n本文将从 Oracle 空间管理的底层架构讲起，系统解释空间分配与回收机制，并结合实际操作场景说明：什么时候该做、什么时候不该做、做了会产生什么影响。目标不是“把空间整理得很漂亮”，而是帮助你做出正确的、面向业务的决策。\n第一章：Oracle 空间架构的层次结构 # 1.1 四层存储模型 # Oracle 的逻辑存储结构可以分为四层，从宏观到微观依次为：\n表空间（Tablespace）：逻辑存储最高层容器，对应一个或多个数据文件。DBA 日常容量管理的主要对象。 段（Segment）：数据库对象的存储实体。表、索引、LOB 等通常都有独立段。 区（Extent）：由一组连续数据块组成，是段向表空间申请空间时的分配单位。 数据块（Block）：Oracle 数据库以数据块（也称为 Oracle 块或页）为单位，来管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单位。 关键点：很多“空间没释放”的争议，都是因为把这四层混在一起看了。\n1.2 表空间管理方式的演进：DMT → LMT # Oracle 表空间管理方式经历了明显演进：\n管理方式 典型时代 元数据位置 特征 字典管理（DMT） 早期版本 数据字典表 并发竞争高、易产生管理开销 本地管理（LMT） 9i+ 主流/默认 数据文件头位图 分配效率高、管理开销低 ASSM（段空间管理方式） 9i+ 主流 位图块 自动管理块内空闲空间 为什么 LMT 显著减少了“表空间碎片”问题？\n在 LMT 中，Oracle 通过位图管理区的分配状态，区大小要么是统一大小（UNIFORM），要么由系统自动分配（AUTOALLOCATE）。这使得传统 DMT 时代那种“空闲区难以合并利用”的问题大幅减少。\n更准确的说法是：LMT 显著降低了分配管理层面的碎片问题，但段内空闲、HWM 以下空块等“空间现象”仍然存在，只是含义不同。\n示例（统一 extents 的 LMT 表空间）：\nCREATE TABLESPACE app_data_ts DATAFILE \u0026#39;/u01/app/oracle/oradata/orcl/app_data01.dbf\u0026#39; SIZE 10G EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO; 1.3 段空间管理：MSSM vs ASSM # MSSM（Manual Segment Space Management） # 通过 Freelist 跟踪可用块，在高并发 INSERT 场景下可能产生热点争用。\nASSM（Automatic Segment Space Management） # 通过位图记录块空间使用状态，显著降低并发争用，是现代 Oracle 的标准配置。\nASSM 常见空闲级别（概念上）：\nFS1：0–25% 空闲 FS2：25–50% 空闲 FS3：50–75% 空闲 FS4：75–100% 空闲 FULL：块已满或低于 PCTFREE 可用阈值 第二章：高水位线（HWM）的本质 # 2.1 什么是高水位线？ # 高水位线（HWM）可以理解为：段曾经使用到的最高块位置标记。\n即使你删除了大量数据，这些块变成空块，只要 HWM 没下降，Oracle 在某些访问路径（尤其全表扫描）中仍然可能扫描到这些块。\n2.2 HWM 为什么影响性能？ # 全表扫描（Full Table Scan）通常扫描到 HWM，而不是只扫描“当前有数据的块”。\n因此，删除大量数据后你可能会看到：\n表看起来“行数少了很多” 但全表扫描耗时变化不明显 段大小也没明显缩小 这并不代表 Oracle “没删掉”，而是因为 DELETE 不会自动降低 HWM。\n2.3 关于 HWM 观察的一个常见误区 # 很多人会直接看 USER_TABLES.BLOCKS/EMPTY_BLOCKS 判断空间情况，但要注意：\n这些字段依赖统计信息（stats），不一定实时； 在不同版本、不同统计采集方式下，参考价值有限； 它们更适合做粗略估算，不是精确诊断。 可先用段大小做快速判断：\nSELECT segment_name, blocks, ROUND(bytes/1024/1024, 2) AS mb FROM user_segments WHERE segment_name = \u0026#39;MY_TABLE\u0026#39;; 如果要更精细地分析 ASSM 段内空闲分布，可考虑 DBMS_SPACE（如 SPACE_USAGE、UNUSED_SPACE）做进一步诊断。\n示例：适用于：表段 / 索引段（ASSM），能看到每个桶里有多少块（Blocks）。\nSET SERVEROUTPUT ON; DECLARE l_unformatted_blocks NUMBER; l_unformatted_bytes NUMBER; l_fs1_blocks NUMBER; -- 0-25% free l_fs1_bytes NUMBER; l_fs2_blocks NUMBER; -- 25-50% free l_fs2_bytes NUMBER; l_fs3_blocks NUMBER; -- 50-75% free l_fs3_bytes NUMBER; l_fs4_blocks NUMBER; -- 75-100% free l_fs4_bytes NUMBER; l_full_blocks NUMBER; -- full blocks l_full_bytes NUMBER; BEGIN DBMS_SPACE.SPACE_USAGE( segment_owner =\u0026gt; \u0026#39;SCOTT\u0026#39;, segment_name =\u0026gt; \u0026#39;EMP\u0026#39;, segment_type =\u0026gt; \u0026#39;TABLE\u0026#39;, -- TABLE / INDEX / CLUSTER / ... unformatted_blocks =\u0026gt; l_unformatted_blocks, unformatted_bytes =\u0026gt; l_unformatted_bytes, fs1_blocks =\u0026gt; l_fs1_blocks, fs1_bytes =\u0026gt; l_fs1_bytes, fs2_blocks =\u0026gt; l_fs2_blocks, fs2_bytes =\u0026gt; l_fs2_bytes, fs3_blocks =\u0026gt; l_fs3_blocks, fs3_bytes =\u0026gt; l_fs3_bytes, fs4_blocks =\u0026gt; l_fs4_blocks, fs4_bytes =\u0026gt; l_fs4_bytes, full_blocks =\u0026gt; l_full_blocks, full_bytes =\u0026gt; l_full_bytes ); DBMS_OUTPUT.PUT_LINE(\u0026#39;Segment: SCOTT.EMP (TABLE)\u0026#39;); DBMS_OUTPUT.PUT_LINE(\u0026#39;Unformatted Blocks : \u0026#39; || l_unformatted_blocks); DBMS_OUTPUT.PUT_LINE(\u0026#39;FS1 (0-25% free) : \u0026#39; || l_fs1_blocks); DBMS_OUTPUT.PUT_LINE(\u0026#39;FS2 (25-50% free) : \u0026#39; || l_fs2_blocks); DBMS_OUTPUT.PUT_LINE(\u0026#39;FS3 (50-75% free) : \u0026#39; || l_fs3_blocks); DBMS_OUTPUT.PUT_LINE(\u0026#39;FS4 (75-100% free) : \u0026#39; || l_fs4_blocks); DBMS_OUTPUT.PUT_LINE(\u0026#39;Full Blocks : \u0026#39; || l_full_blocks); END; / 2.4 关于“碎片”的误解（建议 DBA 必看） # 在现代 Oracle（LMT + ASSM）环境下，很多人说的“碎片”其实不是一回事：\n概念 真实影响 是否需要处理 表空间分配碎片（LMT） 通常较小 一般不需要 段内空闲（HWM 以下） 可被同段后续重用 通常不需要 行迁移/行链接 可能影响访问性能 视情况处理 索引叶块空洞/不平衡 部分场景可能有影响 证据驱动处理 核心原则： DELETE 后产生的段内空闲空间，通常可以被该对象后续 DML 重用。不要仅因为“看起来不整齐”就做重组。\n第三章：DELETE / TRUNCATE / DROP 的空间行为对比 # 这是空间管理里最常被误解的部分。三者都能“让数据消失”，但空间行为完全不同。\n3.1 DELETE：删数据，不降 HWM # DELETE FROM hr.employees WHERE salary \u0026gt; 30000; 空间行为：\n段内空间：释放为可重用（供该段后续使用） 高水位线（HWM）：通常不降低 表空间可用空间：通常不增加 操作系统/ASM 可见空间：不会减少文件大小 Redo/Undo：大量产生 事务特性：可回滚 适用场景：\n需要按条件精确删除 需要回滚能力 需要触发器/审计逻辑生效 小批量或分批删除（批处理） 实务建议： 大批量删除时，不要一次性删完。建议分批提交，控制 Undo/Redo、归档日志、锁持有时间。\n3.2 TRUNCATE：快速清空，重置 HWM # TRUNCATE TABLE hr.employees; -- 或 TRUNCATE TABLE hr.employees REUSE STORAGE; 空间行为：\n高水位线（HWM）：重置 段空间：默认释放多余 extents 给表空间（DROP STORAGE） 文件系统/ASM：文件大小通常不变 Redo/Undo：相对极少（DDL） 事务特性：不可回滚（DDL 隐式提交） 两种常见模式：\n-- 默认行为（等价于 DROP STORAGE） TRUNCATE TABLE hr.employees DROP STORAGE; -- 保留已分配空间，适合马上要重新装载数据 TRUNCATE TABLE hr.employees REUSE STORAGE; 适用场景：\n清空整表（如临时表、阶段表） ETL 中间层表重置 测试环境快速清空数据 注意：TRUNCATE 不能带 WHERE 条件；且会影响依赖对象/约束场景（需结合外键关系设计）。\n3.3 DROP TABLE：删除对象本身 # DROP TABLE hr.employees; -- 跳过回收站（如果业务允许） DROP TABLE hr.employees PURGE; 空间行为：\n对象级别：表对象及其依赖对象（索引等）被删除 表空间空间：回收（若进入回收站则可能延迟完全释放） 文件系统/ASM：文件大小通常不变 可恢复性：若进入回收站，可 FLASHBACK TABLE ... TO BEFORE DROP 回收站常用操作：\n-- 查看回收站对象 SELECT object_name, original_name, droptime FROM recyclebin; -- 恢复 FLASHBACK TABLE hr.employees TO BEFORE DROP; -- 清空当前用户回收站 PURGE RECYCLEBIN; -- 清空指定表空间回收站对象（可按需加 USER 子句） PURGE TABLESPACE users; 3.4 三种操作对比总结 # 操作 段内空间重用 表空间回收 文件系统/ASM 缩小 HWM 可回滚 Redo/Undo DELETE ✅ ❌ ❌ ❌ ✅ 大 TRUNCATE ✅（重置后重新分配） ✅（默认） ❌ ✅ ❌ 小 DROP N/A ✅（回收站可能延迟） ❌ N/A ❌ 小 DROP 本身不可回滚；如进入回收站，可通过 Flashback 恢复对象。\n第四章：空间回收的方法与工具 # 这一章建议用“按目标层级”来组织，读者最容易理解。\n4.1 目标一：释放段空间（降低 HWM / 提高段内利用率） # 方法一：Segment Shrink（推荐优先评估） # ALTER TABLE hr.employees ENABLE ROW MOVEMENT; ALTER TABLE hr.employees SHRINK SPACE; -- 或仅压缩段内数据，不立即降低 HWM ALTER TABLE hr.employees SHRINK SPACE COMPACT; -- 连带依赖对象（视版本/对象类型而定） ALTER TABLE hr.employees SHRINK SPACE CASCADE; 优点：\n通常可在线执行（对业务影响较小） 能降低 HWM（非 COMPACT 模式） 注意与限制：\n仅适用于 ASSM 表空间 需要 ROW MOVEMENT 会改变 ROWID（对依赖 ROWID 的程序要谨慎） 某些对象类型/版本存在限制（LOB、IOT、分区对象等要单独确认） 方法二：ALTER TABLE \u0026hellip; MOVE（重建段） # ALTER TABLE hr.employees MOVE; -- 或移动到新表空间 ALTER TABLE hr.employees MOVE TABLESPACE new_ts; -- 12c+ 可用在线方式（视版本/对象类型） ALTER TABLE hr.employees MOVE ONLINE; 特点：\n能有效整理段并重建存储布局 常用于迁移表空间、压缩重建 重要注意： 传统 MOVE 后，相关索引通常会变为不可用，需要重建：\nALTER INDEX hr.pk_employees REBUILD; -- 或在线重建（视版本/许可/对象类型） ALTER INDEX hr.pk_employees REBUILD ONLINE; 方法三：CTAS（适合大改造/结构优化） # CREATE TABLE hr.employees_new AS SELECT * FROM hr.employees; RENAME hr.employees TO hr.employees_old; RENAME hr.employees_new TO hr.employees; 适用场景：\n需要同时做结构优化（列调整、压缩、分区改造） 大表离线重构 历史数据治理项目 风险点：\n索引、约束、权限、触发器、同义词、统计信息需要重建或迁移 变更窗口要充分评估 4.2 目标二：释放表空间空闲给操作系统 / ASM（缩小数据文件） # 这是 DBA 常见误区：段里释放了空间 ≠ 数据文件变小。\nOracle 一般不会自动缩小数据文件，若要把空间“还给操作系统/ASM”，需要显式操作。\n方法一：收缩数据文件（RESIZE） # ALTER DATABASE DATAFILE \u0026#39;/u01/app/oracle/oradata/orcl/app_data01.dbf\u0026#39; RESIZE 5G; 前提：\n数据文件尾部没有已分配 extents RESIZE 值必须大于文件内最高已用块位置 建议：先评估再收缩（避免 ORA-03297）\n先确认数据文件 HWM 预留增长空间（不要收得太极限） 结合 autoextend 策略评估 实务建议：生产库中，宁可保守缩小，也不要频繁“缩了又长”。\n方法二：删除空数据文件（特定条件下） # ALTER TABLESPACE users DROP DATAFILE \u0026#39;/u01/app/oracle/oradata/orcl/users02.dbf\u0026#39;; 前提：\n数据文件必须为空（无 extents） 版本、表空间类型、管理方式需满足条件 4.3 索引空间管理：Coalesce vs Rebuild # Coalesce（轻量级整理叶块） # ALTER INDEX hr.pk_employees COALESCE; 在线 不重建整棵 B-tree 适合局部叶块空洞整理 Rebuild（完全重建） # ALTER INDEX hr.pk_employees REBUILD; -- 在线（视版本/对象类型） ALTER INDEX hr.pk_employees REBUILD ONLINE; -- 压缩重建（视场景） ALTER INDEX hr.pk_employees REBUILD COMPRESS; 经验原则：\n先问“有没有性能问题” 再问“是不是索引导致” 最后才决定 COALESCE 还是 REBUILD 不要因为“删除了很多数据”就习惯性重建索引。\n第五章：监控与诊断 # 5.1 表空间使用率监控（建议同时看当前值与最大可扩展值） # 你原文的思路是对的，建议在实际使用时再补一列 maxbytes（若开启 autoextend 更有意义），这样不会误判“快满了”。\n示例（简化版，按当前分配容量统计）：\nSELECT df.tablespace_name, ROUND(SUM(df.bytes)/1024/1024/1024, 2) AS total_gb, ROUND((SUM(df.bytes) - NVL(fs.free_bytes,0))/1024/1024/1024, 2) AS used_gb, ROUND(NVL(fs.free_bytes,0)/1024/1024/1024, 2) AS free_gb, ROUND((SUM(df.bytes)-NVL(fs.free_bytes,0))/SUM(df.bytes)*100, 2) AS pct_used FROM dba_data_files df LEFT JOIN ( SELECT tablespace_name, SUM(bytes) AS free_bytes FROM dba_free_space GROUP BY tablespace_name ) fs ON df.tablespace_name = fs.tablespace_name GROUP BY df.tablespace_name, fs.free_bytes ORDER BY pct_used DESC; 如果是 OMF/ASM/autoextend 环境，建议再补充 MAXBYTES 视角，避免只看当前 bytes。\n5.2 大段识别 # SELECT owner, segment_name, segment_type, ROUND(bytes/1024/1024/1024, 2) AS size_gb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 20 ROWS ONLY; 这类 SQL 非常适合做巡检、容量治理、空间回收候选对象筛选。\n5.3 表统计信息 vs 段占用空间（“是否值得整理”的初筛） # SELECT t.table_name, t.num_rows, ROUND(t.blocks * 8 / 1024, 2) AS stats_mb, -- 假设8KB块，仅粗估 ROUND(s.bytes / 1024 / 1024, 2) AS segment_mb, ROUND((s.bytes / 1024 / 1024) - (t.blocks * 8 / 1024), 2) AS potential_gap_mb FROM user_tables t JOIN user_segments s ON t.table_name = s.segment_name WHERE s.segment_type = \u0026#39;TABLE\u0026#39; ORDER BY potential_gap_mb DESC; 注意：\n这里的 8KB 是估算值，实际请按数据库块大小调整； USER_TABLES.BLOCKS 依赖统计信息，不是实时值； 该查询适合做“候选清单”，不适合直接作为 shrink/move 的唯一依据。 5.4 行迁移/行链接检测（建议改写为现代实践） # 统计信息：使用 DBMS_STATS 行迁移/行链接专项诊断：使用 ANALYZE ... LIST CHAINED ROWS 示例：\n-- 1) 常规统计信息（推荐） BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname =\u0026gt; \u0026#39;HR\u0026#39;, -- 用户名（Schema 名），替换为你的实际用户名 tabname =\u0026gt; \u0026#39;EMPLOYEES\u0026#39;, -- 表名，替换为你的实际表名 method_opt =\u0026gt; \u0026#39;FOR ALL COLUMNS SIZE AUTO\u0026#39;, -- 你关注的参数 estimate_percent =\u0026gt; DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自动采样比例（推荐） cascade =\u0026gt; TRUE, -- 同时收集索引的统计信息（推荐） no_invalidate =\u0026gt; FALSE -- 使已有的执行计划失效，重新生成最优计划 ); END; / -- 2) 链式/迁移行诊断（需预先创建 CHAINED_ROWS 表） ANALYZE TABLE hr.employees LIST CHAINED ROWS INTO chained_rows; SELECT COUNT(*) AS chained_row_count FROM chained_rows WHERE table_name = \u0026#39;EMPLOYEES\u0026#39;; 说明：CHAIN_CNT 的解释和准确性受统计方式影响，实战中更建议把它当作“提示信号”，结合 SQL 性能表现再决定是否处理。\n第六章：实战决策建议 # 很多文章讲完原理就结束了，但 DBA 真正需要的是“怎么选”。\n场景1：删除历史数据后，空间没变，是否要整理？ # 先问三件事：\n业务是否会很快再写回这些空间？ 如果会，通常不需要整理（留着复用更划算）。\n是否存在明确性能问题（如 FTS 变慢）？ 没有证据就不要动。\n你的目标是段内复用、表空间回收，还是 OS/ASM 释放？ 目标不同，方法完全不同。\n场景2：大表清理后全表扫描变慢 # 优先级建议：\n先确认执行计划是否真在 FTS 判断是否因 HWM 过高造成无效扫描 再评估 SHRINK / MOVE / 分区改造 对历史数据治理类大表，长期最优解通常不是反复 shrink，而是分区表 + 生命周期管理。\n场景3：磁盘告警，想“立刻释放空间” # 正确路径通常是：\n找出最大段/增长最快对象 确认是否存在可清理对象（临时表、归档、历史分区、回收站） 执行对象级回收（如 truncate/drop/shrink/move） 最后再评估数据文件 RESIZE 不要一上来就收缩数据文件。\n总结 # Oracle 空间管理的核心，不是“把空间变小”，而是准确理解空间所在层级，并选择正确动作。\n请记住这五条原则：\n先分层级：表空间、段、区、块，含义不同，处理方法不同 先定目标：是为了性能、复用、回收表空间，还是释放 OS/ASM 空间 先看证据：有性能问题再整理，而不是出于“强迫症”整理 先控风险：评估事务、锁、ROWID、索引失效、业务窗口 长期靠架构：大表历史数据管理优先考虑分区，而不是反复手工回收 数据库管理的目标是服务业务稳定与效率，不是追求“空间看起来完美”。在空间管理上，做正确的事，比做很多事更重要。\n","date":"2026-02-25","externalUrl":null,"permalink":"/posts/oracle-space-management-hwm/","section":"文章","summary":"一篇 Oracle 空间管理深度解析文章，从逻辑存储结构、HWM、高水位线、段内空闲、表空间回收、数据文件收缩、索引整理和生产决策角度，说明空间回收到底该不该做、什么时候做、怎么做。","title":"Oracle 空间管理深度解析：从逻辑存储结构、HWM 到空间回收策略","type":"posts"},{"content":"","date":"2026-02-25","externalUrl":null,"permalink":"/tags/segment-shrink/","section":"Tags","summary":"","title":"Segment Shrink","type":"tags"},{"content":"","date":"2026-02-25","externalUrl":null,"permalink":"/tags/%E8%A1%A8%E7%A9%BA%E9%97%B4/","section":"Tags","summary":"","title":"表空间","type":"tags"},{"content":"","date":"2026-02-25","externalUrl":null,"permalink":"/tags/%E7%A9%BA%E9%97%B4%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"空间管理","type":"tags"},{"content":"","date":"2026-02-25","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E6%94%B6%E7%BC%A9/","section":"Tags","summary":"","title":"数据文件收缩","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/asm/","section":"Tags","summary":"","title":"ASM","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/grid-infrastructure/","section":"Tags","summary":"","title":"Grid Infrastructure","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/oracle-26ai/","section":"Tags","summary":"","title":"Oracle 26ai","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/oracle-linux-9/","section":"Tags","summary":"","title":"Oracle Linux 9","type":"tags"},{"content":" 一、安装规划 # 1.1 软件规划 # 序号 软件 版本 1 虚拟化软件 VMware®Workstation 16 Pro 16.2.4 build-20089737 2 操作系统软件 OracleLinux-R9-U7-Server-x86_64-dvd.iso,要求9.2以上 3 Oracle软件 LINUX.X64_2326100_db_home.zip 4 GI软件 LINUX.X64_2326100_grid_home.zip 1.1.1 软件下载 # 1.1.1.1 操作系统下载 # 操作系统我们选择官网推荐的访问https://yum.oracle.com/oracle-linux-isos.html，Oracle Linux 9.7版本下载OracleLinux-R9-U7-x86_64-dvd.iso\n1.1.1.2 RAC软件下载 # 首先RAC软件访问https://www.oracle.com/database/technologies/oracle26ai-linux-downloads.html下载LINUX.X64_2326100_db_home.zip和LINUX.X64_2326100_grid_home.zip\n可以利用sha256sum检验软件的完整性。\n1.1.2 操作系统认证 # 因此安装Oracle26ai RAC，选择Oracle Linux 9操作系统，要求在9.2版本以上，这点请注意。\n1.2 虚拟机规划 # Oracle 数据库安装至少需要 1 GB 内存。建议使用 2 GB 内存。Oracle Grid Infrastructure 安装至少需要 8 GB 内存，我们这里给两台虚拟机各4颗CPU，16G内存，磁盘100G。\nCPU 内存 磁盘空间 网卡 操作系统版本 4C 16G 100G 两个网卡，一块Public IP、一块Private IP Oracle Linux Server release 9.7 4C 16G 100G 两个网卡，一块Public IP、一块Private IP Oracle Linux Server release 9.7 1.3 网络规划 # 从Oracle 11g开始，一共至少7个IP地址，2块网卡，其中public、vip和scan都在同一个网段，private在另一个网段，主机名不要包含下横线，如：RAC_01是不允许的；通过执行ifconfig -a检查2个节点的网卡名称必须一致。另外，在安装之前，公网、私网共4个IP可以ping通，其它3个不能ping通才是正常的。从18c开始，生产环境scan建议至少3个。\n节点名称 Public IP(NAT) Private IP(HOST) Virtual IP SCAN 名称 SCAN IP rac1 192.168.18.5 18.18.18.5 192.168.18.7 rac-scan 192.168.18.9 rac2 192.168.18.6 18.18.18.6 192.168.18.8 1.4 操作系统规划 # Table 1-3 Server Configuration Checklist for Oracle AI Database\nCheck Task Disk space allocated to the /tmp directory At least 1 GB of space in the /tmp directory. Swap space allocation relative to RAM (Oracle AI Database) Between 1 GB and 2 GB: 1.5 times the size of the RAM Between 2 GB and 16 GB: Equal to the size of the RAM More than 16 GB: 16 GB Note: If you enable HugePages for your Linux servers, then you should deduct the memory allocated to HugePages from the available RAM before calculating swap space. Swap space allocation relative to RAM (Oracle Restart) Between 8 GB and 16 GB: Equal to the size of the RAM More than 16 GB: 16 GB Note: If you enable HugePages for your Linux servers, then you should deduct the memory allocated to HugePages from the available RAM before calculating swap space. Oracle Inventory (oraInventory) and OINSTALL Group Requirements For upgrades, the installer detects an existing oraInventory directory from the /etc/oraInst.loc file, and uses the existing oraInventory.For new installs, if you have not configured an oraInventory directory, then you can specify the oraInventory directory during the software installation and Oracle Universal Installer will set up the software directories for you. The Oracle inventory is one directory level up from the Oracle base for the Oracle software installation and designates the installation owner\u0026rsquo;s primary group as the Oracle inventory group. Ensure that the oraInventory path that you specify is in compliance with the Oracle Optimal Flexible Architecture recommendations.The Oracle Inventory directory is the central inventory of Oracle software installed on your system. Users who have the Oracle Inventory group as their primary group are granted the OINSTALL privilege to write to the central inventory.The OINSTALL group must be the primary group of all Oracle software installation owners on the server. It should be writable by any Oracle installation owner. Groups and users Oracle recommends that you create groups and user accounts required for your security plans before starting installation. Installation owners have resource limits settings and other requirements. Group and user names must use only ASCII characters.You can use the Preinstallation RPM to automatically create the oracle user and the oraInventory (oinstall) and OSDBA (dba) groups for you. Mount point paths for the software binaries Oracle recommends that you create an Optimal Flexible Architecture configuration as described in the appendix \u0026ldquo;Optimal Flexible Architecture\u0026rdquo; in Oracle AI Database Installation Guide for your platform. Ensure that the Oracle home (the Oracle home path you select for Oracle AI Database) uses only ASCII characters The ASCII character restriction includes installation owner user names, which are used as a default for some home paths, as well as other directory names you may select for paths. Unset Oracle software environment variables If you have an existing Oracle software installation, and you are using the same user to install this installation, then unset the following environment variables: $ORACLE_HOME,$ORA_NLS10, and $TNS_ADMIN.If you have set $ORA_CRS_HOME as an environment variable, then unset it before starting an installation or upgrade. Do not use $ORA_CRS_HOME as a user environment variable, except as directed by Oracle Support. Set locale (if needed) Specify the language and the territory, or locale, in which you want to use Oracle components. A locale is a linguistic and cultural environment in which a system or program is running. NLS (National Language Support) parameters determine the locale-specific behavior on both servers and clients. The locale setting of a component determines the language of the user interface of the component, and the globalization behavior, such as date and number formatting. Check Shared Memory File System Mount By default, your operating system includes an entry in /etc/fstab to mount /dev/shm. However, if your Configuration Verification Utility (CVU) or installer checks fail, ensure that the /dev/shm mount area is of type tmpfs and is mounted with the following options:rw and exec permissions set on itWithout noexec or nosuid set on itNote: These options may not be listed as they are usually set as the default permissions by your operating system. Symlinks Oracle home or Oracle base cannot be symlinks, nor can any of their parent directories, all the way to up to the root directory. 1.4.1 操作系统目录 # 由于我们是测试这里把所有空间都给到/目录，生产环境我们可以划分成/目录100G，/boot目录1G，swap目录16G，/u01软件目录300G，/tmp目录20G，/home目录50G，\n分区 大小 /boot 1G / 83G swap 16.1G 1.4.2 软件包 # Table 4-1 x86-64 Oracle Linux 9 Minimum Operating System Requirements\nItem Requirements SSH Requirement Ensure that OpenSSH is installed on your servers. OpenSSH is the required SSH software. Oracle Linux 9 Minimum supported versions:Oracle Linux 9.2 with the Unbreakable Enterprise Kernel 7: 5.15.0-201.135.6.el9uek.x86_64 or laterOracle Linux 9.2 with the Red Hat Compatible Kernel: 5.14.0-284.30.1.el9_2.x86_64 or laterNote: Oracle recommends that you update Oracle Linux to the latest available version and release level. Packages for Oracle Linux 9 Install the latest released versions of the following packages:Subscribe to the Oracle Linux 9 channel on the Unbreakable Linux Network, or configure a yum repository from the Oracle Linux yum server website, and then install the Oracle AI Database Preinstallation RPM, oracle-ai-database-preinstall-26ai. The Oracle AI Database Preinstallation RPM, oracle-ai-database-preinstall-26ai, automatically installs all required packages listed in the table below, their dependencies for Oracle Grid Infrastructure and Oracle AI Database installations, and also performs other system configuration. If you install the Oracle AI Database Preinstallation RPM, oracle-ai-database-preinstall-26ai, then you do not have to install these packages, as the Oracle AI Database Preinstallation RPM automatically installs them. bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan liblsan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat Optional Packages for Oracle Linux 9 Based on your requirement, install the latest released versions of the following packages: ipmiutil (for Intelligent Platform Management Interface) libnsl2 (for Oracle Database Client only) libnsl2-devel (for Oracle Database Client only) net-tools (for Oracle RAC and Oracle Clusterware) nfs-utils (for Oracle ACFS) 1.5 共享存储规划 # Table 1-6 Oracle Grid Infrastructure Storage Configuration Checks\nCheck Task Minimum disk space (local or shared) for Oracle Grid Infrastructure Software At least 12 GB of space for the Oracle Grid Infrastructure for a cluster home (Grid home). Oracle recommends that you allocate 100 GB to allow additional space for patches. At least 10 GB for Oracle AI Database Enterprise Edition.Allocate additional storage space as per your cluster configuration, as described in Oracle Clusterware Storage Space Requirements. Select Oracle ASM Storage Options During installation, based on the cluster configuration, you are asked to provide Oracle ASM storage paths for the Oracle Clusterware files. These path locations must be writable by the Oracle Grid Infrastructure installation owner (Grid user). These locations must be shared across all nodes of the cluster on Oracle ASM because the files in the Oracle ASM disk group created during installation must be available to all cluster member nodes.For Oracle Grid Infrastructure deployment to manage Oracle RAC databases, shared storage, either Oracle ASM or shared file system, is locally mounted on each of the cluster nodes.Voting files are files that Oracle Clusterware uses to verify cluster node membership and status. Oracle Cluster Registry files (OCR) contain cluster and database configuration information for Oracle Clusterware. Table 8-1 Minimum Available Space Requirements for Oracle Grid Infrastructure Deployment to Manage Oracle RAC Databases\nRedundancy Level DATA Disk Group Oracle Fleet Patching and Provisioning Total Storage External 1 GB 1 GB 2 GB Normal 2 GB 2 GB 4 GB High/Flex/Extended 3 GB 3 GB 6 GB Oracle recommends that you use a separate disk group, other than DATA, for Oracle Clusterware backup files. The initial sizing for the Oracle Grid Infrastructure deployment to manage Oracle RAC databases is for up to four nodes. You must add additional storage space to the disk group containing Oracle Clusterware backup files for each new node added to the cluster. By default, all new Oracle Grid Infrastructure deployments to manage Oracle RAC databases are configured with Oracle Fleet Patching and Provisioning for patching that cluster only. This deployment requires a minimal ACFS file system that is automatically configured. 根据要求，采用的磁盘组策略如下：\nASM磁盘名称 磁盘组名称 冗余方式 大小 用途 备注 /dev/asm-ocrvote OCRVOTE External 3*5G OCR+VOTINGDISK 建议用3块 /dev/asm-data DATA External 2*20G 存储数据库数据文件 1.6 Oracle规划 # 1.6.1 软件规划 # 软件 版本 Oracle软件 LINUX.X64_2326100_db_home.zip(安装包) GI软件 LINUX.X64_2326100_db_home.zip(安装包) RU软件 opatch版本 1.6.2 用户组和用户 # 常见用户组说明\n组 角色 权限 oinstall 安装和升级oracle软件 dba sysdba 创建、删除、修改、启动、关闭数据库，切换日志归档模式，备份恢复数据库 oper sysoper 启动、关闭、修改、备份、恢复数据库，修改归档模式 asmdba sysdba自动存储管理 管理ASM实例 asmoper sysoper自动存储管理 启动、停止ASM实例 asmadmin sysasm 挂载、卸载磁盘组，管理其他存储设备 backupdba sysbackup 启动关闭和执行备份恢复（12c） dgdba sysdg 管理Data Guard（12c） kmdba syskm 加密管理相关操作 racdba rac管理 GroupName GroupID 说明 oinstall 54321 Oracle清单和软件所有者 dba 54322 数据库管理员 oper 54323 DBA操作员组 backupdba 54324 备份管理员 dgdba 54325 DG管理员 kmdba 54326 KM管理员 asmdba 54327 ASM数据库管理员组 asmoper 54328 ASM操作员组 asmadmin 54329 Oracle自动存储管理组 racdba 54330 RAC管理员 用户UID OS用户 主 用户目录 默认shell 54321 oracle oinstall dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba /home/oracle bash 54331 grid oinstall dba,asmadmin,asmdba,asmoper,racdba grid /home/grid bash 1.6.3 软件目录规划 # 目录名称 路径 说明 ORACLE_BASE （oracle） /u01/app/oracle oracle基目录 ORACLE_HOME （oracle） /u01/app/oracle/product/23.0.0/dbhome_1/ oracle用户HOME目录 ORACLE_BASE （grid） /u01/app/grid grid基目录 ORACLE_HOME （grid） /u01/app/23.0.0/grid grid用户HOME目录 1.6.4 整体数据库安装规划 # 规划内容 规划描述 PDB ocrlpdb 内存规划 SGA PGA processes 1000 字符集 ZHS16GBK 归档模式 非 redo 5组 每组200M undo 2G 自动扩展 最大4G temp 4G 闪回配置 4G大小 归档模式 非归档（手工调整归档模式） 1.6.5 RU升级规划 # 二、虚拟机安装 # 两台虚拟机创建方式相同，只是IP和主机名不同，因此相关说明只截取一台\n2.1 选择硬件兼容性 # 2.2 选择操作系统ISO # 2.3 命名虚拟机 # 2.4 CPU # 2.5 内存 # 2.6 网卡 # 2.7 硬盘 # 最后选择自定义硬件\n2.8 添加网卡 # 2.9 同样方式创建RAC2节点 # 省略\n2.10 分别安装操作系统 # 2.11 安装完成之后，加快SSH登录 # --配置LoginGraceTime参数为0, 将timeout wait设置为无限制 cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;` \u0026amp;\u0026amp; sed -i \u0026#39;/#LoginGraceTime 2m/ s/#LoginGraceTime 2m/LoginGraceTime 0/\u0026#39; /etc/ssh/sshd_config \u0026amp;\u0026amp; grep LoginGraceTime /etc/ssh/sshd_config --加快SSH登陆速度，禁用DNS cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;` \u0026amp;\u0026amp; sed -i \u0026#39;/#UseDNS yes/ s/#UseDNS yes/UseDNS no/\u0026#39; /etc/ssh/sshd_config \u0026amp;\u0026amp; grep UseDNS /etc/ssh/sshd_config 三、共享存储配置 # 3.1 创建共享磁盘-命令行 # D: cd \u0026#39;.\\Program Files (x86)\\VMware\\VMware Workstation\\\u0026#39; .\\vmware-vdiskmanager.exe -c -s 5g -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote1.vmdk\u0026#34; .\\vmware-vdiskmanager.exe -c -s 5g -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote2.vmdk\u0026#34; .\\vmware-vdiskmanager.exe -c -s 5g -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote3.vmdk\u0026#34; .\\vmware-vdiskmanager.exe -c -s 20GB -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\data1.vmdk\u0026#34; .\\vmware-vdiskmanager.exe -c -s 20GB -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\data2.vmdk\u0026#34; 执行过程： Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。 尝试新的跨平台 PowerShell https://aka.ms/pscore6 PS C:\\Windows\\system32\u0026gt; D: PS D:\\\u0026gt; cd \u0026#39;.\\Program Files (x86)\\VMware\\VMware Workstation\\\u0026#39; PS D:\\Program Files (x86)\\VMware\\VMware Workstation\u0026gt; .\\vmware-vdiskmanager.exe -c -s 5g -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote1.vmdk\u0026#34; Creating disk \u0026#39;E:\\vmware\\vm\\sharedisk\\ocrvote1.vmdk\u0026#39; Create: 100% done. Virtual disk creation successful. PS D:\\Program Files (x86)\\VMware\\VMware Workstation\u0026gt; .\\vmware-vdiskmanager.exe -c -s 5g -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote2.vmdk\u0026#34; Creating disk \u0026#39;E:\\vmware\\vm\\sharedisk\\ocrvote2.vmdk\u0026#39; Create: 100% done. Virtual disk creation successful. PS D:\\Program Files (x86)\\VMware\\VMware Workstation\u0026gt; .\\vmware-vdiskmanager.exe -c -s 5g -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote3.vmdk\u0026#34; Creating disk \u0026#39;E:\\vmware\\vm\\sharedisk\\ocrvote3.vmdk\u0026#39; Create: 100% done. Virtual disk creation successful. PS D:\\Program Files (x86)\\VMware\\VMware Workstation\u0026gt; .\\vmware-vdiskmanager.exe -c -s 20GB -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\data1.vmdk\u0026#34; Creating disk \u0026#39;E:\\vmware\\vm\\sharedisk\\data1.vmdk\u0026#39; Create: 100% done. Virtual disk creation successful. PS D:\\Program Files (x86)\\VMware\\VMware Workstation\u0026gt; .\\vmware-vdiskmanager.exe -c -s 20GB -t 2 \u0026#34;E:\\vmware\\vm\\sharedisk\\data2.vmdk\u0026#34; Creating disk \u0026#39;E:\\vmware\\vm\\sharedisk\\data2.vmdk\u0026#39; Create: 100% done. Virtual disk creation successful. PS D:\\Program Files (x86)\\VMware\\VMware Workstation\u0026gt; 相关命令说明： vmware-vdiskmanager [选项] 这里的选项你必须包含以下的一些选择项或参数 选项和参数 描述 虚拟磁盘文件的名字。虚拟磁盘文件必须是.vmdk为扩展名。你能够指定一个你想要储存的虚拟磁盘文件的路径。如果你在你的宿主机中映射了网络共享，你也可以提供确切的虚拟磁盘文件的路径信息来创建虚拟磁盘在这个网络共享中 -c 创建虚拟磁盘。你必须用-a, -s 和 -t 并指定选项参数，然后你需要指定所要创建的虚拟磁盘文件的文件名。 -s [GB|MB] 指定虚拟磁盘的大小。确定大小用GB或MB做单位。你必须在创建磁盘时指定其大小。 尽管你必须指定虚拟磁盘的大小，但当你增长它的大小时，你不能用-s这个选项。 可以指定的磁盘大小规定：IDE和SCSI适配器都为最小100MB，最大950GB。 -a [ ide | buslogic | lsilogic ] 指定磁盘适配器的类型。你在创建新的虚拟磁盘时必须指定其类型。选择以下类型之一： ide —— IDE接口适配器 buslogic —— BusLogic SCSI接口适配器 lsilogic —— LSI Logic SCSI接口适配器 -t [0|1|2|3] 你在创建一个新的虚拟磁盘或者重新配置一个虚拟磁盘时必须指定虚拟磁盘的类型。指定以下类型之一： 0 —— 创建一个包含在单一虚拟文件中的可增长虚拟磁盘 1 —— 创建一个被分割为每个文件2GB大小的可增长虚拟磁盘 2 —— 创建一个包含在单一虚拟文件中的预分配虚拟磁盘 3 —— 创建一个被分割为每个文件2GB大小的预分配虚拟磁盘 3.2 创建共享磁盘-图形（可选，本次未采用） # 通过界面创建方法：\n添加硬盘\n在节点二 添加硬盘\n3.3 关闭两台虚拟机，编辑相关vmx文件 # #shared disks configure diskLib.dataCacheMaxSize=0 diskLib.dataCacheMaxReadAheadSize=0 diskLib.dataCacheMinReadAheadSize=0 diskLib.dataCachePageSize=4096 diskLib.maxUnsyncedWrites = \u0026#34;0\u0026#34; disk.EnableUUID = \u0026#34;TRUE\u0026#34; disk.locking = \u0026#34;FALSE\u0026#34; scsi1.sharedBus = \u0026#34;virtual\u0026#34; scsi1.virtualDev = \u0026#34;lsilogic\u0026#34; scsi1.present = \u0026#34;TRUE\u0026#34; scsi1:0.fileName = \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote1.vmdk\u0026#34; scsi1:0.mode = \u0026#34;independent-persistent\u0026#34; scsi1:0.present = \u0026#34;TRUE\u0026#34; scsi1:4.fileName = \u0026#34;E:\\vmware\\vm\\sharedisk\\data2.vmdk\u0026#34; scsi1:4.mode = \u0026#34;independent-persistent\u0026#34; scsi1:4.present = \u0026#34;TRUE\u0026#34; scsi1:2.fileName = \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote3.vmdk\u0026#34; scsi1:2.mode = \u0026#34;independent-persistent\u0026#34; scsi1:2.present = \u0026#34;TRUE\u0026#34; scsi1:1.fileName = \u0026#34;E:\\vmware\\vm\\sharedisk\\ocrvote2.vmdk\u0026#34; scsi1:1.mode = \u0026#34;independent-persistent\u0026#34; scsi1:1.present = \u0026#34;TRUE\u0026#34; scsi1:3.fileName = \u0026#34;E:\\vmware\\vm\\sharedisk\\data1.vmdk\u0026#34; scsi1:3.mode = \u0026#34;independent-persistent\u0026#34; scsi1:3.present = \u0026#34;TRUE\u0026#34; 3.4 重新启动虚拟机 # 重新打开虚拟机设置进行确认\n四、26ai RAC安装准备工作 # 4.1 硬件配置和系统情况 # 4.1.1 检查操作系统 # cat /etc/oracle-release [root@rac1 ~]# cat /etc/oracle-release Oracle Linux Server release 9.7 [root@rac1 ~]# [root@rac2 ~]# cat /etc/oracle-release Oracle Linux Server release 9.7 [root@rac2 ~]# [root@rac1 ~]# dmidecode |grep Name Product Name: VMware Virtual Platform Product Name: 440BX Desktop Reference Platform Manufacturer Name: Intel [root@rac1 ~]# [root@rac2 ~]# dmidecode |grep Name Product Name: VMware Virtual Platform Product Name: 440BX Desktop Reference Platform Manufacturer Name: Intel [root@rac2 ~]# CPU: lscpu [root@rac1 ~]# lscpu 架构： x86_64 CPU 运行模式： 32-bit, 64-bit Address sizes: 45 bits physical, 48 bits virtual 字节序： Little Endian CPU: 8 在线 CPU 列表： 0-7 厂商 ID： AuthenticAMD BIOS Vendor ID: AuthenticAMD 型号名称： AMD Ryzen 9 5950X 16-Core Processor BIOS Model name: AMD Ryzen 9 5950X 16-Core Processor CPU 系列： 25 型号： 33 每个核的线程数： 1 每个座的核数： 4 座： 2 步进： 2 BogoMIPS： 6799.98 标记： fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid extd_ap icid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 erms rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero arat umip vaes vpclmulqdq rdpid overflow_recov succor fsrm Virtualization features: 超管理器厂商： VMware 虚拟化类型： 完全 Caches (sum of all): L1d: 256 KiB (8 instances) L1i: 256 KiB (8 instances) L2: 4 MiB (8 instances) L3: 64 MiB (2 instances) NUMA: NUMA 节点： 1 NUMA 节点0 CPU： 0-7 Vulnerabilities: Gather data sampling: Not affected Indirect target selection: Not affected Itlb multihit: Not affected L1tf: Not affected Mds: Not affected Meltdown: Not affected Mmio stale data: Not affected Reg file data sampling: Not affected Retbleed: Not affected Spec rstack overflow: Vulnerable: Safe RET, no microcode Spec store bypass: Vulnerable Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected Srbds: Not affected Tsa: Vulnerable: Clear CPU buffers attempted, no microcode Tsx async abort: Not affected Vmscape: Not affected [root@rac1 ~]# [root@rac2 ~]# lscpu 架构： x86_64 CPU 运行模式： 32-bit, 64-bit Address sizes: 45 bits physical, 48 bits virtual 字节序： Little Endian CPU: 8 在线 CPU 列表： 0-7 厂商 ID： AuthenticAMD BIOS Vendor ID: AuthenticAMD 型号名称： AMD Ryzen 9 5950X 16-Core Processor BIOS Model name: AMD Ryzen 9 5950X 16-Core Processor CPU 系列： 25 型号： 33 每个核的线程数： 1 每个座的核数： 4 座： 2 步进： 2 BogoMIPS： 6799.98 标记： fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid extd_ap icid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 erms rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero arat umip vaes vpclmulqdq rdpid overflow_recov succor fsrm Virtualization features: 超管理器厂商： VMware 虚拟化类型： 完全 Caches (sum of all): L1d: 256 KiB (8 instances) L1i: 256 KiB (8 instances) L2: 4 MiB (8 instances) L3: 64 MiB (2 instances) NUMA: NUMA 节点： 1 NUMA 节点0 CPU： 0-7 Vulnerabilities: Gather data sampling: Not affected Indirect target selection: Not affected Itlb multihit: Not affected L1tf: Not affected Mds: Not affected Meltdown: Not affected Mmio stale data: Not affected Reg file data sampling: Not affected Retbleed: Not affected Spec rstack overflow: Vulnerable: Safe RET, no microcode Spec store bypass: Vulnerable Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected Srbds: Not affected Tsa: Vulnerable: Clear CPU buffers attempted, no microcode Tsx async abort: Not affected Vmscape: Not affected [root@rac2 ~]# 4.1.2 检查内存 # dmidecode|grep -A5 \u0026#34;Memory Device\u0026#34;|grep Size|grep -v No |grep -v Range free -h grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39; [root@rac1 ~]# dmidecode|grep -A5 \u0026#34;Memory Device\u0026#34;|grep Size|grep -v No |grep -v Range Size: 16 GB [root@rac1 ~]# free -h total used free shared buff/cache available Mem: 15Gi 941Mi 14Gi 15Mi 391Mi 14Gi Swap: 16Gi 0B 16Gi [root@rac1 ~]# grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39; 16370520 [root@rac1 ~]# [root@rac2 ~]# dmidecode|grep -A5 \u0026#34;Memory Device\u0026#34;|grep Size|grep -v No |grep -v Range Size: 16 GB [root@rac2 ~]# free -h total used free shared buff/cache available Mem: 15Gi 933Mi 14Gi 17Mi 394Mi 14Gi Swap: 16Gi 0B 16Gi [root@rac2 ~]# grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39; 16370520 [root@rac2 ~]# 4.1.3 检查swap # free -h grep SwapTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39; [root@rac1 ~]# free -h total used free shared buff/cache available Mem: 15Gi 941Mi 14Gi 15Mi 391Mi 14Gi Swap: 16Gi 0B 16Gi [root@rac1 ~]# grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39; 16370520 [root@rac1 ~]# [root@rac2 ~]# free -h total used free shared buff/cache available Mem: 15Gi 933Mi 14Gi 17Mi 394Mi 14Gi Swap: 16Gi 0B 16Gi [root@rac2 ~]# grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39; 16370520 [root@rac2 ~]# 4.1.4 检查/tmp # df -h /tmp [root@rac1 ~]# df -h /tmp 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/ol-root 83G 5.4G 78G 7% / [root@rac1 ~]# [root@rac2 ~]# df -h /tmp 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/ol-root 83G 5.4G 78G 7% / [root@rac2 ~]# 4.1.4 检查时间和时区 # 检查时间和时区\n设置时区: timedatectl set-timezone \u0026#34;Asia/Shanghai\u0026#34; \u0026amp;\u0026amp; timedatectl status|grep Local [root@rac1 ~]# date 2026年 02月 09日 星期一 11:30:26 CST [root@rac1 ~]# [root@rac2 ~]# date 2026年 02月 09日 星期一 11:30:29 CST [root@rac2 ~]# 时区： [root@rac1 ~]# timedatectl status|grep Local Local time: 一 2026-02-09 12:55:14 CST [root@rac1 ~]# date -R Mon, 09 Feb 2026 12:55:18 +0800 [root@rac1 ~]# timedatectl | grep \u0026#34;Asia/Shanghai\u0026#34; Time zone: Asia/Shanghai (CST, +0800) [root@rac1 ~]# [root@rac2 ~]# timedatectl status|grep Local Local time: 一 2026-02-09 12:54:53 CST [root@rac2 ~]# date -R Mon, 09 Feb 2026 12:54:57 +0800 [root@rac2 ~]# timedatectl | grep \u0026#34;Asia/Shanghai\u0026#34; Time zone: Asia/Shanghai (CST, +0800) [root@rac2 ~]# 4.2 主机名和hosts文件 # 4.2.1 设置和检查主机名 # [root@rac1 ~]# hostnamectl status Static hostname: rac1 Icon name: computer-vm Chassis: vm 🖴 Machine ID: 4388f15b239441fabbac3930963e9c28 Boot ID: db76f06d736145649a7330a03095e6c5 Virtualization: vmware Operating System: Oracle Linux Server 9.7 CPE OS Name: cpe:/o:oracle:linux:9:7:server Kernel: Linux 6.12.0-105.51.5.el9uek.x86_64 Architecture: x86-64 Hardware Vendor: VMware, Inc. Hardware Model: VMware Virtual Platform Firmware Version: 6.00 [root@rac1 ~]# [root@rac2 ~]# hostnamectl status Static hostname: rac2 Icon name: computer-vm Chassis: vm 🖴 Machine ID: 91bdf6eceebb415ba1ed3fffe804bdff Boot ID: 947004c2a5bb4a538af6a148783e8058 Virtualization: vmware Operating System: Oracle Linux Server 9.7 CPE OS Name: cpe:/o:oracle:linux:9:7:server Kernel: Linux 6.12.0-105.51.5.el9uek.x86_64 Architecture: x86-64 Hardware Vendor: VMware, Inc. Hardware Model: VMware Virtual Platform Firmware Version: 6.00 [root@rac2 ~]# 设置方法： hostnamectl set-hostname rac1 hostnamectl set-hostname rac2 主机名允许使用小写字母、数字和中横线（-），并且只能以小写字母开头。 4.2.2 调整hosts文件 # cp /etc/hosts /etc/hosts_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;` echo \u0026#39; #public ip 192.168.18.5 rac1 192.168.18.6 rac2 #private ip 18.18.18.5 rac1-priv 18.18.18.6 rac2-priv #vip 192.168.18.7 rac1-vip 192.168.18.8 rac2-vip #scanip 192.168.18.9 rac-scan \u0026#39;\u0026gt;\u0026gt; /etc/hosts [root@rac1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #public ip 192.168.18.5 rac1 192.168.18.6 rac2 #private ip 18.18.18.5 rac1-priv 18.18.18.6 rac2-priv #vip 192.168.18.7 rac1-vip 192.168.18.8 rac2-vip #scanip 192.168.18.9 rac-scan [root@rac1 ~]# [root@rac2 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #public ip 192.168.18.5 rac1 192.168.18.6 rac2 #private ip 18.18.18.5 rac1-priv 18.18.18.6 rac2-priv #vip 192.168.18.7 rac1-vip 192.168.18.8 rac2-vip #scanip 192.168.18.9 rac-scan [root@rac2 ~]# 4.3 网卡（虚拟）配置、netwok文件 # 4.3.1 （可选）禁用虚拟网卡 # systemctl stop libvirtd systemctl disable libvirtd [root@rac1 ~]# systemctl stop libvirtd Failed to stop libvirtd.service: Unit libvirtd.service not loaded. [root@rac1 ~]# systemctl disable libvirtd Failed to disable unit: Unit file libvirtd.service does not exist. [root@rac1 ~]# Note：对于虚拟机可选，需要重启操作系统\n4.3.2 检查节点的网卡名和IP # [root@rac1 ~]# ip a 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens160: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:30:0f:d9 brd ff:ff:ff:ff:ff:ff altname enp3s0 inet 192.168.18.5/24 brd 192.168.18.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever 3: ens192: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:30:0f:e3 brd ff:ff:ff:ff:ff:ff altname enp11s0 inet 18.18.18.5/24 brd 18.18.18.255 scope global noprefixroute ens192 valid_lft forever preferred_lft forever [root@rac1 ~]# [root@rac2 ~]# ip a 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens160: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:cc:64:2d brd ff:ff:ff:ff:ff:ff altname enp3s0 inet 192.168.18.6/24 brd 192.168.18.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever 3: ens192: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:cc:64:37 brd ff:ff:ff:ff:ff:ff altname enp11s0 inet 18.18.18.6/24 brd 18.18.18.255 scope global noprefixroute ens192 valid_lft forever preferred_lft forever [root@rac2 ~]# 需要确认两个节点的网卡名一致，否者安装会出现问题。 如何两个节点名称不一致，可以通过如下方式修改某一个节点 [root@rac1 ~]# cd /etc/NetworkManager/system-connections/ [root@rac1 system-connections]# ll 总用量 8 -rw-------. 1 root root 299 2月 9 10:29 ens160.nmconnection -rw-------. 1 root root 258 2月 9 10:29 ens192.nmconnection [root@rac1 system-connections]# mv ens160.nmconnection ens33.nmconnection # 编辑新配置文件，指定新网卡名和静态IP vi ens33.nmconnection # 设置配置文件权限为600（仅root可读可写） chmod 600 ens33.nmconnection # 创建/编辑udev规则文件（70开头表示规则优先级，确保优先生效） vi /etc/udev/rules.d/70-persistent-net.rules SUBSYSTEM==\u0026#34;net\u0026#34;, ACTION==\u0026#34;add\u0026#34;, ATTR{address}==\u0026#34;00:0c:29:19:08:da\u0026#34;, NAME=\u0026#34;ens33\u0026#34; # 重新加载udev规则（无需重启系统，让新规则生效） udevadm control --reload-rules udevadm trigger # 重新加载NetworkManager配置（读取修改后的ens33.nmconnection） nmcli connection reload # 重启系统（核心！让网卡重新被识别，udev规则生效） reboot 4.3.3 测试连通性 # [root@rac1 ~]# ping rac1 PING rac1 (192.168.18.5) 56(84) 比特的数据。 64 比特，来自 rac1 (192.168.18.5): icmp_seq=1 ttl=64 时间=0.037 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=2 ttl=64 时间=0.049 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=3 ttl=64 时间=0.048 毫秒 ^C --- rac1 ping 统计 --- 已发送 3 个包， 已接收 3 个包, 0% packet loss, time 2085ms rtt min/avg/max/mdev = 0.037/0.044/0.049/0.005 ms [root@rac1 ~]# ping rac2 PING rac2 (192.168.18.6) 56(84) 比特的数据。 64 比特，来自 rac2 (192.168.18.6): icmp_seq=1 ttl=64 时间=0.577 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=2 ttl=64 时间=0.449 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=3 ttl=64 时间=0.310 毫秒 ^C --- rac2 ping 统计 --- 已发送 3 个包， 已接收 3 个包, 0% packet loss, time 2036ms rtt min/avg/max/mdev = 0.310/0.445/0.577/0.109 ms [root@rac1 ~]# ping rac1-priv PING rac1-priv (18.18.18.5) 56(84) 比特的数据。 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=1 ttl=64 时间=0.030 毫秒 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=2 ttl=64 时间=0.047 毫秒 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=3 ttl=64 时间=0.045 毫秒 ^C --- rac1-priv ping 统计 --- 已发送 3 个包， 已接收 3 个包, 0% packet loss, time 2062ms rtt min/avg/max/mdev = 0.030/0.040/0.047/0.007 ms [root@rac1 ~]# ping rac2-priv PING rac2-priv (18.18.18.6) 56(84) 比特的数据。 64 比特，来自 rac2-priv (18.18.18.6): icmp_seq=1 ttl=64 时间=0.838 毫秒 64 比特，来自 rac2-priv (18.18.18.6): icmp_seq=2 ttl=64 时间=0.336 毫秒 64 比特，来自 rac2-priv (18.18.18.6): icmp_seq=3 ttl=64 时间=0.285 毫秒 ^C --- rac2-priv ping 统计 --- 已发送 3 个包， 已接收 3 个包, 0% packet loss, time 2052ms rtt min/avg/max/mdev = 0.285/0.486/0.838/0.249 ms [root@rac1 ~]# [root@rac2 ~]# ping rac1 PING rac1 (192.168.18.5) 56(84) 比特的数据。 64 比特，来自 rac1 (192.168.18.5): icmp_seq=1 ttl=64 时间=0.361 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=2 ttl=64 时间=0.619 毫秒 ^C --- rac1 ping 统计 --- 已发送 2 个包， 已接收 2 个包, 0% packet loss, time 1055ms rtt min/avg/max/mdev = 0.361/0.490/0.619/0.129 ms [root@rac2 ~]# ping rac2 PING rac2 (192.168.18.6) 56(84) 比特的数据。 64 比特，来自 rac2 (192.168.18.6): icmp_seq=1 ttl=64 时间=0.026 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=2 ttl=64 时间=0.049 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=3 ttl=64 时间=0.045 毫秒 ^C --- rac2 ping 统计 --- 已发送 3 个包， 已接收 3 个包, 0% packet loss, time 2082ms rtt min/avg/max/mdev = 0.026/0.040/0.049/0.010 ms [root@rac2 ~]# ping rac1-priv PING rac1-priv (18.18.18.5) 56(84) 比特的数据。 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=1 ttl=64 时间=0.323 毫秒 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=2 ttl=64 时间=0.267 毫秒 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=3 ttl=64 时间=0.246 毫秒 64 比特，来自 rac1-priv (18.18.18.5): icmp_seq=4 ttl=64 时间=0.273 毫秒 ^C --- rac1-priv ping 统计 --- 已发送 4 个包， 已接收 4 个包, 0% packet loss, time 3099ms rtt min/avg/max/mdev = 0.246/0.277/0.323/0.028 ms [root@rac2 ~]# ping rac2-priv PING rac2-priv (18.18.18.6) 56(84) 比特的数据。 64 比特，来自 rac2-priv (18.18.18.6): icmp_seq=1 ttl=64 时间=0.032 毫秒 64 比特，来自 rac2-priv (18.18.18.6): icmp_seq=2 ttl=64 时间=0.046 毫秒 64 比特，来自 rac2-priv (18.18.18.6): icmp_seq=3 ttl=64 时间=0.044 毫秒 ^C --- rac2-priv ping 统计 --- 已发送 3 个包， 已接收 3 个包, 0% packet loss, time 2085ms rtt min/avg/max/mdev = 0.032/0.040/0.046/0.006 ms [root@rac2 ~]# 4.3.4 调整network # 当使用Oracle集群的时候，Zero Configuration Network一样可能会导致节点间的通信问题，所以也应该停掉 Without zeroconf, a network administrator must set up network services, such as Dynamic Host Configuration Protocol (DHCP) and Domain Name System (DNS), or configure each computer\u0026#39;s network settings manually. 在使用平常的网络设置方式的情况下是可以停掉Zero Conf的 两个节点执行 echo \u0026#34;NOZEROCONF=yes\u0026#34; \u0026gt;\u0026gt;/etc/sysconfig/network \u0026amp;\u0026amp; cat /etc/sysconfig/network [root@rac1 ~]# echo \u0026#34;NOZEROCONF=yes\u0026#34; \u0026gt;\u0026gt;/etc/sysconfig/network \u0026amp;\u0026amp; cat /etc/sysconfig/network # Created by anaconda NOZEROCONF=yes [root@rac1 ~]# [root@rac2 ~]# echo \u0026#34;NOZEROCONF=yes\u0026#34; \u0026gt;\u0026gt;/etc/sysconfig/network \u0026amp;\u0026amp; cat /etc/sysconfig/network # Created by anaconda NOZEROCONF=yes [root@rac2 ~]# 4.4 调整/dev/shm # [root@rac1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 7.6G 0 7.6G 0% /dev/shm tmpfs 3.1G 12M 3.1G 1% /run /dev/mapper/ol-root 90G 6.1G 84G 7% / /dev/sda1 960M 464M 497M 49% /boot tmpfs 1.6G 52K 1.6G 1% /run/user/42 tmpfs 1.6G 36K 1.6G 1% /run/user/0 [root@rac1 ~]# [root@rac2 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 7.9G 0 7.9G 0% /dev/shm tmpfs 3.2G 9.4M 3.2G 1% /run /dev/mapper/ol-root 90G 5.8G 85G 7% / /dev/sda1 960M 427M 534M 45% /boot tmpfs 1.6G 52K 1.6G 1% /run/user/42 tmpfs 1.6G 36K 1.6G 1% /run/user/0 [root@rac2 ~]# # 如果需要把/dev/shm调整到8G，操作下面命令： cp /etc/fstab /etc/fstab_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;` echo \u0026#34;tmpfs /dev/shm tmpfs rw,exec,size=8G 0 0\u0026#34;\u0026gt;\u0026gt;/etc/fstab cat /etc/fstab mount -o remount /dev/shm df -h 4.5 设置THP和numa # # 检查： cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag # 特别注意这里官网是建议设置成madvise sed -i \u0026#39;s/quiet/quiet transparent_hugepage=madvise numa=off/\u0026#39; /etc/default/grub grep quiet /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline # 重启后检查是否生效： cat /sys/kernel/mm/transparent_hugepage/enabled cat /proc/cmdline #不重启 echo madvise \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/enabled [root@rac1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never [root@rac1 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag always defer defer+madvise [madvise] never [root@rac1 ~]# sed -i \u0026#39;s/quiet/quiet transparent_hugepage=madvise numa=off/\u0026#39; /etc/default/grub [root@rac1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline Generating grub configuration file ... Adding boot menu entry for UEFI Firmware Settings ... done [root@rac1 ~]# init 6 [root@rac1 ~]# [root@rac2 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never [root@rac2 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag always defer defer+madvise [madvise] never [root@rac2 ~]# sed -i \u0026#39;s/quiet/quiet transparent_hugepage=madvise numa=off/\u0026#39; /etc/default/grub [root@rac2 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline Generating grub configuration file ... Adding boot menu entry for UEFI Firmware Settings ... done [root@rac2 ~]# init 6 [root@rac2 ~]# 4.6 关闭防火墙 # #关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld [root@rac1 ~]# systemctl stop firewalld systemctl disable firewalld systemctl status firewalld Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/firewalld.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service\u0026#34;. ○ firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) 2月 09 13:02:35 rac1 systemd[1]: Starting firewalld - dynamic firewall daemon... 2月 09 13:02:36 rac1 systemd[1]: Started firewalld - dynamic firewall daemon. 2月 09 13:03:27 rac1 systemd[1]: Stopping firewalld - dynamic firewall daemon... 2月 09 13:03:27 rac1 systemd[1]: firewalld.service: Deactivated successfully. 2月 09 13:03:27 rac1 systemd[1]: Stopped firewalld - dynamic firewall daemon. [root@rac1 ~]# [root@rac2 ~]# systemctl stop firewalld systemctl disable firewalld systemctl status firewalld Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/firewalld.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service\u0026#34;. ○ firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) 2月 09 13:03:14 rac2 systemd[1]: Starting firewalld - dynamic firewall daemon... 2月 09 13:03:16 rac2 systemd[1]: Started firewalld - dynamic firewall daemon. 2月 09 13:03:30 rac2 systemd[1]: Stopping firewalld - dynamic firewall daemon... 2月 09 13:03:30 rac2 systemd[1]: firewalld.service: Deactivated successfully. 2月 09 13:03:30 rac2 systemd[1]: Stopped firewalld - dynamic firewall daemon. [root@rac2 ~]# 4.7 关闭selinux # cp /etc/selinux/config /etc/selinux/config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;`\u0026amp;\u0026amp; sed -i \u0026#39;s/SELINUX\\=enforcing/SELINUX\\=disabled/g\u0026#39; /etc/selinux/config cat /etc/selinux/config #不重启 setenforce 0 getenforce sestatus [root@rac1 ~]# cp /etc/selinux/config /etc/selinux/config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;`\u0026amp;\u0026amp; sed -i \u0026#39;s/SELINUX\\=enforcing/SELINUX\\=disabled/g\u0026#39; /etc/selinux/config cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. # See also: # https://docs.oracle.com/en/operating-systems/oracle-linux/selinux/selinux-SettingSELinuxModes.html # # NOTE: In earlier Oracle Linux kernel builds, SELINUX=disabled would also # fully disable SELinux during boot. If you need a system with SELinux # fully disabled instead of SELinux running with no policy loaded, you # need to pass selinux=0 to the kernel command line. You can use grubby # to persistently set the bootloader to boot with selinux=0: # # grubby --update-kernel ALL --args selinux=0 # # To revert back to SELinux enabled: # # grubby --update-kernel ALL --remove-args selinux # SELINUX=disabled # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@rac1 ~]# setenforce 0 getenforce sestatus Permissive SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: disabled Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33 [root@rac1 ~]# [root@rac2 ~]# cp /etc/selinux/config /etc/selinux/config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;`\u0026amp;\u0026amp; sed -i \u0026#39;s/SELINUX\\=enforcing/SELINUX\\=disabled/g\u0026#39; /etc/selinux/config cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. # See also: # https://docs.oracle.com/en/operating-systems/oracle-linux/selinux/selinux-SettingSELinuxModes.html # # NOTE: In earlier Oracle Linux kernel builds, SELINUX=disabled would also # fully disable SELinux during boot. If you need a system with SELinux # fully disabled instead of SELinux running with no policy loaded, you # need to pass selinux=0 to the kernel command line. You can use grubby # to persistently set the bootloader to boot with selinux=0: # # grubby --update-kernel ALL --args selinux=0 # # To revert back to SELinux enabled: # # grubby --update-kernel ALL --remove-args selinux # SELINUX=disabled # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@rac2 ~]# setenforce 0 getenforce sestatus Permissive SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: disabled Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33 [root@rac2 ~]# 4.8 配置软件yum源（可选） # #mount cdrom mount /dev/cdrom /mnt #设置 cd /etc/yum.repos.d/ mkdir bak mv *.repo ./bak/ cat \u0026gt;\u0026gt; /etc/yum.repos.d/local.repo \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; [local] name=local baseurl=file:///mnt/AppStream gpgcheck=0 enabled=1 EOF #测试 yum clean all yum makecache yum repolist # 由于我们这里有外网。不需要配置本地yum源 [root@rac1 ~]# yum repolist 仓库 id 仓库名称 ol9_UEKR8 Oracle Linux 9 UEK Release 8 (x86_64) ol9_appstream Oracle Linux 9 Application Stream Packages (x86_64) ol9_baseos_latest Oracle Linux 9 BaseOS Latest (x86_64) [root@rac1 ~]# [root@rac2 ~]# yum repolist 仓库 id 仓库名称 ol9_UEKR8 Oracle Linux 9 UEK Release 8 (x86_64) ol9_appstream Oracle Linux 9 Application Stream Packages (x86_64) ol9_baseos_latest Oracle Linux 9 BaseOS Latest (x86_64) [root@rac2 ~]# 4.8 安装软件包 # #安装软件包和工具包 dnf install -y bc dnf install -y binutils dnf install -y compat-openssl11 dnf install -y elfutils-libelf dnf install -y fontconfig dnf install -y glibc dnf install -y glibc-devel dnf install -y glibc-headers dnf install -y ksh dnf install -y libaio dnf install -y libasan dnf install -y liblsan dnf install -y libX11 dnf install -y libXau dnf install -y libXi dnf install -y libXrender dnf install -y libXtst dnf install -y libxcrypt-compat dnf install -y libgcc dnf install -y libibverbs dnf install -y librdmacm dnf install -y libstdc++ dnf install -y libxcb dnf install -y libvirt-libs dnf install -y make dnf install -y policycoreutils dnf install -y policycoreutils-python-utils dnf install -y smartmontools dnf install -y sysstat dnf install -y nfs-utils # 检查（根据官方文档要求） rpm -q bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat nfs-utils | grep \u0026#34;not installed\u0026#34; [root@rac1 ~]# rpm -q bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat nfs-utils | grep \u0026#34;not installed\u0026#34; [root@rac1 ~]# [root@rac2 ~]# rpm -q bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat nfs-utils | grep \u0026#34;not installed\u0026#34; [root@rac2 ~]# 4.9 配置核心参数 # # 参考恩墨核心配置 cp /etc/sysctl.conf /etc/sysctl.conf.bak memTotal=$(grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39;) totalMemory=$((memTotal / 2048)) shmall=$((memTotal / 4)) if [ $shmall -lt 2097152 ]; then shmall=2097152 fi shmmax=$((memTotal * 1024 - 1)) if [ \u0026#34;$shmmax\u0026#34; -lt 4294967295 ]; then shmmax=4294967295 fi cat \u0026lt;\u0026lt;EOF\u0026gt;\u0026gt;/etc/sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = $shmall kernel.shmmax = $shmmax kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.wmem_default = 16777216 fs.aio-max-nr = 6194304 vm.dirty_ratio=20 vm.dirty_background_ratio=3 vm.dirty_writeback_centisecs=100 vm.dirty_expire_centisecs=500 vm.swappiness=10 vm.min_free_kbytes=524288 net.core.netdev_max_backlog = 30000 net.core.netdev_budget = 600 #vm.nr_hugepages = net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 net.ipv4.ipfrag_time = 60 net.ipv4.ipfrag_low_thresh = 3145728 net.ipv4.ipfrag_high_thresh = 8388608 kernel.panic_on_oops = 1 kernel.panic = 2 EOF sysctl -p [root@rac1 ~]# cp /etc/sysctl.conf /etc/sysctl.conf.bak memTotal=$(grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39;) totalMemory=$((memTotal / 2048)) shmall=$((memTotal / 4)) if [ $shmall -lt 2097152 ]; then shmall=2097152 fi shmmax=$((memTotal * 1024 - 1)) if [ \u0026#34;$shmmax\u0026#34; -lt 4294967295 ]; then shmmax=4294967295 fi cat \u0026lt;\u0026lt;EOF\u0026gt;\u0026gt;/etc/sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = $shmall kernel.shmmax = $shmmax kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.wmem_default = 16777216 fs.aio-max-nr = 6194304 vm.dirty_ratio=20 vm.dirty_background_ratio=3 vm.dirty_writeback_centisecs=100 vm.dirty_expire_centisecs=500 vm.swappiness=10 vm.min_free_kbytes=524288 net.core.netdev_max_backlog = 30000 net.core.netdev_budget = 600 #vm.nr_hugepages = net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 net.ipv4.ipfrag_time = 60 net.ipv4.ipfrag_low_thresh = 3145728 net.ipv4.ipfrag_high_thresh = 8388608 kernel.panic_on_oops = 1 kernel.panic = 2 EOF [root@rac1 ~]# sysctl -p fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 3977942 kernel.shmmax = 16293650431 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.wmem_default = 16777216 fs.aio-max-nr = 6194304 vm.dirty_ratio = 20 vm.dirty_background_ratio = 3 vm.dirty_writeback_centisecs = 100 vm.dirty_expire_centisecs = 500 vm.swappiness = 10 vm.min_free_kbytes = 524288 net.core.netdev_max_backlog = 30000 net.core.netdev_budget = 600 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 net.ipv4.ipfrag_time = 60 net.ipv4.ipfrag_low_thresh = 3145728 net.ipv4.ipfrag_high_thresh = 8388608 kernel.panic_on_oops = 1 kernel.panic = 2 [root@rac1 ~]# [root@rac2 ~]# cp /etc/sysctl.conf /etc/sysctl.conf.bak memTotal=$(grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39;) totalMemory=$((memTotal / 2048)) shmall=$((memTotal / 4)) if [ $shmall -lt 2097152 ]; then shmall=2097152 fi shmmax=$((memTotal * 1024 - 1)) if [ \u0026#34;$shmmax\u0026#34; -lt 4294967295 ]; then shmmax=4294967295 fi cat \u0026lt;\u0026lt;EOF\u0026gt;\u0026gt;/etc/sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = $shmall kernel.shmmax = $shmmax kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.wmem_default = 16777216 fs.aio-max-nr = 6194304 vm.dirty_ratio=20 vm.dirty_background_ratio=3 vm.dirty_writeback_centisecs=100 vm.dirty_expire_centisecs=500 vm.swappiness=10 vm.min_free_kbytes=524288 net.core.netdev_max_backlog = 30000 net.core.netdev_budget = 600 #vm.nr_hugepages = net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 net.ipv4.ipfrag_time = 60 net.ipv4.ipfrag_low_thresh = 3145728 net.ipv4.ipfrag_high_thresh = 8388608 kernel.panic_on_oops = 1 kernel.panic = 2 EOF [root@rac2 ~]# sysctl -p fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 4092630 kernel.shmmax = 16763412479 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.wmem_default = 16777216 fs.aio-max-nr = 6194304 vm.dirty_ratio = 20 vm.dirty_background_ratio = 3 vm.dirty_writeback_centisecs = 100 vm.dirty_expire_centisecs = 500 vm.swappiness = 10 vm.min_free_kbytes = 524288 net.core.netdev_max_backlog = 30000 net.core.netdev_budget = 600 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 net.ipv4.ipfrag_time = 60 net.ipv4.ipfrag_low_thresh = 3145728 net.ipv4.ipfrag_high_thresh = 8388608 kernel.panic_on_oops = 1 kernel.panic = 2 [root@rac2 ~]# 4.10 关闭avahi服务 # systemctl stop avahi-daemon systemctl disable avahi-daemon [root@rac1 ~]# systemctl stop avahi-daemon Warning: Stopping avahi-daemon.service, but it can still be activated by: avahi-daemon.socket [root@rac1 ~]# systemctl disable avahi-daemon Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/avahi-daemon.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/sockets.target.wants/avahi-daemon.socket\u0026#34;. Removed \u0026#34;/etc/systemd/system/dbus-org.freedesktop.Avahi.service\u0026#34;. [root@rac1 ~]# [root@rac2 ~]# systemctl stop avahi-daemon Warning: Stopping avahi-daemon.service, but it can still be activated by: avahi-daemon.socket [root@rac2 ~]# systemctl disable avahi-daemon Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/avahi-daemon.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/sockets.target.wants/avahi-daemon.socket\u0026#34;. Removed \u0026#34;/etc/systemd/system/dbus-org.freedesktop.Avahi.service\u0026#34;. [root@rac2 ~]# 4.11 关闭其他服务（可选） # --禁用开机启动 systemctl disable accounts-daemon.service systemctl disable atd.service systemctl disable avahi-daemon.service systemctl disable avahi-daemon.socket systemctl disable bluetooth.service systemctl disable brltty.service --systemctl disable chronyd.service systemctl disable colord.service systemctl disable cups.service systemctl disable debug-shell.service systemctl disable firewalld.service systemctl disable gdm.service systemctl disable ksmtuned.service systemctl disable ktune.service systemctl disable libstoragemgmt.service systemctl disable mcelog.service systemctl disable ModemManager.service --systemctl disable ntpd.service systemctl disable postfix.service systemctl disable postfix.service systemctl disable rhsmcertd.service systemctl disable rngd.service systemctl disable rpcbind.service systemctl disable rtkit-daemon.service systemctl disable tuned.service systemctl disable upower.service systemctl disable wpa_supplicant.service --停止服务 systemctl stop accounts-daemon.service systemctl stop atd.service systemctl stop avahi-daemon.service systemctl stop avahi-daemon.socket systemctl stop bluetooth.service systemctl stop brltty.service --systemctl stop chronyd.service systemctl stop colord.service systemctl stop cups.service systemctl stop debug-shell.service systemctl stop firewalld.service systemctl stop gdm.service systemctl stop ksmtuned.service systemctl stop ktune.service systemctl stop libstoragemgmt.service systemctl stop mcelog.service systemctl stop ModemManager.service --systemctl stop ntpd.service systemctl stop postfix.service systemctl stop postfix.service systemctl stop rhsmcertd.service systemctl stop rngd.service systemctl stop rpcbind.service systemctl stop rtkit-daemon.service systemctl stop tuned.service systemctl stop upower.service systemctl stop wpa_supplicant.service 暂时不停止chrony和ntp [root@rac1 ~]# systemctl disable avahi-daemon Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/avahi-daemon.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/sockets.target.wants/avahi-daemon.socket\u0026#34;. Removed \u0026#34;/etc/systemd/system/dbus-org.freedesktop.Avahi.service\u0026#34;. [root@rac1 ~]# systemctl disable --now postfix Failed to disable unit: Unit file postfix.service does not exist. [root@rac1 ~]# systemctl disable --now cups Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/cups.path\u0026#34;. Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/cups.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/sockets.target.wants/cups.socket\u0026#34;. Removed \u0026#34;/etc/systemd/system/printer.target.wants/cups.service\u0026#34;. [root@rac1 ~]# systemctl disable --now avahi-daemon Warning: Stopping avahi-daemon.service, but it can still be activated by: avahi-daemon.socket [root@rac1 ~]# systemctl disable --now bluetooth Removed \u0026#34;/etc/systemd/system/dbus-org.bluez.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/bluetooth.target.wants/bluetooth.service\u0026#34;. [root@rac1 ~]# systemctl disable --now kdump [root@rac1 ~]# [root@rac2 ~]# systemctl stop avahi-daemon Warning: Stopping avahi-daemon.service, but it can still be activated by: avahi-daemon.socket [root@rac2 ~]# systemctl disable avahi-daemon Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/avahi-daemon.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/sockets.target.wants/avahi-daemon.socket\u0026#34;. Removed \u0026#34;/etc/systemd/system/dbus-org.freedesktop.Avahi.service\u0026#34;. [root@rac2 ~]# systemctl disable avahi-daemon [root@rac2 ~]# systemctl disable --now postfix Failed to disable unit: Unit file postfix.service does not exist. [root@rac2 ~]# systemctl disable --now cups Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/cups.path\u0026#34;. Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/cups.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/sockets.target.wants/cups.socket\u0026#34;. Removed \u0026#34;/etc/systemd/system/printer.target.wants/cups.service\u0026#34;. [root@rac2 ~]# systemctl disable --now avahi-daemon Warning: Stopping avahi-daemon.service, but it can still be activated by: avahi-daemon.socket [root@rac2 ~]# systemctl disable --now bluetooth Removed \u0026#34;/etc/systemd/system/dbus-org.bluez.service\u0026#34;. Removed \u0026#34;/etc/systemd/system/bluetooth.target.wants/bluetooth.service\u0026#34;. [root@rac2 ~]# systemctl disable --now kdump Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/kdump.service\u0026#34;. [root@rac2 ~]# 4.12 配置ssh服务 # --配置LoginGraceTime参数为0, 将timeout wait设置为无限制 cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;` \u0026amp;\u0026amp; sed -i \u0026#39;/#LoginGraceTime 2m/ s/#LoginGraceTime 2m/LoginGraceTime 0/\u0026#39; /etc/ssh/sshd_config \u0026amp;\u0026amp; grep LoginGraceTime /etc/ssh/sshd_config --加快SSH登陆速度，禁用DNS cp /etc/ssh/sshd_config /etc/ssh/sshd_config_`date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;` \u0026amp;\u0026amp; sed -i \u0026#39;/#UseDNS yes/ s/#UseDNS yes/UseDNS no/\u0026#39; /etc/ssh/sshd_config \u0026amp;\u0026amp; grep UseDNS /etc/ssh/sshd_config 4.13 hugepage配置（可选） # 与AMM冲突 如果您有较大的RAM和SGA，则HugePages对于在Linux上提高Oracle数据库性能至关重要 grep HugePagesize /proc/meminfo Hugepagesize: 2048 kB chmod 755 hugepages_settings.sh 需要在数据库启动情况下执行 脚本： cat hugepages_settings.sh #!/bin/bash # # hugepages_settings.sh # # Linux bash script to compute values for the # recommended HugePages/HugeTLB configuration # on Oracle Linux # # Note: This script does calculation for all shared memory # segments available when the script is run, no matter it # is an Oracle RDBMS shared memory segment or not. # # This script is provided by Doc ID 401749.1 from My Oracle Support # http://support.oracle.com # Welcome text echo \u0026#34; This script is provided by Doc ID 401749.1 from My Oracle Support (http://support.oracle.com) where it is intended to compute values for the recommended HugePages/HugeTLB configuration for the current shared memory segments on Oracle Linux. Before proceeding with the execution please note following: * For ASM instance, it needs to configure ASMM instead of AMM. * The \u0026#39;pga_aggregate_target\u0026#39; is outside the SGA and you should accommodate this while calculating the overall size. * In case you changes the DB SGA size, as the new SGA will not fit in the previous HugePages configuration, it had better disable the whole HugePages, start the DB with new SGA size and run the script again. And make sure that: * Oracle Database instance(s) are up and running * Oracle Database 11g Automatic Memory Management (AMM) is not setup (See Doc ID 749851.1) * The shared memory segments can be listed by command: # ipcs -m Press Enter to proceed...\u0026#34; read # Check for the kernel version KERN=`uname -r | awk -F. \u0026#39;{ printf(\u0026#34;%d.%d/n\u0026#34;,$1,$2); }\u0026#39;` # Find out the HugePage size HPG_SZ=`grep Hugepagesize /proc/meminfo | awk \u0026#39;{print $2}\u0026#39;` if [ -z \u0026#34;$HPG_SZ\u0026#34; ];then echo \u0026#34;The hugepages may not be supported in the system where the script is being executed.\u0026#34; exit 1 fi # Initialize the counter NUM_PG=0 # Cumulative number of pages required to handle the running shared memory segments for SEG_BYTES in `ipcs -m | cut -c44-300 | awk \u0026#39;{print $1}\u0026#39; | grep \u0026#34;[0-9][0-9]*\u0026#34;` do MIN_PG=`echo \u0026#34;$SEG_BYTES/($HPG_SZ*1024)\u0026#34; | bc -q` if [ $MIN_PG -gt 0 ]; then NUM_PG=`echo \u0026#34;$NUM_PG+$MIN_PG+1\u0026#34; | bc -q` fi done RES_BYTES=`echo \u0026#34;$NUM_PG * $HPG_SZ * 1024\u0026#34; | bc -q` # An SGA less than 100MB does not make sense # Bail out if that is the case if [ $RES_BYTES -lt 100000000 ]; then echo \u0026#34;***********\u0026#34; echo \u0026#34;** ERROR **\u0026#34; echo \u0026#34;***********\u0026#34; echo \u0026#34;Sorry! There are not enough total of shared memory segments allocated for HugePages configuration. HugePages can only be used for shared memory segments that you can list by command: # ipcs -m of a size that can match an Oracle Database SGA. Please make sure that: * Oracle Database instance is up and running * Oracle Database 11g Automatic Memory Management (AMM) is not configured\u0026#34; exit 1 fi # Finish with results case $KERN in \u0026#39;2.4\u0026#39;) HUGETLB_POOL=`echo \u0026#34;$NUM_PG*$HPG_SZ/1024\u0026#34; | bc -q`; echo \u0026#34;Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL\u0026#34; ;; \u0026#39;2.6\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; \u0026#39;3.8\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; \u0026#39;3.10\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; \u0026#39;4.1\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; \u0026#39;4.14\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; \u0026#39;4.18\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; \u0026#39;5.4\u0026#39;) echo \u0026#34;Recommended setting: vm.nr_hugepages = $NUM_PG\u0026#34; ;; *) echo \u0026#34;Kernel version $KERN is not supported by this script (yet). Exiting.\u0026#34; ;; esac # End 计算需要的页数： linux 一个大页的大小为 2M，开启大页的总内存应该比 sga_max_size 稍稍大一点，比如 sga_max_size=3g，则： hugepages \u0026gt; (3*1024)/2 = 1536 配置 sysctl.conf 文件，添加： [root@ node01 ~]$ vi /etc/sysctl.conf vm.nr_hugepages = 1550 配置/etc/security/limits.conf，添加（比 sga_max_size 稍大，官方建议为总物理内存的 90%，以 K 为 单位）： [root@ node01 ~]$ vi /etc/security/limits.conf oracle soft memlock 3400000 oracle hard memlock 3400000 # vim /etc/sysctl.conf vm.nr_hugepages = xxxx # sysctl -p vim /etc/security/limits.conf oracle soft memlock unlimited oracle hard memlock unlimited 4.14 修改login配置 # cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt;EOF session required pam_limits.so EOF [root@rac1 ~]# cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt;EOF session required pam_limits.so EOF [root@rac1 ~]# [root@rac2 ~]# cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt;EOF session required pam_limits.so EOF [root@rac2 ~]# 4.15 配置用户限制 # cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt;EOF grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 grid hard stack 32768 grid soft memlock 3145728 grid hard memlock 3145728 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 3145728 oracle hard memlock 3145728 EOF [root@rac1 ~]# cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt;EOF session required pam_limits.so EOF [root@rac1 ~]# cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt;EOF grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 grid hard stack 32768 grid soft memlock 3145728 grid hard memlock 3145728 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 3145728 oracle hard memlock 3145728 EOF [root@rac1 ~]# [root@rac2 ~]# cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt;EOF session required pam_limits.so EOF [root@rac2 ~]# cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt;EOF grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 grid hard stack 32768 grid soft memlock 3145728 grid hard memlock 3145728 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 3145728 oracle hard memlock 3145728 EOF [root@rac2 ~]# 4.16 配置NTP服务（可选） # ntp\nchony\n-x\n4.16.1 使用ctss # 各节点系统时间校对:\n--检验时间和时区确认正确 date --关闭chrony服务，移除chrony配置文件（后续使用ctss） systemctl list-unit-files|grep chronyd systemctl status chronyd systemctl disable chronyd systemctl stop chronyd mv /etc/chrony.conf /etc/chrony.conf_bak mv /etc/ntp.conf /etc/ntp.conf_bak systemctl list-unit-files|grep -E \u0026#39;ntp|chrony\u0026#39; [root@rac1 ~]# systemctl list-unit-files|grep chronyd chronyd-restricted.service disabled disabled chronyd.service enabled enabled [root@rac1 ~]# systemctl status chronyd ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled) Active: active (running) since Mon 2026-02-09 13:02:36 CST; 17min ago Docs: man:chronyd(8) man:chrony.conf(5) Main PID: 1225 (chronyd) Tasks: 1 (limit: 99016) Memory: 1.4M (peak: 2.2M) CPU: 51ms CGroup: /system.slice/chronyd.service └─1225 /usr/sbin/chronyd -F 2 2月 09 13:02:36 rac1 chronyd[1225]: Loaded 0 symmetric keys 2月 09 13:02:36 rac1 chronyd[1225]: Using right/UTC timezone to obtain leap second data 2月 09 13:02:36 rac1 chronyd[1225]: Frequency 4.239 +/- 0.405 ppm read from /var/lib/chrony/drift 2月 09 13:02:36 rac1 chronyd[1225]: Loaded seccomp filter (level 2) 2月 09 13:02:36 rac1 systemd[1]: Started NTP client/server. 2月 09 13:02:47 rac1 chronyd[1225]: Selected source 119.28.206.193 (2.pool.ntp.org) 2月 09 13:02:47 rac1 chronyd[1225]: System clock wrong by -1.205485 seconds 2月 09 13:02:46 rac1 chronyd[1225]: System clock was stepped by -1.205485 seconds 2月 09 13:02:46 rac1 chronyd[1225]: System clock TAI offset set to 37 seconds 2月 09 13:17:54 rac1 chronyd[1225]: Selected source 111.230.189.174 (2.pool.ntp.org) [root@rac1 ~]# systemctl disable chronyd systemctl stop chronyd Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/chronyd.service\u0026#34;. [root@rac1 ~]# mv /etc/chrony.conf /etc/chrony.conf_bak [root@rac1 ~]# mv /etc/ntp.conf /etc/ntp.conf_bak mv: 无法获取\u0026#39;/etc/ntp.conf\u0026#39; 的文件状态(stat): 没有那个文件或目录 [root@rac1 ~]# systemctl list-unit-files|grep -E \u0026#39;ntp|chrony\u0026#39; chrony-wait.service disabled disabled chronyd-restricted.service disabled disabled chronyd.service disabled enabled [root@rac1 ~]# [root@rac2 ~]# systemctl list-unit-files|grep chronyd chronyd-restricted.service disabled disabled chronyd.service enabled enabled [root@rac2 ~]# systemctl status chronyd ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled) Active: active (running) since Mon 2026-02-09 13:03:16 CST; 16min ago Docs: man:chronyd(8) man:chrony.conf(5) Main PID: 1223 (chronyd) Tasks: 1 (limit: 101883) Memory: 1.4M (peak: 2.1M) CPU: 52ms CGroup: /system.slice/chronyd.service └─1223 /usr/sbin/chronyd -F 2 2月 09 13:03:16 rac2 chronyd[1223]: chronyd version 4.6.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG) 2月 09 13:03:16 rac2 chronyd[1223]: Loaded 0 symmetric keys 2月 09 13:03:16 rac2 chronyd[1223]: Using right/UTC timezone to obtain leap second data 2月 09 13:03:16 rac2 chronyd[1223]: Frequency 4.192 +/- 0.422 ppm read from /var/lib/chrony/drift 2月 09 13:03:16 rac2 chronyd[1223]: Loaded seccomp filter (level 2) 2月 09 13:03:16 rac2 systemd[1]: Started NTP client/server. 2月 09 13:03:27 rac2 chronyd[1223]: Selected source 111.230.189.174 (2.pool.ntp.org) 2月 09 13:03:27 rac2 chronyd[1223]: System clock wrong by -1.206441 seconds 2月 09 13:03:26 rac2 chronyd[1223]: System clock was stepped by -1.206441 seconds 2月 09 13:03:26 rac2 chronyd[1223]: System clock TAI offset set to 37 seconds [root@rac2 ~]# systemctl disable chronyd systemctl stop chronyd Removed \u0026#34;/etc/systemd/system/multi-user.target.wants/chronyd.service\u0026#34;. [root@rac2 ~]# mv /etc/chrony.conf /etc/chrony.conf_bak [root@rac2 ~]# mv /etc/ntp.conf /etc/ntp.conf_bak systemctl list-unit-files|grep -E \u0026#39;ntp|chrony\u0026#39; mv: 无法获取\u0026#39;/etc/ntp.conf\u0026#39; 的文件状态(stat): 没有那个文件或目录 chrony-wait.service disabled disabled chronyd-restricted.service disabled disabled chronyd.service disabled enabled [root@rac2 ~]# 这里实验环境，选择不使用NTP和chrony，这样Oracle会自动使用自己的ctss服务\n4.16.2 使用ntp # 1）修改所有节点的/etc/ntp.conf 【命令】vi /etc/ntp.conf 【内容】 restrict 192.168.17.5 nomodify notrap nopeer noquery //当前节点IP地址 restrict 192.168.17.2 mask 255.255.255.0 nomodify notrap //集群所在网段的网关（Gateway），子网掩码（Genmask） 2）选择一个主节点，修改其/etc/ntp.conf 【命令】vi /etc/ntp.conf 【内容】在server部分添加一下部分，并注释掉server 0 ~ n server 127.127.1.0 Fudge 127.127.1.0 stratum 10 3）主节点以外，继续修改/etc/ntp.conf 【命令】vi /etc/ntp.conf 【内容】在server部分添加如下语句，将server指向主节点。 server 192.168.17.5 Fudge 192.168.17.5 stratum 10 节点1 echo systemctl status ntpd systemctl stop ntpd systemctl stop chronyd systemctl disable chronyd sed -i \u0026#39;s/OPTIONS=\u0026#34;-g\u0026#34;/OPTIONS=\u0026#34;-g -x\u0026#34;/\u0026#39; /etc/sysconfig/ntpd vim /etc/ntp.conf 注释server sed \u0026#39;/^server/s/^/#/\u0026#39; /etc/ntp.conf -i server 127.127.1.0 Fudge 127.127.1.0 stratum 10 # Hosts on local network are less restricted. restrict 192.168.17.0 mask 255.255.255.0 nomodify notrap 把网段改为 192.168.17.0,取消注释 # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst #server 3.rhel.pool.ntp.org iburst server 127.127.1.0 Fudge 127.127.1.0 stratum 10 #broadcast 192.168.1.255 autokey # broadcast server #broadcastclient # broadcast client #broadcast 224.0.1.1 autokey # multicast server #multicastclient 224.0.1.1 # multicast client #manycastserver 239.255.254.254 # manycast server #manycastclient 239.255.254.254 autokey # manycast client # Enable public key cryptography. #crypto includefile /etc/ntp/crypto/pw # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography. keys /etc/ntp/keys --- 把网段改为 192.168.17.0 systemctl start ntpd systemctl enable ntpd echo 节点2 echo systemctl stop ntpd systemctl stop chronyd systemctl disable chronyd sed -i \u0026#39;s/OPTIONS=\u0026#34;-g\u0026#34;/OPTIONS=\u0026#34;-g -x\u0026#34;/\u0026#39; /etc/sysconfig/ntpd sed -i \u0026#39;s/^server/#server/g\u0026#39; /etc/ntp.conf sed -i \u0026#39;$a server 192.168.17.141 iburst\u0026#39; /etc/ntp.conf systemctl start ntpd systemctl enable ntpd echo 检查ntp配置文件/etc/sysconfig/ntpd，也已经从默认值OPTIONS=\u0026#34;-g\u0026#34;修改成OPTIONS=\u0026#34;-x -g\u0026#34;，但是在使用命令$ cluvfy comp clocksync -n all –verbose检查时为什么会失败呢？ 通过MOS文档《Linux:CVU NTP Prerequisite check fails with PRVF-7590, PRVG-1024 and PRVF-5415 (Doc ID2126223.1)》分析可以看出：If var/run/ntpd.pid does not existon the server, the CVU command fails. This is due to unpublished bug 19427746 which has been fixed in Oracle 12.2.（意思是：如果服务器上不存在/var/run/ntpd.pid，则CVU命令失败。这是由于未发布的错误BUG 19427746，该错误已在Oracle 12.2中修复。） 4.16.3 使用chony # 最小化安装没有安装相关包 需要自行安装 yum -y install chrony 配置文件说明 $ cat /etc/chrony.conf # 使用pool.ntp.org项目中的公共服务器。以server开，理论上你想添加多少时间服务器都可以。 # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst # 根据实际时间计算出服务器增减时间的比率，然后记录到一个文件中，在系统重启后为系统做出最佳时间补偿调整。 driftfile /var/lib/chrony/drift # chronyd根据需求减慢或加速时间调整， # 在某些情况下系统时钟可能漂移过快，导致时间调整用时过长。 # 该指令强制chronyd调整时期，大于某个阀值时步进调整系统时钟。 # 只有在因chronyd启动时间超过指定的限制时（可使用负值来禁用限制）没有更多时钟更新时才生效。 makestep 1.0 3 # 将启用一个内核模式，在该模式中，系统时间每11分钟会拷贝到实时时钟（RTC）。 rtcsync # Enable hardware timestamping on all interfaces that support it. # 通过使用hwtimestamp指令启用硬件时间戳 #hwtimestamp eth0 #hwtimestamp eth1 #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # 指定一台主机、子网，或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器 #allow 192.168.0.0/16 #deny 192.168/16 # Serve time even if not synchronized to a time source. local stratum 10 # 指定包含NTP验证密钥的文件。 #keyfile /etc/chrony.keys # 指定日志文件的目录。 logdir /var/log/chrony # Select which information is logged. #log measurements statistics tracking RAC1: 1 先注释server ： sed \u0026#39;/^server/s/^/#/\u0026#39; /etc/chrony.conf -i 注释server 2 # vi /etc/chrony.conf # Serve time even if not synchronized to a time source.开启该服务,在不与外网同步时间的情况下,依然为下层终端提供同步服务 local stratum 10 #allow用来标记允许同步的网段或主机，下例是允许192.168.17.0/24这个网段的终端来同步，127/8是本机和自己同步。 allow 192.168.17.0/24 server 127.0.0.1 iburst --表示本机同步 allow\t#允许所有网段连入 local stratum 10 3 重新启动 systemctl restart chronyd.service RAC2: 1 先注释server ： sed \u0026#39;/^server/s/^/#/\u0026#39; /etc/chrony.conf -i 注释server 2 # vi /etc/chrony.conf server 192.168.17.141 iburst --表示RAC1同步 重启时间同步服务: systemctl restart chronyd.service systemctl enable chronyd.service 查看时间同步源: # chronyc sources -v chronyc sourcestats -v 查看 ntp_servers 是否在线 chronyc activity -v 查看 ntp 详细信息 chronyc tracking -v 4.17 创建组和用户 # groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper groupadd -g 54324 backupdba groupadd -g 54325 dgdba groupadd -g 54326 kmdba groupadd -g 54327 asmdba groupadd -g 54328 asmoper groupadd -g 54329 asmadmin groupadd -g 54330 racdba useradd -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba -u 54321 oracle useradd -g oinstall -G dba,asmadmin,asmdba,asmoper,racdba -u 54331 grid echo \u0026#34;oracle\u0026#34; | passwd --stdin oracle echo \u0026#34;grid\u0026#34; | passwd --stdin grid [root@rac1 ~]# systemctl list-unit-files|grep -E \u0026#39;ntp|chrony\u0026#39; chrony-wait.service disabled disabled chronyd-restricted.service disabled disabled chronyd.service disabled enabled [root@rac1 ~]# groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper groupadd -g 54324 backupdba groupadd -g 54325 dgdba groupadd -g 54326 kmdba groupadd -g 54327 asmdba groupadd -g 54328 asmoper groupadd -g 54329 asmadmin groupadd -g 54330 racdba useradd -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba -u 54321 oracle useradd -g oinstall -G dba,asmadmin,asmdba,asmoper,racdba -u 54331 grid echo \u0026#34;oracle\u0026#34; | passwd --stdin oracle echo \u0026#34;grid\u0026#34; | passwd --stdin grid 更改用户 oracle 的密码 。 passwd：所有的身份验证令牌已经成功更新。 更改用户 grid 的密码 。 passwd：所有的身份验证令牌已经成功更新。 [root@rac1 ~]# id oracle 用户id=54321(oracle) 组id=54321(oinstall) 组=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54327(asmdba),54328(asmoper),54329(asmadmin),54330(racdba) [root@rac1 ~]# id grid 用户id=54331(grid) 组id=54321(oinstall) 组=54321(oinstall),54322(dba),54327(asmdba),54328(asmoper),54329(asmadmin),54330(racdba) [root@rac1 ~]# [root@rac2 ~]# groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper groupadd -g 54324 backupdba groupadd -g 54325 dgdba groupadd -g 54326 kmdba groupadd -g 54327 asmdba groupadd -g 54328 asmoper groupadd -g 54329 asmadmin groupadd -g 54330 racdba useradd -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba -u 54321 oracle useradd -g oinstall -G dba,asmadmin,asmdba,asmoper,racdba -u 54331 grid echo \u0026#34;oracle\u0026#34; | passwd --stdin oracle echo \u0026#34;grid\u0026#34; | passwd --stdin grid 更改用户 oracle 的密码 。 passwd：所有的身份验证令牌已经成功更新。 更改用户 grid 的密码 。 passwd：所有的身份验证令牌已经成功更新。 [root@rac2 ~]# id oracle 用户id=54321(oracle) 组id=54321(oinstall) 组=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54327(asmdba),54328(asmoper),54329(asmadmin),54330(racdba) [root@rac2 ~]# id grid 用户id=54331(grid) 组id=54321(oinstall) 组=54321(oinstall),54322(dba),54327(asmdba),54328(asmoper),54329(asmadmin),54330(racdba) [root@rac2 ~]# 4.18 创建目录 # mkdir -p /u01/app/23.0.0/grid mkdir -p /u01/app/grid mkdir -p /u01/app/oracle/product/23.0.0/dbhome_1/ chown -R grid:oinstall /u01 chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01/ [root@rac1 ~]# mkdir -p /u01/app/23.0.0/grid mkdir -p /u01/app/grid mkdir -p /u01/app/oracle/product/23.0.0/dbhome_1/ chown -R grid:oinstall /u01 chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01/ [root@rac1 ~]# [root@rac2 ~]# mkdir -p /u01/app/23.0.0/grid mkdir -p /u01/app/grid mkdir -p /u01/app/oracle/product/23.0.0/dbhome_1/ chown -R grid:oinstall /u01 chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01/ [root@rac2 ~]# 4.19 配置用户环境变量 # 4.19.1 grid # cat \u0026gt;\u0026gt; /home/grid/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/23.0.0/grid export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=+ASM1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysasm\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF cat \u0026gt;\u0026gt; /home/grid/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################ enmo add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/23.0.0/grid export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=+ASM2 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysasm\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF [root@rac1 ~]# su - grid [grid@rac1 ~]$ cat \u0026gt;\u0026gt; /home/grid/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/23.0.0/grid export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=+ASM1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysasm\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF [grid@rac1 ~]$ [root@rac2 ~]# su - grid [grid@rac2 ~]$ cat \u0026gt;\u0026gt; /home/grid/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################ enmo add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/23.0.0/grid export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=+ASM2 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysasm\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF [grid@rac2 ~]$ 4.19.2 oracle # cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################ add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/23.0.0/dbhome_1 export ORACLE_HOSTNAME=rac1 export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=orcl1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysdba\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################ add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/23.0.0/dbhome_1 export ORACLE_HOSTNAME=rac2 export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=orcl2 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysdba\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF [root@rac1 ~]# su - oracle [oracle@rac1 ~]$ cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################ add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/23.0.0/dbhome_1 export ORACLE_HOSTNAME=rac1 export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=orcl1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysdba\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF [oracle@rac1 ~]$ [root@rac2 ~]# su - oracle [oracle@rac2 ~]$ cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ################ add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/23.0.0/dbhome_1 export ORACLE_HOSTNAME=rac2 export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=orcl2 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysdba\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; EOF [oracle@rac2 ~]$ 4.20 配置共享存储（multipath+udev） # 这次我们配置选择（multipath+udev）\n4.20.1 multipath # ##安装multipath dnf install -y device-mapper* mpathconf --enable --with_multipathd y ##查看共享盘的scsi_id /usr/lib/udev/scsi_id -g -u /dev/sdb /usr/lib/udev/scsi_id -g -u /dev/sdc /usr/lib/udev/scsi_id -g -u /dev/sdd /usr/lib/udev/scsi_id -g -u /dev/sde /usr/lib/udev/scsi_id -g -u /dev/sdf ##配置multipath，wwid的值为上面获取的scsi_id，alias可自定义，这里配置3块OCR盘，2块DATA盘 defaults { user_friendly_names yes } 这里可以和之前的冲突了 cp /etc/multipath.conf /etc/multipath.conf.bak sed \u0026#39;/^/s/^/#/\u0026#39; /etc/multipath.conf -i 注释所有的行 cat \u0026lt;\u0026lt;EOF\u0026gt;\u0026gt; /etc/multipath.conf defaults { user_friendly_names yes } blacklist { devnode \u0026#34;^sda\u0026#34; } multipaths { multipath { wwid \u0026#34;36000c29c2199f445e6c28a483068676f\u0026#34; alias OCRVOTE01 } multipath { wwid \u0026#34;36000c296e58e5e22e6fca2e526238c7a\u0026#34; alias OCRVOTE02 } multipath { wwid \u0026#34;36000c2900352ea2cc26022e3d8307c8e\u0026#34; alias OCRVOTE03 } multipath { wwid \u0026#34;36000c29dc198a2ae28aca1a24ddc303b\u0026#34; alias DATA01 } multipath { wwid \u0026#34;36000c297c1ceaf5039485fec0dc39e5e\u0026#34; alias DATA02 } } EOF 激活multipath多路径： multipath -F multipath -v2 multipath -ll [root@rac1 ~]# dnf install -y device-mapper* 上次元数据过期检查：0:00:27 前，执行于 2026年02月09日 星期一 16时10分45秒。 软件包 device-mapper-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-event-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-event-libs-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-libs-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-multipath-0.8.7-39.el9.x86_64 已安装。 软件包 device-mapper-multipath-libs-0.8.7-39.el9.x86_64 已安装。 软件包 device-mapper-persistent-data-1.1.0-1.el9.x86_64 已安装。 依赖关系解决。 ================================================================================================================================================================================================================================================= 软件包 架构 版本 仓库 大小 ================================================================================================================================================================================================================================================= 升级: device-mapper x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 154 k device-mapper-event x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 38 k device-mapper-event-libs x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 31 k device-mapper-libs x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 179 k device-mapper-multipath x86_64 0.8.7-39.el9_7.1 ol9_baseos_latest 173 k device-mapper-multipath-libs x86_64 0.8.7-39.el9_7.1 ol9_baseos_latest 302 k kpartx x86_64 0.8.7-39.el9_7.1 ol9_baseos_latest 58 k lvm2 x86_64 9:2.03.32-2.el9_7.1 ol9_baseos_latest 1.6 M lvm2-libs x86_64 9:2.03.32-2.el9_7.1 ol9_baseos_latest 1.0 M 事务概要 ================================================================================================================================================================================================================================================= 升级 9 软件包 总下载：3.5 M 下载软件包： 正在等待 pid 为19560的进程退出。 (1/9): device-mapper-event-1.02.206-2.el9_7.1.x86_64.rpm 12 kB/s | 38 kB 00:03 (2/9): device-mapper-event-libs-1.02.206-2.el9_7.1.x86_64.rpm 10 kB/s | 31 kB 00:03 (3/9): device-mapper-1.02.206-2.el9_7.1.x86_64.rpm 44 kB/s | 154 kB 00:03 (4/9): device-mapper-libs-1.02.206-2.el9_7.1.x86_64.rpm 285 kB/s | 179 kB 00:00 (5/9): device-mapper-multipath-0.8.7-39.el9_7.1.x86_64.rpm 259 kB/s | 173 kB 00:00 (6/9): kpartx-0.8.7-39.el9_7.1.x86_64.rpm 250 kB/s | 58 kB 00:00 (7/9): device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64.rpm 578 kB/s | 302 kB 00:00 (8/9): lvm2-libs-2.03.32-2.el9_7.1.x86_64.rpm 772 kB/s | 1.0 MB 00:01 (9/9): lvm2-2.03.32-2.el9_7.1.x86_64.rpm 1.0 MB/s | 1.6 MB 00:01 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 总计 684 kB/s | 3.5 MB 00:05 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 升级 : device-mapper-libs-9:1.02.206-2.el9_7.1.x86_64 1/18 升级 : device-mapper-9:1.02.206-2.el9_7.1.x86_64 2/18 升级 : device-mapper-event-libs-9:1.02.206-2.el9_7.1.x86_64 3/18 升级 : device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 4/18 运行脚本: device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 4/18 升级 : lvm2-libs-9:2.03.32-2.el9_7.1.x86_64 5/18 升级 : device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64 6/18 升级 : kpartx-0.8.7-39.el9_7.1.x86_64 7/18 升级 : device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 8/18 运行脚本: device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 8/18 升级 : lvm2-9:2.03.32-2.el9_7.1.x86_64 9/18 运行脚本: lvm2-9:2.03.32-2.el9_7.1.x86_64 9/18 运行脚本: device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 清理 : device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 运行脚本: device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 清理 : device-mapper-multipath-libs-0.8.7-39.el9.x86_64 11/18 清理 : kpartx-0.8.7-39.el9.x86_64 12/18 运行脚本: lvm2-9:2.03.32-2.el9.x86_64 13/18 清理 : lvm2-9:2.03.32-2.el9.x86_64 13/18 运行脚本: lvm2-9:2.03.32-2.el9.x86_64 13/18 清理 : lvm2-libs-9:2.03.32-2.el9.x86_64 14/18 运行脚本: device-mapper-event-9:1.02.206-2.el9.x86_64 15/18 清理 : device-mapper-event-9:1.02.206-2.el9.x86_64 15/18 清理 : device-mapper-event-libs-9:1.02.206-2.el9.x86_64 16/18 清理 : device-mapper-libs-9:1.02.206-2.el9.x86_64 17/18 清理 : device-mapper-9:1.02.206-2.el9.x86_64 18/18 运行脚本: device-mapper-9:1.02.206-2.el9.x86_64 18/18 验证 : device-mapper-9:1.02.206-2.el9_7.1.x86_64 1/18 验证 : device-mapper-9:1.02.206-2.el9.x86_64 2/18 验证 : device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 3/18 验证 : device-mapper-event-9:1.02.206-2.el9.x86_64 4/18 验证 : device-mapper-event-libs-9:1.02.206-2.el9_7.1.x86_64 5/18 验证 : device-mapper-event-libs-9:1.02.206-2.el9.x86_64 6/18 验证 : device-mapper-libs-9:1.02.206-2.el9_7.1.x86_64 7/18 验证 : device-mapper-libs-9:1.02.206-2.el9.x86_64 8/18 验证 : device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 9/18 验证 : device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 验证 : device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64 11/18 验证 : device-mapper-multipath-libs-0.8.7-39.el9.x86_64 12/18 验证 : kpartx-0.8.7-39.el9_7.1.x86_64 13/18 验证 : kpartx-0.8.7-39.el9.x86_64 14/18 验证 : lvm2-9:2.03.32-2.el9_7.1.x86_64 15/18 验证 : lvm2-9:2.03.32-2.el9.x86_64 16/18 验证 : lvm2-libs-9:2.03.32-2.el9_7.1.x86_64 17/18 验证 : lvm2-libs-9:2.03.32-2.el9.x86_64 18/18 已升级: device-mapper-9:1.02.206-2.el9_7.1.x86_64 device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 device-mapper-event-libs-9:1.02.206-2.el9_7.1.x86_64 device-mapper-libs-9:1.02.206-2.el9_7.1.x86_64 device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64 kpartx-0.8.7-39.el9_7.1.x86_64 lvm2-9:2.03.32-2.el9_7.1.x86_64 lvm2-libs-9:2.03.32-2.el9_7.1.x86_64 完毕！ [root@rac1 ~]# mpathconf --enable --with_multipathd y [root@rac1 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdb 36000c29c2199f445e6c28a483068676f [root@rac1 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdc 36000c296e58e5e22e6fca2e526238c7a [root@rac1 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdd 36000c29dc198a2ae28aca1a24ddc303b [root@rac1 ~]# /usr/lib/udev/scsi_id -g -u /dev/sde 36000c2900352ea2cc26022e3d8307c8e [root@rac1 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdf 36000c297c1ceaf5039485fec0dc39e5e [root@rac1 ~]# cp /etc/multipath.conf /etc/multipath.conf.bak [root@rac1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 98.9G 0 part ├─ol-root 252:0 0 82.8G 0 lvm / └─ol-swap 252:1 0 16.1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk sdc 8:32 0 5G 0 disk sdd 8:48 0 20G 0 disk sde 8:64 0 5G 0 disk sdf 8:80 0 20G 0 disk sr0 11:0 1 13.5G 0 rom [root@rac1 ~]# sed \u0026#39;/^/s/^/#/\u0026#39; /etc/multipath.conf -i [root@rac1 ~]# cat \u0026lt;\u0026lt;EOF\u0026gt;\u0026gt; /etc/multipath.conf defaults { user_friendly_names yes } blacklist { devnode \u0026#34;^sda\u0026#34; } multipaths { multipath { wwid \u0026#34;36000c29c2199f445e6c28a483068676f\u0026#34; alias OCRVOTE01 } multipath { wwid \u0026#34;36000c296e58e5e22e6fca2e526238c7a\u0026#34; alias OCRVOTE02 } multipath { wwid \u0026#34;36000c2900352ea2cc26022e3d8307c8e\u0026#34; alias OCRVOTE03 } multipath { wwid \u0026#34;36000c29dc198a2ae28aca1a24ddc303b\u0026#34; alias DATA01 } multipath { wwid \u0026#34;36000c297c1ceaf5039485fec0dc39e5e\u0026#34; alias DATA02 } } EOF [root@rac1 ~]# multipath -F [root@rac1 ~]# multipath -v2 670.898978 | OCRVOTE02: addmap [0 10485760 multipath 0 0 1 1 service-time 0 1 1 8:32 1] create: OCRVOTE02 (36000c296e58e5e22e6fca2e526238c7a) undef VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:0:0 sdc 8:32 undef ready running 670.960115 | OCRVOTE01: addmap [0 10485760 multipath 0 0 1 1 service-time 0 1 1 8:16 1] create: OCRVOTE01 (36000c29c2199f445e6c28a483068676f) undef VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:1:0 sdb 8:16 undef ready running 671.013828 | OCRVOTE03: addmap [0 10485760 multipath 0 0 1 1 service-time 0 1 1 8:64 1] create: OCRVOTE03 (36000c2900352ea2cc26022e3d8307c8e) undef VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:2:0 sde 8:64 undef ready running 671.068251 | DATA01: addmap [0 41943040 multipath 0 0 1 1 service-time 0 1 1 8:48 1] create: DATA01 (36000c29dc198a2ae28aca1a24ddc303b) undef VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:3:0 sdd 8:48 undef ready running 671.116454 | DATA02: addmap [0 41943040 multipath 0 0 1 1 service-time 0 1 1 8:80 1] create: DATA02 (36000c297c1ceaf5039485fec0dc39e5e) undef VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:4:0 sdf 8:80 undef ready running [root@rac1 ~]# multipath -ll DATA01 (36000c29dc198a2ae28aca1a24ddc303b) dm-5 VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:3:0 sdd 8:48 active ready running DATA02 (36000c297c1ceaf5039485fec0dc39e5e) dm-6 VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:4:0 sdf 8:80 active ready running OCRVOTE01 (36000c29c2199f445e6c28a483068676f) dm-3 VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:1:0 sdb 8:16 active ready running OCRVOTE02 (36000c296e58e5e22e6fca2e526238c7a) dm-2 VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:0:0 sdc 8:32 active ready running OCRVOTE03 (36000c2900352ea2cc26022e3d8307c8e) dm-4 VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:2:0 sde 8:64 active ready running [root@rac1 ~]# [root@rac2 ~]# dnf install -y device-mapper* 正在等待 pid 为2426的进程退出。 上次元数据过期检查：0:00:03 前，执行于 2026年02月09日 星期一 16时14分27秒。 软件包 device-mapper-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-event-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-event-libs-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-libs-9:1.02.206-2.el9.x86_64 已安装。 软件包 device-mapper-multipath-0.8.7-39.el9.x86_64 已安装。 软件包 device-mapper-multipath-libs-0.8.7-39.el9.x86_64 已安装。 软件包 device-mapper-persistent-data-1.1.0-1.el9.x86_64 已安装。 依赖关系解决。 ================================================================================================================================================================================================================================================= 软件包 架构 版本 仓库 大小 ================================================================================================================================================================================================================================================= 升级: device-mapper x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 154 k device-mapper-event x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 38 k device-mapper-event-libs x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 31 k device-mapper-libs x86_64 9:1.02.206-2.el9_7.1 ol9_baseos_latest 179 k device-mapper-multipath x86_64 0.8.7-39.el9_7.1 ol9_baseos_latest 173 k device-mapper-multipath-libs x86_64 0.8.7-39.el9_7.1 ol9_baseos_latest 302 k kpartx x86_64 0.8.7-39.el9_7.1 ol9_baseos_latest 58 k lvm2 x86_64 9:2.03.32-2.el9_7.1 ol9_baseos_latest 1.6 M lvm2-libs x86_64 9:2.03.32-2.el9_7.1 ol9_baseos_latest 1.0 M 事务概要 ================================================================================================================================================================================================================================================= 升级 9 软件包 总下载：3.5 M 下载软件包： (1/9): device-mapper-event-libs-1.02.206-2.el9_7.1.x86_64.rpm 9.8 kB/s | 31 kB 00:03 (2/9): device-mapper-event-1.02.206-2.el9_7.1.x86_64.rpm 12 kB/s | 38 kB 00:03 (3/9): device-mapper-1.02.206-2.el9_7.1.x86_64.rpm 41 kB/s | 154 kB 00:03 (4/9): device-mapper-multipath-0.8.7-39.el9_7.1.x86_64.rpm 229 kB/s | 173 kB 00:00 (5/9): kpartx-0.8.7-39.el9_7.1.x86_64.rpm 207 kB/s | 58 kB 00:00 (6/9): device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64.rpm 479 kB/s | 302 kB 00:00 (7/9): lvm2-libs-2.03.32-2.el9_7.1.x86_64.rpm 1.4 MB/s | 1.0 MB 00:00 (8/9): device-mapper-libs-1.02.206-2.el9_7.1.x86_64.rpm 83 kB/s | 179 kB 00:02 (9/9): lvm2-2.03.32-2.el9_7.1.x86_64.rpm 1.6 MB/s | 1.6 MB 00:01 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 总计 686 kB/s | 3.5 MB 00:05 Oracle Linux 9 BaseOS Latest (x86_64) 6.1 MB/s | 6.2 kB 00:00 导入 GPG 公钥 0x8D8B756F: Userid: \u0026#34;Oracle Linux (release key 1) \u0026lt;secalert_us@oracle.com\u0026gt;\u0026#34; 指纹: 3E6D 826D 3FBA B389 C2F3 8E34 BC4D 06A0 8D8B 756F 来自: /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle 导入公钥成功 导入 GPG 公钥 0x8B4EFBE6: Userid: \u0026#34;Oracle Linux (backup key 1) \u0026lt;secalert_us@oracle.com\u0026gt;\u0026#34; 指纹: 9822 3175 9C74 6706 5D0C E9B2 A7DD 0708 8B4E FBE6 来自: /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle 导入公钥成功 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 升级 : device-mapper-libs-9:1.02.206-2.el9_7.1.x86_64 1/18 升级 : device-mapper-9:1.02.206-2.el9_7.1.x86_64 2/18 升级 : device-mapper-event-libs-9:1.02.206-2.el9_7.1.x86_64 3/18 升级 : device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 4/18 运行脚本: device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 4/18 升级 : lvm2-libs-9:2.03.32-2.el9_7.1.x86_64 5/18 升级 : device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64 6/18 升级 : kpartx-0.8.7-39.el9_7.1.x86_64 7/18 升级 : device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 8/18 运行脚本: device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 8/18 升级 : lvm2-9:2.03.32-2.el9_7.1.x86_64 9/18 运行脚本: lvm2-9:2.03.32-2.el9_7.1.x86_64 9/18 运行脚本: device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 清理 : device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 运行脚本: device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 清理 : device-mapper-multipath-libs-0.8.7-39.el9.x86_64 11/18 清理 : kpartx-0.8.7-39.el9.x86_64 12/18 运行脚本: lvm2-9:2.03.32-2.el9.x86_64 13/18 清理 : lvm2-9:2.03.32-2.el9.x86_64 13/18 运行脚本: lvm2-9:2.03.32-2.el9.x86_64 13/18 清理 : lvm2-libs-9:2.03.32-2.el9.x86_64 14/18 运行脚本: device-mapper-event-9:1.02.206-2.el9.x86_64 15/18 清理 : device-mapper-event-9:1.02.206-2.el9.x86_64 15/18 清理 : device-mapper-event-libs-9:1.02.206-2.el9.x86_64 16/18 清理 : device-mapper-libs-9:1.02.206-2.el9.x86_64 17/18 清理 : device-mapper-9:1.02.206-2.el9.x86_64 18/18 运行脚本: device-mapper-9:1.02.206-2.el9.x86_64 18/18 验证 : device-mapper-9:1.02.206-2.el9_7.1.x86_64 1/18 验证 : device-mapper-9:1.02.206-2.el9.x86_64 2/18 验证 : device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 3/18 验证 : device-mapper-event-9:1.02.206-2.el9.x86_64 4/18 验证 : device-mapper-event-libs-9:1.02.206-2.el9_7.1.x86_64 5/18 验证 : device-mapper-event-libs-9:1.02.206-2.el9.x86_64 6/18 验证 : device-mapper-libs-9:1.02.206-2.el9_7.1.x86_64 7/18 验证 : device-mapper-libs-9:1.02.206-2.el9.x86_64 8/18 验证 : device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 9/18 验证 : device-mapper-multipath-0.8.7-39.el9.x86_64 10/18 验证 : device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64 11/18 验证 : device-mapper-multipath-libs-0.8.7-39.el9.x86_64 12/18 验证 : kpartx-0.8.7-39.el9_7.1.x86_64 13/18 验证 : kpartx-0.8.7-39.el9.x86_64 14/18 验证 : lvm2-9:2.03.32-2.el9_7.1.x86_64 15/18 验证 : lvm2-9:2.03.32-2.el9.x86_64 16/18 验证 : lvm2-libs-9:2.03.32-2.el9_7.1.x86_64 17/18 验证 : lvm2-libs-9:2.03.32-2.el9.x86_64 18/18 已升级: device-mapper-9:1.02.206-2.el9_7.1.x86_64 device-mapper-event-9:1.02.206-2.el9_7.1.x86_64 device-mapper-event-libs-9:1.02.206-2.el9_7.1.x86_64 device-mapper-libs-9:1.02.206-2.el9_7.1.x86_64 device-mapper-multipath-0.8.7-39.el9_7.1.x86_64 device-mapper-multipath-libs-0.8.7-39.el9_7.1.x86_64 kpartx-0.8.7-39.el9_7.1.x86_64 lvm2-9:2.03.32-2.el9_7.1.x86_64 lvm2-libs-9:2.03.32-2.el9_7.1.x86_64 完毕！ [root@rac2 ~]# mpathconf --enable --with_multipathd y [root@rac2 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdb 36000c296e58e5e22e6fca2e526238c7a [root@rac2 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdc 36000c29c2199f445e6c28a483068676f [root@rac2 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdd 36000c29dc198a2ae28aca1a24ddc303b [root@rac2 ~]# /usr/lib/udev/scsi_id -g -u /dev/sde 36000c2900352ea2cc26022e3d8307c8e [root@rac2 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdf 36000c297c1ceaf5039485fec0dc39e5e [root@rac2 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 98.9G 0 part ├─ol-root 252:0 0 82.8G 0 lvm / └─ol-swap 252:1 0 16.1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk sdc 8:32 0 5G 0 disk sdd 8:48 0 20G 0 disk sde 8:64 0 5G 0 disk sdf 8:80 0 20G 0 disk sr0 11:0 1 13.5G 0 rom [root@rac2 ~]# cp /etc/multipath.conf /etc/multipath.conf.bak [root@rac2 ~]# sed \u0026#39;/^/s/^/#/\u0026#39; /etc/multipath.conf -i [root@rac2 ~]# cat \u0026lt;\u0026lt;EOF\u0026gt;\u0026gt; /etc/multipath.conf defaults { user_friendly_names yes } blacklist { devnode \u0026#34;^sda\u0026#34; } multipaths { multipath { wwid \u0026#34;36000c29c2199f445e6c28a483068676f\u0026#34; alias OCRVOTE01 } multipath { wwid \u0026#34;36000c296e58e5e22e6fca2e526238c7a\u0026#34; alias OCRVOTE02 } multipath { wwid \u0026#34;36000c2900352ea2cc26022e3d8307c8e\u0026#34; alias OCRVOTE03 } multipath { wwid \u0026#34;36000c29dc198a2ae28aca1a24ddc303b\u0026#34; alias DATA01 } multipath { wwid \u0026#34;36000c297c1ceaf5039485fec0dc39e5e\u0026#34; alias DATA02 } } EOF [root@rac2 ~]# multipath -F [root@rac2 ~]# multipath -v2 1051.682658 | OCRVOTE02: addmap [0 10485760 multipath 0 0 1 1 service-time 0 1 1 8:16 1] create: OCRVOTE02 (36000c296e58e5e22e6fca2e526238c7a) undef VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:0:0 sdb 8:16 undef ready running 1051.772004 | OCRVOTE01: addmap [0 10485760 multipath 0 0 1 1 service-time 0 1 1 8:32 1] create: OCRVOTE01 (36000c29c2199f445e6c28a483068676f) undef VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:1:0 sdc 8:32 undef ready running 1051.823303 | OCRVOTE03: addmap [0 10485760 multipath 0 0 1 1 service-time 0 1 1 8:64 1] create: OCRVOTE03 (36000c2900352ea2cc26022e3d8307c8e) undef VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:2:0 sde 8:64 undef ready running 1051.873167 | DATA01: addmap [0 41943040 multipath 0 0 1 1 service-time 0 1 1 8:48 1] create: DATA01 (36000c29dc198a2ae28aca1a24ddc303b) undef VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:3:0 sdd 8:48 undef ready running 1051.920340 | DATA02: addmap [0 41943040 multipath 0 0 1 1 service-time 0 1 1 8:80 1] create: DATA02 (36000c297c1ceaf5039485fec0dc39e5e) undef VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=undef `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=undef `- 3:0:4:0 sdf 8:80 undef ready running [root@rac2 ~]# multipath -ll DATA01 (36000c29dc198a2ae28aca1a24ddc303b) dm-5 VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:3:0 sdd 8:48 active ready running DATA02 (36000c297c1ceaf5039485fec0dc39e5e) dm-6 VMware,,VMware Virtual S size=20G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:4:0 sdf 8:80 active ready running OCRVOTE01 (36000c29c2199f445e6c28a483068676f) dm-3 VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:1:0 sdc 8:32 active ready running OCRVOTE02 (36000c296e58e5e22e6fca2e526238c7a) dm-2 VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:0:0 sdb 8:16 active ready running OCRVOTE03 (36000c2900352ea2cc26022e3d8307c8e) dm-4 VMware,,VMware Virtual S size=5.0G features=\u0026#39;0\u0026#39; hwhandler=\u0026#39;0\u0026#39; wp=rw `-+- policy=\u0026#39;service-time 0\u0026#39; prio=1 status=active `- 3:0:2:0 sde 8:64 active ready running [root@rac2 ~]# 4.20.2 UDEV # cd /dev/mapper for i in OCRVOTE01 OCRVOTE02 OCRVOTE03 DATA01 DATA02; do printf \u0026#34;%s %s\\n\u0026#34; \u0026#34;$i\u0026#34; \u0026#34;$(udevadm info --query=all --name=/dev/mapper/\u0026#34;$i\u0026#34; | grep -i dm_uuid)\u0026#34; \u0026gt;\u0026gt;/dev/mapper/udev_info done while read -r line; do dm_uuid=$(echo \u0026#34;$line\u0026#34; | awk -F\u0026#39;=\u0026#39; \u0026#39;{print $2}\u0026#39;) disk_name=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) echo \u0026#34;KERNEL==\\\u0026#34;dm-*\\\u0026#34;,ENV{DM_UUID}==\\\u0026#34;${dm_uuid}\\\u0026#34;,SYMLINK+=\\\u0026#34;oracleasm/disks/${disk_name}\\\u0026#34;,OWNER=\\\u0026#34;grid\\\u0026#34;,GROUP=\\\u0026#34;asmdba\\\u0026#34;,MODE=\\\u0026#34;0660\\\u0026#34;\u0026#34; \u0026gt;\u0026gt;/etc/udev/rules.d/99-oracle-asmdevices.rules done \u0026lt; /dev/mapper/udev_info ##重载udev udevadm control --reload-rules udevadm trigger --type=devices ll /dev/oracleasm/disks/ [root@rac1 mapper]# cd [root@rac1 ~]# cd /dev/mapper [root@rac1 mapper]# for i in OCRVOTE01 OCRVOTE02 OCRVOTE03 DATA01 DATA02; do printf \u0026#34;%s %s\\n\u0026#34; \u0026#34;$i\u0026#34; \u0026#34;$(udevadm info --query=all --name=/dev/mapper/\u0026#34;$i\u0026#34; | grep -i dm_uuid)\u0026#34; \u0026gt;\u0026gt;/dev/mapper/udev_info done [root@rac1 mapper]# while read -r line; do dm_uuid=$(echo \u0026#34;$line\u0026#34; | awk -F\u0026#39;=\u0026#39; \u0026#39;{print $2}\u0026#39;) disk_name=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) echo \u0026#34;KERNEL==\\\u0026#34;dm-*\\\u0026#34;,ENV{DM_UUID}==\\\u0026#34;${dm_uuid}\\\u0026#34;,SYMLINK+=\\\u0026#34;oracleasm/disks/${disk_name}\\\u0026#34;,OWNER=\\\u0026#34;grid\\\u0026#34;,GROUP=\\\u0026#34;asmdba\\\u0026#34;,MODE=\\\u0026#34;0660\\\u0026#34;\u0026#34; \u0026gt;\u0026gt;/etc/udev/rules.d/99-oracle-asmdevices.rules done \u0026lt; /dev/mapper/udev_info [root@rac1 mapper]# ll /dev/mapper/udev_info -rw-r--r--. 1 root root 299 2月 9 16:26 /dev/mapper/udev_info [root@rac1 mapper]# cat /dev/mapper/udev_info OCRVOTE01 E: DM_UUID=mpath-36000c29c2199f445e6c28a483068676f OCRVOTE02 E: DM_UUID=mpath-36000c296e58e5e22e6fca2e526238c7a OCRVOTE03 E: DM_UUID=mpath-36000c2900352ea2cc26022e3d8307c8e DATA01 E: DM_UUID=mpath-36000c29dc198a2ae28aca1a24ddc303b DATA02 E: DM_UUID=mpath-36000c297c1ceaf5039485fec0dc39e5e [root@rac1 mapper]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules KERNEL==\u0026#34;dm-*\u0026#34;,ENV{DM_UUID}==\u0026#34;mpath-36000c29c2199f445e6c28a483068676f\u0026#34;,SYMLINK+=\u0026#34;oracleasm/disks/OCRVOTE01\u0026#34;,OWNER=\u0026#34;grid\u0026#34;,GROUP=\u0026#34;asmdba\u0026#34;,MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;dm-*\u0026#34;,ENV{DM_UUID}==\u0026#34;mpath-36000c296e58e5e22e6fca2e526238c7a\u0026#34;,SYMLINK+=\u0026#34;oracleasm/disks/OCRVOTE02\u0026#34;,OWNER=\u0026#34;grid\u0026#34;,GROUP=\u0026#34;asmdba\u0026#34;,MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;dm-*\u0026#34;,ENV{DM_UUID}==\u0026#34;mpath-36000c2900352ea2cc26022e3d8307c8e\u0026#34;,SYMLINK+=\u0026#34;oracleasm/disks/OCRVOTE03\u0026#34;,OWNER=\u0026#34;grid\u0026#34;,GROUP=\u0026#34;asmdba\u0026#34;,MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;dm-*\u0026#34;,ENV{DM_UUID}==\u0026#34;mpath-36000c29dc198a2ae28aca1a24ddc303b\u0026#34;,SYMLINK+=\u0026#34;oracleasm/disks/DATA01\u0026#34;,OWNER=\u0026#34;grid\u0026#34;,GROUP=\u0026#34;asmdba\u0026#34;,MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;dm-*\u0026#34;,ENV{DM_UUID}==\u0026#34;mpath-36000c297c1ceaf5039485fec0dc39e5e\u0026#34;,SYMLINK+=\u0026#34;oracleasm/disks/DATA02\u0026#34;,OWNER=\u0026#34;grid\u0026#34;,GROUP=\u0026#34;asmdba\u0026#34;,MODE=\u0026#34;0660\u0026#34; [root@rac1 mapper]# udevadm control --reload-rules [root@rac1 mapper]# udevadm trigger --type=devices [root@rac1 mapper]# ls -lh /dev/oracleasm/disks/ 总用量 0 lrwxrwxrwx. 1 root root 10 2月 9 16:29 DATA01 -\u0026gt; ../../dm-5 lrwxrwxrwx. 1 root root 10 2月 9 16:29 DATA02 -\u0026gt; ../../dm-6 lrwxrwxrwx. 1 root root 10 2月 9 16:29 OCRVOTE01 -\u0026gt; ../../dm-3 lrwxrwxrwx. 1 root root 10 2月 9 16:29 OCRVOTE02 -\u0026gt; ../../dm-2 lrwxrwxrwx. 1 root root 10 2月 9 16:29 OCRVOTE03 -\u0026gt; ../../dm-4 [root@rac1 mapper]# init 6 [root@rac1 mapper]# [root@rac2 ~]# rpm -q bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat nfs-utils | grep \u0026#34;not installed\u0026#34; [root@rac2 ~]# cd /dev/mapper for i in OCRVOTE01 OCRVOTE02 OCRVOTE03 DATA01 DATA02; do printf \u0026#34;%s %s\\n\u0026#34; \u0026#34;$i\u0026#34; \u0026#34;$(udevadm info --query=all --name=/dev/mapper/\u0026#34;$i\u0026#34; | grep -i dm_uuid)\u0026#34; \u0026gt;\u0026gt;/dev/mapper/udev_info done while read -r line; do dm_uuid=$(echo \u0026#34;$line\u0026#34; | awk -F\u0026#39;=\u0026#39; \u0026#39;{print $2}\u0026#39;) disk_name=$(echo \u0026#34;$line\u0026#34; | awk \u0026#39;{print $1}\u0026#39;) echo \u0026#34;KERNEL==\\\u0026#34;dm-*\\\u0026#34;,ENV{DM_UUID}==\\\u0026#34;${dm_uuid}\\\u0026#34;,SYMLINK+=\\\u0026#34;oracleasm/disks/${disk_name}\\\u0026#34;,OWNER=\\\u0026#34;grid\\\u0026#34;,GROUP=\\\u0026#34;asmdba\\\u0026#34;,MODE=\\\u0026#34;0660\\\u0026#34;\u0026#34; \u0026gt;\u0026gt;/etc/udev/rules.d/99-oracle-asmdevices.rules done \u0026lt; /dev/mapper/udev_info [root@rac2 mapper]# udevadm control --reload-rules [root@rac2 mapper]# udevadm trigger --type=devices [root@rac2 mapper]# ll /dev/oracleasm/disks/ 总用量 0 lrwxrwxrwx 1 root root 10 2月 9 16:34 DATA01 -\u0026gt; ../../dm-5 lrwxrwxrwx 1 root root 10 2月 9 16:34 DATA02 -\u0026gt; ../../dm-6 lrwxrwxrwx 1 root root 10 2月 9 16:34 OCRVOTE01 -\u0026gt; ../../dm-3 lrwxrwxrwx 1 root root 10 2月 9 16:34 OCRVOTE02 -\u0026gt; ../../dm-2 lrwxrwxrwx 1 root root 10 2月 9 16:34 OCRVOTE03 -\u0026gt; ../../dm-4 [root@rac2 mapper]# init 6 [root@rac2 mapper]# 4.20.2 UDEV(非multipath） # for i in b c d e ; do echo \u0026#34;KERNEL==\\\u0026#34;sd*\\\u0026#34;, ENV{DEVTYPE}==\\\u0026#34;disk\\\u0026#34;, SUBSYSTEM==\\\u0026#34;block\\\u0026#34;, PROGRAM==\\\u0026#34;/lib/udev/scsi_id -g -u -d \\$devnode\\\u0026#34;, RESULT==\\\u0026#34;`/lib/udev/scsi_id -g -u -d /dev/sd$i`\\\u0026#34;, SYMLINK+=\\\u0026#34;asm-disk$i\\\u0026#34;, OWNER=\\\u0026#34;grid\\\u0026#34;, GROUP=\\\u0026#34;asmadmin\\\u0026#34;, MODE= \\\u0026#34;0660\\\u0026#34;\u0026#34; \u0026gt;\u0026gt; /etc/udev/rules.d/99-oracle-asmdevices.rules done # 加载rules文件,重新加载udev rule /sbin/udevadm control --reload # 检查新的设备名称 /sbin/udevadm trigger --type=devices --action=change # 诊断udev rule /sbin/udevadm test /sys/block/* 用脚本生成udev 配置： for i in b c d e f; do echo \u0026#34;KERNEL==/\u0026#34;sd*/\u0026#34;,ENV{DEVTYPE}==/\u0026#34;disk/\u0026#34;,SUBSYSTEM==/\u0026#34;block/\u0026#34;,PROGRAM==/\u0026#34;/usr/lib/udev/scsi_id -g -u -d /$devnode/\u0026#34;,RESULT==/\u0026#34;`/usr/lib/udev/scsi_id -g -u /dev/sd$i`/\u0026#34;, RUN+=/\u0026#34;/bin/sh -c \u0026#39;mknod /dev/asmdisk$i b /$major /$minor; chown grid:asmadmin /dev/asmdisk$i; chmod 0660 /dev/asmdisk$i\u0026#39;/\u0026#34;\u0026#34; done 将脚本内容写入/etc/udev/rules.d/99-oracle-asmdevices.rules 文件。 [root@rac1 ~]# vi /etc/udev/rules.d/99-oracle-asmdevices.rules.bak [root@rac1 ~]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules.bak ##OCR KERNEL==\u0026#34;sd*\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/lib/udev/scsi_id --whitelisted --replace-whitespace --device /dev/$name\u0026#34;, RESULT==\u0026#34;36000c29f3aef7e4624b113f7fa3b814a\u0026#34;, SYMLINK+=\u0026#34;oracleasm/disks/OCRVOTE1\u0026#34;, OWNER=\u0026#34;grid\u0026#34;,GROUP=\u0026#34;asmadmin\u0026#34;,MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;sd*\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/lib/udev/scsi_id --whitelisted --replace-whitespace --device /dev/$name\u0026#34;, RESULT==\u0026#34;36000c29bb678b6eddfcc18bc14b700fd\u0026#34;, SYMLINK+=\u0026#34;oracleasm/disks/OCRVOTE2\u0026#34;, OWNER=\u0026#34;grid\u0026#34;, GROUP=\u0026#34;asmadmin\u0026#34;, MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;sd*\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/lib/udev/scsi_id --whitelisted --replace-whitespace --device /dev/$name\u0026#34;, RESULT==\u0026#34;36000c296f427a1940291bb5b8553421d\u0026#34;, SYMLINK+=\u0026#34;oracleasm/disks/OCRVOTE3\u0026#34;, OWNER=\u0026#34;grid\u0026#34;, GROUP=\u0026#34;asmadmin\u0026#34;, MODE=\u0026#34;0660\u0026#34; ##DATA KERNEL==\u0026#34;sd*\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/lib/udev/scsi_id --whitelisted --replace-whitespace --device /dev/$name\u0026#34;, RESULT==\u0026#34;36000c290a592be891e54e91ebc74f47a\u0026#34;, SYMLINK+=\u0026#34;oracleasm/disks/DATA01\u0026#34;, OWNER=\u0026#34;grid\u0026#34;, GROUP=\u0026#34;asmadmin\u0026#34;, MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;sd*\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/lib/udev/scsi_id --whitelisted --replace-whitespace --device /dev/$name\u0026#34;, RESULT==\u0026#34;36000c29c9bee73d24577ed3d66d99f5d\u0026#34;, SYMLINK+=\u0026#34;oracleasm/disks/DATA02\u0026#34;, OWNER=\u0026#34;grid\u0026#34;, GROUP=\u0026#34;asmadmin\u0026#34;, MODE=\u0026#34;0660\u0026#34; [root@rac1 ~]# 让UDEV生效： /sbin/udevadm trigger —type=devices —action=change or KERNEL==\u0026#34;sdb\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/usr/lib/udev/scsi_id -g -u -d /dev/$name\u0026#34;,RESULT==\u0026#34;360003ff44dc75adc8cec9cce0033f402\u0026#34;, OWNER=\u0026#34;grid\u0026#34;, GROUP=\u0026#34;asmadmin\u0026#34;, MODE=\u0026#34;0660\u0026#34; KERNEL==\u0026#34;sdc\u0026#34;, SUBSYSTEM==\u0026#34;block\u0026#34;, PROGRAM==\u0026#34;/usr/lib/udev/scsi_id -g -u -d /dev/$name\u0026#34;,RESULT==\u0026#34;360003ff44dc75adc9ba684d395391bae\u0026#34;, OWNER=\u0026#34;grid\u0026#34;, GROUP=\u0026#34;asmadmin\u0026#34;, MODE=\u0026#34;0660 ll /dev/oracleasm/disks/ 4.20.3 ASMLib v3.1（最推荐） # 先去网站https://www.oracle.com/linux/downloads/linux-asmlib-v9-downloads.html上下载oracleasmlib-3.1.1-1.el9.x86_64.rpm\n# 安装oracleasm-support和oracleasmlib，oracleasm-support可以在通过在线yum源安装，oracleasmlib去官网下载上传安装 dnf --enablerepo=ol9_addons install oracleasm-support -y dnf install -y oracleasmlib-3.1.1-1.el9.x86_64.rpm [root@rac1 ~]# dnf --enablerepo=ol9_addons install oracleasm-support -y Oracle Linux 9 Addons (x86_64) 21 kB/s | 811 kB 00:39 上次元数据过期检查：0:00:29 前，执行于 2026年02月09日 星期一 13时30分47秒。 依赖关系解决。 ================================================================================================================================================================================================================================================= 软件包 架构 版本 仓库 大小 ================================================================================================================================================================================================================================================= 安装: oracleasm-support x86_64 3.1.1-4.el9 ol9_addons 131 k 事务概要 ================================================================================================================================================================================================================================================= 安装 1 软件包 总下载：131 k 安装大小：318 k 下载软件包： oracleasm-support-3.1.1-4.el9.x86_64.rpm 17 kB/s | 131 kB 00:07 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 总计 17 kB/s | 131 kB 00:07 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 安装 : oracleasm-support-3.1.1-4.el9.x86_64 1/1 运行脚本: oracleasm-support-3.1.1-4.el9.x86_64 1/1 Created symlink /etc/systemd/system/multi-user.target.wants/oracleasm.service → /usr/lib/systemd/system/oracleasm.service. 验证 : oracleasm-support-3.1.1-4.el9.x86_64 1/1 已安装: oracleasm-support-3.1.1-4.el9.x86_64 完毕！ [root@rac1 ~]# dnf install -y oracleasmlib-3.1.1-1.el9.x86_64.rpm 上次元数据过期检查：1:46:39 前，执行于 2026年02月09日 星期一 11时45分00秒。 依赖关系解决。 ================================================================================================================================================================================================================================================= 软件包 架构 版本 仓库 大小 ================================================================================================================================================================================================================================================= 安装: oracleasmlib x86_64 3.1.1-1.el9 @commandline 53 k 事务概要 ================================================================================================================================================================================================================================================= 安装 1 软件包 总计：53 k 安装大小：107 k 下载软件包： 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 安装 : oracleasmlib-3.1.1-1.el9.x86_64 1/1 运行脚本: oracleasmlib-3.1.1-1.el9.x86_64 1/1 验证 : oracleasmlib-3.1.1-1.el9.x86_64 1/1 已安装: oracleasmlib-3.1.1-1.el9.x86_64 完毕！ [root@rac1 ~]# # 以交互模式运行配置实用程序以初始化配置 oracleasm configure -i [root@rac1 ~]# oracleasm configure -i Configuring the Oracle ASM system service. This will configure the on-boot properties of the Oracle ASM system service. The following questions will determine whether the service is started on boot and what permissions it will have. The current values will be shown in brackets (\u0026#39;[]\u0026#39;). Hitting \u0026lt;ENTER\u0026gt; without typing an answer will keep that current value. Ctrl-C will abort. Default user to own the ASM disk devices []: oracle Default group to own the ASM disk devices []: dba Start Oracle ASM system service on boot (y/n) [y]: y Scan for Oracle ASM disks when starting the oracleasm service (y/n) [y]: y Maximum number of ASM disks that can be used on system [2048]: 2048 Enable iofilter if kernel supports it (y/n) [y]: y Writing Oracle ASM system service configuration: done Configuration changes only come into effect after the Oracle ASM system service is restarted. Please run \u0026#39;systemctl restart oracleasm\u0026#39; after making changes. WARNING: All of your Oracle and ASM instances must be stopped prior to restarting the oracleasm service. [root@rac1 ~]# # 启用并启动oracleasm服务 systemctl enable --now oracleasm [root@rac1 ~]# systemctl enable --now oracleasm [root@rac1 ~]# # 使用 oracleasm createdisk 命令为磁盘添加标签。 fdisk /dev/sdb fdisk /dev/sdc fdisk /dev/sdd fdisk /dev/sde fdisk /dev/sdf oracleasm createdisk OCRVOTE1 /dev/sdb1 oracleasm createdisk OCRVOTE2 /dev/sdc1 oracleasm createdisk OCRVOTE3 /dev/sdd1 oracleasm createdisk DATA1 /dev/sde1 oracleasm createdisk DATA2 /dev/sdf1 oracleasm listdisks [root@rac1 ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.37.4)。 更改将停留在内存中，直到您决定将更改写入磁盘。 使用写入命令前请三思。 设备不包含可识别的分区表。 创建了一个磁盘标识符为 0xba39d816 的新 DOS 磁盘标签。 命令(输入 m 获取帮助)：n 分区类型 p 主分区 (0 primary, 0 extended, 4 free) e 扩展分区 (逻辑分区容器) 选择 (默认 p)：p 分区号 (1-4, 默认 1): 第一个扇区 (2048-10485759, 默认 2048): 最后一个扇区，+/-sectors 或 +size{K,M,G,T,P} (2048-10485759, 默认 10485759): 创建了一个新分区 1，类型为“Linux”，大小为 5 GiB。 命令(输入 m 获取帮助)：w 分区表已调整。 将调用 ioctl() 来重新读分区表。 正在同步磁盘。 [root@rac1 ~]# fdisk /dev/sdc 欢迎使用 fdisk (util-linux 2.37.4)。 更改将停留在内存中，直到您决定将更改写入磁盘。 使用写入命令前请三思。 设备不包含可识别的分区表。 创建了一个磁盘标识符为 0xdcbe1da6 的新 DOS 磁盘标签。 命令(输入 m 获取帮助)：n 分区类型 p 主分区 (0 primary, 0 extended, 4 free) e 扩展分区 (逻辑分区容器) 选择 (默认 p)：p 分区号 (1-4, 默认 1): 1 第一个扇区 (2048-10485759, 默认 2048): 最后一个扇区，+/-sectors 或 +size{K,M,G,T,P} (2048-10485759, 默认 10485759): 创建了一个新分区 1，类型为“Linux”，大小为 5 GiB。 命令(输入 m 获取帮助)：w 分区表已调整。 将调用 ioctl() 来重新读分区表。 正在同步磁盘。 [root@rac1 ~]# fdisk /dev/sdd 欢迎使用 fdisk (util-linux 2.37.4)。 更改将停留在内存中，直到您决定将更改写入磁盘。 使用写入命令前请三思。 设备不包含可识别的分区表。 创建了一个磁盘标识符为 0xfefc982e 的新 DOS 磁盘标签。 命令(输入 m 获取帮助)：n 分区类型 p 主分区 (0 primary, 0 extended, 4 free) e 扩展分区 (逻辑分区容器) 选择 (默认 p)：p 分区号 (1-4, 默认 1): 第一个扇区 (2048-10485759, 默认 2048): 最后一个扇区，+/-sectors 或 +size{K,M,G,T,P} (2048-10485759, 默认 10485759): 创建了一个新分区 1，类型为“Linux”，大小为 5 GiB。 命令(输入 m 获取帮助)：w 分区表已调整。 将调用 ioctl() 来重新读分区表。 正在同步磁盘。 [root@rac1 ~]# fdisk /dev/sde 欢迎使用 fdisk (util-linux 2.37.4)。 更改将停留在内存中，直到您决定将更改写入磁盘。 使用写入命令前请三思。 设备不包含可识别的分区表。 创建了一个磁盘标识符为 0xffa6b5a1 的新 DOS 磁盘标签。 命令(输入 m 获取帮助)：n 分区类型 p 主分区 (0 primary, 0 extended, 4 free) e 扩展分区 (逻辑分区容器) 选择 (默认 p)：p 分区号 (1-4, 默认 1): 第一个扇区 (2048-41943039, 默认 2048): 最后一个扇区，+/-sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): 创建了一个新分区 1，类型为“Linux”，大小为 20 GiB。 命令(输入 m 获取帮助)：w 分区表已调整。 将调用 ioctl() 来重新读分区表。 正在同步磁盘。 [root@rac1 ~]# fdisk /dev/sdf 欢迎使用 fdisk (util-linux 2.37.4)。 更改将停留在内存中，直到您决定将更改写入磁盘。 使用写入命令前请三思。 设备不包含可识别的分区表。 创建了一个磁盘标识符为 0xd80eda6a 的新 DOS 磁盘标签。 命令(输入 m 获取帮助)：n 分区类型 p 主分区 (0 primary, 0 extended, 4 free) e 扩展分区 (逻辑分区容器) 选择 (默认 p)：p 分区号 (1-4, 默认 1): 第一个扇区 (2048-41943039, 默认 2048): 最后一个扇区，+/-sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): 创建了一个新分区 1，类型为“Linux”，大小为 20 GiB。 命令(输入 m 获取帮助)：w 分区表已调整。 将调用 ioctl() 来重新读分区表。 正在同步磁盘。 [root@rac1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 98.1G 0 part ├─ol-root 252:0 0 90G 0 lvm / └─ol-swap 252:1 0 8.1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk └─sdb1 8:17 0 5G 0 part sdc 8:32 0 5G 0 disk └─sdc1 8:33 0 5G 0 part sdd 8:48 0 5G 0 disk └─sdd1 8:49 0 5G 0 part sde 8:64 0 20G 0 disk └─sde1 8:65 0 20G 0 part sdf 8:80 0 20G 0 disk └─sdf1 8:81 0 20G 0 part sr0 11:0 1 13.5G 0 rom [root@rac1 ~]# oracleasm createdisk OCRVOTE1 /dev/sdb1 Writing disk header: done Instantiating disk: done [root@rac1 ~]# oracleasm createdisk OCRVOTE2 /dev/sdc1 Writing disk header: done Instantiating disk: done [root@rac1 ~]# oracleasm createdisk OCRVOTE3 /dev/sdd1 Writing disk header: done Instantiating disk: done [root@rac1 ~]# oracleasm createdisk DATA1 /dev/sde1 Writing disk header: done Instantiating disk: done [root@rac1 ~]# oracleasm createdisk DATA2 /dev/sdf1 Writing disk header: done Instantiating disk: done [root@rac1 ~]# oracleasm listdisks DATA1 DATA2 OCRVOTE1 OCRVOTE2 OCRVOTE3 [root@rac1 ~]# # 安装oracleasm-support和oracleasmlib，oracleasm-support可以在通过在线yum源安装，oracleasmlib去官网下载上传安装 dnf --enablerepo=ol9_addons install oracleasm-support -y dnf install -y oracleasmlib-3.1.1-1.el9.x86_64.rpm [root@rac2 ~]# dnf --enablerepo=ol9_addons install oracleasm-support -y Oracle Linux 9 Addons (x86_64) 49 kB/s | 811 kB 00:16 上次元数据过期检查：0:00:04 前，执行于 2026年02月09日 星期一 13时36分59秒。 依赖关系解决。 ================================================================================================================================================================================================================================================= 软件包 架构 版本 仓库 大小 ================================================================================================================================================================================================================================================= 安装: oracleasm-support x86_64 3.1.1-4.el9 ol9_addons 131 k 事务概要 ================================================================================================================================================================================================================================================= 安装 1 软件包 总下载：131 k 安装大小：318 k 下载软件包： oracleasm-support-3.1.1-4.el9.x86_64.rpm 25 kB/s | 131 kB 00:05 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 总计 25 kB/s | 131 kB 00:05 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 安装 : oracleasm-support-3.1.1-4.el9.x86_64 1/1 运行脚本: oracleasm-support-3.1.1-4.el9.x86_64 1/1 Created symlink /etc/systemd/system/multi-user.target.wants/oracleasm.service → /usr/lib/systemd/system/oracleasm.service. 验证 : oracleasm-support-3.1.1-4.el9.x86_64 1/1 已安装: oracleasm-support-3.1.1-4.el9.x86_64 完毕！ [root@rac2 ~]# dnf install -y oracleasmlib-3.1.1-1.el9.x86_64.rpm 上次元数据过期检查：1:42:55 前，执行于 2026年02月09日 星期一 11时54分38秒。 依赖关系解决。 ================================================================================================================================================================================================================================================= 软件包 架构 版本 仓库 大小 ================================================================================================================================================================================================================================================= 安装: oracleasmlib x86_64 3.1.1-1.el9 @commandline 53 k 事务概要 ================================================================================================================================================================================================================================================= 安装 1 软件包 总计：53 k 安装大小：107 k 下载软件包： 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 安装 : oracleasmlib-3.1.1-1.el9.x86_64 1/1 运行脚本: oracleasmlib-3.1.1-1.el9.x86_64 1/1 验证 : oracleasmlib-3.1.1-1.el9.x86_64 1/1 已安装: oracleasmlib-3.1.1-1.el9.x86_64 完毕！ [root@rac2 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 98.1G 0 part ├─ol-root 252:0 0 90G 0 lvm / └─ol-swap 252:1 0 8.1G 0 lvm [SWAP] sdb 8:16 0 5G 0 disk └─sdb1 8:17 0 5G 0 part sdc 8:32 0 5G 0 disk └─sdc1 8:33 0 5G 0 part sdd 8:48 0 5G 0 disk └─sdd1 8:49 0 5G 0 part sde 8:64 0 20G 0 disk └─sde1 8:65 0 20G 0 part sdf 8:80 0 20G 0 disk └─sdf1 8:81 0 20G 0 part sr0 11:0 1 13.5G 0 rom # 以交互模式运行配置实用程序以初始化配置 oracleasm configure -i [root@rac2 ~]# oracleasm configure -i Configuring the Oracle ASM system service. This will configure the on-boot properties of the Oracle ASM system service. The following questions will determine whether the service is started on boot and what permissions it will have. The current values will be shown in brackets (\u0026#39;[]\u0026#39;). Hitting \u0026lt;ENTER\u0026gt; without typing an answer will keep that current value. Ctrl-C will abort. Default user to own the ASM disk devices []: oracle Default group to own the ASM disk devices []: dba Start Oracle ASM system service on boot (y/n) [y]: y Scan for Oracle ASM disks when starting the oracleasm service (y/n) [y]: y Maximum number of ASM disks that can be used on system [2048]: 2048 Enable iofilter if kernel supports it (y/n) [y]: y Writing Oracle ASM system service configuration: done Configuration changes only come into effect after the Oracle ASM system service is restarted. Please run \u0026#39;systemctl restart oracleasm\u0026#39; after making changes. WARNING: All of your Oracle and ASM instances must be stopped prior to restarting the oracleasm service. [root@rac2 ~]# # 启用并启动oracleasm服务 systemctl enable --now oracleasm [root@rac2 ~]# systemctl enable --now oracleasm [root@rac2 ~]# init 6 [root@rac2 ~]# # 重启后,查看asmdisk oracleasm listdisks [root@rac2 ~]# oracleasm listdisks DATA1 DATA2 OCRVOTE1 OCRVOTE2 OCRVOTE3 [root@rac2 ~]# 4.21 配置IO调度（可选） # 说明这里测试我们不需要调整： # cat /sys/block/${ASM_DISK}/queue/scheduler noop [deadline] cfq If the default disk I/O scheduler is not Deadline, then set it using a rules file: 1. Using a text editor, create a UDEV rules file for the Oracle ASM devices: # vi /etc/udev/rules.d/60-oracle-schedulers.rules 2. Add the following line to the rules file and save it: ACTION==\u0026#34;add|change\u0026#34;, KERNEL==\u0026#34;sd[a-z]\u0026#34;, ATTR{queue/rotational}==\u0026#34;0\u0026#34;, ATTR{queue/scheduler}=\u0026#34;deadline\u0026#34; 3. On clustered systems, copy the rules file to all other nodes on the cluster. For example: $ scp 60-oracle-schedulers.rules root@node2:/etc/udev/rules.d/ 4. Load the rules file and restart the UDEV service. For example: a. Oracle Linux and Red Hat Enterprise Linux #udevadm control --reload-rules \u0026amp;\u0026amp; udevadm trigger 操作： cat /etc/udev/rules.d/60-oracle-schedulers.rules ACTION==\u0026#34;add|change\u0026#34;, KERNEL==\u0026#34;dm-[a-z]\u0026#34;, ATTR{queue/rotational}==\u0026#34;0\u0026#34;, ATTR{queue/scheduler}=\u0026#34;deadline\u0026#34; udevadm control --reload-rules \u0026amp;\u0026amp; udevadm trigger [root@rac1 ~]# vi /etc/udev/rules.d/60-oracle-schedulers.rules [root@rac1 ~]# cat /etc/udev/rules.d/60-oracle-schedulers.rules ACTION==\u0026#34;add|change\u0026#34;, KERNEL==\u0026#34;dm-[a-z]\u0026#34;, ATTR{queue/rotational}==\u0026#34;0\u0026#34;, ATTR{queue/scheduler}=\u0026#34;deadline\u0026#34; udevadm control --reload-rules \u0026amp;\u0026amp; udevadm trigger [root@rac1 ~]# udevadm control --reload-rules \u0026amp;\u0026amp; udevadm trigger [root@rac1 ~]# cat /sys/block/dm-2/queue/scheduler [mq-deadline] kyber bfq none [root@rac1 ~]# cat /sys/block/dm-3/queue/scheduler [mq-deadline] kyber bfq none [root@rac1 ~]# cat /sys/block/dm-4/queue/scheduler [mq-deadline] kyber bfq none [root@rac1 ~]# cat /sys/block/dm-5/queue/scheduler [mq-deadline] kyber bfq none [root@rac1 ~]# cat /sys/block/dm-6/queue/scheduler [mq-deadline] kyber bfq none [root@rac1 ~]# [root@rac2 ~]# vi /etc/udev/rules.d/60-oracle-schedulers.rules [root@rac2 ~]# udevadm control --reload-rules \u0026amp;\u0026amp; udevadm trigger [root@rac2 ~]# cat /etc/udev/rules.d/60-oracle-schedulers.rules ACTION==\u0026#34;add|change\u0026#34;, KERNEL==\u0026#34;dm-[a-z]\u0026#34;, ATTR{queue/rotational}==\u0026#34;0\u0026#34;, ATTR{queue/scheduler}=\u0026#34;deadline\u0026#34; udevadm control --reload-rules \u0026amp;\u0026amp; udevadm trigger [root@rac2 ~]# cat /sys/block/dm-2/queue/scheduler [mq-deadline] kyber bfq none [root@rac2 ~]# cat /sys/block/dm-3/queue/scheduler [mq-deadline] kyber bfq none [root@rac2 ~]# cat /sys/block/dm-4/queue/scheduler [mq-deadline] kyber bfq none [root@rac2 ~]# cat /sys/block/dm-5/queue/scheduler [mq-deadline] kyber bfq none [root@rac2 ~]# cat /sys/block/dm-6/queue/scheduler [mq-deadline] kyber bfq none [root@rac2 ~]# 4.22 重启OS # 4.23 整体check脚本检查 # ################################################################################### ## 重启操作系统进行修改验证 ## 需要人工干预 ################################################################################### ################################################################################### ## 检查修改信息 ################################################################################### echo \u0026#34;###################################################################################\u0026#34; echo \u0026#34;检查修改信息\u0026#34; echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/selinux/config\u0026#34; echo cat /etc/selinux/config echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/sysconfig/network\u0026#34; echo cat /etc/sysconfig/network echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/sys/kernel/mm/transparent_hugepage/enabled\u0026#34; echo cat /sys/kernel/mm/transparent_hugepage/enabled echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/hosts\u0026#34; echo cat /etc/hosts echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/ntp.conf\u0026#34; echo cat /etc/ntp.conf echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/sysctl.conf\u0026#34; echo cat /etc/sysctl.conf echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/security/limits.conf\u0026#34; echo cat /etc/security/limits.conf echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/pam.d/login\u0026#34; echo cat /etc/pam.d/login echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/etc/profile\u0026#34; echo cat /etc/profile echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/home/grid/.bash_profile\u0026#34; echo cat /home/grid/.bash_profile echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo echo \u0026#34;/home/oracle/.bash_profile\u0026#34; echo cat /home/oracle/.bash_profile echo echo echo \u0026#34;--------------------------------systemctl------------------------------------------\u0026#34; echo systemctl status firewalld echo systemctl status avahi-daemon echo systemctl status nscd echo systemctl status ntpd echo echo echo \u0026#34;-----------------------------------------------------------------------------------\u0026#34; echo rpm -q bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat nfs-utils | grep \u0026#34;not installed\u0026#34; echo echo \u0026#34;################请仔细核对所有文件信息 !!!!!!!################\u0026#34; [root@rac1 ~]# ./check.sh ################################################################################### 检查修改信息 ----------------------------------------------------------------------------------- /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. # See also: # https://docs.oracle.com/en/operating-systems/oracle-linux/selinux/selinux-SettingSELinuxModes.html # # NOTE: In earlier Oracle Linux kernel builds, SELINUX=disabled would also # fully disable SELinux during boot. If you need a system with SELinux # fully disabled instead of SELinux running with no policy loaded, you # need to pass selinux=0 to the kernel command line. You can use grubby # to persistently set the bootloader to boot with selinux=0: # # grubby --update-kernel ALL --args selinux=0 # # To revert back to SELinux enabled: # # grubby --update-kernel ALL --remove-args selinux # SELINUX=disabled # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted ----------------------------------------------------------------------------------- /etc/sysconfig/network # Created by anaconda NOZEROCONF=yes ----------------------------------------------------------------------------------- /sys/kernel/mm/transparent_hugepage/enabled always [madvise] never ----------------------------------------------------------------------------------- /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #public ip 192.168.18.5 rac1 192.168.18.6 rac2 #private ip 18.18.18.5 rac1-priv 18.18.18.6 rac2-priv #vip 192.168.18.7 rac1-vip 192.168.18.8 rac2-vip #scanip 192.168.18.9 rac-scan ----------------------------------------------------------------------------------- /etc/ntp.conf cat: /etc/ntp.conf: 没有那个文件或目录 ----------------------------------------------------------------------------------- /etc/sysctl.conf # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. # # Vendors settings live in /usr/lib/sysctl.d/. # To override a whole file, create a new file with the same in # /etc/sysctl.d/ and put new settings there. To override # only specific settings, add a file with a lexically later # name in /etc/sysctl.d/ and put new settings there. # # For more information, see sysctl.conf(5) and sysctl.d(5). fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 3977942 kernel.shmmax = 16293650431 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.wmem_default = 16777216 fs.aio-max-nr = 6194304 vm.dirty_ratio=20 vm.dirty_background_ratio=3 vm.dirty_writeback_centisecs=100 vm.dirty_expire_centisecs=500 vm.swappiness=10 vm.min_free_kbytes=524288 net.core.netdev_max_backlog = 30000 net.core.netdev_budget = 600 #vm.nr_hugepages = net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 net.ipv4.ipfrag_time = 60 net.ipv4.ipfrag_low_thresh = 3145728 net.ipv4.ipfrag_high_thresh = 8388608 ----------------------------------------------------------------------------------- /etc/security/limits.conf # /etc/security/limits.conf # #This file sets the resource limits for the users logged in via PAM. #It does not affect resource limits of the system services. # #Also note that configuration files in /etc/security/limits.d directory, #which are read in alphabetical order, override the settings in this #file in case the domain is the same or more specific. #That means, for example, that setting a limit for wildcard domain here #can be overridden with a wildcard setting in a config file in the #subdirectory, but a user specific setting here can be overridden only #with a user specific setting in the subdirectory. # #Each line describes a limit for a user in the form: # #\u0026lt;domain\u0026gt; \u0026lt;type\u0026gt; \u0026lt;item\u0026gt; \u0026lt;value\u0026gt; # #Where: #\u0026lt;domain\u0026gt; can be: # - a user name # - a group name, with @group syntax # - the wildcard *, for default entry # - the wildcard %, can be also used with %group syntax, # for maxlogin limit # #\u0026lt;type\u0026gt; can have the two values: # - \u0026#34;soft\u0026#34; for enforcing the soft limits # - \u0026#34;hard\u0026#34; for enforcing hard limits # #\u0026lt;item\u0026gt; can be one of the following: # - core - limits the core file size (KB) # - data - max data size (KB) # - fsize - maximum filesize (KB) # - memlock - max locked-in-memory address space (KB) # - nofile - max number of open file descriptors # - rss - max resident set size (KB) # - stack - max stack size (KB) # - cpu - max CPU time (MIN) # - nproc - max number of processes # - as - address space limit (KB) # - maxlogins - max number of logins for this user # - maxsyslogins - max number of logins on the system # - priority - the priority to run user process with # - locks - max number of file locks the user can hold # - sigpending - max number of pending signals # - msgqueue - max memory used by POSIX message queues (bytes) # - nice - max nice priority allowed to raise to values: [-20, 19] # - rtprio - max realtime priority # #\u0026lt;domain\u0026gt; \u0026lt;type\u0026gt; \u0026lt;item\u0026gt; \u0026lt;value\u0026gt; # #* soft core 0 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #@student - maxlogins 4 # End of file grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 grid hard stack 32768 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 3145728 oracle hard memlock 3145728 ----------------------------------------------------------------------------------- /etc/pam.d/login #%PAM-1.0 auth substack system-auth auth include postlogin account required pam_nologin.so account include system-auth password include system-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so session required pam_limits.so ----------------------------------------------------------------------------------- /etc/profile # /etc/profile # System wide environment and startup programs, for login setup # Functions and aliases go in /etc/bashrc # It\u0026#39;s NOT a good idea to change this file unless you know what you # are doing. It\u0026#39;s much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates. pathmunge () { case \u0026#34;:${PATH}:\u0026#34; in *:\u0026#34;$1\u0026#34;:*) ;; *) if [ \u0026#34;$2\u0026#34; = \u0026#34;after\u0026#34; ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac } if [ -x /usr/bin/id ]; then if [ -z \u0026#34;$EUID\u0026#34; ]; then # ksh workaround EUID=`/usr/bin/id -u` UID=`/usr/bin/id -ru` fi USER=\u0026#34;`/usr/bin/id -un`\u0026#34; LOGNAME=$USER MAIL=\u0026#34;/var/spool/mail/$USER\u0026#34; fi # Path manipulation if [ \u0026#34;$EUID\u0026#34; = \u0026#34;0\u0026#34; ]; then pathmunge /usr/sbin pathmunge /usr/local/sbin else pathmunge /usr/local/sbin after pathmunge /usr/sbin after fi HOSTNAME=$(/usr/bin/hostnamectl --transient 2\u0026gt;/dev/null) || \\ HOSTNAME=$(/usr/bin/hostname 2\u0026gt;/dev/null) || \\ HOSTNAME=$(/usr/bin/uname -n) HISTSIZE=1000 if [ \u0026#34;$HISTCONTROL\u0026#34; = \u0026#34;ignorespace\u0026#34; ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do if [ -r \u0026#34;$i\u0026#34; ]; then if [ \u0026#34;${-#*i}\u0026#34; != \u0026#34;$-\u0026#34; ]; then . \u0026#34;$i\u0026#34; else . \u0026#34;$i\u0026#34; \u0026gt;/dev/null fi fi done unset i unset -f pathmunge if [ -n \u0026#34;${BASH_VERSION-}\u0026#34; ] ; then if [ -f /etc/bashrc ] ; then # Bash login shells run only /etc/profile # Bash non-login shells run only /etc/bashrc # Check for double sourcing is done in /etc/bashrc. . /etc/bashrc fi fi ----------------------------------------------------------------------------------- /home/grid/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs ################add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/23.0.0/grid export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=+ASM1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysasm\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; ----------------------------------------------------------------------------------- /home/oracle/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs ################ add######################### umask 022 export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/23.0.0/dbhome_1 export ORACLE_HOSTNAME=rac1 export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=orcl1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH alias sas=\u0026#39;sqlplus / as sysdba\u0026#39; export PS1=\u0026#34;[\\`whoami\\`@\\`hostname\\`:\u0026#34;\u0026#39;$PWD]\\$ \u0026#39; --------------------------------systemctl------------------------------------------ ○ firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) ○ avahi-daemon.service - Avahi mDNS/DNS-SD Stack Loaded: loaded (/usr/lib/systemd/system/avahi-daemon.service; disabled; preset: enabled) Active: inactive (dead) TriggeredBy: ○ avahi-daemon.socket Unit nscd.service could not be found. Unit ntpd.service could not be found. ----------------------------------------------------------------------------------- ################请仔细核对所有文件信息 !!!!!!!################ [root@rac1 ~]# 五、安装GI+RU # 5.1 修改软件包权限 # mkdir /soft mv LINUX.X64_2326100_grid_home.zip /soft chown -R grid:oinstall /soft cd /soft/ ll [root@rac1 ~]# mkdir /soft [root@rac1 ~]# mv LINUX.X64_2326100_grid_home.zip /soft [root@rac1 ~]# chown -R grid:oinstall /soft [root@rac1 ~]# cd /soft/ [root@rac1 soft]# ll 总用量 1064012 -rw-r--r-- 1 grid oinstall 1089544451 2月 9 14:11 LINUX.X64_2326100_grid_home.zip [root@rac1 soft]# 5.2 解压缩软件 # 5.2.1 解压缩grid 软件 # 安全软件2.7G.解压后6.0 su - grid cd /soft/ unzip -q LINUX.X64_2326100_grid_home.zip -d $ORACLE_HOME [root@rac1 soft]# su - grid Last login: Thu Oct 23 13:41:28 CST 2025 on pts/0 [grid@rac1:/home/grid]$ cd /soft/ [grid@rac1:/soft]$ unzip -q LINUX.X64_193000_grid_home.zip -d $ORACLE_HOME [grid@rac1:/soft]$ 5.2.2 升级OPatch（可选） # 不用打RU，无需操作\nunzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME opatch version [grid@rac1:/home/grid]$ opatch version OPatch Version: 12.2.0.1.17 OPatch succeeded. [grid@rac1:/u01/app/23.0.0/grid]$ mv OPatch/ OPatchbak [grid@rac1:/u01/app/23.0.0/grid]$ cd /u01/sw [grid@rac1:/u01/sw]$ unzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME [grid@rac1:/u01/sw]$ opatch version OPatch Version: 12.2.0.1.25 OPatch succeeded. 5.2.3 解压缩26.2RU（可选） # 不用打RU，无需操作\nRU软件报是2.5G.解压缩为4.4G 目录是 /u01/sw/ru/... 5.3 安装cvuqdisk软件 # cvuqdisk RPM 包含在 Oracle Grid Infrastructure 安装介质上的cv/rpm 目录中 设置环境变量 CVUQDISK_GRP，使其指向作为 cvuqdisk 的所有者所在的组（本文为 oinstall）： export CVUQDISK_GRP=oinstall 使用 CVU 验证是否满足 Oracle 集群件要求 记住要作为 grid 用户在将要执行 Oracle 安装的节点 (racnode1) 上运行。此外，必须为 grid 用户配置通过用户等效性实现的 SSH 连通性, root执行 export CVUQDISK_GRP=oinstall cd /u01/app/23.0.0/grid/cv/rpm/ ll rpm -ivh cvuqdisk-1.0.10-1.rpm [root@rac1 soft]# export CVUQDISK_GRP=oinstall [root@rac1 soft]# cd /u01/app/23.0.0/grid/cv/rpm/ [root@rac1 rpm]# ll 总用量 24 -rw-r--r-- 1 grid oinstall 24520 1月 10 01:59 cvuqdisk-1.0.10-1.rpm [root@rac1 rpm]# rpm -ivh cvuqdisk-1.0.10-1.rpm 警告：cvuqdisk-1.0.10-1.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ad986da3: NOKEY Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:cvuqdisk-1.0.10-1 ################################# [100%] [root@rac1 rpm]# 传输到第 2 个节点上和安装 [root@rac1 rpm]# scp cvuqdisk-1.0.10-1.rpm rac2:/root The authenticity of host \u0026#39;rac2 (192.168.18.6)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:2qOxLjQpn+3dH8lp3zKfDui6BjZI6/QY/NSSXQJUpDU. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac2\u0026#39; (ED25519) to the list of known hosts. root@rac2\u0026#39;s password: cvuqdisk-1.0.10-1.rpm 100% 24KB 16.9MB/s 00:00 [root@rac1 rpm]# [root@rac2 ~]# export CVUQDISK_GRP=oinstall [root@rac2 ~]# rpm -ivh cvuqdisk-1.0.10-1.rpm 警告：cvuqdisk-1.0.10-1.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ad986da3: NOKEY Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:cvuqdisk-1.0.10-1 ################################# [100%] [root@rac2 ~]# 5.4 配置grid 用户ssh（可选） # 解决密钥长度太弱，被 OL9 的 OpenSSH/系统加密策略（尤其 FIPS / FUTURE）直接拒绝（最常见：老的 1024-bit 或更小的 RSA/DSA） grid用户 mv -f /home/grid/.ssh/id_rsa /home/grid/.ssh/id_rsa.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null mv -f /home/grid/.ssh/id_rsa.pub /home/grid/.ssh/id_rsa.pub.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null ssh-keygen -t rsa -b 3072 -o -a 100 -f /home/grid/.ssh/id_rsa ll [grid@rac1:/home/grid]$ cd .ssh/ [grid@rac1:/home/grid/.ssh]$ mv -f /home/grid/.ssh/id_rsa /home/grid/.ssh/id_rsa.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null [grid@rac1:/home/grid/.ssh]$ mv -f /home/grid/.ssh/id_rsa.pub /home/grid/.ssh/id_rsa.pub.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null [grid@rac1:/home/grid/.ssh]$ ssh-keygen -t rsa -b 3072 -o -a 100 -f /home/grid/.ssh/id_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/grid/.ssh/id_rsa Your public key has been saved in /home/grid/.ssh/id_rsa.pub The key fingerprint is: SHA256:Jfko5lMkkaxhhBxPAI2w52Ig3dUsFcBgan1PHwVwNlM grid@rac1 The key\u0026#39;s randomart image is: +---[RSA 3072]----+ |+=o==++*+o*oE | |.o+Bo.=.o+ + | |+ =.+oo.= o | |o+ .. = * . | |... o S o | |.. o o | | o | | . | | | +----[SHA256]-----+ [grid@rac1:/home/grid/.ssh]$ ll 总用量 40 -rw-r--r-- 1 grid oinstall 446 2月 9 14:21 authorized_keys -rw-r--r-- 1 grid oinstall 0 2月 9 14:20 authorized_keys.tmp -rw-r--r-- 1 grid oinstall 23 2月 9 14:20 config -rw-r--r-- 1 grid oinstall 21 2月 9 14:20 config.backup -rw------- 1 grid oinstall 2590 2月 9 14:25 id_rsa -rw------- 1 grid oinstall 1032 2月 9 14:18 id_rsa.bak.2026-02-09_142457 -rw-r--r-- 1 grid oinstall 563 2月 9 14:25 id_rsa.pub -rw-r--r-- 1 grid oinstall 223 2月 9 14:18 id_rsa.pub.bak.2026-02-09_142502 -rw------- 1 grid oinstall 1620 2月 9 14:21 known_hosts -rw------- 1 grid oinstall 896 2月 9 14:21 known_hosts.old -rw-r--r-- 1 grid oinstall 86 2月 9 14:20 known_hosts.tmp [grid@rac1:/home/grid/.ssh]$ grid用户 $ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user grid -hosts \u0026#34;rac1 rac2\u0026#34; -advanced -noPromptPassphrase 这里主要为了进行安装前检查设置的。 [grid@rac1:/home/grid/.ssh]$ /u01/app/23.0.0/grid/oui/prov/resources/scripts/sshUserSetup.sh -user grid -hosts \u0026#34;rac1 rac2\u0026#34; -advanced -noPromptPassphrase The output of this script is also logged into /tmp/sshUserSetup_2026-02-09-14-26-40.log Hosts are rac1 rac2 user is grid Platform:- Linux Checking if the remote hosts are reachable PING rac1 (192.168.18.5) 56(84) 比特的数据。 64 比特，来自 rac1 (192.168.18.5): icmp_seq=1 ttl=64 时间=0.015 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=2 ttl=64 时间=0.028 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=3 ttl=64 时间=0.053 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=4 ttl=64 时间=0.044 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=5 ttl=64 时间=0.032 毫秒 --- rac1 ping 统计 --- 已发送 5 个包， 已接收 5 个包, 0% packet loss, time 4092ms rtt min/avg/max/mdev = 0.015/0.034/0.053/0.013 ms PING rac2 (192.168.18.6) 56(84) 比特的数据。 64 比特，来自 rac2 (192.168.18.6): icmp_seq=1 ttl=64 时间=0.233 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=2 ttl=64 时间=0.260 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=3 ttl=64 时间=0.235 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=4 ttl=64 时间=0.286 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=5 ttl=64 时间=0.256 毫秒 --- rac2 ping 统计 --- 已发送 5 个包， 已接收 5 个包, 0% packet loss, time 4093ms rtt min/avg/max/mdev = 0.233/0.254/0.286/0.019 ms Remote host reachability check succeeded. The following hosts are reachable: rac1 rac2. The following hosts are not reachable: . All hosts are reachable. Proceeding further... firsthost rac1 numhosts 2 The script will setup SSH connectivity from the host rac1 to all the remote hosts. After the script is executed, the user can use SSH to run commands on the remote hosts or copy files between this host rac1 and the remote hosts without being prompted for passwords or confirmations. NOTE 1: As part of the setup procedure, this script will use ssh and scp to copy files between the local host and the remote hosts. Since the script does not store passwords, you may be prompted for the passwords during the execution of the script whenever ssh or scp is invoked. NOTE 2: AS PER SSH REQUIREMENTS, THIS SCRIPT WILL SECURE THE USER HOME DIRECTORY AND THE .ssh DIRECTORY BY REVOKING GROUP AND WORLD WRITE PRIVILEGES TO THESE directories. Do you want to continue and let the script make the above mentioned changes (yes/no)? yes The user chose yes User chose to skip passphrase related questions. Creating .ssh directory on local host, if not present already Creating authorized_keys file on local host Changing permissions on authorized_keys to 644 on local host Creating known_hosts file on local host Changing permissions on known_hosts to 644 on local host Creating config file on local host If a config file exists already at /home/grid/.ssh/config, it would be backed up to /home/grid/.ssh/config.backup. Creating .ssh directory and setting permissions on remote host rac1 THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR grid. THIS IS AN SSH REQUIREMENT. The script would create ~grid/.ssh/config file on remote host rac1. If a config file exists already at ~grid/.ssh/config, it would be backed up to ~grid/.ssh/config.backup. The user may be prompted for a password here since the script would be running SSH on host rac1. Warning: Permanently added \u0026#39;rac1\u0026#39; (ED25519) to the list of known hosts. grid@rac1\u0026#39;s password: Done with creating .ssh directory and setting permissions on remote host rac1. Creating .ssh directory and setting permissions on remote host rac2 THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR grid. THIS IS AN SSH REQUIREMENT. The script would create ~grid/.ssh/config file on remote host rac2. If a config file exists already at ~grid/.ssh/config, it would be backed up to ~grid/.ssh/config.backup. The user may be prompted for a password here since the script would be running SSH on host rac2. Warning: Permanently added \u0026#39;rac2\u0026#39; (ED25519) to the list of known hosts. grid@rac2\u0026#39;s password: Done with creating .ssh directory and setting permissions on remote host rac2. Copying local host public key to the remote host rac1 The user may be prompted for a password or passphrase here since the script would be using SCP for host rac1. grid@rac1\u0026#39;s password: Done copying local host public key to the remote host rac1 Copying local host public key to the remote host rac2 The user may be prompted for a password or passphrase here since the script would be using SCP for host rac2. grid@rac2\u0026#39;s password: Done copying local host public key to the remote host rac2 Creating keys on remote host rac1 if they do not exist already. This is required to setup SSH on host rac1. Creating keys on remote host rac2 if they do not exist already. This is required to setup SSH on host rac2. Updating authorized_keys file on remote host rac1 Updating known_hosts file on remote host rac1 Updating authorized_keys file on remote host rac2 Updating known_hosts file on remote host rac2 cat: /home/grid/.ssh/known_hosts.tmp: 没有那个文件或目录 cat: /home/grid/.ssh/authorized_keys.tmp: 没有那个文件或目录 SSH setup is complete. ------------------------------------------------------------------------ Verifying SSH setup =================== The script will now run the date command on the remote nodes using ssh to verify if ssh is setup correctly. IF THE SETUP IS CORRECTLY SETUP, THERE SHOULD BE NO OUTPUT OTHER THAN THE DATE AND SSH SHOULD NOT ASK FOR PASSWORDS. If you see any output other than date or are prompted for the password, ssh is not setup correctly and you will need to resolve the issue and set up ssh again. The possible causes for failure could be: 1. The server settings in /etc/ssh/sshd_config file do not allow ssh for user grid. 2. The server may have disabled public key based authentication. 3. The client public key on the server may be outdated. 4. ~grid or ~grid/.ssh on the remote host may not be owned by grid. 5. User may not have passed -shared option for shared remote users or may be passing the -shared option for non-shared remote users. 6. If there is output in addition to the date, but no password is asked, it may be a security alert shown as part of company policy. Append the additional text to the \u0026lt;OMS HOME\u0026gt;/sysman/prov/resources/ignoreMessages.txt file. ------------------------------------------------------------------------ --rac1:-- Running /usr/bin/ssh -x -l grid rac1 date to verify SSH connectivity has been setup from local host to rac1. IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. Please note that being prompted for a passphrase may be OK but being prompted for a password is ERROR. 2026年 02月 09日 星期一 14:27:07 CST ------------------------------------------------------------------------ --rac2:-- Running /usr/bin/ssh -x -l grid rac2 date to verify SSH connectivity has been setup from local host to rac2. IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. Please note that being prompted for a passphrase may be OK but being prompted for a password is ERROR. 2026年 02月 09日 星期一 14:27:08 CST ------------------------------------------------------------------------ ------------------------------------------------------------------------ Verifying SSH connectivity has been setup from rac1 to rac1 IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. 2026年 02月 09日 星期一 14:27:08 CST ------------------------------------------------------------------------ ------------------------------------------------------------------------ Verifying SSH connectivity has been setup from rac1 to rac2 IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. 2026年 02月 09日 星期一 14:27:08 CST ------------------------------------------------------------------------ -Verification from complete- SSH verification complete. [grid@rac1:/home/grid/.ssh]$ 测试: [grid@rac1:/home/grid/.ssh]$ ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date 2026年 02月 09日 星期一 14:32:47 CST 2026年 02月 09日 星期一 14:32:47 CST The authenticity of host \u0026#39;rac1-priv (18.18.18.5)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:UafGoOKyAZbN82nQjIgXOqfFUlDzlktc9QOZpAUHh7k. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:1: rac1 ~/.ssh/known_hosts:7: rac1 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac1-priv\u0026#39; (ED25519) to the list of known hosts. 2026年 02月 09日 星期一 14:32:50 CST The authenticity of host \u0026#39;rac2-priv (18.18.18.6)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:2qOxLjQpn+3dH8lp3zKfDui6BjZI6/QY/NSSXQJUpDU. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:2: rac2 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac2-priv\u0026#39; (ED25519) to the list of known hosts. 2026年 02月 09日 星期一 14:32:52 CST [grid@rac1:/home/grid/.ssh]$ ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date 2026年 02月 09日 星期一 14:32:55 CST 2026年 02月 09日 星期一 14:32:55 CST 2026年 02月 09日 星期一 14:32:56 CST 2026年 02月 09日 星期一 14:32:56 CST [grid@rac1:/home/grid/.ssh]$ oracle用户--oracle采用的图形方法 $ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user oracle -hosts \u0026#34;rac1 rac2\u0026#34; -advanced -noPromptPassphrase 普通配置方法\n分别配置 grid 和 oracle 用户的 ssh 两个节点都执行 # su - oracle $ mkdir -p ~/.ssh $ chmod 700 ~/.ssh $ ssh-keygen -t rsa -\u0026gt;回车-\u0026gt;回车-\u0026gt;回车 $ ssh-keygen -t dsa -\u0026gt;回车-\u0026gt;回车-\u0026gt;回车 ---------------------------------------------------------------- # su - oracle $ mkdir ~/.ssh $ chmod 700 ~/.ssh $ ssh-keygen -t rsa -\u0026gt;回车-\u0026gt;回车-\u0026gt;回车 $ ssh-keygen -t dsa -\u0026gt;回车-\u0026gt;回车-\u0026gt;回车 以上两个节点都执行，下面就一个节点执行即可 $ cat ~/.ssh/id_rsa.pub \u0026gt;\u0026gt; ~/.ssh/authorized_keys $ cat ~/.ssh/id_dsa.pub \u0026gt;\u0026gt; ~/.ssh/authorized_keys $ ssh rac2 cat ~/.ssh/id_rsa.pub \u0026gt;\u0026gt; ~/.ssh/authorized_keys -\u0026gt;输入 rac2 密码 $ ssh rac2 cat ~/.ssh/id_dsa.pub \u0026gt;\u0026gt; ~/.ssh/authorized_keys -\u0026gt;输入 rac2 密码 $ scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys -\u0026gt;输入 rac2 密码 测试两节点连通性： $ ssh rac1 date $ ssh rac2 date $ ssh rac1-priv date $ ssh rac2-priv date $ ssh rac1 date $ ssh rac2 date $ ssh rac1-priv date $ ssh rac2-priv date 5.5 安装前检查 # GRID 安装完成，在进行集群校验时，因为 SCAN NAME 没有使用 DNS 解析报失败，此情况正常，忽略 在 grid 软件目录里运行以下命令： 使用 CVU 验证硬件和操作系统设置 ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -fixup -verbose ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose ./runcluvfy.sh stage -post hwos -n rac1,rac2 -verbos 在grid的ORACLE_HOME下 执行./runcluvfy.sh stage -post hwos -n rac1,rac2 -verbos export CVUQDISK_GRP=oinstall ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose [grid@rac1:/home/grid/.ssh]$ export CVUQDISK_GRP=oinstall [grid@rac1:/home/grid/.ssh]$ cd $ORACLE_HOME [grid@rac1:/u01/app/23.0.0/grid]$ ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -fixup -verbose Initializing ... Performing following verification checks ... 物理内存 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 15.6121GB (1.637052E7KB) 8GB (8388608.0KB) 通过 rac1 15.6121GB (1.637052E7KB) 8GB (8388608.0KB) 通过 物理内存 ...通过 可用物理内存 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 14.9835GB (1.5711288E7KB) 50MB (51200.0KB) 通过 rac1 14.6003GB (1.5309504E7KB) 50MB (51200.0KB) 通过 可用物理内存 ...通过 交换空间大小 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 16.0977GB (1.6879612E7KB) 15.6121GB (1.637052E7KB) 通过 rac1 16.0977GB (1.6879612E7KB) 15.6121GB (1.637052E7KB) 通过 交换空间大小 ...通过 空闲空间: rac2:/usr,rac2:/var,rac2:/etc,rac2:/sbin,rac2:/tmp ... 路径 节点名 装载点 可用 必需 状态 ---------------- ------------ ------------ ------------ ------------ ------------ /usr rac2 / 80.6934GB 25MB 通过 /var rac2 / 80.6934GB 5MB 通过 /etc rac2 / 80.6934GB 25MB 通过 /sbin rac2 / 80.6934GB 10MB 通过 /tmp rac2 / 80.6934GB 1GB 通过 空闲空间: rac2:/usr,rac2:/var,rac2:/etc,rac2:/sbin,rac2:/tmp ...通过 空闲空间: rac1:/usr,rac1:/var,rac1:/etc,rac1:/sbin,rac1:/tmp ... 路径 节点名 装载点 可用 必需 状态 ---------------- ------------ ------------ ------------ ------------ ------------ /usr rac1 / 74.4733GB 25MB 通过 /var rac1 / 74.4733GB 5MB 通过 /etc rac1 / 74.4733GB 25MB 通过 /sbin rac1 / 74.4733GB 10MB 通过 /tmp rac1 / 74.4733GB 1GB 通过 空闲空间: rac1:/usr,rac1:/var,rac1:/etc,rac1:/sbin,rac1:/tmp ...通过 用户存在性: grid ... 节点名 状态 注释 ------------ ------------------------ ------------------------ rac2 通过 存在(54331) rac1 通过 存在(54331) 具有相同 UID 的用户: 54331 ...通过 用户存在性: grid ...通过 组存在性: asmadmin ... 节点名 状态 注释 ------------ ------------------------ ------------------------ rac2 通过 存在 rac1 通过 存在 组存在性: asmadmin ...通过 组存在性: asmdba ... 节点名 状态 注释 ------------ ------------------------ ------------------------ rac2 通过 存在 rac1 通过 存在 组存在性: asmdba ...通过 组存在性: oinstall ... 节点名 状态 注释 ------------ ------------------------ ------------------------ rac2 通过 存在 rac1 通过 存在 组存在性: oinstall ...通过 组成员资格: asmdba ... 节点名 用户存在 组存在 组中的用户 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 是 是 是 通过 rac1 是 是 是 通过 组成员资格: asmdba ...通过 组成员资格: asmadmin ... 节点名 用户存在 组存在 组中的用户 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 是 是 是 通过 rac1 是 是 是 通过 组成员资格: asmadmin ...通过 组成员资格: oinstall(主) ... 节点名 用户存在 组存在 组中的用户 主 状态 ---------------- ------------ ------------ ------------ ------------ ------------ rac2 是 是 是 是 通过 rac1 是 是 是 是 通过 组成员资格: oinstall(主) ...通过 运行级别 ... 节点名 运行级别 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 5 3,5 通过 rac1 5 3,5 通过 运行级别 ...通过 硬性限制: 打开的文件描述符的最大数 ... 节点名 类型 可用 必需 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 硬性 65536 65536 通过 rac1 硬性 65536 65536 通过 硬性限制: 打开的文件描述符的最大数 ...通过 软性限制: 打开的文件描述符的最大数 ... 节点名 类型 可用 必需 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 软性 1024 1024 通过 rac1 软性 1024 1024 通过 软性限制: 打开的文件描述符的最大数 ...通过 硬性限制: 最大用户进程数 ... 节点名 类型 可用 必需 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 硬性 16384 16384 通过 rac1 硬性 16384 16384 通过 硬性限制: 最大用户进程数 ...通过 软性限制: 最大用户进程数 ... 节点名 类型 可用 必需 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 软性 2047 2047 通过 rac1 软性 2047 2047 通过 软性限制: 最大用户进程数 ...通过 软性限制: 最大堆栈大小 ... 节点名 类型 可用 必需 状态 ---------------- ------------ ------------ ------------ ---------------- rac2 软性 10240 10240 通过 rac1 软性 10240 10240 通过 软性限制: 最大堆栈大小 ...通过 体系结构 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 x86_64 x86_64 通过 rac1 x86_64 x86_64 通过 体系结构 ...通过 操作系统内核版本 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 6.12.0-105.51.5.el9uek.x86_64 5.15.0 通过 rac1 6.12.0-105.51.5.el9uek.x86_64 5.15.0 通过 操作系统内核版本 ...通过 操作系统内核参数: semmsl ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 250 250 250 通过 rac2 250 250 250 通过 操作系统内核参数: semmsl ...通过 操作系统内核参数: semmns ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 32000 32000 32000 通过 rac2 32000 32000 32000 通过 操作系统内核参数: semmns ...通过 操作系统内核参数: semopm ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 100 100 100 通过 rac2 100 100 100 通过 操作系统内核参数: semopm ...通过 操作系统内核参数: semmni ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 128 128 128 通过 rac2 128 128 128 通过 操作系统内核参数: semmni ...通过 操作系统内核参数: shmmax ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 16763412479 16763412479 8381706240 通过 rac2 16763412479 16763412479 8381706240 通过 操作系统内核参数: shmmax ...通过 操作系统内核参数: shmmni ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 4096 4096 4096 通过 rac2 4096 4096 4096 通过 操作系统内核参数: shmmni ...通过 操作系统内核参数: shmall ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 4092630 4092630 4092629 通过 rac2 4092630 4092630 4092629 通过 操作系统内核参数: shmall ...通过 操作系统内核参数: file-max ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 6815744 6815744 6815744 通过 rac2 6815744 6815744 6815744 通过 操作系统内核参数: file-max ...通过 操作系统内核参数: ip_local_port_range ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 between 9000 \u0026amp; 65500 between 9000 \u0026amp; 65500 between 9000 \u0026amp; 65535 通过 rac2 between 9000 \u0026amp; 65500 between 9000 \u0026amp; 65500 between 9000 \u0026amp; 65535 通过 操作系统内核参数: ip_local_port_range ...通过 操作系统内核参数: rmem_default ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 16777216 16777216 262144 通过 rac2 16777216 16777216 262144 通过 操作系统内核参数: rmem_default ...通过 操作系统内核参数: rmem_max ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 16777216 16777216 4194304 通过 rac2 16777216 16777216 4194304 通过 操作系统内核参数: rmem_max ...通过 操作系统内核参数: wmem_default ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 16777216 16777216 262144 通过 rac2 16777216 16777216 262144 通过 操作系统内核参数: wmem_default ...通过 操作系统内核参数: wmem_max ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 16777216 16777216 1048576 通过 rac2 16777216 16777216 1048576 通过 操作系统内核参数: wmem_max ...通过 操作系统内核参数: aio-max-nr ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 6194304 6194304 1048576 通过 rac2 6194304 6194304 1048576 通过 操作系统内核参数: aio-max-nr ...通过 操作系统内核参数: panic_on_oops ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 1 1 1 通过 rac2 1 1 1 通过 操作系统内核参数: panic_on_oops ...通过 操作系统内核参数: kernel.panic ... 节点名 当前值 已配置 必需 状态 注释 ---------------- ------------ ------------ ------------ ------------ ------------ rac1 2 2 at least 1 通过 rac2 2 2 at least 1 通过 操作系统内核参数: kernel.panic ...通过 包: binutils-2.35.2 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 binutils-2.35.2-67.0.1.el9_7.1 binutils-2.35.2 通过 rac1 binutils-2.35.2-67.0.1.el9_7.1 binutils-2.35.2 通过 包: binutils-2.35.2 ...通过 包: compat-openssl11-1.1.1 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 compat-openssl11(x86_64)-1.1.1k-5.el9_6.1 compat-openssl11(x86_64)-1.1.1 通过 rac1 compat-openssl11(x86_64)-1.1.1k-5.el9_6.1 compat-openssl11(x86_64)-1.1.1 通过 包: compat-openssl11-1.1.1 (x86_64) ...通过 包: fontconfig-2.14.0 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 fontconfig(x86_64)-2.14.0-2.el9_1 fontconfig(x86_64)-2.14.0 通过 rac1 fontconfig(x86_64)-2.14.0-2.el9_1 fontconfig(x86_64)-2.14.0 通过 包: fontconfig-2.14.0 (x86_64) ...通过 包: libxcrypt-compat-4.4.18 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 libxcrypt-compat-4.4.18-3.el9 libxcrypt-compat-4.4.18 通过 rac1 libxcrypt-compat-4.4.18-3.el9 libxcrypt-compat-4.4.18 通过 包: libxcrypt-compat-4.4.18 ...通过 包: libgcc-11.3.1 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 libgcc(x86_64)-11.5.0-11.0.2.el9 libgcc(x86_64)-11.3.1 通过 rac1 libgcc(x86_64)-11.5.0-11.0.2.el9 libgcc(x86_64)-11.3.1 通过 包: libgcc-11.3.1 (x86_64) ...通过 包: libstdc++-11.3.1 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 libstdc++(x86_64)-11.5.0-11.0.2.el9 libstdc++(x86_64)-11.3.1 通过 rac1 libstdc++(x86_64)-11.5.0-11.0.2.el9 libstdc++(x86_64)-11.3.1 通过 包: libstdc++-11.3.1 (x86_64) ...通过 包: sysstat-12.5.4 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 sysstat-12.5.4-9.0.2.el9 sysstat-12.5.4 通过 rac1 sysstat-12.5.4-9.0.2.el9 sysstat-12.5.4 通过 包: sysstat-12.5.4 ...通过 包: make-4.3 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 make-4.3-8.el9 make-4.3 通过 rac1 make-4.3-8.el9 make-4.3 通过 包: make-4.3 ...通过 包: glibc-2.34 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 glibc(x86_64)-2.34-231.0.1.el9_7.2 glibc(x86_64)-2.34 通过 rac1 glibc(x86_64)-2.34-231.0.1.el9_7.2 glibc(x86_64)-2.34 通过 包: glibc-2.34 (x86_64) ...通过 包: glibc-devel-2.34 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 glibc-devel(x86_64)-2.34-231.0.1.el9_7.2 glibc-devel(x86_64)-2.34 通过 rac1 glibc-devel(x86_64)-2.34-231.0.1.el9_7.2 glibc-devel(x86_64)-2.34 通过 包: glibc-devel-2.34 (x86_64) ...通过 包: libaio-0.3.111 (x86_64) ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 libaio(x86_64)-0.3.111-13.el9 libaio(x86_64)-0.3.111 通过 rac1 libaio(x86_64)-0.3.111-13.el9 libaio(x86_64)-0.3.111 通过 包: libaio-0.3.111 (x86_64) ...通过 包: nfs-utils-2.5.4 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 nfs-utils-2.5.4-38.0.1.el9 nfs-utils-2.5.4 通过 rac1 nfs-utils-2.5.4-38.0.1.el9 nfs-utils-2.5.4 通过 包: nfs-utils-2.5.4 ...通过 包: smartmontools-7.2-6 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 smartmontools-7.2-9.el9 smartmontools-7.2-6 通过 rac1 smartmontools-7.2-9.el9 smartmontools-7.2-6 通过 包: smartmontools-7.2-6 ...通过 包: net-tools-2.0-0.62 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 net-tools-2.0-0.64.20160912git.el9 net-tools-2.0-0.62 通过 rac1 net-tools-2.0-0.64.20160912git.el9 net-tools-2.0-0.62 通过 包: net-tools-2.0-0.62 ...通过 包: policycoreutils-3.5-1 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 policycoreutils-3.6-3.el9 policycoreutils-3.5-1 通过 rac1 policycoreutils-3.6-3.el9 policycoreutils-3.5-1 通过 包: policycoreutils-3.5-1 ...通过 包: policycoreutils-python-utils-3.5-1 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 policycoreutils-python-utils-3.6-3.el9 policycoreutils-python-utils-3.5-1 通过 rac1 policycoreutils-python-utils-3.6-3.el9 policycoreutils-python-utils-3.5-1 通过 包: policycoreutils-python-utils-3.5-1 ...通过 具有相同 UID 的用户: 0 ...通过 当前组 ID ...通过 Root 用户一致性 ... 节点名 状态 ------------------------------------ ------------------------ rac2 通过 rac1 通过 Root 用户一致性 ...通过 包: psmisc-22.6-19 ... 节点名 可用 必需 状态 ------------ ------------------------ ------------------------ ---------- rac2 psmisc-23.4-3.el9 psmisc-22.6-19 通过 rac1 psmisc-23.4-3.el9 psmisc-22.6-19 通过 包: psmisc-22.6-19 ...通过 主机名 ...通过 节点连接性 ... 主机文件 ... 节点名 状态 ------------------------------------ ------------------------ rac1 通过 rac2 通过 主机文件 ...通过 节点 \u0026#34;rac1\u0026#34; 的接口信息 名称 IP 地址 子网 网关 默认网关 HW 地址 MTU ------ --------------- --------------- --------------- --------------- ----------------- ------ ens160 192.168.18.5 192.168.18.0 0.0.0.0 192.168.18.2 00:0C:29:30:0F:D9 1500 ens192 18.18.18.5 18.18.18.0 0.0.0.0 192.168.18.2 00:0C:29:30:0F:E3 1500 节点 \u0026#34;rac2\u0026#34; 的接口信息 名称 IP 地址 子网 网关 默认网关 HW 地址 MTU ------ --------------- --------------- --------------- --------------- ----------------- ------ ens160 192.168.18.6 192.168.18.0 0.0.0.0 192.168.18.2 00:0C:29:CC:64:2D 1500 ens192 18.18.18.6 18.18.18.0 0.0.0.0 192.168.18.2 00:0C:29:CC:64:37 1500 检查: 子网 \u0026#34;192.168.18.0\u0026#34; 的 MTU 一致性。 节点 名称 IP 地址 子网 MTU ---------------- ------------ ------------ ------------ ---------------- rac1 ens160 192.168.18.5 192.168.18.0 1500 rac2 ens160 192.168.18.6 192.168.18.0 1500 检查: 子网 \u0026#34;18.18.18.0\u0026#34; 的 MTU 一致性。 节点 名称 IP 地址 子网 MTU ---------------- ------------ ------------ ------------ ---------------- rac1 ens192 18.18.18.5 18.18.18.0 1500 rac2 ens192 18.18.18.6 18.18.18.0 1500 源 目标 是否已连接? -------------------------- -------------------------- -------------------------- rac1[ens160:192.168.18.5] rac2[ens160:192.168.18.6] 是 源 目标 是否已连接? -------------------------- -------------------------- -------------------------- rac1[ens192:18.18.18.5] rac2[ens192:18.18.18.6] 是 检查流经子网的最大 (MTU) 大小数据包 ...通过 子网 \u0026#34;192.168.18.0\u0026#34; 的子网掩码一致性 ...通过 子网 \u0026#34;18.18.18.0\u0026#34; 的子网掩码一致性 ...通过 节点连接性 ...通过 多点传送或广播检查 ... 正在检查子网 \u0026#34;192.168.18.0\u0026#34; 是否能够与多点传送组 \u0026#34;224.0.0.251\u0026#34; 进行多点传送通信 子网 网络类型 Multicast Enabled ------------ ------------------------ ------------------------ 192.168.18.0 PUBLIC TRUE 多点传送或广播检查 ...通过 网络时间协议 (NTP) ...通过 相同核心文件名模式 ...通过 用户掩码 ... 节点名 可用 必需 注释 ------------ ------------------------ ------------------------ ---------- rac2 0022 0022 通过 rac1 0022 0022 通过 用户掩码 ...通过 用户不在组中 \u0026#34;root\u0026#34;: grid ... 节点名 状态 注释 ------------ ------------------------ ------------------------ rac2 通过 不存在 rac1 通过 不存在 用户不在组中 \u0026#34;root\u0026#34;: grid ...通过 时区一致性 ...通过 Path existence, ownership, permissions and attributes ... Path \u0026#34;/var\u0026#34; ...通过 Path \u0026#34;/dev/shm\u0026#34; ...通过 Path existence, ownership, permissions and attributes ...通过 节点之间的时间偏移量 ...通过 resolv.conf 完整性 ... 节点名 状态 ------------------------------------ ------------------------ rac1 通过 rac2 通过 检查 \u0026#34;/etc/resolv.conf\u0026#34; 中指定的每个名称服务器对名称 \u0026#34;rac1\u0026#34; 的响应 节点名 源 注释 状态 ------------ ------------------------ ------------------------ ---------- rac1 192.168.18.2 IPv4 通过 检查 \u0026#34;/etc/resolv.conf\u0026#34; 中指定的每个名称服务器对名称 \u0026#34;rac2\u0026#34; 的响应 节点名 源 注释 状态 ------------ ------------------------ ------------------------ ---------- rac2 192.168.18.2 IPv4 通过 resolv.conf 完整性 ...通过 DNS/NIS 名称服务 ...通过 守护程序 \u0026#34;avahi-daemon\u0026#34; 未配置且未运行 ... 节点名 已配置 状态 ------------ ------------------------ ------------------------ rac2 否 通过 rac1 否 通过 节点名 正在运行? 状态 ------------ ------------------------ ------------------------ rac2 否 通过 rac1 否 通过 守护程序 \u0026#34;avahi-daemon\u0026#34; 未配置且未运行 ...通过 守护程序 \u0026#34;proxyt\u0026#34; 未配置且未运行 ... 节点名 已配置 状态 ------------ ------------------------ ------------------------ rac2 否 通过 rac1 否 通过 节点名 正在运行? 状态 ------------ ------------------------ ------------------------ rac2 否 通过 rac1 否 通过 守护程序 \u0026#34;proxyt\u0026#34; 未配置且未运行 ...通过 域套接字 ...通过 等同用户 ...通过 RPM Package Manager 数据库 ...信息 (PRVG-11250) 最大锁定内存检查 ...通过 /dev/shm 作为临时文件系统装载 ...通过 proc 文件系统的文件系统装载选项 hidepid ...通过 SCP 二进制文件检查 ...通过 Systemd 登录管理器 IPC 参数 ...通过 cgroup 操作系统兼容性 ...信息 (PRVG-11250) ORAchk health score ...信息 (PRVH-1507) 集群服务设置 的预检查成功。 RPM Package Manager 数据库 ...信息 PRVG-11250 : 由于检查 \u0026#34;RPM Package Manager 数据库\u0026#34; 需要 \u0026#39;root\u0026#39; 用户权限，未执行该检查。 Refer to My Oracle Support notes \u0026#34;2548970.1\u0026#34; for more details regarding errors PRVG-11250\u0026#34;. cgroup 操作系统兼容性 ...信息 PRVG-11250 : 由于检查 \u0026#34;cgroup 操作系统兼容性\u0026#34; 需要 \u0026#39;root\u0026#39; 用户权限，未执行该检查。 Refer to My Oracle Support notes \u0026#34;2548970.1\u0026#34; for more details regarding errors PRVG-11250\u0026#34;. ORAchk health score ...信息 PRVH-1507 : ORAchk/EXAchk checks are skipped. CVU 操作已执行: stage -pre crsinst 日期: 2026年2月9日 下午4:46:00 CVU 版本： 23.26.1.0.0 (010926x8664) CVU 主目录: /u01/app/23.0.0/grid 用户: grid 操作系统: Linux6.12.0-105.51.5.el9uek.x86_64 没有要修复的可修复验证故障 [grid@rac1:/u01/app/23.0.0/grid]$ 5.6 执行安装 # export DISPLAY=192.168.18.1:0.0 -推荐用mobaXterm方便 执行安装程序开始安装，通过-applyRU参数指向补丁解压位置，提前安装grid补丁 ./gridSetup.sh -applyRU /soft/32545008 cd $ORACLE_HOME ./gridSetup.sh 本次不需要升级: [grid@rac1:/home/grid]$ cd $ORACLE_HOME [grid@rac1:/u01/app/23.0.0/grid]$ ./gridSetup.sh 正在启动 Oracle Grid Infrastructure 安装向导... 5.6.1 图形截图 # 选择为新集群配置GI。\n填写集群名称和scan名字，scan名字和/etc/hosts一致\n添加节点二信息，进行互信\n确保对应网卡和IP网段对应即可，19C心跳网段需要选ASM \u0026amp; Private，用于ASM实例的托管\n选择Oracle Flex ASM\n冗余选择普通，选择/dev/oracleasm/disks/OCRVOTE01，/dev/oracleasm/disks/OCRVOTE02，/dev/oracleasm/disks/OCRVOTE03\n输入密码oracle\n启用自动自行更正\n不启动IPMI\n不注册EM\n核对用户组\n安装目录选择\n选择oraInventory目录\n下一步\n预检查\n忽略全部，下一步\nGI软件安装汇总，开始安装\n5.6.2 执行脚本 # [root@rac1 ~]# /u01/app/oraInventory/orainstRoot.sh 更改权限/u01/app/oraInventory. 添加组的读取和写入权限。 删除全局的读取, 写入和执行权限。 更改组名/u01/app/oraInventory 到 oinstall. 脚本的执行已完成。 [root@rac1 ~]# /u01/app/23.0.0/grid/root.sh Performing root user operation. The following environment variables are set as: ORACLE_OWNER= grid ORACLE_HOME= /u01/app/23.0.0/grid Enter the full pathname of the local bin directory: [/usr/local/bin]: Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ... Creating /etc/oratab file... Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. RAC option enabled on: Linux Executing command \u0026#39;/u01/app/23.0.0/grid/perl/bin/perl -I/u01/app/23.0.0/grid/perl/lib -I/u01/app/23.0.0/grid/crs/install /u01/app/23.0.0/grid/crs/install/rootcrs.pl \u0026#39; Using configuration parameter file: /u01/app/23.0.0/grid/crs/install/crsconfig_params The log of current session can be found at: /u01/app/grid/crsdata/rac1/crsconfig/rootcrs_rac1_2026-02-09_05-11-40PM.log 2026/02/09 17:11:44 CLSRSC-594: 执行 18 的安装步骤 1: \u0026#39;ValidateEnv\u0026#39;。 2026/02/09 17:11:44 CLSRSC-594: 执行 18 的安装步骤 2: \u0026#39;CheckRootCert\u0026#39;。 2026/02/09 17:11:45 CLSRSC-594: 执行 18 的安装步骤 3: \u0026#39;GenSiteGUIDs\u0026#39;。 2026/02/09 17:11:46 CLSRSC-594: 执行 18 的安装步骤 4: \u0026#39;SetupOSD\u0026#39;。 Redirecting to /bin/systemctl restart rsyslog.service 2026/02/09 17:11:46 CLSRSC-594: 执行 18 的安装步骤 5: \u0026#39;CheckCRSConfig\u0026#39;。 2026/02/09 17:11:46 CLSRSC-594: 执行 18 的安装步骤 6: \u0026#39;SetupLocalGPNP\u0026#39;。 2026/02/09 17:11:49 CLSRSC-594: 执行 18 的安装步骤 7: \u0026#39;CreateRootCert\u0026#39;。 2026/02/09 17:12:01 CLSRSC-594: 执行 18 的安装步骤 8: \u0026#39;ConfigOLR\u0026#39;。 2026/02/09 17:12:04 CLSRSC-594: 执行 18 的安装步骤 9: \u0026#39;ConfigCHMOS\u0026#39;。 2026/02/09 17:12:04 CLSRSC-594: 执行 18 的安装步骤 10: \u0026#39;CreateOHASD\u0026#39;。 2026/02/09 17:12:05 CLSRSC-594: 执行 18 的安装步骤 11: \u0026#39;ConfigOHASD\u0026#39;。 2026/02/09 17:12:13 CLSRSC-330: 正在向文件 \u0026#39;oracle-ohasd.service\u0026#39; 添加集群件条目 2026/02/09 17:12:30 CLSRSC-594: 执行 18 的安装步骤 12: \u0026#39;SetupTFA\u0026#39;。 2026/02/09 17:12:30 CLSRSC-594: 执行 18 的安装步骤 13: \u0026#39;InstallACFS\u0026#39;。 2026/02/09 17:12:52 CLSRSC-594: 执行 18 的安装步骤 14: \u0026#39;CheckFirstNode\u0026#39;。 2026/02/09 17:12:53 CLSRSC-594: 执行 18 的安装步骤 15: \u0026#39;InitConfig\u0026#39;。 2026/02/09 17:13:30 CLSRSC-4002: 已成功安装 Oracle Autonomous Health Framework (AHF)。 CRS-4256: 更新概要文件 已成功添加表决磁盘 7ecae8014ddb4f2fbf737811e66686a1。 已成功添加表决磁盘 b1bb79c499b04f7cbf69083bb5a9af99。 已成功添加表决磁盘 810f931fe52a4f63bf0d474beeca2518。 已成功将表决磁盘组替换为 +OCRVOTE。 CRS-4256: 更新概要文件 CRS-4266: 已成功替换表决文件 ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 7ecae8014ddb4f2fbf737811e66686a1 (/dev/oracleasm/disks/OCRVOTE01) [OCRVOTE] 2. ONLINE b1bb79c499b04f7cbf69083bb5a9af99 (/dev/oracleasm/disks/OCRVOTE03) [OCRVOTE] 3. ONLINE 810f931fe52a4f63bf0d474beeca2518 (/dev/oracleasm/disks/OCRVOTE02) [OCRVOTE] 找到了 3 个表决磁盘。 2026/02/09 17:14:00 CLSRSC-594: 执行 18 的安装步骤 16: \u0026#39;StartCluster\u0026#39;。 2026/02/09 17:14:32 CLSRSC-343: 已成功启动 Oracle Clusterware 堆栈 2026/02/09 17:14:34 CLSRSC-594: 执行 18 的安装步骤 17: \u0026#39;ConfigNode\u0026#39;。 clscfg: EXISTING configuration version 23 detected. Successfully accumulated necessary OCR keys. Creating OCR keys for user \u0026#39;root\u0026#39;, privgrp \u0026#39;root\u0026#39;.. Operation successful. 2026/02/09 17:15:27 CLSRSC-594: 执行 18 的安装步骤 18: \u0026#39;PostConfig\u0026#39;。 2026/02/09 17:15:37 CLSRSC-325: 为集群配置 Oracle Grid Infrastructure...成功 [root@rac1 ~]# [root@rac2 ~]# /u01/app/oraInventory/orainstRoot.sh 更改权限/u01/app/oraInventory. 添加组的读取和写入权限。 删除全局的读取, 写入和执行权限。 更改组名/u01/app/oraInventory 到 oinstall. 脚本的执行已完成。 [root@rac2 ~]# /u01/app/23.0.0/grid/root.sh Performing root user operation. The following environment variables are set as: ORACLE_OWNER= grid ORACLE_HOME= /u01/app/23.0.0/grid Enter the full pathname of the local bin directory: [/usr/local/bin]: Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ... Creating /etc/oratab file... Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. RAC option enabled on: Linux Executing command \u0026#39;/u01/app/23.0.0/grid/perl/bin/perl -I/u01/app/23.0.0/grid/perl/lib -I/u01/app/23.0.0/grid/crs/install /u01/app/23.0.0/grid/crs/install/rootcrs.pl \u0026#39; Using configuration parameter file: /u01/app/23.0.0/grid/crs/install/crsconfig_params The log of current session can be found at: /u01/app/grid/crsdata/rac2/crsconfig/rootcrs_rac2_2026-02-09_05-15-49PM.log 2026/02/09 17:15:53 CLSRSC-594: 执行 18 的安装步骤 1: \u0026#39;ValidateEnv\u0026#39;。 2026/02/09 17:15:53 CLSRSC-594: 执行 18 的安装步骤 2: \u0026#39;CheckRootCert\u0026#39;。 2026/02/09 17:15:54 CLSRSC-594: 执行 18 的安装步骤 3: \u0026#39;GenSiteGUIDs\u0026#39;。 2026/02/09 17:15:54 CLSRSC-594: 执行 18 的安装步骤 4: \u0026#39;SetupOSD\u0026#39;。 Redirecting to /bin/systemctl restart rsyslog.service 2026/02/09 17:15:54 CLSRSC-594: 执行 18 的安装步骤 5: \u0026#39;CheckCRSConfig\u0026#39;。 2026/02/09 17:15:55 CLSRSC-594: 执行 18 的安装步骤 6: \u0026#39;SetupLocalGPNP\u0026#39;。 2026/02/09 17:15:55 CLSRSC-594: 执行 18 的安装步骤 7: \u0026#39;CreateRootCert\u0026#39;。 2026/02/09 17:15:55 CLSRSC-594: 执行 18 的安装步骤 8: \u0026#39;ConfigOLR\u0026#39;。 2026/02/09 17:15:58 CLSRSC-594: 执行 18 的安装步骤 9: \u0026#39;ConfigCHMOS\u0026#39;。 2026/02/09 17:15:58 CLSRSC-594: 执行 18 的安装步骤 10: \u0026#39;CreateOHASD\u0026#39;。 2026/02/09 17:15:59 CLSRSC-594: 执行 18 的安装步骤 11: \u0026#39;ConfigOHASD\u0026#39;。 2026/02/09 17:15:59 CLSRSC-330: 正在向文件 \u0026#39;oracle-ohasd.service\u0026#39; 添加集群件条目 2026/02/09 17:16:16 CLSRSC-594: 执行 18 的安装步骤 12: \u0026#39;SetupTFA\u0026#39;。 2026/02/09 17:16:16 CLSRSC-594: 执行 18 的安装步骤 13: \u0026#39;InstallACFS\u0026#39;。 2026/02/09 17:16:40 CLSRSC-594: 执行 18 的安装步骤 14: \u0026#39;CheckFirstNode\u0026#39;。 2026/02/09 17:16:40 CLSRSC-594: 执行 18 的安装步骤 15: \u0026#39;InitConfig\u0026#39;。 2026/02/09 17:17:04 CLSRSC-4002: 已成功安装 Oracle Autonomous Health Framework (AHF)。 2026/02/09 17:17:04 CLSRSC-594: 执行 18 的安装步骤 16: \u0026#39;StartCluster\u0026#39;。 2026/02/09 17:17:36 CLSRSC-343: 已成功启动 Oracle Clusterware 堆栈 2026/02/09 17:17:36 CLSRSC-594: 执行 18 的安装步骤 17: \u0026#39;ConfigNode\u0026#39;。 2026/02/09 17:17:36 CLSRSC-594: 执行 18 的安装步骤 18: \u0026#39;PostConfig\u0026#39;。 2026/02/09 17:17:37 CLSRSC-325: 为集群配置 Oracle Grid Infrastructure...成功 [root@rac2 ~]# 继续执行图形，忽略\n5.6.3 检查 # su - grid crsctl stat res -t systemctl status oracle-ohasd.service [grid@rac1:/home/grid]$ crsctl stat res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.LISTENER.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.chad ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.cvuadmin OFFLINE OFFLINE rac1 STABLE OFFLINE OFFLINE rac2 STABLE ora.helper OFFLINE OFFLINE rac1 STABLE OFFLINE OFFLINE rac2 IDLE,STABLE ora.net1.network ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.ons ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE rac1 STABLE ora.OCRVOTE.dg(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.asm(ora.asmgroup) 1 ONLINE ONLINE rac1 Started,STABLE 2 ONLINE ONLINE rac2 Started,STABLE ora.asmnet1.asmnetwork(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.cdp1.cdp 1 OFFLINE OFFLINE STABLE ora.cvu 1 ONLINE ONLINE rac1 STABLE ora.cvuhelper 1 OFFLINE OFFLINE STABLE ora.rac1.vip 1 ONLINE ONLINE rac1 STABLE ora.rac2.vip 1 ONLINE ONLINE rac2 STABLE ora.rhpserver 1 OFFLINE OFFLINE STABLE ora.scan1.vip 1 ONLINE ONLINE rac1 STABLE -------------------------------------------------------------------------------- [grid@rac1:/home/grid]$ systemctl status oracle-ohasd.service ● oracle-ohasd.service - Oracle High Availability Services Loaded: loaded (/etc/systemd/system/oracle-ohasd.service; enabled; preset: disabled) Drop-In: /etc/systemd/system/oracle-ohasd.service.d └─00_oracle-ohasd.conf Active: active (running) since Mon 2026-02-09 17:12:14 CST; 10min ago Main PID: 14770 (init.ohasd) Tasks: 491 (limit: 101883) Memory: 2.5G (peak: 2.8G) CPU: 2min 23.223s CGroup: /oracle.slice/oracle-ohasd.service ├─14770 /bin/sh /etc/oracle/scls_scr/rac1/root/init.ohasd run \u0026#34;\u0026gt;/dev/null\u0026#34; \u0026#34;2\u0026gt;\u0026amp;1\u0026#34; \u0026#34;\u0026lt;/dev/null\u0026#34; ├─25714 /u01/app/23.0.0/grid/bin/ohasd.bin reboot \u0026#34;BLOCKING_STACK_LOCALE_OHAS=SIMPLIFIED CHINESE_CHINA.AL32UTF8;CRS_AUX_DATA=CRS_AUXD_FASTCSS=yes\u0026#34; ├─25794 /u01/app/23.0.0/grid/bin/orarootagent.bin ├─25974 /u01/app/23.0.0/grid/bin/oraagent.bin ├─25996 /u01/app/23.0.0/grid/bin/mdnsd.bin ├─25999 /u01/app/23.0.0/grid/bin/evmd.bin ├─26032 /u01/app/23.0.0/grid/bin/gpnpd.bin ├─26079 /u01/app/23.0.0/grid/bin/gipcd.bin ├─26104 /u01/app/23.0.0/grid/bin/evmlogger.bin ├─26164 /u01/app/23.0.0/grid/bin/cssdmonitor ├─26167 /u01/app/23.0.0/grid/bin/osysmond.bin ├─26212 /u01/app/23.0.0/grid/python/bin/python /u01/app/23.0.0/grid/pylib/chmdiag.zip start -f \u0026#34;-n rac1\u0026#34; ├─26228 /u01/app/23.0.0/grid/bin/cssdagent ├─26279 /u01/app/23.0.0/grid/bin/onmd.bin \u0026#34;\u0026#34; -S 1 -F ├─26282 /u01/app/23.0.0/grid/bin/ocssd.bin \u0026#34;\u0026#34; -S 1 -F ├─26356 /u01/app/23.0.0/grid/bin/crfelsnr -n rac1 ├─26669 asm_pmon_+ASM1 ├─26673 asm_clmn_+ASM1 ├─26677 asm_psp0_+ASM1 ├─26681 asm_vktm_+ASM1 ├─26688 asm_gen0_+ASM1 ├─26693 asm_mman_+ASM1 ├─26699 asm_lmon_+ASM1 ├─26703 asm_gen2_+ASM1 ├─26705 asm_vosd_+ASM1 ├─26707 asm_lms0_+ASM1 ├─26714 asm_diag_+ASM1 ├─26716 asm_ping_+ASM1 ├─26720 asm_pman_+ASM1 ├─26722 asm_dia0_+ASM1 ├─26726 asm_dia1_+ASM1 ├─26728 asm_lmd0_+ASM1 ├─26730 asm_lmhb_+ASM1 ├─26733 asm_lck1_+ASM1 ├─26736 asm_dbw0_+ASM1 ├─26738 asm_lgwr_+ASM1 ├─26740 asm_ckpt_+ASM1 ├─26743 asm_smon_+ASM1 ├─26746 asm_lreg_+ASM1 ├─26752 asm_pxmn_+ASM1 ├─26757 asm_rbal_+ASM1 ├─26761 asm_gmon_+ASM1 ├─26764 asm_mmon_+ASM1 ├─26767 asm_mmnl_+ASM1 ├─26774 asm_bg00_+ASM1 ├─26784 asm_bg01_+ASM1 ├─26792 asm_bg02_+ASM1 ├─26797 asm_bg03_+ASM1 ├─26807 asm_dt00_+ASM1 ├─26809 asm_dt01_+ASM1 ├─26816 asm_imr0_+ASM1 ├─26821 asm_lck0_+ASM1 ├─26844 asm_gcw0_+ASM1 ├─26846 asm_gcr0_+ASM1 ├─26989 /u01/app/23.0.0/grid/bin/crsd.bin reboot ├─27006 asm_asmb_+ASM1 ├─27016 oracle+ASM1_asmb_+asm1 \u0026#34;(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))\u0026#34; ├─27030 asm_o000_+ASM1 ├─27032 oracle+ASM1_o000_+asm1 \u0026#34;(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))\u0026#34; ├─27048 oracle+ASM1_ocr \u0026#34;(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))\u0026#34; ├─27102 asm_gcr1_+ASM1 ├─28236 /u01/app/23.0.0/grid/bin/orarootagent.bin ├─28263 /u01/app/23.0.0/grid/bin/oraagent.bin ├─28865 /u01/app/23.0.0/grid/bin/tnslsnr LISTENER_SCAN1 -no_crs_notify -inherit ├─29146 /u01/app/23.0.0/grid/opmn/bin/ons -d ├─29147 /u01/app/23.0.0/grid/opmn/bin/ons -d ├─30271 /u01/app/23.0.0/grid/bin/tnslsnr LISTENER -no_crs_notify -inherit ├─30517 asm_r000_+ASM1 ├─30806 /u01/app/23.0.0/grid/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit ├─30861 oracle+ASM1 \u0026#34;(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))\u0026#34; ├─35326 oracle+ASM1 \u0026#34;(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))\u0026#34; ├─43330 /u01/app/23.0.0/grid/jdk/bin/java -server -Xms30M -Xmx1024M -Djava.awt.headless=true -Ddisable.checkForUpdate=true -DTRACING.ENABLED=false -XX:ParallelGCThreads=1 -cp /opt/oracle.ahf/common/jlib/cha.jar:/opt/oracle.ahf/\u0026gt; └─43805 asm_ppa7_+ASM1 [grid@rac1:/home/grid]$ 六、创建磁盘组 # 图形化操作，创建DATA磁盘组\nasmca 七、安装Oracle软件 # 7.1 修改软件包权限 # mv LINUX.X64_2326100_db_home.zip /soft cd /soft chown oracle:oinstall LINUX.X64_2326100_db_home.zip [root@rac1 ~]# mv LINUX.X64_2326100_db_home.zip /soft [root@rac1 ~]# cd /soft [root@rac1 soft]# chown oracle:oinstall LINUX.X64_2326100_db_home.zip [root@rac1 soft]# 7.2 解压缩到oracle_home # su - oracle unzip -q /soft/LINUX.X64_2326100_db_home.zip -d $ORACLE_HOME [root@rac1 soft]# su - oracle Last login: Thu Oct 23 11:59:22 CST 2025 on pts/0 [oracle@rac1:/home/oracle]$ unzip -q /soft/LINUX.X64_193000_db_home.zip -d $ORACLE_HOME [oracle@rac1:/home/oracle]$ 7.3 升级opatch版本（可选） # 这里不需要升级\n[oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1/OPatchbak]$ ./opatch version OPatch Version: 12.2.0.1.17 OPatch succeeded. [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1]$ mv OPatch/ OPatchbak [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1]$ unzip /u01/sw/p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1/OPatchbak]$ ./opatch version OPatch Version: 12.2.0.1.17 OPatch succeeded. 7.4 安装Oracle软件 # # 解决密钥长度太弱，被 OL9 的 OpenSSH/系统加密策略（尤其 FIPS / FUTURE）直接拒绝（最常见：老的 1024-bit 或更小的 RSA/DSA） # oracle用户 mv -f /home/oracle/.ssh/id_rsa /home/oracle/.ssh/id_rsa.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null mv -f /home/oracle/.ssh/id_rsa.pub /home/oracle/.ssh/id_rsa.pub.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null ssh-keygen -t rsa -b 3072 -o -a 100 -f /home/oracle/.ssh/id_rsa [root@rac1 soft]# su - oracle [oracle@rac1:/home/oracle]$ unzip -q /soft/LINUX.X64_2326100_db_home.zip -d $ORACLE_HOME [oracle@rac1:/home/oracle]$ mv -f /home/oracle/.ssh/id_rsa /home/oracle/.ssh/id_rsa.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null mv -f /home/oracle/.ssh/id_rsa.pub /home/oracle/.ssh/id_rsa.pub.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null [oracle@rac1:/home/oracle]$ [oracle@rac1:/home/oracle]$ ssh-keygen -t rsa -b 3072 -o -a 100 -f /home/oracle/.ssh/id_rsa Generating public/private rsa key pair. Created directory \u0026#39;/home/oracle/.ssh\u0026#39;. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/oracle/.ssh/id_rsa Your public key has been saved in /home/oracle/.ssh/id_rsa.pub The key fingerprint is: SHA256:ERB1OJItsmLqVJ75YcEhBTJBrtUlb1KKL/EK86ysYjo oracle@rac1 The key\u0026#39;s randomart image is: +---[RSA 3072]----+ |.=..+.=*o.. | |. o+.B+ +o | | .+ *o+o.. | |..o=.= . | |+o+.= . S | |.* * o | |o + o . | |E+ . | |Oo | +----[SHA256]-----+ [oracle@rac1:/home/oracle]$ [root@rac2 ~]# su - oracle [oracle@rac2:/home/oracle]$ mv -f /home/oracle/.ssh/id_rsa /home/oracle/.ssh/id_rsa.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null [oracle@rac2:/home/oracle]$ mv -f /home/oracle/.ssh/id_rsa.pub /home/oracle/.ssh/id_rsa.pub.bak.$(date +%F_%H%M%S) 2\u0026gt;/dev/null [oracle@rac2:/home/oracle]$ ssh-keygen -t rsa -b 3072 -o -a 100 -f /home/oracle/.ssh/id_rsa Generating public/private rsa key pair. Created directory \u0026#39;/home/oracle/.ssh\u0026#39;. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/oracle/.ssh/id_rsa Your public key has been saved in /home/oracle/.ssh/id_rsa.pub The key fingerprint is: SHA256:zMcWTvW8OkT3fiPpirl4EnwZtN3eExJu9Pqn82Xqx/I oracle@rac2 The key\u0026#39;s randomart image is: +---[RSA 3072]----+ | . | | . . = | | . = = * | | o * + * = | | . S B + = o| | o = . +.+ | | o oo.o*| | ...o ..++B| | .o+...o+BE| +----[SHA256]-----+ [oracle@rac2:/home/oracle]$ #oracle用户 $ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user oracle -hosts \u0026#34;rac1 rac2\u0026#34; -advanced -noPromptPassphrase /u01/app/oracle/product/23.0.0/dbhome_1/oui/prov/resources/scripts/sshUserSetup.sh -user oracle -hosts \u0026#34;rac1 rac2\u0026#34; -advanced -noPromptPassphrase #测试 ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date [oracle@rac1:/home/oracle]$ /u01/app/oracle/product/23.0.0/dbhome_1/oui/prov/resources/scripts/sshUserSetup.sh -user oracle -hosts \u0026#34;rac1 rac2\u0026#34; -advanced -noPromptPassphrase The output of this script is also logged into /tmp/sshUserSetup_2026-02-09-17-32-34.log Hosts are rac1 rac2 user is oracle Platform:- Linux Checking if the remote hosts are reachable PING rac1 (192.168.18.5) 56(84) 比特的数据。 64 比特，来自 rac1 (192.168.18.5): icmp_seq=1 ttl=64 时间=0.019 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=2 ttl=64 时间=0.020 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=3 ttl=64 时间=0.019 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=4 ttl=64 时间=0.027 毫秒 64 比特，来自 rac1 (192.168.18.5): icmp_seq=5 ttl=64 时间=0.024 毫秒 --- rac1 ping 统计 --- 已发送 5 个包， 已接收 5 个包, 0% packet loss, time 4102ms rtt min/avg/max/mdev = 0.019/0.021/0.027/0.003 ms PING rac2 (192.168.18.6) 56(84) 比特的数据。 64 比特，来自 rac2 (192.168.18.6): icmp_seq=1 ttl=64 时间=0.235 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=2 ttl=64 时间=0.176 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=3 ttl=64 时间=0.359 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=4 ttl=64 时间=0.236 毫秒 64 比特，来自 rac2 (192.168.18.6): icmp_seq=5 ttl=64 时间=0.201 毫秒 --- rac2 ping 统计 --- 已发送 5 个包， 已接收 5 个包, 0% packet loss, time 4093ms rtt min/avg/max/mdev = 0.176/0.241/0.359/0.062 ms Remote host reachability check succeeded. The following hosts are reachable: rac1 rac2. The following hosts are not reachable: . All hosts are reachable. Proceeding further... firsthost rac1 numhosts 2 The script will setup SSH connectivity from the host rac1 to all the remote hosts. After the script is executed, the user can use SSH to run commands on the remote hosts or copy files between this host rac1 and the remote hosts without being prompted for passwords or confirmations. NOTE 1: As part of the setup procedure, this script will use ssh and scp to copy files between the local host and the remote hosts. Since the script does not store passwords, you may be prompted for the passwords during the execution of the script whenever ssh or scp is invoked. NOTE 2: AS PER SSH REQUIREMENTS, THIS SCRIPT WILL SECURE THE USER HOME DIRECTORY AND THE .ssh DIRECTORY BY REVOKING GROUP AND WORLD WRITE PRIVILEGES TO THESE directories. Do you want to continue and let the script make the above mentioned changes (yes/no)? yes The user chose yes User chose to skip passphrase related questions. Creating .ssh directory on local host, if not present already Creating authorized_keys file on local host Changing permissions on authorized_keys to 644 on local host Creating known_hosts file on local host Changing permissions on known_hosts to 644 on local host Creating config file on local host If a config file exists already at /home/oracle/.ssh/config, it would be backed up to /home/oracle/.ssh/config.backup. Creating .ssh directory and setting permissions on remote host rac1 THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR oracle. THIS IS AN SSH REQUIREMENT. The script would create ~oracle/.ssh/config file on remote host rac1. If a config file exists already at ~oracle/.ssh/config, it would be backed up to ~oracle/.ssh/config.backup. The user may be prompted for a password here since the script would be running SSH on host rac1. Warning: Permanently added \u0026#39;rac1\u0026#39; (ED25519) to the list of known hosts. oracle@rac1\u0026#39;s password: Done with creating .ssh directory and setting permissions on remote host rac1. Creating .ssh directory and setting permissions on remote host rac2 THE SCRIPT WOULD ALSO BE REVOKING WRITE PERMISSIONS FOR group AND others ON THE HOME DIRECTORY FOR oracle. THIS IS AN SSH REQUIREMENT. The script would create ~oracle/.ssh/config file on remote host rac2. If a config file exists already at ~oracle/.ssh/config, it would be backed up to ~oracle/.ssh/config.backup. The user may be prompted for a password here since the script would be running SSH on host rac2. Warning: Permanently added \u0026#39;rac2\u0026#39; (ED25519) to the list of known hosts. oracle@rac2\u0026#39;s password: Done with creating .ssh directory and setting permissions on remote host rac2. Copying local host public key to the remote host rac1 The user may be prompted for a password or passphrase here since the script would be using SCP for host rac1. oracle@rac1\u0026#39;s password: Done copying local host public key to the remote host rac1 Copying local host public key to the remote host rac2 The user may be prompted for a password or passphrase here since the script would be using SCP for host rac2. oracle@rac2\u0026#39;s password: Done copying local host public key to the remote host rac2 Creating keys on remote host rac1 if they do not exist already. This is required to setup SSH on host rac1. Creating keys on remote host rac2 if they do not exist already. This is required to setup SSH on host rac2. Updating authorized_keys file on remote host rac1 Updating known_hosts file on remote host rac1 Updating authorized_keys file on remote host rac2 Updating known_hosts file on remote host rac2 cat: /home/oracle/.ssh/known_hosts.tmp: 没有那个文件或目录 cat: /home/oracle/.ssh/authorized_keys.tmp: 没有那个文件或目录 SSH setup is complete. ------------------------------------------------------------------------ Verifying SSH setup =================== The script will now run the date command on the remote nodes using ssh to verify if ssh is setup correctly. IF THE SETUP IS CORRECTLY SETUP, THERE SHOULD BE NO OUTPUT OTHER THAN THE DATE AND SSH SHOULD NOT ASK FOR PASSWORDS. If you see any output other than date or are prompted for the password, ssh is not setup correctly and you will need to resolve the issue and set up ssh again. The possible causes for failure could be: 1. The server settings in /etc/ssh/sshd_config file do not allow ssh for user oracle. 2. The server may have disabled public key based authentication. 3. The client public key on the server may be outdated. 4. ~oracle or ~oracle/.ssh on the remote host may not be owned by oracle. 5. User may not have passed -shared option for shared remote users or may be passing the -shared option for non-shared remote users. 6. If there is output in addition to the date, but no password is asked, it may be a security alert shown as part of company policy. Append the additional text to the \u0026lt;OMS HOME\u0026gt;/sysman/prov/resources/ignoreMessages.txt file. ------------------------------------------------------------------------ --rac1:-- Running /usr/bin/ssh -x -l oracle rac1 date to verify SSH connectivity has been setup from local host to rac1. IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. Please note that being prompted for a passphrase may be OK but being prompted for a password is ERROR. 2026年 02月 09日 星期一 17:32:58 CST ------------------------------------------------------------------------ --rac2:-- Running /usr/bin/ssh -x -l oracle rac2 date to verify SSH connectivity has been setup from local host to rac2. IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. Please note that being prompted for a passphrase may be OK but being prompted for a password is ERROR. 2026年 02月 09日 星期一 17:32:58 CST ------------------------------------------------------------------------ ------------------------------------------------------------------------ Verifying SSH connectivity has been setup from rac1 to rac1 IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. 2026年 02月 09日 星期一 17:32:59 CST ------------------------------------------------------------------------ ------------------------------------------------------------------------ Verifying SSH connectivity has been setup from rac1 to rac2 IF YOU SEE ANY OTHER OUTPUT BESIDES THE OUTPUT OF THE DATE COMMAND OR IF YOU ARE PROMPTED FOR A PASSWORD HERE, IT MEANS SSH SETUP HAS NOT BEEN SUCCESSFUL. 2026年 02月 09日 星期一 17:32:59 CST ------------------------------------------------------------------------ -Verification from complete- SSH verification complete. [oracle@rac1:/home/oracle]$ ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date 2026年 02月 09日 星期一 17:33:36 CST 2026年 02月 09日 星期一 17:33:36 CST The authenticity of host \u0026#39;rac1-priv (18.18.18.5)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:VK0Kdy20xxkoQcLyTehBp3rFhniGOtJF8exmt5+dK1c. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:1: rac1 ~/.ssh/known_hosts:2: rac2 ~/.ssh/known_hosts:3: rac1 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac1-priv\u0026#39; (ED25519) to the list of known hosts. 2026年 02月 09日 星期一 17:33:38 CST The authenticity of host \u0026#39;rac2-priv (18.18.18.6)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:VK0Kdy20xxkoQcLyTehBp3rFhniGOtJF8exmt5+dK1c. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:1: rac1 ~/.ssh/known_hosts:2: rac2 ~/.ssh/known_hosts:3: rac1 ~/.ssh/known_hosts:4: rac1-priv Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac2-priv\u0026#39; (ED25519) to the list of known hosts. 2026年 02月 09日 星期一 17:33:38 CST [oracle@rac1:/home/oracle]$ ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date 2026年 02月 09日 星期一 17:33:40 CST 2026年 02月 09日 星期一 17:33:40 CST 2026年 02月 09日 星期一 17:33:41 CST 2026年 02月 09日 星期一 17:33:40 CST [oracle@rac1:/home/oracle]$ [oracle@rac2:/home/oracle]$ ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date 2026年 02月 09日 星期一 17:33:57 CST 2026年 02月 09日 星期一 17:33:57 CST The authenticity of host \u0026#39;rac1-priv (18.18.18.5)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:VK0Kdy20xxkoQcLyTehBp3rFhniGOtJF8exmt5+dK1c. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:1: rac1 ~/.ssh/known_hosts:2: rac2 ~/.ssh/known_hosts:3: rac1 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac1-priv\u0026#39; (ED25519) to the list of known hosts. 2026年 02月 09日 星期一 17:33:59 CST The authenticity of host \u0026#39;rac2-priv (18.18.18.6)\u0026#39; can\u0026#39;t be established. ED25519 key fingerprint is SHA256:VK0Kdy20xxkoQcLyTehBp3rFhniGOtJF8exmt5+dK1c. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:1: rac1 ~/.ssh/known_hosts:2: rac2 ~/.ssh/known_hosts:3: rac1 ~/.ssh/known_hosts:4: rac1-priv Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added \u0026#39;rac2-priv\u0026#39; (ED25519) to the list of known hosts. 2026年 02月 09日 星期一 17:34:00 CST [oracle@rac2:/home/oracle]$ ssh rac1 date;ssh rac2 date;ssh rac1-priv date;ssh rac2-priv date 2026年 02月 09日 星期一 17:34:03 CST 2026年 02月 09日 星期一 17:34:02 CST 2026年 02月 09日 星期一 17:34:03 CST 2026年 02月 09日 星期一 17:34:03 CST [oracle@rac2:/home/oracle]$ 7.5 安装截图 # 图形化安装\n[oracle@rac1:/home/oracle]$ cd $ORACLE_HOME [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1]$ ./runInstaller 正在启动 Oracle AI 数据库安装向导... 确认版本\n[oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 19:57:59 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; 八、创建数据库 # 8.1 数据库规划 # 规划内容 规划描述 内存规划 SGA PGA processes 1000 字符集 AL32UTF8 归档模式 非 redo 5组 每组200M undo 2G 自动扩展 最大4G temp 4G 闪回配置 4G大小 8.2 dbca建库 # 使用 dbca创建数据库。\n[oracle@rac1:/home/oracle]$ dbca 高级安装\n选择一般用途\n选择节点\n选择创建数据库名，是否包含PDB\n选择数据库安装路径和管理方式\n是否启动FRA和归档\n不使用vault\n内存配置\nprocess配置\n字符集配置\nEM配置\n用户密码\n执行下一步\n检查\n安装汇总\n安装完成\n确认版本信息\nset lines 200 col status for a10 col action for a10 col action_time for a30 col description for a60 select patch_id,patch_type,action,status,action_time,description from dba_registry_sqlpatch; [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:23:23 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; set lines 200 col status for a10 col action for a10 col action_time for a30 col description for a60 select patch_id,patch_type,action,status,action_time,description from dba_registry_sqlpatch;SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; PATCH_ID PATCH_TYPE ACTION STATUS ACTION_TIME DESCRIPTION ---------- ---------- ---------- ---------- ------------------------------ ------------------------------------------------------------ 38743669 RU APPLY SUCCESS 09-FEB-26 08.18.07.139595 PM Database Release Update : 23.26.1.0.0 (38743669) Gold Image SQL\u0026gt; 8.3 连接测试 # 8.3.1 连接CDB # startup show pdbs set linesize 300 select \u0026#39;DB Name: \u0026#39; ||Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;DB_Name\u0026#39;)|| \u0026#39; / CDB?: \u0026#39; ||case when Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;CDB_Name\u0026#39;) is not null then \u0026#39;YES\u0026#39; else \u0026#39;NO\u0026#39; end|| \u0026#39; / Auth-ID: \u0026#39; ||Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;Authenticated_Identity\u0026#39;)|| \u0026#39; / Sessn-User: \u0026#39;||Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;Session_User\u0026#39;)|| \u0026#39; / Container: \u0026#39; ||Nvl(Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;Con_Name\u0026#39;), \u0026#39;n/a\u0026#39;) \u0026#34;Who am I?\u0026#34; from Dual / [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:27:07 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup ORACLE instance started. Total System Global Area 5030262392 bytes Fixed Size 5019256 bytes Variable Size 1258291200 bytes Database Buffers 3758096384 bytes Redo Buffers 8855552 bytes Database mounted. Database opened. SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO SQL\u0026gt; set linesize 300 SQL\u0026gt; select \u0026#39;DB Name: \u0026#39; ||Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;DB_Name\u0026#39;)|| \u0026#39; / CDB?: \u0026#39; ||case when Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;CDB_Name\u0026#39;) is not null then \u0026#39;YES\u0026#39; else \u0026#39;NO\u0026#39; end|| \u0026#39; / Auth-ID: \u0026#39; ||Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;Authenticated_Identity\u0026#39;)|| \u0026#39; / Sessn-User: \u0026#39;||Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;Session_User\u0026#39;)|| \u0026#39; / Container: \u0026#39; ||Nvl(Sys_Context(\u0026#39;Userenv\u0026#39;, \u0026#39;Con_Name\u0026#39;), \u0026#39;n/a\u0026#39;) \u0026#34;Who am I?\u0026#34; from Dual /SQL\u0026gt; 2 3 4 5 6 7 8 9 10 11 12 Who am I? ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ DB Name: orcl / CDB?: YES / Auth-ID: oracle / Sessn-User: SYS / Container: CDB$ROOT SQL\u0026gt; 8.3.2 连接pdb # ORACLE_PDB_SID方式\nexport ORACLE_PDB_SID=pdb1 [oracle@rac1:/home/oracle]$ export ORACLE_PDB_SID=pdb1 [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:30:59 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO SQL\u0026gt; SET CONTAINER方式\nALTER SESSION SET CONTAINER = PDB1; [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:39:06 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO SQL\u0026gt; ALTER SESSION SET CONTAINER = PDB1; Session altered. SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO SQL\u0026gt; exit Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 [oracle@rac1:/home/oracle]$ sqlplus \u0026#34;sys/oracle@//192.168.18.9/pdb1 as sysdba\u0026#34; SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:44:04 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO SQL\u0026gt; service方式+tnsnames.ora\n[oracle@rac1:/home/oracle]$ lsnrctl status LSNRCTL for Linux: Version 23.26.1.0.0 - Production on 09-FEB-2026 20:40:30 Copyright (c) 1991, 2026, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 23.26.1.0.0 - Production Start Date 09-FEB-2026 17:15:20 Uptime 0 days 3 hr. 25 min. 10 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/23.0.0/grid/network/admin/listener.ora Listener Log File /u01/app/grid/diag/tnslsnr/rac1/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.5)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.7)(PORT=1521))) Services Summary... Service \u0026#34;+ASM\u0026#34; has 1 instance(s). Instance \u0026#34;+ASM1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;+ASM_DATA\u0026#34; has 1 instance(s). Instance \u0026#34;+ASM1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;+ASM_OCRVOTE\u0026#34; has 1 instance(s). Instance \u0026#34;+ASM1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;48945b67d121c623e063399b5e6478e6\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;4a642eb750c86927e0630612a8c0345a\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orcl\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orclXDB\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orcl_pdb1\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;pdb1\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... The command completed successfully [oracle@rac1:/home/oracle]$ cd $ORACLE_HOME/network/admin [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1/network/admin]$ vi tnsnames.ora [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1/network/admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/23.0.0/dbhome_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) PDB1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1) ) ) [oracle@rac1:/u01/app/oracle/product/23.0.0/dbhome_1/network/admin]$ sqlplus sys/oracle@PDB1 as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:41:26 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; show con_name CON_NAME ------------------------------ PDB1 SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO SQL\u0026gt; tow_task\nexport TWO_TASK=PDB tow_task连接方式 普通用户。 sys加上密码 sys不加密码方式 [oracle@rac1:/home/oracle]$ export TWO_TASK=pdb1 [oracle@rac1:/home/oracle]$ sqlplus \u0026#34;sys/oracle as sysdba\u0026#34; SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:33:42 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO SQL\u0026gt; exit Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:34:43 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. ERROR: ORA-01017: 身份证明无效或未授权；登录被拒绝 Help: https://docs.oracle.com/error-help/db/ora-01017/ Enter user-name: ERROR: ORA-01017: invalid credential or not authorized; logon denied Help: https://docs.oracle.com/error-help/db/ora-01017/ Enter user-name: ERROR: ORA-01017: invalid credential or not authorized; logon denied Help: https://docs.oracle.com/error-help/db/ora-01017/ SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus Help: https://docs.oracle.com/error-help/db/sp2-0157/ [oracle@rac1:/home/oracle]$ sqlplus system/oracle SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:35:05 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Last Successful login time: Mon Feb 09 2026 20:18:35 +08:00 Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; show con_name CON_NAME ------------------------------ PDB1 SQL\u0026gt; exit Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 [oracle@rac1:/home/oracle]$ PS:使用no-sys和sys密码的方式是可以登录的，但是 sqlplus / as sysdba是不允许的 8.3.3 datafile # set lines 200 col CON_ID for 99999999 col CON_NAME for a20 col TABLESPACE_NAME for a20 col FILE_NAME for a80 WITH CONTAINERS AS ( SELECT PDB_ID CON_ID, PDB_NAME CON_NAME FROM DBA_PDBS UNION SELECT 1 CON_ID, \u0026#39;CDB$ROOT\u0026#39; CON_NAME FROM DUAL) SELECT CON_ID,CON_NAME,TABLESPACE_NAME,FILE_NAME FROM CDB_DATA_FILES INNER JOIN CONTAINERS USING (CON_ID) UNION SELECT CON_ID,CON_NAME,TABLESPACE_NAME,FILE_NAME FROM CDB_TEMP_FILES INNER JOIN CONTAINERS USING (CON_ID) ORDER BY 1, 3; [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:45:56 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; set lines 200 col CON_ID for 99999999 col CON_NAME for a20 col TABLESPACE_NAME for a20 SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; col FILE_NAME for a80 WITH CONTAINERS AS ( SELECT PDB_ID CON_ID, PDB_NAME CON_NAME FROM DBA_PDBS UNION SQL\u0026gt; 2 3 4 SELECT 1 CON_ID, \u0026#39;CDB$ROOT\u0026#39; CON_NAME FROM DUAL) SELECT CON_ID,CON_NAME,TABLESPACE_NAME,FILE_NAME 5 6 FROM CDB_DATA_FILES INNER JOIN CONTAINERS USING (CON_ID) UNION SELECT CON_ID,CON_NAME,TABLESPACE_NAME,FILE_NAME FROM CDB_TEMP_FILES INNER JOIN CONTAINERS USING (CON_ID) 7 8 9 10 ORDER BY 1, 3; CON_ID CON_NAME TABLESPACE_NAME FILE_NAME --------- -------------------- -------------------- -------------------------------------------------------------------------------- 1 CDB$ROOT SYSAUX +DATA/ORCL/DATAFILE/sysaux.260.1224793043 1 CDB$ROOT SYSTEM +DATA/ORCL/DATAFILE/system.258.1224793011 1 CDB$ROOT TEMP +DATA/ORCL/TEMPFILE/temp.267.1224793071 1 CDB$ROOT UNDOTBS1 +DATA/ORCL/DATAFILE/undotbs1.257.1224793011 1 CDB$ROOT UNDOTBS2 +DATA/ORCL/DATAFILE/undotbs2.269.1224793131 1 CDB$ROOT USERS +DATA/ORCL/DATAFILE/users.262.1224793057 3 PDB1 SYSAUX +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/sysaux.275.1224793307 3 PDB1 SYSTEM +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/system.274.1224793307 3 PDB1 TEMP +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/TEMPFILE/temp.276.1224793327 3 PDB1 UNDOTBS1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/undotbs1.273.1224793307 3 PDB1 UNDO_5 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/undo_5.277.1224793323 CON_ID CON_NAME TABLESPACE_NAME FILE_NAME --------- -------------------- -------------------- -------------------------------------------------------------------------------- 3 PDB1 USERS +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/users.278.1224793335 12 rows selected. SQL\u0026gt; 九、RAC日常管理命令 # 9.1 集群资源状态 # crsctl stat res -t [grid@rac1:/home/grid]$ crsctl stat res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.LISTENER.lsnr ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.chad ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.cvuadmin OFFLINE OFFLINE rac1 STABLE OFFLINE OFFLINE rac2 STABLE ora.helper OFFLINE OFFLINE rac1 STABLE OFFLINE OFFLINE rac2 IDLE,STABLE ora.net1.network ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE ora.ons ONLINE ONLINE rac1 STABLE ONLINE ONLINE rac2 STABLE -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.DATA.dg(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE rac1 STABLE ora.OCRVOTE.dg(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.asm(ora.asmgroup) 1 ONLINE ONLINE rac1 Started,STABLE 2 ONLINE ONLINE rac2 Started,STABLE ora.asmnet1.asmnetwork(ora.asmgroup) 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.cdp1.cdp 1 OFFLINE OFFLINE STABLE ora.cvu 1 ONLINE ONLINE rac1 STABLE ora.cvuhelper 1 OFFLINE OFFLINE STABLE ora.orcl.db 1 ONLINE ONLINE rac1 Open,HOME=/u01/app/o racle/product/23.0.0 /dbhome_1,STABLE 2 ONLINE ONLINE rac2 Open,HOME=/u01/app/o racle/product/23.0.0 /dbhome_1,STABLE ora.orcl.orcl_pdb1.svc 1 ONLINE ONLINE rac1 STABLE 2 ONLINE ONLINE rac2 STABLE ora.orcl.pdb1.pdb 1 ONLINE ONLINE rac1 READ WRITE,STABLE 2 ONLINE ONLINE rac2 READ WRITE,STABLE ora.rac1.vip 1 ONLINE ONLINE rac1 STABLE ora.rac2.vip 1 ONLINE ONLINE rac2 STABLE ora.rhpserver 1 OFFLINE OFFLINE STABLE ora.scan1.vip 1 ONLINE ONLINE rac1 STABLE -------------------------------------------------------------------------------- [grid@rac1:/home/grid]$ 9.2 集群服务状态 # crsctl check cluster -all crsctl check crs [grid@rac1:/home/grid]$ crsctl check cluster -all ************************************************************** rac1: CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online ************************************************************** rac2: CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online ************************************************************** [grid@rac1:/home/grid]$ crsctl check crs CRS-4638: Oracle High Availability Services is online CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online [grid@rac1:/home/grid]$ 9.3 数据库状态 # srvctl status database -d orcl [grid@rac1:/home/grid]$ srvctl status database -d orcl 实例 orcl1 正在节点 rac1 上运行 实例 orcl2 正在节点 rac2 上运行 [grid@rac1:/home/grid]$ 9.4 监听状态 # lsnrctl status [grid@rac1:/home/grid]$ lsnrctl status LSNRCTL for Linux: Version 23.26.1.0.0 - Production on 09-FEB-2026 20:49:16 Copyright (c) 1991, 2026, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 23.26.1.0.0 - Production Start Date 09-FEB-2026 17:15:20 Uptime 0 days 3 hr. 33 min. 55 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/23.0.0/grid/network/admin/listener.ora Listener Log File /u01/app/grid/diag/tnslsnr/rac1/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.5)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.7)(PORT=1521))) Services Summary... Service \u0026#34;+ASM\u0026#34; has 1 instance(s). Instance \u0026#34;+ASM1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;+ASM_DATA\u0026#34; has 1 instance(s). Instance \u0026#34;+ASM1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;+ASM_OCRVOTE\u0026#34; has 1 instance(s). Instance \u0026#34;+ASM1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;48945b67d121c623e063399b5e6478e6\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;4a642eb750c86927e0630612a8c0345a\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orcl\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orclXDB\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orcl_pdb1\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;pdb1\u0026#34; has 1 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... The command completed successfully [grid@rac1:/home/grid]$ 9.5 scan状态 # srvctl status scan srvctl status scan_listener lsnrctl status LISTENER_SCAN1 [grid@rac1:/home/grid]$ srvctl status scan SCAN VIP scan1 已启用 SCAN VIP scan1 正在节点 rac1 上运行 [grid@rac1:/home/grid]$ srvctl status scan_listener SCAN 监听程序 LISTENER_SCAN1 已启用 SCAN 监听程序 LISTENER_SCAN1 正在节点 rac1 上运行 [grid@rac1:/home/grid]$ lsnrctl status LISTENER_SCAN1 LSNRCTL for Linux: Version 23.26.1.0.0 - Production on 09-FEB-2026 20:49:52 Copyright (c) 1991, 2026, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))) STATUS of the LISTENER ------------------------ Alias LISTENER_SCAN1 Version TNSLSNR for Linux: Version 23.26.1.0.0 - Production Start Date 09-FEB-2026 17:15:13 Uptime 0 days 3 hr. 34 min. 38 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/23.0.0/grid/network/admin/listener.ora Listener Log File /u01/app/grid/diag/tnslsnr/rac1/listener_scan1/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.9)(PORT=1521))) Services Summary... Service \u0026#34;48945b67d121c623e063399b5e6478e6\u0026#34; has 2 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Instance \u0026#34;orcl2\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;4a642eb750c86927e0630612a8c0345a\u0026#34; has 2 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Instance \u0026#34;orcl2\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orcl\u0026#34; has 2 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Instance \u0026#34;orcl2\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orclXDB\u0026#34; has 2 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Instance \u0026#34;orcl2\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;orcl_pdb1\u0026#34; has 2 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Instance \u0026#34;orcl2\u0026#34;, status READY, has 1 handler(s) for this service... Service \u0026#34;pdb1\u0026#34; has 2 instance(s). Instance \u0026#34;orcl1\u0026#34;, status READY, has 1 handler(s) for this service... Instance \u0026#34;orcl2\u0026#34;, status READY, has 1 handler(s) for this service... The command completed successfully [grid@rac1:/home/grid]$ 9.6 nodeapps状态 # srvctl status nodeapps [grid@rac1:/home/grid]$ srvctl status nodeapps VIP 192.168.18.7 已启用 VIP 192.168.18.7 正在节点上运行: rac1 VIP 192.168.18.8 已启用 VIP 192.168.18.8 正在节点上运行: rac2 网络已启用 网络正在节点上运行: rac1 网络正在节点上运行: rac2 adminhelper 已启用 adminhelper 未在节点上运行: rac1 adminhelper 未在节点上运行: rac2 ONS 已启用 ONS 守护程序正在节点上运行:rac1 ONS 守护程序正在节点上运行:rac2 [grid@rac1:/home/grid]$ 9.7 VIP状态 # srvctl status vip -node rac1 srvctl status vip -node rac2 [grid@rac1:/home/grid]$ srvctl status vip -node rac1 VIP 192.168.18.7 已启用 VIP 192.168.18.7 正在节点上运行: rac1 [grid@rac1:/home/grid]$ srvctl status vip -node rac2 VIP 192.168.18.8 已启用 VIP 192.168.18.8 正在节点上运行: rac2 [grid@rac1:/home/grid]$ 9.8 数据库配置 # srvctl config database -d orcl crsctl status res ora.orcl.db -p |grep -i auto [grid@rac1:/home/grid]$ srvctl config database -d orcl 数据库唯一名称: orcl 数据库名: orcl Oracle 主目录: /u01/app/oracle/product/23.0.0/dbhome_1 Oracle 用户: oracle Spfile: +DATA/ORCL/PARAMETERFILE/spfile.272.1224793159 口令文件: +DATA/ORCL/PASSWORD/pwdorcl.256.1224793001 域: 启动选项: open 停止选项: immediate 数据库角色: PRIMARY 管理策略: AUTOMATIC 服务器池: 磁盘组: DATA 装载点路径: 服务: orcl_pdb1 类型: RAC 启动并行: 停止并行: OSDBA 组: dba OSOPER 组: oper 数据库实例: orcl1,orcl2 已配置的节点: rac1,rac2 CSS 关键型: no CPU 计数: 0 内存目标: 0 最大内存: 0 数据库服务的默认网络编号: 数据库是管理员管理的 [grid@rac1:/home/grid]$ [grid@rac1:/home/grid]$ crsctl status res ora.orcl.db -p |grep -i auto AUTO_START=restore MANAGEMENT_POLICY=AUTOMATIC START_DEPENDENCIES_RTE_INTERNAL=\u0026lt;xml\u0026gt;\u0026lt;Cond name=\u0026#34;isEDV\u0026#34;\u0026gt;False\u0026lt;/Cond\u0026gt;\u0026lt;Cond name=\u0026#34;ASMClientMode\u0026#34;\u0026gt;False\u0026lt;/Cond\u0026gt;\u0026lt;Cond name=\u0026#34;ASMmode\u0026#34;\u0026gt;remote\u0026lt;/Cond\u0026gt;\u0026lt;Arg name=\u0026#34;dg\u0026#34; type=\u0026#34;ResList\u0026#34;\u0026gt;ora.DATA.dg\u0026lt;/Arg\u0026gt;\u0026lt;Arg name=\u0026#34;acfs_or_nfs\u0026#34; type=\u0026#34;ResList\u0026#34;\u0026gt;\u0026lt;/Arg\u0026gt;\u0026lt;Cond name=\u0026#34;OHResExist\u0026#34;\u0026gt;False\u0026lt;/Cond\u0026gt;\u0026lt;Cond name=\u0026#34;DATABASE_TYPE\u0026#34;\u0026gt;RAC\u0026lt;/Cond\u0026gt;\u0026lt;Cond name=\u0026#34;MANAGEMENT_POLICY\u0026#34;\u0026gt;AUTOMATIC\u0026lt;/Cond\u0026gt;\u0026lt;Arg name=\u0026#34;acfs_and_nfs\u0026#34; type=\u0026#34;ResList\u0026#34;\u0026gt;\u0026lt;/Arg\u0026gt;\u0026lt;/xml\u0026gt; [grid@rac1:/home/grid]$ AUTO_START=restore是设置数据库是否启动的，restore就是保持上次状态。 9.9 OCR # ocrcheck [grid@rac1:/home/grid]$ ocrcheck Status of Oracle Cluster Registry is as follows : Version : 4 Total space (kbytes) : 901284 Used space (kbytes) : 84916 Available space (kbytes) : 816368 ID : 820960958 Device/File Name : +OCRVOTE Device/File integrity check succeeded Device/File not configured Device/File not configured Device/File not configured Device/File not configured Cluster registry integrity check succeeded Logical corruption check bypassed due to non-privileged user [grid@rac1:/home/grid]$ 9.10 VOTEDISK # crsctl query css votedisk [grid@rac1:/home/grid]$ crsctl query css votedisk ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 7ecae8014ddb4f2fbf737811e66686a1 (/dev/oracleasm/disks/OCRVOTE01) [OCRVOTE] 2. ONLINE b1bb79c499b04f7cbf69083bb5a9af99 (/dev/oracleasm/disks/OCRVOTE03) [OCRVOTE] 3. ONLINE 810f931fe52a4f63bf0d474beeca2518 (/dev/oracleasm/disks/OCRVOTE02) [OCRVOTE] Located 3 voting disk(s). [grid@rac1:/home/grid]$ 9.11 GI版本 # crsctl query crs releaseversion crsctl query crs activeversion [grid@rac1:/home/grid]$ crsctl query crs releaseversion Oracle High Availability Services release version on the local node is [23.0.0.0.0] [grid@rac1:/home/grid]$ crsctl query crs activeversion Oracle Clusterware active version on the cluster is [23.0.0.0.0] [grid@rac1:/home/grid]$ 9.12 ASM # asmcmd lsdg lsof lsdsk [grid@rac1:/home/grid]$ asmcmd ASMCMD\u0026gt; lsdg State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name MOUNTED EXTERN N 512 512 4096 4194304 40960 36020 0 36020 0 N DATA/ MOUNTED NORMAL N 512 512 4096 4194304 15360 14348 5120 4614 0 Y OCRVOTE/ ASMCMD\u0026gt; lsof DB_Name Instance_Name Path +ASM +ASM1 +OCRVOTE.255.1224782017 orcl orcl1 +DATA/ORCL/48945B67D122C623E063399B5E6478E6/DATAFILE/sysaux.261.1224793051 orcl orcl1 +DATA/ORCL/48945B67D122C623E063399B5E6478E6/DATAFILE/system.259.1224793037 orcl orcl1 +DATA/ORCL/48945B67D122C623E063399B5E6478E6/DATAFILE/undotbs1.263.1224793059 orcl orcl1 +DATA/ORCL/48945B67D122C623E063399B5E6478E6/TEMPFILE/temp.268.1224793075 orcl orcl1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/sysaux.275.1224793307 orcl orcl1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/system.274.1224793307 orcl orcl1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/undo_5.277.1224793323 orcl orcl1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/undotbs1.273.1224793307 orcl orcl1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/DATAFILE/users.278.1224793335 orcl orcl1 +DATA/ORCL/4A642EB750C86927E0630612A8C0345A/TEMPFILE/temp.276.1224793327 orcl orcl1 +DATA/ORCL/CONTROLFILE/current.264.1224793069 orcl orcl1 +DATA/ORCL/DATAFILE/sysaux.260.1224793043 orcl orcl1 +DATA/ORCL/DATAFILE/system.258.1224793011 orcl orcl1 +DATA/ORCL/DATAFILE/undotbs1.257.1224793011 orcl orcl1 +DATA/ORCL/DATAFILE/undotbs2.269.1224793131 orcl orcl1 +DATA/ORCL/DATAFILE/users.262.1224793057 orcl orcl1 +DATA/ORCL/ONLINELOG/group_1.265.1224793069 orcl orcl1 +DATA/ORCL/ONLINELOG/group_2.266.1224793069 orcl orcl1 +DATA/ORCL/ONLINELOG/group_3.270.1224793159 orcl orcl1 +DATA/ORCL/ONLINELOG/group_4.271.1224793159 orcl orcl1 +DATA/ORCL/TEMPFILE/temp.267.1224793071 ASMCMD\u0026gt; lsdsk Path /dev/oracleasm/disks/DATA01 /dev/oracleasm/disks/DATA02 /dev/oracleasm/disks/OCRVOTE01 /dev/oracleasm/disks/OCRVOTE02 /dev/oracleasm/disks/OCRVOTE03 ASMCMD\u0026gt; 9.13 启动和关闭RAC # 启动和关闭RAC\n-关闭\\启动单个实例 $ srvctl stop\\start instance -d orcl -i rac1 --关闭\\启动所有实例 $ srvctl stop\\start database -d orcl --关闭\\启动CRS $ crsctl stop\\start crs --关闭\\启动集群服务 $ crsctl stop\\start cluster -all crsctl start\\stop crs 是单节管理 crsctl start\\stop cluster [-all 所有节点] 可以管理多个节点 crsctl start\\stop crs 管理crs 包含进程 OHASD crsctl start\\stop cluster 不包含OHASD进程 要先启动 OHASD进程才可以使用 srvctl stop\\start database 启动\\停止所有实例及其启用的服务 9.14 节点状态 # 节点示例状态\nset lines 200 col inst_id for 999999 col instance_number for 999999 col instance_name for a20 col parallel for a10 col status for a20 col database_status for a20 col active_state for a20 col host_name for a20 SELECT inst_id,instance_number,instance_name,parallel,status,database_status,active_state,host_name FROM gv$instance order by 1; [oracle@rac1:/home/oracle]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Mon Feb 9 20:57:05 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SQL\u0026gt; set lines 200 col inst_id for 999999 col instance_number for 999999 col instance_name for a20 col parallel for a10 col status for a20 SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; col database_status for a20 col active_state for a20 col host_name for a20 SELECT inst_id,instance_number,instance_name,parallel,status,database_status,active_state,host_name FROM gv$instance order by 1;SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; INST_ID INSTANCE_NUMBER INSTANCE_NAME PARALLEL STATUS DATABASE_STATUS ACTIVE_STATE HOST_NAME ------- --------------- -------------------- ---------- -------------------- -------------------- -------------------- -------------------- 1 1 orcl1 YES OPEN ACTIVE NORMAL rac1 2 2 orcl2 YES OPEN ACTIVE NORMAL rac2 SQL\u0026gt; 9.15 切换scan # srvctl relocate scan_listener -i 1 -n rac2 9.16 切换VIP # srvctl config network srvctl relocate vip -vip rac2-vip -node rac2 十、总结 # 本文按规划 → 虚拟机与网络 → 共享存储（ASM）→ OS 预检查与参数调优 → RAC 安装准备的顺序，给出在 VMware 上用 Oracle Linux 9.7 部署 Oracle 26ai RAC 的全流程实战指南。\n","date":"2026-02-09","externalUrl":null,"permalink":"/posts/oracle26ai-rac-vmware-ol97/","section":"文章","summary":"一篇 Oracle 26ai RAC 安装实战文档，基于 Oracle Linux 9.7 和 VMware Workstation，覆盖双节点虚拟机、Public/Private/VIP/SCAN 网络、共享 VMDK 磁盘、OCR/VOTE/DATA 磁盘组、系统参数和安装前检查。","title":"Oracle Linux 9.7 + VMware 搭建 Oracle 26ai RAC 实战指南","type":"posts"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/vmware/","section":"Tags","summary":"","title":"VMware","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/dbca/","section":"Tags","summary":"","title":"DBCA","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/netca/","section":"Tags","summary":"","title":"NETCA","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/oracle-ai-database/","section":"Tags","summary":"","title":"Oracle AI Database","type":"tags"},{"content":" 一、前言 # Oracle 在 2026 年 1 月 27 日发布官方更新，宣布 Oracle AI Database 26ai Enterprise Edition 已作为 2026 年 1 月季度 Release Update（23.26.1），正式支持 Linux x86-64 的本地部署（on-premises）。 本文将基于 Oracle 官方文档建议的 Oracle Linux 9（建议使用最新 release level；本文采用 OL 9.7），带你完整体验一次 26ai 企业版本地部署与验证流程。\n1.1 环境信息 # 本文的安装环境信息如下：\n主机名 内存 磁盘空间 IP地址 操作系统版本 Oracle版本 ol9 16G 100G 192.168.17.26 Oracle Linux Server release 9.7 Oracle AI Database 26ai 二、下载软件 # 首先数据库安装软件访问https://www.oracle.com/database/technologies/oracle26ai-linux-downloads.html下载LINUX.X64_2326100_db_home.zip。\n操作系统我们选择官网推荐的访问https://yum.oracle.com/oracle-linux-isos.html，Oracle Linux 9.7版本下载OracleLinux-R9-U7-x86_64-dvd.iso\n三、安装先决条件 # 2.1 自动预安装 # 如果您的 Linux 发行版是 Oracle Linux 或 Red Hat Enterprise Linux，并且您是 Oracle Linux 支持客户，那么您可以使用适用于您版本的 Oracle AI 数据库预安装 RPM 完成大多数预安装配置任务。\nroot用户执行下面命令\n# 安装预安装包 dnf install -y oracle-ai-database-preinstall-26ai # 或者直接将rpm包下载到本地进行安装 wget https://yum.oracle.com/repo/OracleLinux/OL9/appstream/x86_64/getPackage/oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64.rpm dnf install -y oracle-ai-database-preinstall-26ai-1.0-1.el9.x86_64.rpm # 关闭防护墙和selinux systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -ri \u0026#39;s/SELINUX=enforcing/SELINUX=disabled/\u0026#39; /etc/selinux/config 安装完之后可以直接跳到2.2.8创建目录继续\n2.2 手动预安装 # 如果您未使用“oracle-database-preinstall-26ai”软件包执行所有先决条件，则需要手动执行以下设置任务。\n2.2.1 关闭防火墙 # systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --state 2.2.2 关闭selinux # setenforce 0 sed -ri \u0026#39;s/SELINUX=enforcing/SELINUX=disabled/\u0026#39; /etc/selinux/config sestatus 2.2.3 安装依赖包 # dnf install -y bc dnf install -y binutils dnf install -y compat-openssl11 dnf install -y elfutils-libelf dnf install -y fontconfig dnf install -y glibc dnf install -y glibc-devel dnf install -y glibc-headers dnf install -y ksh dnf install -y libaio dnf install -y libasan dnf install -y liblsan dnf install -y libX11 dnf install -y libXau dnf install -y libXi dnf install -y libXrender dnf install -y libXtst dnf install -y libxcrypt-compat dnf install -y libgcc dnf install -y libibverbs dnf install -y librdmacm dnf install -y libstdc++ dnf install -y libxcb dnf install -y libvirt-libs dnf install -y make dnf install -y policycoreutils dnf install -y policycoreutils-python-utils dnf install -y smartmontools dnf install -y sysstat dnf install -y nfs-utils # 检查安装包 rpm -q bc binutils compat-openssl11 elfutils-libelf fontconfig glibc glibc-devel glibc-headers ksh libaio libasan libX11 libXau libXi libXrender libXtst libxcrypt-compat libgcc libibverbs librdmacm libstdc++ libxcb libvirt-libs make policycoreutils policycoreutils-python-utils smartmontools sysstat nfs-utils | grep \u0026#34;not installed\u0026#34; 2.2.4 配置hosts文件 # cat \u0026gt;\u0026gt; /etc/hosts \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; 192.168.17.26 ol9 EOF 2.2.5 配置sysctl.conf # vi /etc/sysctl.conf # 添加Oracle Settings fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmni = 4096 kernel.shmall = 4092630 kernel.shmmax = 16763412479 kernel.panic_on_oops = 1 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 fs.aio-max-nr = 1048576 net.ipv4.ip_local_port_range = 9000 65500 # 立即生效sysctl.conf /sbin/sysctl -p 2.2.6 配置limits.conf # cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; # Oracle Settings oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 16384 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 oracle hard memlock 134217728 oracle soft memlock 134217728 oracle soft data unlimited oracle hard data unlimited EOF 2.2.7 创建用户 # # 创建用户组 /usr/sbin/groupadd -g 54321 oinstall /usr/sbin/groupadd -g 54322 dba /usr/sbin/groupadd -g 54323 oper /usr/sbin/groupadd -g 54324 backupdba /usr/sbin/groupadd -g 54325 dgdba /usr/sbin/groupadd -g 54326 kmdba /usr/sbin/groupadd -g 54330 racdba # 创建用户 /usr/sbin/useradd -u 54321 -g oinstall -G dba,backupdba,dgdba,kmdba,racdba,oper oracle # 设置密码 echo \u0026#34;oracle\u0026#34;|passwd --stdin oracle # 检查用户 id oracle 2.2.8 创建目录 # 安装 Oracle 软件，请按照 Oracle 最优灵活架构 (OFA) 建议创建 Oracle 基础目录和 Oracle 清单目录。并为这些目录指定正确的所有者、组和权限。\n# 创建Oracle软件目录 mkdir -p /u01/app/oracle mkdir -p /u01/app/oraInventory mkdir -p /u01/app/oracle/product/23.26.1/dbhome_1 # 授权 chmod -R 775 /u01/app chown -R oracle:oinstall /u01/app/oracle chown -R oracle:oinstall /u01/app/oraInventory 四、安装Oracle软件 # 4.1 环境变量设置 # su - oracle cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; # Oracle Settings TMP=/tmp; export TMP TMPDIR=$TMP; export TMPDIR ORACLE_HOSTNAME=ol9; export ORACLE_HOSTNAME ORACLE_UNQNAME=orcl; export ORACLE_UNQNAME ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/23.26.1/dbhome_1; export ORACLE_HOME ORA_INVENTORY=/u01/app/oraInventory; export ORA_INVENTORY ORACLE_SID=orcl; export ORACLE_SID PDB_NAME=pdb1; export PDB_NAME ORACLE_TERM=xterm; export ORACLE_TERM PATH=/usr/sbin:$PATH; export PATH PATH=$ORACLE_HOME/bin:$PATH; export PATH export PATH=$PATH:$ORACLE_HOME/OPatch export NLS_LANG=\u0026#34;AMERICAN_AMERICA.ZHS16GBK\u0026#34; export NLS_DATE_FORMAT=\u0026#34;yyyy-mm-dd hh24:mi:ss\u0026#34; export ORA_INVENTORY=/u01/app/oraInventory LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH if [ $USER = \u0026#34;oracle\u0026#34; ]; then if [ $SHELL = \u0026#34;/bin/ksh\u0026#34; ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi EOF # 立即生效环境变量 source ~/.bash_profile 4.2 软件上传解压 # 将LINUX.X64_2326100_db_home.zip软件上传到/soft目录下\n# 变更/soft目录权限 chown -R oracle:oinstall /soft su - oracle cd /soft # 解压软件 unzip -q LINUX.X64_2326100_db_home.zip -d $ORACLE_HOME 4.3 配置响应文件 # cat \u0026gt;\u0026gt; /soft/db_install.rsp \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v23.0.0 installOption=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/23.26.1/dbhome_1 SELECTED_LANGUAGES=en,en_GB SECURITY_UPDATES_VIA_MYORACLESUPPORT=false DECLINE_SECURITY_UPDATES=true installEdition=EE OSDBA_GROUP=dba OSOPER_GROUP=oper OSBACKUPDBA_GROUP=backupdba OSDGDBA_GROUP=dgdba OSKMDBA_GROUP=kmdba OSRACDBA_GROUP=racdba executeRootScript=false configMethod= EOF 4.4 静默安装 Oracle 软件 # cd $ORACLE_HOME ./runInstaller -silent -responseFile /soft/db_install.rsp -ignorePrereq -waitForCompletion 安装完后需要切换到 root 用户下执行以下 root.sh 脚本\n/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/23.26.1/dbhome_1/root.sh 4.5 静默创建监听 # netca -silent -responsefile /u01/app/oracle/product/23.26.1/dbhome_1/assistants/netca/netca.rsp 4.6 静默创建数据库实例 # 这里我们创建带有一个PDB的实例orcl\ndbca -silent -createDatabase -templateName General_Purpose.dbc -responseFile NO_VALUE \\ -gdbname orcl -sid orcl \\ -createAsContainerDatabase TRUE \\ -numberOfPDBs 1 \\ -pdbName pdb1 \\ -pdbAdminPassword Passw0rd -sysPassword Passw0rd -systemPassword Passw0rd \\ -datafileDestination \u0026#39;/u01/app/oracle/oradata\u0026#39; -recoveryAreaDestination \u0026#39;/u01/app/oracle/flash_recovery_area\u0026#39; \\ -redoLogFileSize 1024 \\ -storageType FS \\ -characterset ZHS16GBK -nationalCharacterSet AL16UTF16 \\ -totalMemory 2048 \\ -databaseType OLTP \\ -emConfiguration NONE \\ -ignorePreReqs 4.7 验证数据库 # [oracle@ol9 ~]$ sqlplus / as sysdba SQL*Plus: Release 23.26.1.0.0 - Production on Wed Jan 28 13:04:09 2026 Version 23.26.1.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 SYS@orcl\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO SYS@orcl\u0026gt; select * from v$version; BANNER -------------------------------------------------------------------------------- BANNER_FULL -------------------------------------------------------------------------------- BANNER_LEGACY -------------------------------------------------------------------------------- CON_ID ---------- Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production 0 BANNER -------------------------------------------------------------------------------- BANNER_FULL -------------------------------------------------------------------------------- BANNER_LEGACY -------------------------------------------------------------------------------- CON_ID ---------- SYS@orcl\u0026gt; exit Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production Version 23.26.1.0.0 [oracle@ol9 ~]$ $ORACLE_HOME/OPatch/opatch lspatches 38743688;OCW RELEASE UPDATE 23.26.1.0.0 (GOLD IMAGE) (38743688) Gold Image 38743669;Database Release Update : 23.26.1.0.0 (38743669) Gold Image OPatch succeeded. [oracle@ol9 ~]$ 五、总结 # 本文记录了在 Oracle Linux 9.7 上通过 静默（silent）方式完成 Oracle AI Database 26ai Enterprise Edition 的本地部署全流程，覆盖 环境准备、预安装配置、软件静默安装、监听配置、DBCA 静默建库与验证，帮助你用最短路径快速跑通 26ai on-prem 体验。\n","date":"2026-01-28","externalUrl":null,"permalink":"/posts/oracle26ai-install-oracle-linux9/","section":"文章","summary":"一篇 Oracle 26ai 单机静默安装实战文档，基于 Oracle Linux 9.7，覆盖 oracle-ai-database-preinstall-26ai、手工预安装配置、软件安装、监听创建、CDB/PDB 建库和 OPatch 补丁验证。","title":"Oracle AI Database 26ai 在 Oracle Linux 9.7 上静默安装实战","type":"posts"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/datapatch/","section":"Tags","summary":"","title":"Datapatch","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/one-off/","section":"Tags","summary":"","title":"One-Off","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/opatch/","section":"Tags","summary":"","title":"OPatch","type":"tags"},{"content":"适用版本：Oracle Database 19.30.0 → 19.3.0 环境：单实例 ，OS 为 Oracle Linux 7.9 补丁类型：RU (Release Update) 19.30.0.0.260120 工具：opatch / datapatch\n一、前言 # 由于近期发布的Oracle Database 19c DATABASE RELEASE UPDATE 19.30.0.0.0补丁(Patch 38632161)存在bug，已经被官方下架了，打上该补丁的也不要担心，下面介绍两种方法解决这个问题：\n19.30补丁卸载 one-off 补丁进行修复 二、19.30补丁卸载 # 2.1 查询当前补丁情况 # 了解当前的补丁基线\n数据库层面查询\nset lines 200 col action_time format a25 col status format a12 select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; [oracle@prod_db ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 19:37:21 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 SQL\u0026gt; show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB READ WRITE NO SQL\u0026gt; set lines 200 SQL\u0026gt; col action_time format a25 SQL\u0026gt; col status format a12 SQL\u0026gt; select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; ACTION_TIME ACTION STATUS SOURCE_VERSION TARGET_VERSION ------------------------- --------------- ------------ --------------- --------------- 22-JAN-26 08.48.44.104406 APPLY SUCCESS 19.1.0.0.0 19.3.0.0.0 PM 22-JAN-26 10.28.24.990898 APPLY SUCCESS 19.3.0.0.0 19.30.0.0.0 PM SQL\u0026gt; Oracle 主目录补丁清单，注意下面这段已经应用的38632161补丁\nPatch 38632161 : applied on Thu Jan 22 22:06:38 CST 2026 opatch lsinventory opatch lspatches [oracle@prod_db ~]$ opatch lsinventory Oracle Interim Patch Installer version 12.2.0.1.49 Copyright (c) 2026, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/oracle/product/19.3.0/dbhome_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/19.3.0/dbhome_1/oraInst.loc OPatch version : 12.2.0.1.49 OUI version : 12.2.0.7.0 Log file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-26_19-41-30PM_1.log Lsinventory Output file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/lsinv/lsinventory2026-01-26_19-41-30PM.txt -------------------------------------------------------------------------------- Local Machine Information:: Hostname: prod_db ARU platform id: 226 ARU platform description:: Linux x86-64 Installed Top-level Products (1): Oracle Database 19c 19.0.0.0.0 There are 1 products installed in this Oracle Home. Interim patches (2) : Patch 38632161 : applied on Thu Jan 22 22:06:38 CST 2026 Unique Patch ID: 28443995 Patch description: \u0026#34;Database Release Update : 19.30.0.0.260120 (38632161)\u0026#34; Created on 17 Jan 2026, 08:18:46 hrs UTC Bugs fixed: 10121473, 10123661, 12608302, 1297945, 13087312, 13801211, 14570574 14735102, 15878434, 15931756, 15959416, 16662822, 16664572, 16750494 17275499, 17395507, 17428816, 17468475, 17562236, 17777718, 18534283 18697534, 18943905, 19080742, 19138896, 19147630, 19226753, 19630878 19697993, 19884953, 19958239, 20007421, 20044584, 20083476, 20289608 20313356, 20319830, 20351180, 20479545, 20661314, 20721183, 20867658 。。。省略 38471934, 38476257, 38486044, 38486278, 38488013, 38507950, 38519816 38525391, 38534801, 38542828, 38556579, 38573079, 38578258, 38585619 38588567, 38590051, 38602559, 38615863, 38619898, 38624714, 38632348 38637095, 38638752, 38657092, 38658095, 38658309, 38660638, 38676512 38688895, 38702049, 38703128, 38750569, 38751199, 38760350, 38765450 38782444, 38787400, 38789859, 38857925, 7391838, 8460502, 8476681 9002767 Patch 29585399 : applied on Thu Apr 18 15:21:33 CST 2019 Unique Patch ID: 22840393 Patch description: \u0026#34;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)\u0026#34; Created on 9 Apr 2019, 19:12:47 hrs PST8PDT Bugs fixed: 27222128, 27572040, 27604329, 27760043, 27877830, 28302580, 28470673 28621543, 28642469, 28699321, 28710663, 28755846, 28772816, 28785321 28800508, 28808652, 28815557, 28847541, 28847572, 28870496, 28871040 28874416, 28877252, 28881191, 28881848, 28888083, 28911140, 28925250 28925460, 28935956, 28940472, 28942694, 28951332, 28963036, 28968779 28980448, 28995287, 29003207, 29003617, 29016294, 29018680, 29024876 29026154, 29027933, 29047127, 29052850, 29058476, 29111631, 29112455 29117337, 29123444, 29125708, 29125786, 29129476, 29131772, 29132456 29139727, 29146157, 29147849, 29149170, 29152603, 29152752, 29154631 29154636, 29154829, 29159216, 29159661, 29160462, 29161923, 29169540 29169739, 29170717, 29173618, 29181568, 29182920, 29183298, 29186091 29191827, 29201143, 29201695, 29209545, 29210577, 29210610, 29210624 29210683, 29213641, 29219627, 29224294, 29225861, 29229839, 29235934 29242906, 29243749, 29244495, 29244766, 29244968, 29248723, 29249583 29251564, 29255616, 29260224, 29261695, 29271019, 29273360, 29282090 29282666, 29285453, 29285621, 29290235, 29292232, 29293806, 29294753 29299830, 29307090, 29307109, 29311336, 29329675, 29330791, 29339299 29357821, 29360467, 29360775, 29367971, 29368725, 29379299, 29379381 29380527, 29381000, 29382296, 29391301, 29393649, 29402110, 29411931 29413360, 29457319, 29465047, 3 -------------------------------------------------------------------------------- OPatch succeeded. [oracle@prod_db ~]$ opatch lspatches 38632161;Database Release Update : 19.30.0.0.260120 (38632161) 29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399) OPatch succeeded. [oracle@prod_db ~]$ 在应用此补丁之前，OPatch 版本要求：\nOPatch version 12.2.0.1.48 or later\n检查现有 OPatch 版本\ncd $ORACLE_HOME/OPatch ./opatch version [oracle@prod_db ~]$ cd $ORACLE_HOME/OPatch [oracle@prod_db OPatch]$ ./opatch version OPatch Version: 12.2.0.1.49 OPatch succeeded. [oracle@prod_db OPatch]$ ✅️OPatch 现在符合补丁要求。\n2.2 关闭数据库和监听 # Oracle 要求在回退版本之前进行干净关机，停监听。\n[oracle@prod_db ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 19:53:50 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 SQL\u0026gt; shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL\u0026gt; exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 [oracle@prod_db OPatch]$ lsnrctl stop LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 26-JAN-2026 19:54:30 Copyright (c) 1991, 2025, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod_db)(PORT=1521))) The command completed successfully [oracle@prod_db ~]$ 2.3 卸载DB补丁 38632161 # opatch rollback -id 38632161 [oracle@prod_db ~]$ opatch rollback -id 38632161 Oracle Interim Patch Installer version 12.2.0.1.49 Copyright (c) 2026, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/oracle/product/19.3.0/dbhome_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/19.3.0/dbhome_1/oraInst.loc OPatch version : 12.2.0.1.49 OUI version : 12.2.0.7.0 Log file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-26_19-57-48PM_1.log Patches will be rolled back in the following order: 38632161 The following patch(es) will be rolled back: 38632161 Please shutdown Oracle instances running out of this ORACLE_HOME on the local system. (Oracle Home = \u0026#39;/u01/app/oracle/product/19.3.0/dbhome_1\u0026#39;) Is the local system ready for patching? [y|n] y User Responded with: Y Rolling back patch 38632161... RollbackSession rolling back interim patch \u0026#39;38632161\u0026#39; from OH \u0026#39;/u01/app/oracle/product/19.3.0/dbhome_1\u0026#39; Patching component oracle.rdbms.rsf, 19.0.0.0.0... Patching component oracle.rdbms, 19.0.0.0.0... Patching component oracle.rdbms.util, 19.0.0.0.0... Patching component oracle.assistants.acf, 19.0.0.0.0... Patching component oracle.assistants.deconfig, 19.0.0.0.0... Patching component oracle.assistants.server, 19.0.0.0.0... Patching component oracle.blaslapack, 19.0.0.0.0... Patching component oracle.buildtools.rsf, 19.0.0.0.0... Patching component oracle.ctx, 19.0.0.0.0... Patching component oracle.dbdev, 19.0.0.0.0... Patching component oracle.dbjava.ic, 19.0.0.0.0... Patching component oracle.dbjava.jdbc, 19.0.0.0.0... Patching component oracle.dbjava.ucp, 19.0.0.0.0... Patching component oracle.duma, 19.0.0.0.0... Patching component oracle.javavm.client, 19.0.0.0.0... Patching component oracle.ldap.client, 19.0.0.0.0... Patching component oracle.ldap.owm, 19.0.0.0.0... Patching component oracle.ldap.rsf, 19.0.0.0.0... Patching component oracle.ldap.security.osdt, 19.0.0.0.0... Patching component oracle.marvel, 19.0.0.0.0... Patching component oracle.network.rsf, 19.0.0.0.0... Patching component oracle.odbc.ic, 19.0.0.0.0... Patching component oracle.ons, 19.0.0.0.0... Patching component oracle.ons.ic, 19.0.0.0.0... Patching component oracle.oracore.rsf, 19.0.0.0.0... Patching component oracle.perlint, 5.28.1.0.0... Patching component oracle.precomp.common.core, 19.0.0.0.0... Patching component oracle.precomp.rsf, 19.0.0.0.0... Patching component oracle.rdbms.crs, 19.0.0.0.0... Patching component oracle.rdbms.dbscripts, 19.0.0.0.0... Patching component oracle.rdbms.deconfig, 19.0.0.0.0... Patching component oracle.rdbms.install.common, 19.0.0.0.0... Patching component oracle.rdbms.oci, 19.0.0.0.0... Patching component oracle.rdbms.rsf.ic, 19.0.0.0.0... Patching component oracle.rdbms.scheduler, 19.0.0.0.0... Patching component oracle.rhp.db, 19.0.0.0.0... Patching component oracle.rsf, 19.0.0.0.0... Patching component oracle.sdo, 19.0.0.0.0... Patching component oracle.sdo.locator.jrf, 19.0.0.0.0... Patching component oracle.sqlj.sqljruntime, 19.0.0.0.0... Patching component oracle.sqlplus, 19.0.0.0.0... Patching component oracle.sqlplus.ic, 19.0.0.0.0... Patching component oracle.tfa.db, 19.0.0.0.0... Patching component oracle.wwg.plsql, 19.0.0.0.0... Patching component oracle.xdk.rsf, 19.0.0.0.0... Patching component oracle.xdk.parser.java, 19.0.0.0.0... Patching component oracle.rdbms.lbac, 19.0.0.0.0... Patching component oracle.ldap.ssl, 19.0.0.0.0... Patching component oracle.network.aso, 19.0.0.0.0... Patching component oracle.xdk, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.core, 19.0.0.0.0... Patching component oracle.odbc, 19.0.0.0.0... Patching component oracle.rdbms.rat, 19.0.0.0.0... Patching component oracle.rdbms.dv, 19.0.0.0.0... Patching component oracle.oraolap.dbscripts, 19.0.0.0.0... Patching component oracle.rdbms.hs_common, 19.0.0.0.0... Patching component oracle.ldap.rsf.ic, 19.0.0.0.0... Patching component oracle.oraolap, 19.0.0.0.0... Patching component oracle.install.deinstalltool, 19.0.0.0.0... Patching component oracle.mgw.common, 19.0.0.0.0... Patching component oracle.rdbms.rman, 19.0.0.0.0... Patching component oracle.xdk.server, 19.0.0.0.0... Patching component oracle.oraolap.api, 19.0.0.0.0... Patching component oracle.rdbms.hsodbc, 19.0.0.0.0... Patching component oracle.ctx.atg, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.core, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.ic, 19.0.0.0.0... Patching component oracle.sqlj.sqljruntime, 19.0.0.0.0... Patching component oracle.wwg.plsql, 19.0.0.0.0... Patching component oracle.network.client, 19.0.0.0.0... Patching component oracle.dbtoolslistener, 19.0.0.0.0... Patching component oracle.rdbms.install.plugins, 19.0.0.0.0... Patching component oracle.ctx.rsf, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.lbuilder, 19.0.0.0.0... Patching component oracle.rdbms.drdaas, 19.0.0.0.0... Patching component oracle.sdo.locator, 19.0.0.0.0... Patching component oracle.rdbms.locator, 19.0.0.0.0... Patching component oracle.network.listener, 19.0.0.0.0... Patching component oracle.ovm, 19.0.0.0.0... Patching component oracle.javavm.server, 19.0.0.0.0... Patching component oracle.xdk.xquery, 19.0.0.0.0... Patching component oracle.precomp.common, 19.0.0.0.0... Patching component oracle.precomp.lang, 19.0.0.0.0... Patching component oracle.jdk, 1.8.0.201.0... RollbackSession removing interim patch \u0026#39;38632161\u0026#39; from inventory Inactive sub-set patch [29517242] has become active due to the rolling back of a super-set patch [38632161]. Please refer to Doc ID 2161861.1 for any possible further required actions. Log file location: /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-26_19-57-48PM_1.log OPatch succeeded. [oracle@prod_db ~]$ 2.4 启动数据库和监听 # 卸载补丁后就可以启动数据库和监听了\nsqlplus / as sysdba startup alter pluggable database all open; lsnrctl start [oracle@prod_db ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 20:03:32 2026 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup ORACLE instance started. Total System Global Area 2516582192 bytes Fixed Size 9137968 bytes Variable Size 771751936 bytes Database Buffers 1728053248 bytes Redo Buffers 7639040 bytes Database mounted. Database opened. SQL\u0026gt; alter pluggable database all open; Pluggable database altered. SQL\u0026gt; exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 [oracle@prod_db ~]$ lsnrctl start LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 26-JAN-2026 20:05:21 Copyright (c) 1991, 2019, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.3.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/prod_db/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod_db)(PORT=1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod_db)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 26-JAN-2026 20:05:21 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/prod_db/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod_db)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) The listener supports no services The command completed successfully [oracle@prod_db ~]$ 2.5 使用 Datapatch 回滚补丁 # 现在执行 datapatch 工具，回滚与 19.30 二进制补丁对应的 SQL 脚本\ndatapatch -verbose [oracle@prod_db ~]$ datapatch -verbose SQL Patching tool version 19.3.0.0.0 Production on Mon Jan 26 20:10:35 2026 Copyright (c) 2012, 2019, Oracle. All rights reserved. Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_10124_2026_01_26_20_10_35/sqlpatch_invocation.log Connecting to database...OK Gathering database info...done Note: Datapatch will only apply or rollback SQL fixes for PDBs that are in an open state, no patches will be applied to closed PDBs. Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation (Doc ID 1585822.1) Bootstrapping registry and package to current versions...done Determining current state...done Current state of interim SQL patches: No interim patches found Current state of release update SQL patches: Binary registry: 19.3.0.0.0 Release_Update 190410122720: Installed PDB CDB$ROOT: Applied 19.30.0.0.0 Release_Update 260116203150 successfully on 22-JAN-26 10.28.24.990898 PM PDB PDB: Applied 19.30.0.0.0 Release_Update 260116203150 successfully on 22-JAN-26 10.32.15.776106 PM PDB PDB$SEED: Applied 19.30.0.0.0 Release_Update 260116203150 successfully on 22-JAN-26 10.32.12.082646 PM Adding patches to installation queue and performing prereq checks...done Installation queue: For the following PDBs: CDB$ROOT PDB$SEED PDB No interim patches need to be rolled back Patch 38632161 (Database Release Update : 19.30.0.0.260120 (38632161)): Rollback from 19.30.0.0.0 Release_Update 260116203150 to 19.3.0.0.0 Release_Update 190410122720 No interim patches need to be applied Installing patches... Patch installation complete. Total patches installed: 3 Validating logfiles...done Patch 38632161 rollback (pdb CDB$ROOT): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/38632161/28443995/38632161_rollback_PRODCDB_CDBROOT_2026Jan26_20_11_05.log (no errors) Patch 38632161 rollback (pdb PDB$SEED): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/38632161/28443995/38632161_rollback_PRODCDB_PDBSEED_2026Jan26_20_15_02.log (no errors) Patch 38632161 rollback (pdb PDB): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/38632161/28443995/38632161_rollback_PRODCDB_PDB_2026Jan26_20_15_02.log (no errors) SQL Patching tool complete on Mon Jan 26 20:18:30 2026 [oracle@prod_db ~]$ 2.6 验证补丁回退情况 # 数据库层面查询，编译失效对象\nset lines 200 col action_time format a25 col status format a12 select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; @$ORACLE_HOME/rdbms/admin/utlrp.sql [oracle@prod_db ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 20:22:49 2026 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL\u0026gt; set lines 200 SQL\u0026gt; col action_time format a25 SQL\u0026gt; col status format a12 SQL\u0026gt; select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; ACTION_TIME ACTION STATUS SOURCE_VERSION TARGET_VERSION ------------------------- --------------- ------------ --------------- --------------- 22-JAN-26 08.48.44.104406 APPLY SUCCESS 19.1.0.0.0 19.3.0.0.0 PM 22-JAN-26 10.28.24.990898 APPLY SUCCESS 19.3.0.0.0 19.30.0.0.0 PM 26-JAN-26 08.14.39.384401 ROLLBACK SUCCESS 19.30.0.0.0 19.3.0.0.0 PM SQL\u0026gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql Session altered. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_BGN 2026-01-26 20:28:05 DOC\u0026gt; The following PL/SQL block invokes UTL_RECOMP to recompile invalid DOC\u0026gt; objects in the database. Recompilation time is proportional to the DOC\u0026gt; number of invalid objects in the database, so this command may take DOC\u0026gt; a long time to execute on a database with a large number of invalid DOC\u0026gt; objects. DOC\u0026gt; DOC\u0026gt; Use the following queries to track recompilation progress: DOC\u0026gt; DOC\u0026gt; 1. Query returning the number of invalid objects remaining. This DOC\u0026gt; number should decrease with time. DOC\u0026gt; SELECT COUNT(*) FROM obj$ WHERE status IN (4, 5, 6); DOC\u0026gt; DOC\u0026gt; 2. Query returning the number of objects compiled so far. This number DOC\u0026gt; should increase with time. DOC\u0026gt; SELECT COUNT(*) FROM UTL_RECOMP_COMPILED; DOC\u0026gt; DOC\u0026gt; This script automatically chooses serial or parallel recompilation DOC\u0026gt; based on the number of CPUs available (parameter cpu_count) multiplied DOC\u0026gt; by the number of threads per CPU (parameter parallel_threads_per_cpu). DOC\u0026gt; On RAC, this number is added across all RAC nodes. DOC\u0026gt; DOC\u0026gt; UTL_RECOMP uses DBMS_SCHEDULER to create jobs for parallel DOC\u0026gt; recompilation. Jobs are created without instance affinity so that they DOC\u0026gt; can migrate across RAC nodes. Use the following queries to verify DOC\u0026gt; whether UTL_RECOMP jobs are being created and run correctly: DOC\u0026gt; DOC\u0026gt; 1. Query showing jobs created by UTL_RECOMP DOC\u0026gt; SELECT job_name FROM dba_scheduler_jobs DOC\u0026gt; WHERE job_name like \u0026#39;UTL_RECOMP_SLAVE_%\u0026#39;; DOC\u0026gt; DOC\u0026gt; 2. Query showing UTL_RECOMP jobs that are running DOC\u0026gt; SELECT job_name FROM dba_scheduler_running_jobs DOC\u0026gt; WHERE job_name like \u0026#39;UTL_RECOMP_SLAVE_%\u0026#39;; DOC\u0026gt;# PL/SQL procedure successfully completed. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_END 2026-01-26 20:28:06 DOC\u0026gt; The following query reports the number of invalid objects. DOC\u0026gt; DOC\u0026gt; If the number is higher than expected, please examine the error DOC\u0026gt; messages reported with each object (using SHOW ERRORS) to see if they DOC\u0026gt; point to system misconfiguration or resource constraints that must be DOC\u0026gt; fixed before attempting to recompile these objects. DOC\u0026gt;# OBJECTS WITH ERRORS ------------------- 0 DOC\u0026gt; The following query reports the number of exceptions caught during DOC\u0026gt; recompilation. If this number is non-zero, please query the error DOC\u0026gt; messages in the table UTL_RECOMP_ERRORS to see if any of these errors DOC\u0026gt; are due to misconfiguration or resource constraints that must be DOC\u0026gt; fixed before objects can compile successfully. DOC\u0026gt; Note: Typical compilation errors (due to coding errors) are not DOC\u0026gt; logged into this table: they go into DBA_ERRORS instead. DOC\u0026gt;# ERRORS DURING RECOMPILATION --------------------------- 0 Function created. PL/SQL procedure successfully completed. Function dropped. PL/SQL procedure successfully completed. SQL\u0026gt; 我们可以发现数据库19.30的DBRU补丁已经回退。\nOracle 主目录补丁清单\nopatch lsinventory opatch lspatches [oracle@prod_db ~]$ opatch lsinventory Oracle Interim Patch Installer version 12.2.0.1.49 Copyright (c) 2026, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/oracle/product/19.3.0/dbhome_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/19.3.0/dbhome_1/oraInst.loc OPatch version : 12.2.0.1.49 OUI version : 12.2.0.7.0 Log file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-26_20-25-44PM_1.log Lsinventory Output file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/lsinv/lsinventory2026-01-26_20-25-44PM.txt -------------------------------------------------------------------------------- Local Machine Information:: Hostname: prod_db ARU platform id: 226 ARU platform description:: Linux x86-64 Installed Top-level Products (1): Oracle Database 19c 19.0.0.0.0 There are 1 products installed in this Oracle Home. Interim patches (2) : Patch 29585399 : applied on Thu Apr 18 15:21:33 CST 2019 Unique Patch ID: 22840393 Patch description: \u0026#34;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)\u0026#34; Created on 9 Apr 2019, 19:12:47 hrs PST8PDT Bugs fixed: 27222128, 27572040, 27604329, 27760043, 27877830, 28302580, 28470673 28621543, 28642469, 28699321, 28710663, 28755846, 28772816, 28785321 28800508, 28808652, 28815557, 28847541, 28847572, 28870496, 28871040 28874416, 28877252, 28881191, 28881848, 28888083, 28911140, 28925250 。。。省略 29282666, 29285453, 29285621, 29290235, 29292232, 29293806, 29294753 29299830, 29307090, 29307109, 29311336, 29329675, 29330791, 29339299 29357821, 29360467, 29360775, 29367971, 29368725, 29379299, 29379381 29380527, 29381000, 29382296, 29391301, 29393649, 29402110, 29411931 29413360, 29457319, 29465047, 3 Patch 29517242 : applied on Thu Apr 18 15:21:17 CST 2019 Unique Patch ID: 22862832 Patch description: \u0026#34;Database Release Update : 19.3.0.0.190416 (29517242)\u0026#34; Created on 17 Apr 2019, 23:27:10 hrs PST8PDT Bugs fixed: 14735102, 19697993, 20313356, 21965541, 25806201, 25883179, 25986062 26476244, 26611353, 26872233, 27369515, 27423500, 27666312, 27710072 27846298, 27957203, 28064977, 28072567, 28129791, 28181021, 28210681 28279456, 28313275, 28350595, 28371123, 28379065, 28431445, 28463226 。。。省略 29431485, 29435652, 29438736, 29439522, 29450421, 29451386, 29452576 29452953, 29457807, 29460252, 29462957, 29486181, 29507616, 29515240 29521748, 29530812, 29531654, 29557336, 29558975, 29601461 -------------------------------------------------------------------------------- OPatch succeeded. [oracle@prod_db ~]$ opatch lspatches 29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399) 29517242;Database Release Update : 19.3.0.0.190416 (29517242) OPatch succeeded. [oracle@prod_db ~]$ 我们可以发现清单中已经没有19.30的DBRU补丁，至此整个19.30的回滚补丁过程结束。\n三、one-off 补丁进行修复 # 如果已经打了19.30的补丁又不想卸载补丁回退，可以参考三哥之前发的文章，这里我们来实操一下。\n3.1 解压补丁38854064 # [oracle@prod_db ~]$ cd 19.30-one-off/ [oracle@prod_db 19.30-one-off]$ pwd /home/oracle/19.30-one-off [oracle@prod_db 19.30-one-off]$ ll total 480 -rw-r--r-- 1 oracle oinstall 488861 Jan 26 20:40 p38854064_1930000DBRU_Linux-x86-64.zip [oracle@prod_db 19.30-one-off]$ unzip -q p38854064_1930000DBRU_Linux-x86-64.zip [oracle@prod_db 19.30-one-off]$ 3.2 关闭数据库和监听 # [oracle@prod_db 19.30-one-off]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 20:46:25 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 SQL\u0026gt; shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL\u0026gt; exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 [oracle@prod_db 19.30-one-off]$ lsnrctl stop LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 26-JAN-2026 20:47:04 Copyright (c) 1991, 2025, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod_db)(PORT=1521))) The command completed successfully [oracle@prod_db 19.30-one-off]$ 3.3 应用补丁38854064 # [oracle@prod_db 19.30-one-off]$ cd 38854064/ [oracle@prod_db 38854064]$ opatch apply Oracle Interim Patch Installer version 12.2.0.1.49 Copyright (c) 2026, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/oracle/product/19.3.0/dbhome_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/19.3.0/dbhome_1/oraInst.loc OPatch version : 12.2.0.1.49 OUI version : 12.2.0.7.0 Log file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-26_20-48-32PM_1.log Verifying environment and performing prerequisite checks... OPatch continues with these patches: 38854064 Do you want to proceed? [y|n] y User Responded with: Y All checks passed. Please shutdown Oracle instances running out of this ORACLE_HOME on the local system. (Oracle Home = \u0026#39;/u01/app/oracle/product/19.3.0/dbhome_1\u0026#39;) Is the local system ready for patching? [y|n] y User Responded with: Y Backing up files... Applying interim patch \u0026#39;38854064\u0026#39; to OH \u0026#39;/u01/app/oracle/product/19.3.0/dbhome_1\u0026#39; Patching component oracle.rdbms, 19.0.0.0.0... Patch 38854064 successfully applied. Log file location: /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-26_20-48-32PM_1.log OPatch succeeded. [oracle@prod_db 38854064]$ 3.4 启动数据库和监听 # [oracle@prod_db 38854064]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 20:50:33 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup ORACLE instance started. Total System Global Area 2516580200 bytes Fixed Size 9181032 bytes Variable Size 771751936 bytes Database Buffers 1728053248 bytes Redo Buffers 7593984 bytes Database mounted. Database opened. SQL\u0026gt; alter pluggable database all open; Pluggable database altered. SQL\u0026gt; exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 [oracle@prod_db 38854064]$ lsnrctl start LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 26-JAN-2026 20:51:04 Copyright (c) 1991, 2025, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.3.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/prod_db/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod_db)(PORT=1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod_db)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 26-JAN-2026 20:51:04 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/prod_db/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod_db)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) The listener supports no services The command completed successfully [oracle@prod_db 38854064]$ 3.5 使用 Datapatch 应用 SQL 补丁 # Datapatch 连接到数据库，收集注册表信息，并应用 SQL 更改：\n[oracle@prod_db 38854064]$ datapatch -verbose SQL Patching tool version 19.30.0.0.0 Production on Mon Jan 26 20:57:14 2026 Copyright (c) 2012, 2026, Oracle. All rights reserved. Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_5195_2026_01_26_20_57_14/sqlpatch_invocation.log Connecting to database...OK Gathering database info...done Note: Datapatch will only apply or rollback SQL fixes for PDBs that are in an open state, no patches will be applied to closed PDBs. Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation (Doc ID 1585822.1) Bootstrapping registry and package to current versions...done Determining current state...done Current state of interim SQL patches: No interim patches found Current state of release update SQL patches: Binary registry: 19.30.0.0.0 Release_Update 260116203150: Installed PDB CDB$ROOT: Applied 19.30.0.0.0 Release_Update 260116203150 successfully on 22-JAN-26 10.28.24.990898 PM PDB PDB: Applied 19.30.0.0.0 Release_Update 260116203150 successfully on 22-JAN-26 10.32.15.776106 PM PDB PDB$SEED: Applied 19.30.0.0.0 Release_Update 260116203150 successfully on 22-JAN-26 10.32.12.082646 PM Adding patches to installation queue and performing prereq checks...done Installation queue: For the following PDBs: CDB$ROOT PDB$SEED PDB No interim patches need to be rolled back No release update patches need to be installed No interim patches need to be applied SQL Patching tool complete on Mon Jan 26 20:57:27 2026 [oracle@prod_db 38854064]$ 3.6 验证补丁应用情况 # 数据库查询补丁应用情况，编译失效对象\nset lines 200 col action_time format a25 col status format a12 col action for a30 col comments for a80 select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; select action_time,action,comments from registry$history; @$ORACLE_HOME/rdbms/admin/utlrp.sql [oracle@prod_db 38854064]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 26 20:59:12 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 SQL\u0026gt; set lines 200 SQL\u0026gt; col action_time format a25 SQL\u0026gt; col status format a12 SQL\u0026gt; col action for a30 SQL\u0026gt; col comments for a80 SQL\u0026gt; select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; ACTION_TIME ACTION STATUS SOURCE_VERSION TARGET_VERSION ------------------------- ------------------------------ ------------ --------------- --------------- 22-JAN-26 08.48.44.104406 APPLY SUCCESS 19.1.0.0.0 19.3.0.0.0 PM 22-JAN-26 10.28.24.990898 APPLY SUCCESS 19.3.0.0.0 19.30.0.0.0 PM SQL\u0026gt; select action_time,action,comments from registry$history; ACTION_TIME ACTION COMMENTS ------------------------- ------------------------------ -------------------------------------------------------------------------------- BOOTSTRAP RDBMS_19.30.0.0.0DBRU_LINUX.X64_260116 22-JAN-26 08.48.40.853184 RU_APPLY Patch applied on 19.3.0.0.0: Release_Update - 190410122720 PM 22-JAN-26 10.28.25.003754 RU_APPLY Patch applied from 19.3.0.0.0 to 19.30.0.0.0: Release_Update - 260116203150 PM SQL\u0026gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql Session altered. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_BGN 2026-01-26 21:08:01 DOC\u0026gt; The following PL/SQL block invokes UTL_RECOMP to recompile invalid DOC\u0026gt; objects in the database. Recompilation time is proportional to the DOC\u0026gt; number of invalid objects in the database, so this command may take DOC\u0026gt; a long time to execute on a database with a large number of invalid DOC\u0026gt; objects. DOC\u0026gt; DOC\u0026gt; Use the following queries to track recompilation progress: DOC\u0026gt; DOC\u0026gt; 1. Query returning the number of invalid objects remaining. This DOC\u0026gt; number should decrease with time. DOC\u0026gt; SELECT COUNT(*) FROM obj$ WHERE status IN (4, 5, 6); DOC\u0026gt; DOC\u0026gt; 2. Query returning the number of objects compiled so far. This number DOC\u0026gt; should increase with time. DOC\u0026gt; SELECT COUNT(*) FROM UTL_RECOMP_COMPILED; DOC\u0026gt; DOC\u0026gt; This script automatically chooses serial or parallel recompilation DOC\u0026gt; based on the number of CPUs available (parameter cpu_count) multiplied DOC\u0026gt; by the number of threads per CPU (parameter parallel_threads_per_cpu). DOC\u0026gt; On RAC, this number is added across all RAC nodes. DOC\u0026gt; DOC\u0026gt; UTL_RECOMP uses DBMS_SCHEDULER to create jobs for parallel DOC\u0026gt; recompilation. Jobs are created without instance affinity so that they DOC\u0026gt; can migrate across RAC nodes. Use the following queries to verify DOC\u0026gt; whether UTL_RECOMP jobs are being created and run correctly: DOC\u0026gt; DOC\u0026gt; 1. Query showing jobs created by UTL_RECOMP DOC\u0026gt; SELECT job_name FROM dba_scheduler_jobs DOC\u0026gt; WHERE job_name like \u0026#39;UTL_RECOMP_SLAVE_%\u0026#39;; DOC\u0026gt; DOC\u0026gt; 2. Query showing UTL_RECOMP jobs that are running DOC\u0026gt; SELECT job_name FROM dba_scheduler_running_jobs DOC\u0026gt; WHERE job_name like \u0026#39;UTL_RECOMP_SLAVE_%\u0026#39;; DOC\u0026gt;# PL/SQL procedure successfully completed. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_END 2026-01-26 21:08:02 DOC\u0026gt; The following query reports the number of invalid objects. DOC\u0026gt; DOC\u0026gt; If the number is higher than expected, please examine the error DOC\u0026gt; messages reported with each object (using SHOW ERRORS) to see if they DOC\u0026gt; point to system misconfiguration or resource constraints that must be DOC\u0026gt; fixed before attempting to recompile these objects. DOC\u0026gt;# OBJECTS WITH ERRORS ------------------- 0 DOC\u0026gt; The following query reports the number of exceptions caught during DOC\u0026gt; recompilation. If this number is non-zero, please query the error DOC\u0026gt; messages in the table UTL_RECOMP_ERRORS to see if any of these errors DOC\u0026gt; are due to misconfiguration or resource constraints that must be DOC\u0026gt; fixed before objects can compile successfully. DOC\u0026gt; Note: Typical compilation errors (due to coding errors) are not DOC\u0026gt; logged into this table: they go into DBA_ERRORS instead. DOC\u0026gt;# ERRORS DURING RECOMPILATION --------------------------- 0 Function created. PL/SQL procedure successfully completed. Function dropped. PL/SQL procedure successfully completed. SQL\u0026gt; Oracle 主目录补丁清单，注意38854064补丁已经应用\n38854064;OCI DATA CORRUPTION SEEN IN MIDDLE OF DBRU PATCHING TO 19.29 AND LOST WRITE DETECTED IN THE STNABY opatch lspatches [oracle@prod_db 38854064]$ opatch lspatches 38854064;OCI DATA CORRUPTION SEEN IN MIDDLE OF DBRU PATCHING TO 19.29 AND LOST WRITE DETECTED IN THE STNABY 38632161;Database Release Update : 19.30.0.0.260120 (38632161) 29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399) OPatch succeeded. [oracle@prod_db 38854064]$ 至此整个one-off 补丁修复过程结束\n","date":"2026-01-26","externalUrl":null,"permalink":"/posts/oracle19c-rollback-patch-38632161/","section":"文章","summary":"一篇 Oracle 19c 补丁处理实战文档，围绕 19.30 RU Patch 38632161，演示两种处理方式：回退 19.30 补丁到 19.3，或者在保留 19.30 的情况下应用 one-off Patch 38854064 修复。","title":"Oracle 19.30 上卸载补丁 Patch 38632161 实战指南","type":"posts"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/oracle-19c/","section":"Tags","summary":"","title":"Oracle 19c","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/patch/","section":"Tags","summary":"","title":"Patch","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/ru/","section":"Tags","summary":"","title":"RU","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/%E8%A1%A5%E4%B8%81%E5%9B%9E%E9%80%80/","section":"Tags","summary":"","title":"补丁回退","type":"tags"},{"content":"","date":"2026-01-22","externalUrl":null,"permalink":"/tags/19.30/","section":"Tags","summary":"","title":"19.30","type":"tags"},{"content":"适用版本：Oracle Database 19.3.0 → 19.30.0 环境：单实例 ，OS 为 Oracle Linux 7.9 补丁类型：RU (Release Update) 19.30.0.0.260120 工具：opatch / datapatch\n一、补丁简介 # Oracle Database 19c 是长期支持版本，Oracle 会继续按季度发布版本更新 (RU)（通常为 1、4、7、10 月），以解决安全漏洞、修复错误并提升性能。2026年 1 月 20 日，Oracle 2026 年第一季度 RU 补丁发布。如下所示：\n补丁号 补丁名 发布日期 文件名 Patch 38632161 DATABASE RELEASE UPDATE 19.30.0.0.0 2026-1-20 p38632161_190000_Linux-x86-64.zip Patch 38629535 GI RELEASE UPDATE 19.30.0.0.0 2026-1-20 p38629535_190000_Linux-x86-64.zip Patch 38523609 OJVM RELEASE UPDATE 19.30.0.0.0 2026-1-20 p38632161_190000_Linux-x86-64.zip Patch 6880880 OPatch 12.2.0.1.49 for DB 19.0.0.0.0 2026-1-20 p6880880_190000_Linux-x86-64.zip 保持 Oracle 数据库的补丁更新不再是可选项，而是所有重视安全性、稳定性和长期支持的数据库管理员的核心职责。本文将介绍补丁程序 38632161 的实际应用过程，该补丁程序用于将 Oracle Database 19c 单实例升级到版本 19.30.0.0.260120。本文涵盖了 OPatch 升级、预检查、补丁应用和补丁应用后的验证，所有步骤均基于真实的生产环境。\n将所有补丁文件上传到生产环境/home/oracle/19.30目录下\n[oracle@prod_db 19.30]$ ll total 6393340 -rw-r--r-- 1 oracle oinstall 129508957 Jan 22 19:35 p38523609_190000_Linux-x86-64.zip -rw-r--r-- 1 oracle oinstall 4065209003 Jan 22 19:36 p38629535_190000_Linux-x86-64.zip -rw-r--r-- 1 oracle oinstall 2279159986 Jan 22 19:36 p38632161_190000_Linux-x86-64.zip -rw-r--r-- 1 oracle oinstall 72896144 Jan 22 19:36 p6880880_190000_Linux-x86-64.zip [oracle@prod_db 19.30]$ 二、先决条件 # 在应用此补丁之前，OPatch 版本要求：\nOPatch version 12.2.0.1.48 or later\n检查现有 OPatch 版本\ncd $ORACLE_HOME/OPatch ./opatch version [oracle@prod_db ~]$ cd $ORACLE_HOME/OPatch [oracle@prod_db OPatch]$ ./opatch version OPatch Version: 12.2.0.1.17 OPatch succeeded. [oracle@prod_db OPatch]$ 三、升级OPatch工具 # 为了避免冲突，现有的 OPatch 目录已进行备份：\ncd $ORACLE_HOME mv OPatch OPatch_12.2.0.1.17 [oracle@prod_db OPatch]$ cd $ORACLE_HOME [oracle@prod_db dbhome_1]$ mv OPatch OPatch_12.2.0.1.17 [oracle@prod_db dbhome_1]$ 接下来，最新的 OPatch 被直接解压到 Oracle Home 目录下：\ncd ~/19.30 unzip -q p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME [oracle@prod_db dbhome_1]$ cd ~/19.30 [oracle@prod_db 19.30]$ unzip -q p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME 解压完成后，验证结果升级成功：\ncd $ORACLE_HOME/OPatch ./opatch version [oracle@prod_db 19.30]$ cd $ORACLE_HOME/OPatch [oracle@prod_db OPatch]$ ./opatch version OPatch Version: 12.2.0.1.49 OPatch succeeded. [oracle@prod_db OPatch]$ ✅️OPatch 现在符合补丁要求。\n四、记录当前补丁级别 # 在应用新的更新包之前，了解当前的补丁基线非常重要。\n数据库补丁状态\nSQL\u0026gt; select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; ACTION_TIME ACTION STATUS SOURCE_VERSION TARGET_VERSION --------------------------------------------------------------------------- --------------- ------------------------- --------------- --------------- 22-JAN-26 08.48.44.104406 PM APPLY SUCCESS 19.1.0.0.0 19.3.0.0.0 SQL\u0026gt; 这里显示数据库版本还是维持最早安装的19.3版本\nOracle 主目录补丁清单\nopatch lspatches [oracle@prod_db ~]$ opatch lspatches 29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399) 29517242;Database Release Update : 19.3.0.0.190416 (29517242) OPatch succeeded. [oracle@prod_db ~]$ OCW 版本更新 19.3，数据库版本更新 19.3\n五、解压补丁 38632161 # 补丁包的解压过程如下：\ncd ~/19.30 unzip -q p38632161_190000_Linux-x86-64.zip ll [oracle@prod_db ~]$ cd ~/19.30 [oracle@prod_db 19.30]$ unzip -q p38632161_190000_Linux-x86-64.zip [oracle@prod_db 19.30]$ ll total 6395860 drwxr-xr-x 5 oracle oinstall 81 Jan 17 16:18 38632161 -rw-r--r-- 1 oracle oinstall 129508957 Jan 22 19:35 p38523609_190000_Linux-x86-64.zip -rw-r--r-- 1 oracle oinstall 4065209003 Jan 22 19:36 p38629535_190000_Linux-x86-64.zip -rw-r--r-- 1 oracle oinstall 2279159986 Jan 22 19:36 p38632161_190000_Linux-x86-64.zip -rw-r--r-- 1 oracle oinstall 72896144 Jan 22 19:36 p6880880_190000_Linux-x86-64.zip -rw-rw-r-- 1 oracle oinstall 2578958 Jan 21 00:56 PatchSearch.xml [oracle@prod_db 19.30]$ 这创建了一个名为 38632161 的补丁目录，其中包含升级所需的元数据、脚本、二进制文件和配置文件。\nOCW 版本更新 19.3，数据库版本更新 19.3\n六、运行冲突和先决条件检查 # 在操作前务必先验证是否存在冲突\ncd ~/19.30/38632161/ opatch prereq CheckConflictAgainstOHWithDetail -ph ./ [oracle@prod_db 19.30]$ cd 38632161/ [oracle@prod_db 38632161]$ opatch prereq CheckConflictAgainstOHWithDetail -ph ./ Oracle Interim Patch Installer version 12.2.0.1.49 Copyright (c) 2026, Oracle Corporation. All rights reserved. PREREQ session Oracle Home : /u01/app/oracle/product/19.3.0/dbhome_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/19.3.0/dbhome_1/oraInst.loc OPatch version : 12.2.0.1.49 OUI version : 12.2.0.7.0 Log file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-22_21-52-46PM_1.log Invoking prereq \u0026#34;checkconflictagainstohwithdetail\u0026#34; Prereq \u0026#34;checkConflictAgainstOHWithDetail\u0026#34; passed. OPatch succeeded. [oracle@prod_db 38632161]$ ✅️未检测到任何冲突\n这一步骤对于避免补丁安装失败或Oracle Home目录损坏至关重要。\n七、关闭数据库和监听 # Oracle 要求在应用版本更新之前进行干净关机。\nsqlplus / as sysdba shutdown immediate [oracle@prod_db 38632161]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 22 21:59:32 2026 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL\u0026gt; shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL\u0026gt; exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 [oracle@prod_db 38632161]$ 然后停止监听\nlsnrctl stop [oracle@prod_db 38632161]$ lsnrctl stop LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 22-JAN-2026 22:00:25 Copyright (c) 1991, 2019, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod_db)(PORT=1521))) The command completed successfully [oracle@prod_db 38632161]$ 此时，系统已完全准备好进行补丁更新。\n八、DB应用补丁 38632161 # 到补丁文件所在目录并应用补丁：\ncd ~/19.30/38632161/ opatch apply [oracle@prod_db 38632161]$ cd ~/19.30/38632161/ [oracle@prod_db 38632161]$ opatch apply Oracle Interim Patch Installer version 12.2.0.1.49 Copyright (c) 2026, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/oracle/product/19.3.0/dbhome_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/19.3.0/dbhome_1/oraInst.loc OPatch version : 12.2.0.1.49 OUI version : 12.2.0.7.0 Log file location : /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-22_22-03-57PM_1.log Verifying environment and performing prerequisite checks... OPatch continues with these patches: 38632161 Do you want to proceed? [y|n] y User Responded with: Y All checks passed. Please shutdown Oracle instances running out of this ORACLE_HOME on the local system. (Oracle Home = \u0026#39;/u01/app/oracle/product/19.3.0/dbhome_1\u0026#39;) Is the local system ready for patching? [y|n] y User Responded with: Y Backing up files... Applying interim patch \u0026#39;38632161\u0026#39; to OH \u0026#39;/u01/app/oracle/product/19.3.0/dbhome_1\u0026#39; ApplySession: Optional component(s) [ oracle.network.gsm, 19.0.0.0.0 ] , [ oracle.assistants.asm, 19.0.0.0.0 ] , [ oracle.crypto.rsf, 19.0.0.0.0 ] , [ oracle.datamining, 19.0.0.0.0 ] , [ oracle.oraolap.mgmt, 19.0.0.0.0 ] , [ oracle.pg4appc, 19.0.0.0.0 ] , [ oracle.pg4mq, 19.0.0.0.0 ] , [ oracle.precomp.companion, 19.0.0.0.0 ] , [ oracle.rdbms.ic, 19.0.0.0.0 ] , [ oracle.rdbms.tg4db2, 19.0.0.0.0 ] , [ oracle.sdo.companion, 19.0.0.0.0 ] , [ oracle.tfa, 19.0.0.0.0 ] , [ oracle.rdbms.tg4msql, 19.0.0.0.0 ] , [ oracle.ons.eons.bwcompat, 19.0.0.0.0 ] , [ oracle.options.olap.api, 19.0.0.0.0 ] , [ oracle.rdbms.tg4sybs, 19.0.0.0.0 ] , [ oracle.net.cman, 19.0.0.0.0 ] , [ oracle.options.olap, 19.0.0.0.0 ] , [ oracle.network.cman, 19.0.0.0.0 ] , [ oracle.pg4mq, 19.0.0.0.0 ] , [ oracle.oraolap.mgmt, 19.0.0.0.0 ] , [ oracle.java.sqlj.sqljruntime, 19.0.0.0.0 ] , [ oracle.datamining, 19.0.0.0.0 ] , [ oracle.xdk.companion, 19.0.0.0.0 ] , [ oracle.rdbms.tg4tera, 19.0.0.0.0 ] , [ oracle.ldap.ztk, 19.0.0.0.0 ] , [ oracle.ons.cclient, 19.0.0.0.0 ] , [ oracle.oid.client, 19.0.0.0.0 ] , [ oracle.rdbms.tg4ifmx, 19.0.0.0.0 ] , [ oracle.jdk, 1.8.0.191.0 ] , [ oracle.jdk, 1.8.0.391.11 ] not present in the Oracle Home or a higher version is found. Patching component oracle.rdbms.rsf, 19.0.0.0.0... Patching component oracle.rdbms, 19.0.0.0.0... Patching component oracle.rdbms.util, 19.0.0.0.0... Patching component oracle.assistants.acf, 19.0.0.0.0... Patching component oracle.assistants.deconfig, 19.0.0.0.0... Patching component oracle.assistants.server, 19.0.0.0.0... Patching component oracle.blaslapack, 19.0.0.0.0... Patching component oracle.buildtools.rsf, 19.0.0.0.0... Patching component oracle.ctx, 19.0.0.0.0... Patching component oracle.dbdev, 19.0.0.0.0... Patching component oracle.dbjava.ic, 19.0.0.0.0... Patching component oracle.dbjava.jdbc, 19.0.0.0.0... Patching component oracle.dbjava.ucp, 19.0.0.0.0... Patching component oracle.duma, 19.0.0.0.0... Patching component oracle.javavm.client, 19.0.0.0.0... Patching component oracle.ldap.client, 19.0.0.0.0... Patching component oracle.ldap.owm, 19.0.0.0.0... Patching component oracle.ldap.rsf, 19.0.0.0.0... Patching component oracle.ldap.security.osdt, 19.0.0.0.0... Patching component oracle.marvel, 19.0.0.0.0... Patching component oracle.network.rsf, 19.0.0.0.0... Patching component oracle.odbc.ic, 19.0.0.0.0... Patching component oracle.ons, 19.0.0.0.0... Patching component oracle.ons.ic, 19.0.0.0.0... Patching component oracle.oracore.rsf, 19.0.0.0.0... Patching component oracle.perlint, 5.28.1.0.0... Patching component oracle.precomp.common.core, 19.0.0.0.0... Patching component oracle.precomp.rsf, 19.0.0.0.0... Patching component oracle.rdbms.crs, 19.0.0.0.0... Patching component oracle.rdbms.dbscripts, 19.0.0.0.0... Patching component oracle.rdbms.deconfig, 19.0.0.0.0... Patching component oracle.rdbms.install.common, 19.0.0.0.0... Patching component oracle.rdbms.oci, 19.0.0.0.0... Patching component oracle.rdbms.rsf.ic, 19.0.0.0.0... Patching component oracle.rdbms.scheduler, 19.0.0.0.0... Patching component oracle.rhp.db, 19.0.0.0.0... Patching component oracle.rsf, 19.0.0.0.0... Patching component oracle.sdo, 19.0.0.0.0... Patching component oracle.sdo.locator.jrf, 19.0.0.0.0... Patching component oracle.sqlj.sqljruntime, 19.0.0.0.0... Patching component oracle.sqlplus, 19.0.0.0.0... Patching component oracle.sqlplus.ic, 19.0.0.0.0... Patching component oracle.tfa.db, 19.0.0.0.0... Patching component oracle.wwg.plsql, 19.0.0.0.0... Patching component oracle.xdk.rsf, 19.0.0.0.0... Patching component oracle.xdk.parser.java, 19.0.0.0.0... Patching component oracle.rdbms.lbac, 19.0.0.0.0... Patching component oracle.ldap.ssl, 19.0.0.0.0... Patching component oracle.network.aso, 19.0.0.0.0... Patching component oracle.xdk, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.core, 19.0.0.0.0... Patching component oracle.odbc, 19.0.0.0.0... Patching component oracle.rdbms.rat, 19.0.0.0.0... Patching component oracle.rdbms.dv, 19.0.0.0.0... Patching component oracle.oraolap.dbscripts, 19.0.0.0.0... Patching component oracle.rdbms.hs_common, 19.0.0.0.0... Patching component oracle.ldap.rsf.ic, 19.0.0.0.0... Patching component oracle.oraolap, 19.0.0.0.0... Patching component oracle.install.deinstalltool, 19.0.0.0.0... Patching component oracle.mgw.common, 19.0.0.0.0... Patching component oracle.rdbms.rman, 19.0.0.0.0... Patching component oracle.xdk.server, 19.0.0.0.0... Patching component oracle.oraolap.api, 19.0.0.0.0... Patching component oracle.rdbms.hsodbc, 19.0.0.0.0... Patching component oracle.ctx.atg, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.core, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.ic, 19.0.0.0.0... Patching component oracle.sqlj.sqljruntime, 19.0.0.0.0... Patching component oracle.wwg.plsql, 19.0.0.0.0... Patching component oracle.network.client, 19.0.0.0.0... Patching component oracle.dbtoolslistener, 19.0.0.0.0... Patching component oracle.rdbms.install.plugins, 19.0.0.0.0... Patching component oracle.ctx.rsf, 19.0.0.0.0... Patching component oracle.nlsrtl.rsf.lbuilder, 19.0.0.0.0... Patching component oracle.rdbms.drdaas, 19.0.0.0.0... Patching component oracle.sdo.locator, 19.0.0.0.0... Patching component oracle.rdbms.locator, 19.0.0.0.0... Patching component oracle.network.listener, 19.0.0.0.0... Patching component oracle.ovm, 19.0.0.0.0... Patching component oracle.javavm.server, 19.0.0.0.0... Patching component oracle.xdk.xquery, 19.0.0.0.0... Patching component oracle.precomp.common, 19.0.0.0.0... Patching component oracle.precomp.lang, 19.0.0.0.0... Patching component oracle.jdk, 1.8.0.201.0... Patch 38632161 successfully applied. Sub-set patch [29517242] has become inactive due to the application of a super-set patch [38632161]. Please refer to Doc ID 2161861.1 for any possible further required actions. Log file location: /u01/app/oracle/product/19.3.0/dbhome_1/cfgtoollogs/opatch/opatch2026-01-22_22-03-57PM_1.log OPatch succeeded. [oracle@prod_db 38632161]$ 九、启动数据库和监听 # 应用补丁后就可以启动数据库和监听了\nsqlplus / as sysdba startup alter pluggable database all open; lsnrctl start [oracle@prod_db 38632161]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 22 22:11:19 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to an idle instance. SQL\u0026gt; startup ORACLE instance started. Total System Global Area 2516580200 bytes Fixed Size 9181032 bytes Variable Size 536870912 bytes Database Buffers 1962934272 bytes Redo Buffers 7593984 bytes Database mounted. Database opened. SQL\u0026gt; alter pluggable database all open; Pluggable database altered. SQL\u0026gt; exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 [oracle@prod_db 38632161]$ lsnrctl start LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 22-JAN-2026 22:11:56 Copyright (c) 1991, 2025, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.3.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/prod_db/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod_db)(PORT=1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod_db)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 22-JAN-2026 22:11:56 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/prod_db/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod_db)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) The listener supports no services The command completed successfully [oracle@prod_db 38632161]$ 十、运行 Datapatch 健全性检查 # 进行二进制补丁更新后，必须验证 SQL 级别的更改。\n在运行 datapatch 之前，Oracle 提供了一个强大的预验证步骤\n检查内容包括：\n数据库组件状态 无效对象 PDB违规行为 表空间健康状况 调度程序作业 数据泵活动 JVM、Vault 和 GoldenGate 触发器 中央库存和词典一致性 datapatch -sanity_checks [oracle@prod_db 38632161]$ datapatch -sanity_checks SQL Patching sanity checks version 19.30.0.0.0 on Thu 22 Jan 2026 10:16:15 PM CST Copyright (c) 2021, 2026, Oracle. All rights reserved. Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sanity_checks_20260122_221615_48586/sanity_checks_20260122_221615_48586.log Running checks JSON report generated in /u01/app/oracle/cfgtoollogs/sqlpatch/sanity_checks_20260122_221615_48586/sqlpatch_sanity_checks_summary.json file Checks completed. Printing report: Check: Database component status - OK Check: PDB Violations - OK Check: Invalid System Objects - OK Check: Tablespace Status - OK Check: Backup jobs - OK Check: Temp file exists - OK Check: Temp file online - OK Check: Data Pump running - OK Check: Container status - OK Check: Oracle Database Keystore - OK Check: Dictionary statistics gathering - WARNING Patching the database without recent data dictionary statistics gathered may lead to performance issues. Data dictionary statistics are older than 7 days. Run the following queries to start gathering the dictionary statistics: EXEC DBMS_STATS.GATHER_DICTIONARY_STATS; EXEC DBMS_SYSTEM.GATHER_FIXED_OBJECTS_STATS; Refer to MOS 457926.1 for more details. PDB$SEED: | LATEST | OPERATION | STATUS | |-----------------+-------------------------+-----------| | 17-APR-19 02:03 | gather_dictionary_stats | COMPLETED | |-----------------+-------------------------+-----------| Check: Scheduled Jobs - OK Check: GoldenGate triggers - OK Check: Logminer DDL triggers - OK Check: Check sys public grants - OK Check: Statistics gathering running - OK Check: Optim dictionary upgrade parameter - OK Check: Symlinks on oracle home path - OK Check: Central Inventory - OK Check: Java Virtual Machine Enable - OK Check: Oracle Database Vault Enabled - OK Check: Queryable Inventory database directories - OK Check: Queryable Inventory locks - OK Check: Queryable Inventory package - OK Check: Queryable Inventory external table - OK Check: Imperva processes - OK Check: Guardium processes - OK Check: Locale - OK Refer to MOS Note 2975965.1 and debug log /u01/app/oracle/cfgtoollogs/sqlpatch/sanity_checks_20260122_221615_48586/sanity_checks_debug_20260122_221615_48586.log SQL Patching sanity checks completed on Thu 22 Jan 2026 10:16:19 PM CST [oracle@prod_db 38632161]$ ✅️这证明数据库已准备好进行 SQL 补丁更新，并且数据完全一致。\n十一、使用 Datapatch 应用 SQL 补丁 # 现在执行 datapatch 工具，应用与 19.30 二进制补丁对应的 SQL 脚本。\nDatapatch 连接到数据库，收集注册表信息，并应用 SQL 更改：\ndatapatch -verbose [oracle@prod_db 38632161]$ datapatch -verbose SQL Patching tool version 19.30.0.0.0 Production on Thu Jan 22 22:22:57 2026 Copyright (c) 2012, 2026, Oracle. All rights reserved. Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_48990_2026_01_22_22_22_57/sqlpatch_invocation.log Connecting to database...OK Gathering database info...done Note: Datapatch will only apply or rollback SQL fixes for PDBs that are in an open state, no patches will be applied to closed PDBs. Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation (Doc ID 1585822.1) Bootstrapping registry and package to current versions...done Determining current state...done Current state of interim SQL patches: No interim patches found Current state of release update SQL patches: Binary registry: 19.30.0.0.0 Release_Update 260116203150: Installed PDB CDB$ROOT: Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 22-JAN-26 08.48.44.104406 PM PDB PDB: Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 22-JAN-26 08.54.41.962296 PM PDB PDB$SEED: Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 22-JAN-26 08.54.41.962296 PM Adding patches to installation queue and performing prereq checks...done Installation queue: For the following PDBs: CDB$ROOT PDB$SEED PDB No interim patches need to be rolled back Patch 38632161 (Database Release Update : 19.30.0.0.260120 (38632161)): Apply from 19.3.0.0.0 Release_Update 190410122720 to 19.30.0.0.0 Release_Update 260116203150 No interim patches need to be applied Installing patches... Patch installation complete. Total patches installed: 3 Validating logfiles...done Patch 38632161 apply (pdb CDB$ROOT): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/38632161/28443995/38632161_apply_PRODCDB_CDBROOT_2026Jan22_22_23_43.log (no errors) Patch 38632161 apply (pdb PDB$SEED): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/38632161/28443995/38632161_apply_PRODCDB_PDBSEED_2026Jan22_22_28_42.log (no errors) Patch 38632161 apply (pdb PDB): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/38632161/28443995/38632161_apply_PRODCDB_PDB_2026Jan22_22_28_42.log (no errors) SQL Patching tool complete on Thu Jan 22 22:32:57 2026 [oracle@prod_db 38632161]$ ✅️这证实 SQL 注册表已成功更新。\n十二、验证补丁应用情况 # 要确认补丁是否已安装，请查询 DBA_REGISTRY_SQLPATCH 视图。\nset lines 200 col action_time format a25 col status format a12 select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; [oracle@prod_db 38632161]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 22 22:36:11 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 SQL\u0026gt; set lines 200 SQL\u0026gt; col action_time format a25 SQL\u0026gt; col status format a12 SQL\u0026gt; select action_time, action, status, source_version, target_version from dba_registry_sqlpatch; ACTION_TIME ACTION STATUS SOURCE_VERSION TARGET_VERSION ------------------------- --------------- ------------ --------------- --------------- 22-JAN-26 08.48.44.104406 APPLY SUCCESS 19.1.0.0.0 19.3.0.0.0 PM 22-JAN-26 10.28.24.990898 APPLY SUCCESS 19.3.0.0.0 19.30.0.0.0 PM SQL\u0026gt; Oracle 主目录补丁清单\nopatch lspatches [oracle@prod_db 38632161]$ opatch lspatches 38632161;Database Release Update : 19.30.0.0.260120 (38632161) 29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399) OPatch succeeded. [oracle@prod_db 38632161]$ 编译失效对象\n@$ORACLE_HOME/rdbms/admin/utlrp.sql [oracle@prod_db 38632161]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 22 22:39:50 2026 Version 19.30.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.30.0.0.0 SQL\u0026gt; @$ORACLE_HOME/rdbms/admin/utlrp.sql Session altered. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_BGN 2026-01-22 22:39:53 DOC\u0026gt; The following PL/SQL block invokes UTL_RECOMP to recompile invalid DOC\u0026gt; objects in the database. Recompilation time is proportional to the DOC\u0026gt; number of invalid objects in the database, so this command may take DOC\u0026gt; a long time to execute on a database with a large number of invalid DOC\u0026gt; objects. DOC\u0026gt; DOC\u0026gt; Use the following queries to track recompilation progress: DOC\u0026gt; DOC\u0026gt; 1. Query returning the number of invalid objects remaining. This DOC\u0026gt; number should decrease with time. DOC\u0026gt; SELECT COUNT(*) FROM obj$ WHERE status IN (4, 5, 6); DOC\u0026gt; DOC\u0026gt; 2. Query returning the number of objects compiled so far. This number DOC\u0026gt; should increase with time. DOC\u0026gt; SELECT COUNT(*) FROM UTL_RECOMP_COMPILED; DOC\u0026gt; DOC\u0026gt; This script automatically chooses serial or parallel recompilation DOC\u0026gt; based on the number of CPUs available (parameter cpu_count) multiplied DOC\u0026gt; by the number of threads per CPU (parameter parallel_threads_per_cpu). DOC\u0026gt; On RAC, this number is added across all RAC nodes. DOC\u0026gt; DOC\u0026gt; UTL_RECOMP uses DBMS_SCHEDULER to create jobs for parallel DOC\u0026gt; recompilation. Jobs are created without instance affinity so that they DOC\u0026gt; can migrate across RAC nodes. Use the following queries to verify DOC\u0026gt; whether UTL_RECOMP jobs are being created and run correctly: DOC\u0026gt; DOC\u0026gt; 1. Query showing jobs created by UTL_RECOMP DOC\u0026gt; SELECT job_name FROM dba_scheduler_jobs DOC\u0026gt; WHERE job_name like \u0026#39;UTL_RECOMP_SLAVE_%\u0026#39;; DOC\u0026gt; DOC\u0026gt; 2. Query showing UTL_RECOMP jobs that are running DOC\u0026gt; SELECT job_name FROM dba_scheduler_running_jobs DOC\u0026gt; WHERE job_name like \u0026#39;UTL_RECOMP_SLAVE_%\u0026#39;; DOC\u0026gt;# PL/SQL procedure successfully completed. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_END 2026-01-22 22:39:54 DOC\u0026gt; The following query reports the number of invalid objects. DOC\u0026gt; DOC\u0026gt; If the number is higher than expected, please examine the error DOC\u0026gt; messages reported with each object (using SHOW ERRORS) to see if they DOC\u0026gt; point to system misconfiguration or resource constraints that must be DOC\u0026gt; fixed before attempting to recompile these objects. DOC\u0026gt;# OBJECTS WITH ERRORS ------------------- 0 DOC\u0026gt; The following query reports the number of exceptions caught during DOC\u0026gt; recompilation. If this number is non-zero, please query the error DOC\u0026gt; messages in the table UTL_RECOMP_ERRORS to see if any of these errors DOC\u0026gt; are due to misconfiguration or resource constraints that must be DOC\u0026gt; fixed before objects can compile successfully. DOC\u0026gt; Note: Typical compilation errors (due to coding errors) are not DOC\u0026gt; logged into this table: they go into DBA_ERRORS instead. DOC\u0026gt;# ERRORS DURING RECOMPILATION --------------------------- 0 Function created. PL/SQL procedure successfully completed. Function dropped. PL/SQL procedure successfully completed. SQL\u0026gt; 至此整个升级过程结束\n","date":"2026-01-22","externalUrl":null,"permalink":"/posts/oracle19c-upgrade-1930-ru-patch/","section":"文章","summary":"一篇 Oracle 19c RU 补丁升级实战文档，基于 Oracle Linux 7.9 单实例环境，演示从 19.3.0 升级到 19.30.0 的完整流程，覆盖 OPatch 12.2.0.1.49 升级、Patch 38632161 应用、datapatch sanity_checks、SQL 补丁注册和失效对象编译。","title":"Oracle 19c 单实例升级到 19.30 RU 补丁实战指南","type":"posts"},{"content":"","date":"2026-01-22","externalUrl":null,"permalink":"/tags/%E8%A1%A5%E4%B8%81%E5%8D%87%E7%BA%A7/","section":"Tags","summary":"","title":"补丁升级","type":"tags"},{"content":"","date":"2026-01-14","externalUrl":null,"permalink":"/tags/lead/","section":"Tags","summary":"","title":"LEAD","type":"tags"},{"content":"","date":"2026-01-14","externalUrl":null,"permalink":"/tags/minus/","section":"Tags","summary":"","title":"MINUS","type":"tags"},{"content":"","date":"2026-01-14","externalUrl":null,"permalink":"/tags/model/","section":"Tags","summary":"","title":"MODEL","type":"tags"},{"content":"","date":"2026-01-14","externalUrl":null,"permalink":"/tags/sql/","section":"Tags","summary":"","title":"SQL","type":"tags"},{"content":"","date":"2026-01-14","externalUrl":null,"permalink":"/tags/%E5%88%86%E6%9E%90%E5%87%BD%E6%95%B0/","section":"Tags","summary":"","title":"分析函数","type":"tags"},{"content":"","date":"2026-01-14","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97/","section":"Tags","summary":"","title":"数据清洗","type":"tags"},{"content":" 前言 # 在数据清洗/排查时，我们经常需要找出某个表里本应连续递增的主键/编号字段中，哪些数字“断号”了。\n举个例子：people.id 从 1 开始递增，但中间有人删过数据，于是出现缺失。我们希望用一条 SQL直接查出缺失编号：\n缺失 ID：4, 5, 6, 14, 20, 21, 22, 23, 24\n构造数据 # 下面我就以Oracle 19c版本数据库为例子。创建一个名为people的表。\n-- 创建people表 create table people ( id number primary key, name varchar2(20), id_card_number varchar2(18), sex varchar2(10), birthday date, companyname varchar2(200), phone number(11,0), email varchar2(200) ); -- 设置日期格式 alter session set nls_date_format=\u0026#39;YYYY-MM-DD\u0026#39;; -- 插入数据 insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(1,\u0026#39;程向欢\u0026#39;,\u0026#39;998903297003105622\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1989-08-20\u0026#39;,\u0026#39;吉林本健生物技术股份有限公司\u0026#39;,17562635371,\u0026#39;yuanmingze787@gmail.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(2,\u0026#39;傅永\u0026#39;,\u0026#39;263329186803313901\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1984-02-23\u0026#39;,\u0026#39;忻州易京文化传媒有限公司\u0026#39;,13522672709,\u0026#39;kewei239@163.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(3,\u0026#39;黄宁\u0026#39;,\u0026#39;560555215710301609\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1970-10-04\u0026#39;,\u0026#39;绵阳春升教育咨询有限公司\u0026#39;,17864884535,\u0026#39;pangmei120@qq.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(7,\u0026#39;夏晴娴\u0026#39;,\u0026#39;792459186810104789\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1981-05-28\u0026#39;,\u0026#39;鞍山四海友诚装饰品股份有限公司\u0026#39;,14965784873,\u0026#39;xueyugang344@163.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(8,\u0026#39;苏小\u0026#39;,\u0026#39;894179182705302265\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2020-05-17\u0026#39;,\u0026#39;白银茂长生物技术集团有限公司\u0026#39;,13340063183,\u0026#39;dongwen117@qq.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(9,\u0026#39;郝希齐\u0026#39;,\u0026#39;358928183312203948\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1970-05-24\u0026#39;,\u0026#39;广元娇建培训集团有限公司\u0026#39;,15438982015,\u0026#39;daiyuanlan382@qq.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(10,\u0026#39;曲新\u0026#39;,\u0026#39;414835394001209712\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1989-04-04\u0026#39;,\u0026#39;咸阳美威科技集团有限公司\u0026#39;,14993593698,\u0026#39;tongrong880@gmail.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(11,\u0026#39;辛一诺\u0026#39;,\u0026#39;927866289504313248\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2018-06-11\u0026#39;,\u0026#39;衢州晨鑫工程技术股份有限公司\u0026#39;,18562767880,\u0026#39;peihua303@163.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(12,\u0026#39;白雨桐\u0026#39;,\u0026#39;61145121091031771X\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1981-08-14\u0026#39;,\u0026#39;伊春健圆文化集团有限公司\u0026#39;,19889214484,\u0026#39;huangmanting136@qq.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(13,\u0026#39;谷浩然\u0026#39;,\u0026#39;729462231101302467\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1982-11-27\u0026#39;,\u0026#39;佳木斯凤尚医药科技股份有限公司\u0026#39;,15749326665,\u0026#39;guoxinyi567@163.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(15,\u0026#39;龚欣怡\u0026#39;,\u0026#39;518439192212204497\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1992-08-30\u0026#39;,\u0026#39;三亚诺拓物流运输股份有限公司\u0026#39;,19809420459,\u0026#39;zhuangxiyuan919@qq.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(16,\u0026#39;孔宇航\u0026#39;,\u0026#39;231819194212042424\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;2002-09-17\u0026#39;,\u0026#39;乐山玉思电力设备集团有限公司\u0026#39;,18372778598,\u0026#39;xiaoxiangguang761@gmail.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(17,\u0026#39;辛金\u0026#39;,\u0026#39;439897363807310147\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1993-04-03\u0026#39;,\u0026#39;恩施土家族苗族德美商贸有限公司\u0026#39;,14944062965,\u0026#39;zhaohaoran515@gmail.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(18,\u0026#39;乔美彩\u0026#39;,\u0026#39;160707220406209525\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1976-05-29\u0026#39;,\u0026#39;平顶山京德园林绿化工程有限公司\u0026#39;,13658208990,\u0026#39;maoxincan615@gmail.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(19,\u0026#39;卢俊\u0026#39;,\u0026#39;786514320010207528\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2022-11-06\u0026#39;,\u0026#39;识娇婚庆服务股份有限公司\u0026#39;,17526097533,\u0026#39;oulin042@qq.com\u0026#39;); insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(25,\u0026#39;屈勤诚\u0026#39;,\u0026#39;748381189111313308\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2001-06-14\u0026#39;,\u0026#39;十堰尔飞机械设备集团有限公司\u0026#39;,17569406333,\u0026#39;kongxinyao478@gmail.com\u0026#39;); commit; 执行上述命令如下：\n[oracle@19c ~]$ sqlplus user1/oracle@PDBPROD1 SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 14 21:51:33 2026 Version 19.29.0.0.0 Copyright (c) 1982, 2025, Oracle. All rights reserved. Last Successful login time: Wed Jan 14 2026 21:18:37 +08:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.29.0.0.0 USER1@PDBPROD1\u0026gt; create table people ( id number primary key, name varchar2(20), id_card_number varchar2(18), sex varchar2(10), birthday date, companyname varchar2(200), phone number(11,0), email varchar2(200) ); 2 3 4 5 6 7 8 9 10 11 Table created. USER1@PDBPROD1\u0026gt; alter session set nls_date_format=\u0026#39;YYYY-MM-DD\u0026#39;; Session altered. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(1,\u0026#39;程向欢\u0026#39;,\u0026#39;998903297003105622\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1989-08-20\u0026#39;,\u0026#39;吉林本健生物技术股份有限公司\u0026#39;,17562635371,\u0026#39;yuanmingze787@gmail.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(2,\u0026#39;傅永\u0026#39;,\u0026#39;263329186803313901\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1984-02-23\u0026#39;,\u0026#39;忻州易京文化传媒有限公司\u0026#39;,13522672709,\u0026#39;kewei239@163.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(3,\u0026#39;黄宁\u0026#39;,\u0026#39;560555215710301609\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1970-10-04\u0026#39;,\u0026#39;绵阳春升教育咨询有限公司\u0026#39;,17864884535,\u0026#39;pangmei120@qq.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(7,\u0026#39;夏晴娴\u0026#39;,\u0026#39;792459186810104789\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1981-05-28\u0026#39;,\u0026#39;鞍山四海友诚装饰品股份有限公司\u0026#39;,14965784873,\u0026#39;xueyugang344@163.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(8,\u0026#39;苏小\u0026#39;,\u0026#39;894179182705302265\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2020-05-17\u0026#39;,\u0026#39;白银茂长生物技术集团有限公司\u0026#39;,13340063183,\u0026#39;dongwen117@qq.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(9,\u0026#39;郝希齐\u0026#39;,\u0026#39;358928183312203948\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1970-05-24\u0026#39;,\u0026#39;广元娇建培训集团有限公司\u0026#39;,15438982015,\u0026#39;daiyuanlan382@qq.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(10,\u0026#39;曲新\u0026#39;,\u0026#39;414835394001209712\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1989-04-04\u0026#39;,\u0026#39;咸阳美威科技集团有限公司\u0026#39;,14993593698,\u0026#39;tongrong880@gmail.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(11,\u0026#39;辛一诺\u0026#39;,\u0026#39;927866289504313248\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2018-06-11\u0026#39;,\u0026#39;衢州晨鑫工程技术股份有限公司\u0026#39;,18562767880,\u0026#39;peihua303@163.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(12,\u0026#39;白雨桐\u0026#39;,\u0026#39;61145121091031771X\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1981-08-14\u0026#39;,\u0026#39;伊春健圆文化集团有限公司\u0026#39;,19889214484,\u0026#39;huangmanting136@qq.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(13,\u0026#39;谷浩然\u0026#39;,\u0026#39;729462231101302467\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1982-11-27\u0026#39;,\u0026#39;佳木斯凤尚医药科技股份有限公司\u0026#39;,15749326665,\u0026#39;guoxinyi567@163.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(15,\u0026#39;龚欣怡\u0026#39;,\u0026#39;518439192212204497\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;1992-08-30\u0026#39;,\u0026#39;三亚诺拓物流运输股份有限公司\u0026#39;,19809420459,\u0026#39;zhuangxiyuan919@qq.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(16,\u0026#39;孔宇航\u0026#39;,\u0026#39;231819194212042424\u0026#39;,\u0026#39;男\u0026#39;,\u0026#39;2002-09-17\u0026#39;,\u0026#39;乐山玉思电力设备集团有限公司\u0026#39;,18372778598,\u0026#39;xiaoxiangguang761@gmail.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(17,\u0026#39;辛金\u0026#39;,\u0026#39;439897363807310147\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1993-04-03\u0026#39;,\u0026#39;恩施土家族苗族德美商贸有限公司\u0026#39;,14944062965,\u0026#39;zhaohaoran515@gmail.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(18,\u0026#39;乔美彩\u0026#39;,\u0026#39;160707220406209525\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;1976-05-29\u0026#39;,\u0026#39;平顶山京德园林绿化工程有限公司\u0026#39;,13658208990,\u0026#39;maoxincan615@gmail.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(19,\u0026#39;卢俊\u0026#39;,\u0026#39;786514320010207528\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2022-11-06\u0026#39;,\u0026#39;识娇婚庆服务股份有限公司\u0026#39;,17526097533,\u0026#39;oulin042@qq.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; insert into people(id,name,id_card_number,sex,birthday,companyname,phone,email) values(25,\u0026#39;屈勤诚\u0026#39;,\u0026#39;748381189111313308\u0026#39;,\u0026#39;女\u0026#39;,\u0026#39;2001-06-14\u0026#39;,\u0026#39;十堰尔飞机械设备集团有限公司\u0026#39;,17569406333,\u0026#39;kongxinyao478@gmail.com\u0026#39;); 1 row created. USER1@PDBPROD1\u0026gt; commit; Commit complete. USER1@PDBPROD1\u0026gt; set linesize 300 USER1@PDBPROD1\u0026gt; set pagesize 300 USER1@PDBPROD1\u0026gt; col companyname for a30 USER1@PDBPROD1\u0026gt; col phone for 99999999999 USER1@PDBPROD1\u0026gt; col email for a30 USER1@PDBPROD1\u0026gt; select * from people; ID NAME ID_CARD_NUMBER\tSEX\tBIRTHDAY\tCOMPANYNAME\tPHONE EMAIL ---------- -------------------- ------------------ ---------- ---------- ------------------------------ ------------ ------------------------------ 1 程向欢\t998903297003105622 男\t1989-08-20 吉林本健生物技术股份有限公司\t17562635371 yuanmingze787@gmail.com 2 傅永 263329186803313901 女\t1984-02-23 忻州易京文化传媒有限公司\t13522672709 kewei239@163.com 3 黄宁 560555215710301609 女\t1970-10-04 绵阳春升教育咨询有限公司\t17864884535 pangmei120@qq.com 7 夏晴娴\t792459186810104789 男\t1981-05-28 鞍山四海友诚装饰品股份有限公司 14965784873 xueyugang344@163.com 8 苏小 894179182705302265 女\t2020-05-17 白银茂长生物技术集团有限公司\t13340063183 dongwen117@qq.com 9 郝希齐\t358928183312203948 男\t1970-05-24 广元娇建培训集团有限公司\t15438982015 daiyuanlan382@qq.com 10 曲新 414835394001209712 女\t1989-04-04 咸阳美威科技集团有限公司\t14993593698 tongrong880@gmail.com 11 辛一诺\t927866289504313248 女\t2018-06-11 衢州晨鑫工程技术股份有限公司\t18562767880 peihua303@163.com 12 白雨桐\t61145121091031771X 女\t1981-08-14 伊春健圆文化集团有限公司\t19889214484 huangmanting136@qq.com 13 谷浩然\t729462231101302467 女\t1982-11-27 佳木斯凤尚医药科技股份有限公司 15749326665 guoxinyi567@163.com 15 龚欣怡\t518439192212204497 男\t1992-08-30 三亚诺拓物流运输股份有限公司\t19809420459 zhuangxiyuan919@qq.com 16 孔宇航\t231819194212042424 男\t2002-09-17 乐山玉思电力设备集团有限公司\t18372778598 xiaoxiangguang761@gmail.com 17 辛金 439897363807310147 女\t1993-04-03 恩施土家族苗族德美商贸有限公司 14944062965 zhaohaoran515@gmail.com 18 乔美彩\t160707220406209525 女\t1976-05-29 平顶山京德园林绿化工程有限公司 13658208990 maoxincan615@gmail.com 19 卢俊 786514320010207528 女\t2022-11-06 识娇婚庆服务股份有限公司\t17526097533 oulin042@qq.com 25 屈勤诚\t748381189111313308 女\t2001-06-14 十堰尔飞机械设备集团有限公司\t17569406333 kongxinyao478@gmail.com 16 rows selected. USER1@PDBPROD1\u0026gt; 解题思路 # 方法一：生成序列 + MINUS（最直观） # 思路：先生成 1~25 的完整序列，再用 MINUS 减掉表里存在的 id，剩下的就是缺失值。\nSELECT LEVEL AS missing_id FROM dual CONNECT BY LEVEL \u0026lt;= (SELECT max(id) FROM people) MINUS SELECT id FROM people; 执行如下：\nUSER1@PDBPROD1\u0026gt; SELECT LEVEL AS missing_id FROM dual CONNECT BY LEVEL \u0026lt;= (SELECT max(id) FROM people) MINUS SELECT id FROM people; 2 3 4 5 6 7 MISSING_ID ---------- 4 5 6 14 20 21 22 23 24 9 rows selected. USER1@PDBPROD1\u0026gt; 方法二：生成序列 + LEFT JOIN 反连接（更“标准 SQL”） # 思路：同样先生成 1~25 序列，然后 LEFT JOIN 原表，筛 p.id is null。\nSELECT seq.id AS missing_id FROM (SELECT LEVEL AS id FROM dual CONNECT BY LEVEL \u0026lt;= (SELECT max(id) FROM people)) seq LEFT JOIN people p ON p.id = seq.id WHERE p.id IS NULL ORDER BY seq.id; 执行如下：\nUSER1@PDBPROD1\u0026gt; SELECT seq.id AS missing_id FROM (SELECT LEVEL AS id FROM dual CONNECT BY LEVEL \u0026lt;= (SELECT max(id) FROM people)) seq LEFT JOIN people p ON p.id = seq.id WHERE p.id IS NULL ORDER BY seq.id; 2 3 4 5 6 7 8 9 MISSING_ID ---------- 4 5 6 14 20 21 22 23 24 9 rows selected. USER1@PDBPROD1\u0026gt; 方法三：LEAD 找缺口区间 + 展开（大范围更推荐） # 思路：使用LEAD()窗口函数找到每个 id 的下一个值 next_id，next_id \u0026gt; id + 1 说明中间有缺失，查询出缺失范围，最后用CROSS APPLY 展开。\nWITH gap_ranges AS (SELECT id + 1 AS gap_start, next_id - 1 AS gap_end FROM (SELECT id, lead(id) OVER (ORDER BY id) AS next_id FROM people) WHERE next_id \u0026gt; id + 1) SELECT x.missing_id FROM gap_ranges g CROSS apply (SELECT g.gap_start + LEVEL - 1 AS missing_id FROM dual CONNECT BY LEVEL \u0026lt;= g.gap_end - g.gap_start + 1) x ORDER BY x.missing_id; 执行如下：\nUSER1@PDBPROD1\u0026gt; WITH gap_ranges AS (SELECT id + 1 AS gap_start, next_id - 1 AS gap_end FROM (SELECT id, lead(id) OVER (ORDER BY id) AS next_id FROM people) WHERE next_id \u0026gt; id + 1) SELECT x.missing_id FROM gap_ranges g CROSS apply 2 3 4 5 6 7 8 9 (SELECT g.gap_start + LEVEL - 1 AS missing_id FROM dual CONNECT BY LEVEL \u0026lt;= g.gap_end - g.gap_start + 1) x ORDER BY x.missing_id; 10 11 12 13 MISSING_ID ---------- 4 5 6 14 20 21 22 23 24 9 rows selected. USER1@PDBPROD1\u0026gt; 感谢刘老虎老师的提醒，要确认边界否则头和尾id被删除，就会找不到缺失的id\n适用于Oracle版本12c以上的，修改如下:\nWITH gap_ranges AS (SELECT id + 1 AS gap_start, next_id - 1 AS gap_end FROM (SELECT id, lead(id) OVER (ORDER BY id) AS next_id FROM (SELECT id FROM people UNION ALL SELECT 0 FROM dual UNION ALL SELECT 26 FROM dual)) WHERE next_id \u0026gt; id + 1) SELECT x.missing_id FROM gap_ranges g CROSS apply (SELECT g.gap_start + LEVEL - 1 AS missing_id FROM dual CONNECT BY LEVEL \u0026lt;= g.gap_end - g.gap_start + 1) x ORDER BY x.missing_id; 适用于Oracle版本12c以下的，修改如下:\nWITH gap_ranges AS (SELECT id + 1 AS gap_start, next_id - 1 AS gap_end FROM (SELECT id, lead(id) OVER (ORDER BY id) AS next_id FROM (SELECT id FROM people UNION ALL SELECT 0 FROM dual UNION ALL SELECT 26 FROM dual)) WHERE next_id \u0026gt; id + 1) SELECT gap_start + LEVEL - 1 AS missing_id FROM gap_ranges CONNECT BY LEVEL \u0026lt;= gap_end - gap_start + 1 AND PRIOR gap_start = gap_start AND PRIOR sys_guid() IS NOT NULL ORDER BY missing_id; 还有用row_number()（窗口函数） 来代替 LEAD()，再用 自连接 rn+1 找到“下一行 id”，最后把缺口区间展开成单个缺失值。\nWITH s AS (SELECT DISTINCT id, row_number() OVER (ORDER BY id) AS rn FROM (SELECT id FROM people UNION ALL SELECT 0 FROM dual UNION ALL SELECT 26 FROM dual)), gaps AS (SELECT a.id + 1 AS gap_start, b.id - 1 AS gap_end FROM s a JOIN s b ON b.rn = a.rn + 1 WHERE b.id \u0026gt; a.id + 1) SELECT gap_start + LEVEL - 1 AS missing_id FROM gaps CONNECT BY LEVEL \u0026lt;= gap_end - gap_start + 1 AND PRIOR gap_start = gap_start AND PRIOR sys_guid() IS NOT NULL ORDER BY missing_id; 方法四：MODEL 子句（进阶写法，可读性一般但很“Oracle”） # 思路：把 1~25 当成“维度”，用 MODEL 把缺失位置的 flag 补成 0，然后筛出 flag=0 的维度值。\nSELECT id AS missing_id FROM (SELECT id, flag FROM (SELECT id, 1 AS flag FROM people) model dimension by(id) measures(flag) rules upsert(flag [ for id from 1 to 25 increment 1 ] = nvl(flag [ cv() ], 0))) WHERE flag = 0; 执行如下：\nUSER1@PDBPROD1\u0026gt; SELECT id AS missing_id FROM (SELECT id, flag FROM (SELECT id, 1 AS flag FROM people) model dimension by(id) measures(flag) rules upsert(flag [ for id from 1 to 25 increment 1 ] = nvl(flag [ cv() ], 0))) WHERE flag = 2 3 4 5 6 7 8 9 0; MISSING_ID ---------- 4 5 6 14 20 21 22 23 24 9 rows selected. USER1@PDBPROD1\u0026gt; 总结 # 本文给了 4 种“一条 SQL”的写法，核心都是：定义范围 → 找出缺失 → 输出缺失编号。如果还有其他方法也请各位高手赐教。\n","date":"2026-01-14","externalUrl":null,"permalink":"/posts/oracle19c-find-missing-id-sql/","section":"文章","summary":"一篇 Oracle SQL 实战文章：通过构造 people 示例表，演示如何用一条 SQL 找出不连续 ID，覆盖生成序列减法、反连接、LEAD 缺口区间展开、MODEL 子句等多种写法。","title":"用一条 SQL 找出不连续的 ID：Oracle 19c 四种写法","type":"posts"},{"content":"","date":"2025-12-20","externalUrl":null,"permalink":"/tags/awr/","section":"Tags","summary":"","title":"AWR","type":"tags"},{"content":" 一、通过 AWR 定位问题 SQL # 在业务高峰（周一 10:00~11:00）拉取 AWR 报告，在 SQL ordered by Elapsed Time 章节找到耗时最重的 SQL，记录：\nSQL_ID = f6asas4cp2n53 二、使用 SQL Monitor工具 # 用SQL Monitor工具简单的分析一下这条SQL\n2.1 确认参数 # SQL\u0026gt; show parameter statistics_level NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ statistics_level string TYPICAL SQL\u0026gt; show parameter control_management_pack_access; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_management_pack_access string DIAGNOSTIC+TUNING SQL\u0026gt; 2.2 生成 SQL Monitor 报告（ACTIVE HTML） # SQL\u0026gt; set long 2000000 longchunksize 2000000 pages 0 lines 32767 trimspool on SQL\u0026gt; spool sqlmon_f6asas4cp2n53_old.html SQL\u0026gt; select dbms_sqltune.report_sql_monitor(sql_id=\u0026gt;\u0026#39;f6asas4cp2n53\u0026#39;,report_level=\u0026gt;\u0026#39;ALL\u0026#39;,type=\u0026gt;\u0026#39;ACTIVE\u0026#39;) as report from dual; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta http-equiv=\u0026#34;Content-Type\u0026#34; content=\u0026#34;text/html; charset=utf-8\u0026#34;/\u0026gt; \u0026lt;base href=\u0026#34;http://download.oracle.com/otn_software/\u0026#34;/\u0026gt; 。。。省略 \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; language=\u0026#34;JavaScript1.2\u0026#34; charset=\u0026#34;utf-8\u0026#34; src=\u0026#34;emviewers/scripts/document.js\u0026#34;\u0026gt; \u0026lt;!--Run document script--\u0026gt; \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; SQL\u0026gt; spool off 2.3 分析SQL Monitor 报告 # 将ACTIVE Report下载到本地查看一下，看到执行需要27秒，需要大量的用户I/O等待。\nElapsed（总体耗时 27 秒） Top waits（大量 User I/O） 执行计划走了“明显不合理”的路径（走了低选择性索引、回表过多） 三、运行 SQL Tuning Advisor（生成建议） # 使用SQL Tuning Advisor工具来优化SQL。\n3.1 创建 Tuning Task # 通过调用函数DBMS_SQLTUNE.CREATE_TUNING_TASK来创建优化任务\nSQL\u0026gt; declare my_task_name varchar2(30); begin my_task_name := dbms_sqltune.create_tuning_task( 2 3 4 5 begin_snap =\u0026gt; 75585, end_snap =\u0026gt; 75586, sql_id =\u0026gt; \u0026#39;f6asas4cp2n53\u0026#39;, scope =\u0026gt; \u0026#39;COMPREHENSIVE\u0026#39;, time_limit =\u0026gt; 1000, task_name =\u0026gt; \u0026#39;sql_tuning_advisor_test\u0026#39;, 6 7 8 9 10 11 description =\u0026gt; \u0026#39;Task to tune a query on a specified table\u0026#39;); end; / 12 13 14 PL/SQL procedure successfully completed. SQL\u0026gt; 3.2 执行任务 # 通过调用dbms_sqltune.execute_tuning_task过程来执行前面创建好的优化任务。\nSQL\u0026gt; exec dbms_sqltune.execute_tuning_task(\u0026#39;sql_tuning_advisor_test\u0026#39;); PL/SQL procedure successfully completed. SQL\u0026gt; 3.3 查看任务状态 # 通过查看user_advisor_tasks/dba_advisor_tasks视图可以查看优化任务的当前状态。\nSQL\u0026gt; SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name=\u0026#39;sql_tuning_advisor_test\u0026#39;; TASK_NAME STATUS ------------------------------ ----------- sql_tuning_advisor_test EXECUTING SQL\u0026gt; 3.4 查看优化建议（报告） # SQL\u0026gt; set linesize 500 pagesize 500 SQL\u0026gt; SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( \u0026#39;sql_tuning_advisor_test\u0026#39;) from DUAL; DBMS_SQLTUNE.REPORT_TUNING_TASK(\u0026#39;SQL_TUNING_ADVISOR_TEST\u0026#39;) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- GENERAL INFORMATION SECTION ------------------------------------------------------------------------------- Tuning Task Name : sql_tuning_advisor_test Tuning Task Owner : GRYL Workload Type : Single SQL Statement Execution Count : 2 Current Execution : EXEC_89642 Execution Type : TUNE SQL Scope : COMPREHENSIVE Time Limit(seconds): 1000 Completion Status : COMPLETED Started at : 12/17/2025 15:30:03 Completed at : 12/17/2025 15:32:46 ------------------------------------------------------------------------------- Schema Name: GRYL SQL ID : f6asas4cp2n53 SQL Text : select count(*) from ( select distinct id from ( SELECT o.id FROM ui_sales_invoices o JOIN spd_cstapp_ref a ON a.IOTYPE = o.IOTYPE AND a.CSTID = o.CSTID join scm_salbill_hdr b on o.billid = b.id join pub_dept pd on b.deptid = pd.deptid and pd.spdsubdeptid = a.udeptid and pd.spdtype = \u0026#39;20\u0026#39; WHERE a.APPID = :1 AND a.appdeptcode = :2 AND o.transflag = \u0026#39;00\u0026#39; union all SELECT o.id FROM ui_sales_invoices o JOIN spd_cstapp_ref a ON a.IOTYPE = o.IOTYPE AND a.CSTID = o.CSTID join scm_salbill_hdr b on o.billid = b.id join pub_dept pd on b.deptid = pd.deptid and pd.spdtype \u0026lt;\u0026gt; \u0026#39;20\u0026#39; WHERE a.APPID = :3 AND a.appdeptcode = :4 AND o.transflag = \u0026#39;00\u0026#39; ) ) Bind Variables : 1 - (VARCHAR2(128)):plemisetbj 21023 2 - (VARCHAR2(32)):6 3 - (VARCHAR2(128)):plemisetbj 21023 4 - (VARCHAR2(32)):6 ------------------------------------------------------------------------------- FINDINGS SECTION (2 findings) ------------------------------------------------------------------------------- 1- SQL Profile Finding (see explain plans section below) -------------------------------------------------------- 为此语句找到了性能更好的执行计划 2。选择以下 SQL 概要文件之一进行实施。 Recommendation (estimated benefit: 98.02%) ------------------------------------------ - 考虑接受推荐的 SQL 概要文件。 execute dbms_sqltune.accept_sql_profile(task_name =\u0026gt; \u0026#39;sql_tuning_advisor_test\u0026#39;, task_owner =\u0026gt; \u0026#39;GRYL\u0026#39;, replace =\u0026gt; TRUE); Validation results ------------------ 已对 SQL profile 进行测试, 方法为执行其计划和原始计划并测量与计划相对应的执行统计信息。如果其中一个计划运行在很短的时间内就完成, 则另一计划可能只执行了一部分。 Original Plan With SQL Profile % Improved ------------- ---------------- ---------- Completion Status: COMPLETE COMPLETE Elapsed Time (s): 2.636928 .19837 92.47 % CPU Time (s): 2.638678 .197866 92.5 % User I/O Time (s): 0 0 Buffer Gets: 519126 10263 98.02 % Physical Read Requests: 0 0 Physical Write Requests: 0 0 Physical Read Bytes: 0 0 Physical Write Bytes: 0 0 Rows Processed: 1 1 Fetches: 1 1 Executions: 1 1 Notes ----- 1. the original plan 的统计信息是 1 执行的平均值。 2. the SQL profile plan 的统计信息是 6 执行的平均值。 Recommendation (estimated benefit: 99.25%) ------------------------------------------ - 考虑接受建议的 SQL 概要文件, 以便对此语句使用并行执行。 execute dbms_sqltune.accept_sql_profile(task_name =\u0026gt; \u0026#39;sql_tuning_advisor_test\u0026#39;, task_owner =\u0026gt; \u0026#39;GRYL\u0026#39;, replace =\u0026gt; TRUE, profile_type =\u0026gt; DBMS_SQLTUNE.PX_PROFILE); 与 DOP 32 并行执行此查询会使 SQL 概要文件计划上的响应时间缩短 95.16%。但是, 启用并行执行时要付出一些代价。它将增加语句的资源消耗 (预计为 55.03%), 这会导致系统吞吐量降低。此外, 由于在非常短的持续时间内消耗了这些资源, 因此如果没有足够可用的硬件容量, 并发语句的响应时间将受到负面影响。 The following data shows some sampled statistics for this SQL from the past week and projected weekly values when parallel execution is enabled. Past week sampled statistics for this SQL ----------------------------------------- Number of executions 0 Percent of total activity 0 Percent of samples with #Active Sessions \u0026gt; 2*CPU 0 Weekly DB time (in sec) 0 Projected statistics with Parallel Execution -------------------------------------------- Weekly DB time (in sec) 0 2- Index Finding (see explain plans section below) -------------------------------------------------- 通过创建一个或多个索引可以改进此语句的执行计划。 Recommendation (estimated benefit: 99.98%) ------------------------------------------ - 考虑运行访问指导以改进物理方案设计或者创建推荐的索引。如果选择创建推荐的索引, 请考虑删除索引 \u0026#34;GRYL\u0026#34;.\u0026#34;IDV_UI_SALES_INVOICES_IOTYPE\u0026#34;, 因为它是推荐的索引的前缀。 create index GRYL.IDX$$_1521E0001 on GRYL.UI_SALES_INVOICES(\u0026#34;IOTYPE\u0026#34;,\u0026#34;CSTID \u0026#34;); Rationale --------- 创建推荐的索引可以显著地改进此语句的执行计划。但是, 使用典型的 SQL 工作量运行 \u0026#34;访问指导\u0026#34; 可能比单个语句更可取。通过这种方法可以获得全面的索引建议案, 包括计算索引维护的开销和附加的空间消耗。 ------------------------------------------------------------------------------- ADDITIONAL INFORMATION SECTION ------------------------------------------------------------------------------- - 优化程序不能合并位于执行计划的行 ID 4 处的视图。. 优化程序不能合并包含设置运算符的视图。. ------------------------------------------------------------------------------- EXPLAIN PLANS SECTION ------------------------------------------------------------------------------- 1- Original With Adjusted Cost ------------------------------ Plan hash value: 1729567282 --------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 469K (1)| 01:34:00 | | 1 | SORT AGGREGATE | | 1 | | | | | 2 | VIEW | | 2 | | 469K (1)| 01:34:00 | | 3 | HASH UNIQUE | | 2 | 12 | 469K (1)| 01:34:00 | | 4 | VIEW | | 2 | 12 | 469K (1)| 01:34:00 | | 5 | UNION-ALL | | | | | | | 6 | NESTED LOOPS | | 1 | 86 | 391K (1)| 01:18:20 | | 7 | NESTED LOOPS | | 46 | 86 | 391K (1)| 01:18:20 | | 8 | NESTED LOOPS | | 46 | 3450 | 391K (1)| 01:18:19 | |* 9 | HASH JOIN | | 10 | 480 | 26 (0)| 00:00:01 | |* 10 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 1 | 37 | 3 (0)| 00:00:01 | |* 11 | TABLE ACCESS FULL | PUB_DEPT | 91 | 1001 | 23 (0)| 00:00:01 | |* 12 | TABLE ACCESS BY INDEX ROWID | UI_SALES_INVOICES | 5 | 135 | 39148 (1)| 00:07:50 | |* 13 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_IOTYPE | 419K| | 797 (1)| 00:00:10 | |* 14 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 1 (0)| 00:00:01 | |* 15 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 2 (0)| 00:00:01 | |* 16 | HASH JOIN | | 1 | 81 | 78324 (1)| 00:15:40 | |* 17 | TABLE ACCESS FULL | PUB_DEPT | 2070 | 18630 | 23 (0)| 00:00:01 | | 18 | NESTED LOOPS | | 1 | 72 | 78301 (1)| 00:15:40 | | 19 | NESTED LOOPS | | 1 | 72 | 78301 (1)| 00:15:40 | | 20 | NESTED LOOPS | | 1 | 61 | 78299 (1)| 00:15:40 | |* 21 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 2 | 68 | 3 (0)| 00:00:01 | |* 22 | TABLE ACCESS BY INDEX ROWID| UI_SALES_INVOICES | 1 | 27 | 39148 (1)| 00:07:50 | |* 23 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_IOTYPE | 419K| | 797 (1)| 00:00:10 | |* 24 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 1 (0)| 00:00:01 | | 25 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 2 (0)| 00:00:01 | --------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 9 - access(\u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34;=\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34;) 10 - filter(\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34; IS NOT NULL AND \u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:2 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:1) 11 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;=\u0026#39;20\u0026#39; AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34; IS NOT NULL) 12 - filter(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39; AND \u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 13 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;)) 14 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 15 - filter(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 16 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 17 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;\u0026lt;\u0026gt;\u0026#39;20\u0026#39;) 21 - filter(\u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:4 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:3) 22 - filter(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39; AND \u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 23 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;)) 24 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 2- Using SQL Profile -------------------- Plan hash value: 1915901977 -------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 71849 (1)| 00:14:23 | | 1 | SORT AGGREGATE | | 1 | | | | | 2 | VIEW | | 2 | | 71849 (1)| 00:14:23 | | 3 | HASH UNIQUE | | 2 | 12 | 71849 (1)| 00:14:23 | | 4 | VIEW | | 2 | 12 | 71848 (1)| 00:14:23 | | 5 | UNION-ALL | | | | | | | 6 | NESTED LOOPS | | 1 | 86 | 23955 (1)| 00:04:48 | | 7 | NESTED LOOPS | | 1 | 86 | 23955 (1)| 00:04:48 | | 8 | NESTED LOOPS | | 1 | 75 | 23954 (1)| 00:04:48 | | 9 | NESTED LOOPS | | 1 | 64 | 23952 (1)| 00:04:48 | |* 10 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 1 | 37 | 3 (0)| 00:00:01 | |* 11 | TABLE ACCESS BY INDEX ROWID | UI_SALES_INVOICES | 1 | 27 | 23952 (1)| 00:04:48 | | 12 | BITMAP CONVERSION TO ROWIDS | | | | | | | 13 | BITMAP AND | | | | | | | 14 | BITMAP CONVERSION FROM ROWIDS| | | | | | |* 15 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_IOTYPE | 419K| | 797 (1)| 00:00:10 | | 16 | BITMAP CONVERSION FROM ROWIDS| | | | | | |* 17 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_TRFLAG | 419K| | 2210 (1)| 00:00:27 | | 18 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 2 (0)| 00:00:01 | |* 19 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 1 (0)| 00:00:01 | |* 20 | INDEX UNIQUE SCAN | PK_PUB_DEPT | 1 | | 0 (0)| 00:00:01 | |* 21 | TABLE ACCESS BY INDEX ROWID | PUB_DEPT | 1 | 11 | 1 (0)| 00:00:01 | | 22 | NESTED LOOPS | | 1 | 81 | 47892 (1)| 00:09:35 | | 23 | NESTED LOOPS | | 1 | 81 | 47892 (1)| 00:09:35 | | 24 | NESTED LOOPS | | 1 | 72 | 47891 (1)| 00:09:35 | | 25 | NESTED LOOPS | | 1 | 61 | 47889 (1)| 00:09:35 | |* 26 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 2 | 68 | 3 (0)| 00:00:01 | |* 27 | TABLE ACCESS BY INDEX ROWID | UI_SALES_INVOICES | 1 | 27 | 47889 (1)| 00:09:35 | | 28 | BITMAP CONVERSION TO ROWIDS | | | | | | | 29 | BITMAP AND | | | | | | | 30 | BITMAP CONVERSION FROM ROWIDS| | | | | | |* 31 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_IOTYPE | 419K| | 797 (1)| 00:00:10 | | 32 | BITMAP CONVERSION FROM ROWIDS| | | | | | |* 33 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_TRFLAG | 419K| | 2210 (1)| 00:00:27 | | 34 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 2 (0)| 00:00:01 | |* 35 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 1 (0)| 00:00:01 | |* 36 | INDEX UNIQUE SCAN | PK_PUB_DEPT | 1 | | 0 (0)| 00:00:01 | |* 37 | TABLE ACCESS BY INDEX ROWID | PUB_DEPT | 1 | 9 | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 10 - filter(\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34; IS NOT NULL AND \u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:2 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:1) 11 - filter(\u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 15 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;)) 17 - access(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39;) 19 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 20 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 21 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;=\u0026#39;20\u0026#39; AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34; IS NOT NULL AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34;=\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34;) 26 - filter(\u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:4 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:3) 27 - filter(\u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 31 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;)) 33 - access(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39;) 35 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 36 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 37 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;\u0026lt;\u0026gt;\u0026#39;20\u0026#39;) 3- Using New Indices -------------------- Plan hash value: 3981297468 ---------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | ---------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 8 (25)| 00:00:01 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | | 2 | PX COORDINATOR | | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10001 | 1 | | | | Q1,01 | P-\u0026gt;S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | | Q1,01 | PCWP | | | 5 | VIEW | | 2 | | 8 (25)| 00:00:01 | Q1,01 | PCWP | | | 6 | HASH UNIQUE | | 2 | 12 | 8 (25)| 00:00:01 | Q1,01 | PCWP | | | 7 | PX RECEIVE | | 2 | 12 | 8 (25)| 00:00:01 | Q1,01 | PCWP | | | 8 | PX SEND HASH | :TQ10000 | 2 | 12 | 8 (25)| 00:00:01 | Q1,00 | P-\u0026gt;P | HASH | | 9 | HASH UNIQUE | | 2 | 12 | 8 (25)| 00:00:01 | Q1,00 | PCWP | | | 10 | VIEW | | 2 | 12 | 6 (0)| 00:00:01 | Q1,00 | PCWP | | | 11 | UNION-ALL | | | | | | Q1,00 | PCWP | | | 12 | NESTED LOOPS | | 1 | 86 | 3 (0)| 00:00:01 | Q1,00 | PCWP | | | 13 | NESTED LOOPS | | 1 | 86 | 3 (0)| 00:00:01 | Q1,00 | PCWP | | | 14 | NESTED LOOPS | | 1 | 75 | 3 (0)| 00:00:01 | Q1,00 | PCWP | | | 15 | NESTED LOOPS | | 1 | 64 | 3 (0)| 00:00:01 | Q1,00 | PCWP | | | 16 | PX BLOCK ITERATOR | | | | | | Q1,00 | PCWC | | |* 17 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 1 | 37 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | |* 18 | TABLE ACCESS BY INDEX ROWID| UI_SALES_INVOICES | 1 | 27 | 21 (0)| 00:00:01 | Q1,00 | PCWP | | |* 19 | INDEX RANGE SCAN | IDX$$_1521E0001 | 102 | | 2 (0)| 00:00:01 | Q1,00 | PCWP | | | 20 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 21 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 22 | INDEX UNIQUE SCAN | PK_PUB_DEPT | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 23 | TABLE ACCESS BY INDEX ROWID | PUB_DEPT | 1 | 11 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | | 24 | NESTED LOOPS | | 1 | 81 | 4 (0)| 00:00:01 | Q1,00 | PCWP | | | 25 | NESTED LOOPS | | 1 | 81 | 4 (0)| 00:00:01 | Q1,00 | PCWP | | | 26 | NESTED LOOPS | | 1 | 72 | 4 (0)| 00:00:01 | Q1,00 | PCWP | | | 27 | NESTED LOOPS | | 1 | 61 | 3 (0)| 00:00:01 | Q1,00 | PCWP | | | 28 | PX BLOCK ITERATOR | | | | | | Q1,00 | PCWC | | |* 29 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 2 | 68 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | |* 30 | TABLE ACCESS BY INDEX ROWID| UI_SALES_INVOICES | 1 | 27 | 21 (0)| 00:00:01 | Q1,00 | PCWP | | |* 31 | INDEX RANGE SCAN | IDX$$_1521E0001 | 102 | | 2 (0)| 00:00:01 | Q1,00 | PCWP | | | 32 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 33 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 34 | INDEX UNIQUE SCAN | PK_PUB_DEPT | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 35 | TABLE ACCESS BY INDEX ROWID | PUB_DEPT | 1 | 9 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | ---------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 17 - filter(\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34; IS NOT NULL AND \u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:2 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:1) 18 - filter(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39;) 19 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;) AND \u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 21 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 22 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 23 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;=\u0026#39;20\u0026#39; AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34; IS NOT NULL AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34;=\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34;) 29 - filter(\u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:4 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:3) 30 - filter(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39;) 31 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;) AND \u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 33 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 34 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 35 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;\u0026lt;\u0026gt;\u0026#39;20\u0026#39;) 4- Using Parallel Execution --------------------------- Plan hash value: 2730138638 -------------------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 3481 (1)| 00:00:42 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | | 2 | PX COORDINATOR | | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10001 | 1 | | | | Q1,01 | P-\u0026gt;S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | | Q1,01 | PCWP | | | 5 | VIEW | | 2 | | 3481 (1)| 00:00:42 | Q1,01 | PCWP | | | 6 | HASH UNIQUE | | 2 | 12 | 3481 (1)| 00:00:42 | Q1,01 | PCWP | | | 7 | PX RECEIVE | | 2 | 12 | 3481 (1)| 00:00:42 | Q1,01 | PCWP | | | 8 | PX SEND HASH | :TQ10000 | 2 | 12 | 3481 (1)| 00:00:42 | Q1,00 | P-\u0026gt;P | HASH | | 9 | HASH UNIQUE | | 2 | 12 | 3481 (1)| 00:00:42 | Q1,00 | PCWP | | | 10 | VIEW | | 2 | 12 | 3480 (1)| 00:00:42 | Q1,00 | PCWP | | | 11 | UNION-ALL | | | | | | Q1,00 | PCWP | | | 12 | NESTED LOOPS | | 1 | 86 | 1361 (1)| 00:00:17 | Q1,00 | PCWP | | | 13 | NESTED LOOPS | | 1 | 86 | 1361 (1)| 00:00:17 | Q1,00 | PCWP | | | 14 | NESTED LOOPS | | 1 | 75 | 1361 (1)| 00:00:17 | Q1,00 | PCWP | | | 15 | NESTED LOOPS | | 1 | 64 | 1361 (1)| 00:00:17 | Q1,00 | PCWP | | | 16 | PX BLOCK ITERATOR | | | | | | Q1,00 | PCWC | | |* 17 | TABLE ACCESS FULL | SPD_CSTAPP_REF | 1 | 37 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | |* 18 | TABLE ACCESS BY INDEX ROWID| UI_SALES_INVOICES | 1 | 27 | 1359 (1)| 00:00:17 | Q1,00 | PCWP | | |* 19 | INDEX RANGE SCAN | IDV_UI_SALES_INVOICES_IOTYPE | 419K| | 28 (0)| 00:00:01 | Q1,00 | PCWP | | | 20 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 21 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 22 | INDEX UNIQUE SCAN | PK_PUB_DEPT | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 23 | TABLE ACCESS BY INDEX ROWID | PUB_DEPT | 1 | 11 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | | 24 | NESTED LOOPS | | 1 | 81 | 2118 (1)| 00:00:26 | Q1,00 | PCWP | | | 25 | NESTED LOOPS | | 1 | 81 | 2118 (1)| 00:00:26 | Q1,00 | PCWP | | | 26 | NESTED LOOPS | | 1 | 72 | 2118 (1)| 00:00:26 | Q1,00 | PCWP | | | 27 | NESTED LOOPS | | 1 | 61 | 2118 (1)| 00:00:26 | Q1,00 | PCWP | | | 28 | PX BLOCK ITERATOR | | | | | | Q1,00 | PCWC | | |* 29 | TABLE ACCESS FULL | UI_SALES_INVOICES | 2329 | 62883 | 2117 (1)| 00:00:26 | Q1,00 | PCWP | | |* 30 | TABLE ACCESS BY INDEX ROWID| SPD_CSTAPP_REF | 1 | 34 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 31 | INDEX RANGE SCAN | IDX_SPD_CSTAPP_REF_CSTID | 10 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | | 32 | TABLE ACCESS BY INDEX ROWID | SCM_SALBILL_HDR | 1 | 11 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 33 | INDEX UNIQUE SCAN | PK_SCM_SALBILL_HDR | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 34 | INDEX UNIQUE SCAN | PK_PUB_DEPT | 1 | | 0 (0)| 00:00:01 | Q1,00 | PCWP | | |* 35 | TABLE ACCESS BY INDEX ROWID | PUB_DEPT | 1 | 9 | 0 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 17 - filter(\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34; IS NOT NULL AND \u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:2 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:1) 18 - filter(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39; AND \u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 19 - access(\u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;)) 21 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 22 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 23 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;=\u0026#39;20\u0026#39; AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34; IS NOT NULL AND \u0026#34;PD\u0026#34;.\u0026#34;SPDSUBDEPTID\u0026#34;=\u0026#34;A\u0026#34;.\u0026#34;UDEPTID\u0026#34;) 29 - filter(\u0026#34;O\u0026#34;.\u0026#34;TRANSFLAG\u0026#34;=\u0026#39;00\u0026#39;) 30 - filter(\u0026#34;A\u0026#34;.\u0026#34;APPDEPTCODE\u0026#34;=:4 AND \u0026#34;A\u0026#34;.\u0026#34;APPID\u0026#34;=:3 AND \u0026#34;O\u0026#34;.\u0026#34;IOTYPE\u0026#34;=TO_NUMBER(\u0026#34;A\u0026#34;.\u0026#34;IOTYPE\u0026#34;)) 31 - access(\u0026#34;A\u0026#34;.\u0026#34;CSTID\u0026#34;=\u0026#34;O\u0026#34;.\u0026#34;CSTID\u0026#34;) 33 - access(\u0026#34;O\u0026#34;.\u0026#34;BILLID\u0026#34;=\u0026#34;B\u0026#34;.\u0026#34;ID\u0026#34;) 34 - access(\u0026#34;B\u0026#34;.\u0026#34;DEPTID\u0026#34;=\u0026#34;PD\u0026#34;.\u0026#34;DEPTID\u0026#34;) 35 - filter(\u0026#34;PD\u0026#34;.\u0026#34;SPDTYPE\u0026#34;\u0026lt;\u0026gt;\u0026#39;20\u0026#39;) ------------------------------------------------------------------------------- SQL\u0026gt; 你通常会看到的两类“可参考建议”\nSQL Profile（含并行 Profile 选项）：可能改变执行计划、甚至建议并行 ⚠️ 生产 OLTP 谨慎：并行可能放大并发压力，需要压测验证 索引建议：常见是对过滤列/连接列给出复合索引建议 ⚠️ 需要评估：新增索引会增加 DML 成本，占用空间，且可能与现有索引重复 3.5 删除任务 # SQL\u0026gt; exec dbms_sqltune.drop_tuning_task(\u0026#39;sql_tuning_advisor_test\u0026#39;); PL/SQL procedure successfully completed. SQL\u0026gt; 四、落地建议 # 4.1 创建索引 # 仔细阅读上述报告，选择采纳最佳建议，创建索引。\nSQL\u0026gt; create index GRYL.IDV_UI_SALES_INVOICES_IC on GRYL.UI_SALES_INVOICES (IOTYPE,CSTID) tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); 2 3 4 5 6 7 8 9 10 11 12 Index created. SQL\u0026gt; 4.2 收集统计信息 # SQL\u0026gt; BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname =\u0026gt; \u0026#39;GRYL\u0026#39;, 2 3 4 tabname =\u0026gt; \u0026#39;UI_SALES_INVOICES\u0026#39;, 5 method_opt =\u0026gt; \u0026#39;FOR ALL COLUMNS SIZE AUTO\u0026#39;, estimate_percent =\u0026gt; DBMS_STATS.AUTO_SAMPLE_SIZE, cascade =\u0026gt; TRUE, no_invalidate =\u0026gt; FALSE ); END; / 6 7 8 9 10 11 PL/SQL procedure successfully completed. SQL\u0026gt; 五、验证 # 5.1 找到最新执行的 sql_exec_id # SQL\u0026gt; select sql_id,sql_exec_id,sql_exec_start from v$sql_monitor where sql_id=\u0026#39;f6asas4cp2n53\u0026#39;; SQL_ID SQL_EXEC_ID SQL_EXEC_START ------------- ----------- ------------------- f6asas4cp2n53 18820639 2025-12-18 09:01:38 f6asas4cp2n53 18820714 2025-12-18 09:03:08 f6asas4cp2n53 18820747 2025-12-18 09:03:36 f6asas4cp2n53 18820785 2025-12-18 09:04:27 f6asas4cp2n53 18820827 2025-12-18 09:06:39 5 rows selected. SQL\u0026gt; 5.2 生成“优化后”SQL Monitor 报告 # SQL\u0026gt; set long 2000000 longchunksize 2000000 pages 0 lines 32767 trimspool on SQL\u0026gt; spool sqlmon_f6asas4cp2n53_new.html SQL\u0026gt; SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id=\u0026gt;\u0026#39;f6asas4cp2n53\u0026#39;,sql_exec_id =\u0026gt; 18820827,report_level=\u0026gt;\u0026#39;ALL\u0026#39;,type=\u0026gt;\u0026#39;ACTIVE\u0026#39;) as report from dual; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta http-equiv=\u0026#34;Content-Type\u0026#34; content=\u0026#34;text/html; charset=utf-8\u0026#34;/\u0026gt; \u0026lt;base href=\u0026#34;http://download.oracle.com/otn_software/\u0026#34;/\u0026gt; \u0026lt;script language=\u0026#34;javascript\u0026#34; type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;emviewers/scripts/flashver.js\u0026#34;\u0026gt; \u0026lt;!--Test flash version--\u0026gt; 。。。省略 \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; language=\u0026#34;JavaScript1.2\u0026#34; charset=\u0026#34;utf-8\u0026#34; src=\u0026#34;emviewers/scripts/document.js\u0026#34;\u0026gt; \u0026lt;!--Run document script--\u0026gt; \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; SQL\u0026gt; spool off SQL\u0026gt; 5.3 分析“优化后”SQL Monitor 报告 # 将ACTIVE Report下载到本地查看一下，用 SQL Monitor验证执行计划已走新索引。性能从约 27s 降到约 5s。\n对比 old vs new：\nElapsed 明显下降 Top waits 用户I/O 明显降下来了 使用了新复合索引 六、总结 # 通过 AWR 锁定高耗时 SQL（SQL_ID：f6asas4cp2n53），SQL Monitor 显示主要等待为用户 I/O，单次执行约 27s。\n运行 SQL Tuning Advisor（COMPREHENSIVE）后，报告给出两类核心建议：\n接受 SQL Profile（含并行 PX Profile 选项） 创建复合索引 (IOTYPE, CSTID)，并提示现有 IOTYPE 索引可能为前缀索引需评估是否删除。 最终选择落地“创建复合索引 + 收集统计信息”，并用 SQL Monitor验证执行计划已走新索引。性能从约 27s 降到约 5s。\n","date":"2025-12-20","externalUrl":null,"permalink":"/posts/oracle-sql-tuning-advisor-sta-case/","section":"文章","summary":"一次 Oracle SQL 优化实战：AWR 定位 SQL_ID f6asas4cp2n53，SQL Monitor 显示执行约 27 秒且 User I/O 等待明显，SQL Tuning Advisor 建议 SQL Profile 和复合索引，最终创建 UI_SALES_INVOICES(IOTYPE,CSTID) 索引后性能降至约 5 秒。","title":"Oracle SQL Tuning Advisor 实战：从 AWR 定位慢 SQL 到索引优化落地","type":"posts"},{"content":"","date":"2025-12-20","externalUrl":null,"permalink":"/tags/sql-monitor/","section":"Tags","summary":"","title":"SQL Monitor","type":"tags"},{"content":"","date":"2025-12-20","externalUrl":null,"permalink":"/tags/sql-tuning-advisor/","section":"Tags","summary":"","title":"SQL Tuning Advisor","type":"tags"},{"content":"","date":"2025-12-20","externalUrl":null,"permalink":"/tags/sta/","section":"Tags","summary":"","title":"STA","type":"tags"},{"content":"","date":"2025-12-20","externalUrl":null,"permalink":"/tags/%E7%B4%A2%E5%BC%95%E4%BC%98%E5%8C%96/","section":"Tags","summary":"","title":"索引优化","type":"tags"},{"content":"","date":"2025-12-11","externalUrl":null,"permalink":"/tags/checkpoint-incomplete/","section":"Tags","summary":"","title":"Checkpoint Incomplete","type":"tags"},{"content":"","date":"2025-12-11","externalUrl":null,"permalink":"/tags/log-file-switch/","section":"Tags","summary":"","title":"Log File Switch","type":"tags"},{"content":"","date":"2025-12-11","externalUrl":null,"permalink":"/tags/log-file-sync/","section":"Tags","summary":"","title":"Log File Sync","type":"tags"},{"content":"","date":"2025-12-11","externalUrl":null,"permalink":"/tags/redo/","section":"Tags","summary":"","title":"Redo","type":"tags"},{"content":"","date":"2025-12-11","externalUrl":null,"permalink":"/tags/%E5%BD%92%E6%A1%A3%E6%97%A5%E5%BF%97/","section":"Tags","summary":"","title":"归档日志","type":"tags"},{"content":" 一、问题现象 # 12 月 8 日上午 11 点多，监控告警提示生产数据库磁盘使用率超过 90%。初步判断：磁盘使用突增，需要关注数据库整体负载与日志增长情况。\n二、问题排查 # 2.1 操作系统磁盘空间 # 查看 OS 空间与 Oracle 目录占用，发现归档/恢复区相关目录增长较快（fast_recovery_area 约 43G）。\n[root@md-db-out ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_root-lv_root 461G 399G 39G 92% / tmpfs 32G 160K 32G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot [root@md-db-out ~]# su - oracle [oracle@md-db-out ~]$ cd /u01/app/oracle/ [oracle@md-db-out oracle]$ du -h --max-depth=1 4.0K ./checkpoints 55G ./diag 4.6G ./admin 70G ./oradata 43G ./fast_recovery_area 1.8M ./cfgtoollogs 4.4G ./product 177G . [oracle@md-db-out oracle]$ 虽然oradata目录不小但故障前没有添加过表空间数据文件，所以这次告警更像是“归档/恢复区增长过快”触发\n2.2 归档日志切换频率异常 # 归档日志增长过快后，进一步统计日志切换频率，发现上午 9 点开始切换次数从 11 次 → 755 次（提升近 68 倍）。\n[oracle@md-db-out oracle]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Dec 8 11:27:01 2025 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL\u0026gt; set lines 300 SQL\u0026gt; column h0 format 999 column h1 format 999 column h2 format 999 column h3 format 999 column h4 format 999 column h5 format 999 column h6 format 999 column h7 format 999 column h8 format 999 column h9 format 999 column h10 format 999 column h11 format 999 column h12 format 999 column h13 format 999 column h14 format 999 column h15 format 999 column h16 format 999 column h17 format 999 column h18 format 999 column h19 format 999 column h20 format 999 column h21 format 999 column h22 format 999 column h23 format 999 column avg format 999.99 column day format a6 SELECT TRUNC (first_time) \u0026#34;Date\u0026#34;, TO_CHAR (first_time, \u0026#39;Dy\u0026#39;) \u0026#34;Day\u0026#34;, COUNT (1) \u0026#34;Total\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;00\u0026#39;, 1, 0)) h0, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;01\u0026#39;, 1, 0)) \u0026#34;h1\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;02\u0026#39;, 1, 0)) \u0026#34;h2\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;03\u0026#39;, 1, 0)) \u0026#34;h3\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;04\u0026#39;, 1, 0)) \u0026#34;h4\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;05\u0026#39;, 1, 0)) \u0026#34;h5\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;06\u0026#39;, 1, 0)) \u0026#34;h6\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;07\u0026#39;, 1, 0)) \u0026#34;h7\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;08\u0026#39;, 1, 0)) \u0026#34;h8\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;09\u0026#39;, 1, 0)) \u0026#34;h9\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;10\u0026#39;, 1, 0)) \u0026#34;h10\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;11\u0026#39;, 1, 0)) \u0026#34;h11\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;12\u0026#39;, 1, 0)) \u0026#34;h12\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;13\u0026#39;, 1, 0)) \u0026#34;h13\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;14\u0026#39;, 1, 0)) \u0026#34;h14\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;15\u0026#39;, 1, 0)) \u0026#34;h15\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;16\u0026#39;, 1, 0)) \u0026#34;h16\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;17\u0026#39;, 1, 0)) \u0026#34;h17\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;18\u0026#39;, 1, 0)) \u0026#34;h18\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;19\u0026#39;, 1, 0)) \u0026#34;h19\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;20\u0026#39;, 1, 0)) \u0026#34;h20\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;21\u0026#39;, 1, 0)) \u0026#34;h21\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;22\u0026#39;, 1, 0)) \u0026#34;h22\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;23\u0026#39;, 1, 0)) \u0026#34;h23\u0026#34;, to_char(ROUND (COUNT (1) / 24, 2),\u0026#39;fm99999999990.00\u0026#39;) \u0026#34;Avg\u0026#34; FROM gv$log_history WHERE first_time \u0026gt;= trunc(SYSDATE) - 7 and thread# = inst_id GROUP BY TRUNC (first_time), TO_CHAR (first_time, \u0026#39;Dy\u0026#39;) ORDER BY 1 DESC; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; SQL\u0026gt; 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Date Day Total H0 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 h12 h13 h14 h15 h16 h17 h18 h19 h20 h21 h22 h23 Avg ------------------- ------ ---------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --------------- 2025-12-08 00:00:00 Mon 1823 48 6 8 7 8 7 8 7 11 755 884 74 0 0 0 0 0 0 0 0 0 0 0 0 75.96 2025-12-07 00:00:00 Sun 480 38 8 9 8 6 8 9 7 9 9 9 8 8 8 9 8 9 8 8 9 7 7 10 261 20.00 2025-12-06 00:00:00 Sat 520 32 8 8 7 7 10 9 9 9 9 42 9 9 9 8 9 9 9 8 9 9 8 8 266 21.67 2025-12-05 00:00:00 Fri 568 33 9 11 8 7 9 9 9 9 19 19 18 13 11 15 17 23 16 11 10 7 9 10 266 23.67 2025-12-04 00:00:00 Thu 581 42 9 10 9 8 9 9 8 12 24 18 17 11 24 16 18 20 14 12 9 9 8 11 254 24.21 2025-12-03 00:00:00 Wed 585 55 8 10 8 7 10 9 10 12 14 19 20 11 13 19 20 20 17 11 10 8 9 10 255 24.38 2025-12-02 00:00:00 Tue 603 48 9 10 7 7 10 8 8 12 31 18 21 11 12 22 32 21 27 20 14 8 10 10 227 25.13 2025-12-01 00:00:00 Mon 554 51 7 7 6 7 7 8 7 10 14 18 17 11 13 16 18 17 17 14 8 8 9 11 253 23.08 8 rows selected. SQL\u0026gt; 三、AWR报告分析 # 拉取10:00~11:00的AWR报告\nSQL\u0026gt; @$ORACLE_HOME/rdbms/admin/awrrpt.sql 3.1 整体负载概况 # DB Time：29,845s ≈ 497 分钟，AAS ≈ 29,845 / (59×60) ≈ 8.4 个活跃会话\nDB CPU ≈ 6,541s → 每秒约 1.84 CPU 秒，用满 16 核只用了 约 11–12% 的 CPU\nOS 负载：%busy ~ 11.8%，%idle ~ 88%，%iowait ~ 5.4%\n结论：CPU 很空闲，系统总体是“等待型”而不是“CPU 打满型”。\n3.2 Top Wait Events # 查看Top Wait 事件，找到真正卡在哪里。Top 10 Foreground Events：\nlog file switch (checkpoint incomplete)\nWaits：12,509\nTotal Wait Time：≈ 12,288s（占 DB time ~41%）\nAvg wait：982 ms / 次\nlog file sync\nWaits：4,112,201 Total Wait Time：≈ 6,929s（占 DB time ~23%） Avg wait：2 ms / 次 大约 1,160 次 commit/s 左右 Wait Class 汇总也印证了这一点：\nConfiguration：45%（主要就是各种 log file switch、SQ contention 等） Commit：23%（log file sync） DB CPU：22% Concurrency：8.6% User I/O：7% 结论：绝大部分时间都耗在 redo / checkpoint 配置和并发控制上。\n3.3 定位 SQL：高频 UPDATE # 在 “SQL ordered by Elapsed Time” 中，你定位到 SQL ID：0vq0s6rm8fawn。它在 60 分钟内执行 3,763,703 次，约 1000+ 次/秒 UPDATE，直接带来大量 redo / 归档与频繁 log switch。\nSQL如下：\nUPDATE SOA_EX_DRUG SET DRUG_ID=:1 , CMM_NAME=:2 , CMMDT_NM=:3 , MED_CTGY_TYPE=:4 , NORM=:5 , MIN_PCKNG_CMPNY=:6 , APRV_NO=:7 , PRDCT_PLT=:8 , status=:9 , CNTRY_NAME=:10 , DEVICES=:11 , PRV_APRV_NO=:12 , CMM_NAME_PY=:13 , PRDCT_CREDIT=:14 , PRDCT_ID=:15 , PACK_QUANTITY=:16 , MGT_CAT_NAME=:17 , PROD_CAT_NAME=:18 , REGIST_FORM_NAME=:19 , CLASS_SUBCATALOG_V17_NAME=:20 , LEVEL1_PROD_CAT_V17_NAME=:21 , LEVEL2_PROD_CAT_V17_NAME=:22 , SPU_FLAG=:23 WHERE ID=:24 进一步用 dba_hist_sqlstat 验证：12/5 之前 executions 仅 2 万级，到了 12/8 突增到 300 万级（增长 167 倍）。\nSQL\u0026gt; set linesize 300 SQL\u0026gt; select a.snap_id,b.begin_interval_time,a.executions_delta from dba_hist_sqlstat a,dba_hist_snapshot b where a.sql_id=\u0026#39;0vq0s6rm8fawn\u0026#39; and a.snap_id=b.snap_id order by a.snap_id; SNAP_ID BEGIN_INTERVAL_TIME EXECUTIONS_DELTA ---------- -------------------------------------------------------------------------------- ---------------- 64968 02-DEC-25 02.00.04.126 PM 22446 64969 02-DEC-25 03.00.06.304 PM 35605 64989 03-DEC-25 11.00.53.713 AM 25956 65011 04-DEC-25 09.00.47.148 AM 22293 65018 04-DEC-25 04.00.05.309 PM 15736 65040 05-DEC-25 02.00.01.717 PM 5283 65042 05-DEC-25 04.00.06.122 PM 51054 65107 08-DEC-25 09.00.51.667 AM 3144734 65108 08-DEC-25 10.00.56.171 AM 3763703 65109 08-DEC-25 11.00.03.946 AM 318640 65110 08-DEC-25 12.00.35.037 PM 3151397 65111 08-DEC-25 01.00.43.053 PM 3999423 65112 08-DEC-25 02.00.29.114 PM 2629413 13 rows selected. SQL\u0026gt; 一直到下午14点多查看oratop还是显示SQL Id：0vq0s6rm8fawn频繁执行。造成大量log file switch (checkpoint incomplete)等待。\n结论：高频的更新SQL语句，导致log file switch (checkpoint incomplete)一小时内 12,509 次，平均每次接近 1 秒\n四、问题解决 # 4.1 应用侧 # 第一步：与开发沟通，把高频 SQL 告知对方，推动应用修改。\n应用修改后，日志切换频率正常。如下：\nSQL\u0026gt; SELECT TRUNC (first_time) \u0026#34;Date\u0026#34;, TO_CHAR (first_time, \u0026#39;Dy\u0026#39;) \u0026#34;Day\u0026#34;, COUNT (1) \u0026#34;Total\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;00\u0026#39;, 1, 0)) h0, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;01\u0026#39;, 1, 0)) \u0026#34;h1\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;02\u0026#39;, 1, 0)) \u0026#34;h2\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;03\u0026#39;, 1, 0)) \u0026#34;h3\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;04\u0026#39;, 1, 0)) \u0026#34;h4\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;05\u0026#39;, 1, 0)) \u0026#34;h5\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;06\u0026#39;, 1, 0)) \u0026#34;h6\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;07\u0026#39;, 1, 0)) \u0026#34;h7\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;08\u0026#39;, 1, 0)) \u0026#34;h8\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;09\u0026#39;, 1, 0)) \u0026#34;h9\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;10\u0026#39;, 1, 0)) \u0026#34;h10\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;11\u0026#39;, 1, 0)) \u0026#34;h11\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;12\u0026#39;, 1, 0)) \u0026#34;h12\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;13\u0026#39;, 1, 0)) \u0026#34;h13\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;14\u0026#39;, 1, 0)) \u0026#34;h14\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;15\u0026#39;, 1, 0)) \u0026#34;h15\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;16\u0026#39;, 1, 0)) \u0026#34;h16\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;17\u0026#39;, 1, 0)) \u0026#34;h17\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;18\u0026#39;, 1, 0)) \u0026#34;h18\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;19\u0026#39;, 1, 0)) \u0026#34;h19\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;20\u0026#39;, 1, 0)) \u0026#34;h20\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;21\u0026#39;, 1, 0)) \u0026#34;h21\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;22\u0026#39;, 1, 0)) \u0026#34;h22\u0026#34;, SUM (DECODE (TO_CHAR (first_time, \u0026#39;hh24\u0026#39;), \u0026#39;23\u0026#39;, 1, 0)) \u0026#34;h23\u0026#34;, to_char(ROUND (COUNT (1) / 24, 2),\u0026#39;fm99999999990.00\u0026#39;) \u0026#34;Avg\u0026#34; FROM gv$log_history WHERE first_time \u0026gt;= trunc(SYSDATE) - 7 and thread# = inst_id GROUP BY TRUNC (first_time), TO_CHAR (first_time, \u0026#39;Dy\u0026#39;) ORDER BY 1 DESC; 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Date Day Total H0 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 h12 h13 h14 h15 h16 h17 h18 h19 h20 h21 h22 h23 Avg ------------------- ------ ---------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --------------- 2025-12-10 00:00:00 Wed 333 56 9 10 7 7 8 7 9 18 22 20 16 13 12 16 18 19 16 10 7 8 7 9 9 13.88 2025-12-09 00:00:00 Tue 607 0 0 0 0 0 0 0 0 67 72 16 15 10 12 17 19 44 27 11 10 7 8 7 265 25.29 2025-12-08 00:00:00 Mon 4364 48 6 8 7 8 7 8 7 11 755 884 83 725 884 622 17 17 14 9 9 7 7 10 211 181.83 2025-12-07 00:00:00 Sun 480 38 8 9 8 6 8 9 7 9 9 9 8 8 8 9 8 9 8 8 9 7 7 10 261 20.00 2025-12-06 00:00:00 Sat 520 32 8 8 7 7 10 9 9 9 9 42 9 9 9 8 9 9 9 8 9 9 8 8 266 21.67 2025-12-05 00:00:00 Fri 568 33 9 11 8 7 9 9 9 9 19 19 18 13 11 15 17 23 16 11 10 7 9 10 266 23.67 2025-12-04 00:00:00 Thu 581 42 9 10 9 8 9 9 8 12 24 18 17 11 24 16 18 20 14 12 9 9 8 11 254 24.21 2025-12-03 00:00:00 Wed 585 55 8 10 8 7 10 9 10 12 14 19 20 11 13 19 20 20 17 11 10 8 9 10 255 24.38 SQL\u0026gt; 4.2 数据库侧：扩大 redo log size（从 50MB 扩到 2GB） # 当时的 redo 配置：3 组、每组 50MB(默认)。然后新增 3 组 2GB（group 4/5/6），切换后删除旧组（1/2/3）。检查 checkpoint / mttr 参数，查看 FAST_START_MTTR_TARGET / LOG_CHECKPOINT_INTERVAL / LOG_CHECKPOINT_TIMEOUT避免设置得太小，导致频繁 checkpoint。\n-- 1) 查看现状 SQL\u0026gt; select group#, bytes/1024/1024 mb, status from v$log; GROUP# MB STATUS ---------- ---------- ---------------- 1 50 CURRENT 2 50 INACTIVE 3 50 INACTIVE SQL\u0026gt; col member for a80 SQL\u0026gt; select group#, member from v$logfile; GROUP# MEMBER ---------- -------------------------------------------------------------------------------- 1 /u01/app/oracle/oradata/mddb/redo01.log 2 /u01/app/oracle/oradata/mddb/redo02.log 3 /u01/app/oracle/oradata/mddb/redo03.log -- 2) 新增大 redo SQL\u0026gt; alter database add logfile group 4 \u0026#39;/u01/app/oracle/oradata/mddb/redo04.log\u0026#39; size 2g; Database altered. SQL\u0026gt; alter database add logfile group 5 \u0026#39;/u01/app/oracle/oradata/mddb/redo05.log\u0026#39; size 2g; Database altered. SQL\u0026gt; alter database add logfile group 6 \u0026#39;/u01/app/oracle/oradata/mddb/redo06.log\u0026#39; size 2g; Database altered. -- 3) 手工切换，确保旧组不再 ACTIVE/CURRENT，再删除 SQL\u0026gt; alter system switch logfile; System altered. SQL\u0026gt; / System altered. SQL\u0026gt; select group#, bytes/1024/1024 mb, status from v$log; GROUP# MB STATUS ---------- ---------- ---------------- 1 50 INACTIVE 2 50 INACTIVE 3 50 INACTIVE 4 2048 INACTIVE 5 2048 ACTIVE 6 2048 CURRENT 6 rows selected. SQL\u0026gt; alter database drop logfile group 1; Database altered. SQL\u0026gt; alter database drop logfile group 2; Database altered. SQL\u0026gt; alter database drop logfile group 3; Database altered. -- 4) 验证 SQL\u0026gt; select group#, bytes/1024/1024 mb, status from v$log; GROUP# MB STATUS ---------- ---------- ---------------- 4 2048 INACTIVE 5 2048 ACTIVE 6 2048 CURRENT -- 5) 检查参数，为默认，系统自动触发/控制 checkpoint SQL\u0026gt; show parameter fast_start_mttr_target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ fast_start_mttr_target integer 0 SQL\u0026gt; show parameter log_check NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_checkpoint_interval integer 0 log_checkpoint_timeout integer 1800 log_checkpoints_to_alert boolean FALSE SQL\u0026gt; 五、总结 # 12 月 8 日 11 点生产库磁盘使用率超过 90%，排查发现主要由归档日志快速增长导致（/u01 下 fast_recovery_area 占用明显）。进一步查看日志切换，9 点后归档切换从 11 次飙升到 755 次。拉取 10:00–11:00 AWR 后确认系统属于“等待型”，主要等待集中在 log file switch (checkpoint incomplete)（12,509 次，约 41% DB time）和 log file sync（4,112,201 次，约 23% DB time）。同期 Top SQL 中 0vq0s6rm8fawn 在 60 分钟内执行 3,763,703 次（约 1000+ 次/秒），并且相较 12/5 执行次数突增 167 倍，是导致 redo/归档暴涨的关键诱因。处置上先通知开发处理高频 SQL，同时将 redo log 从 50MB 3 组扩容为 2GB 3 组并完成切换与清理，缓解日志切换与 checkpoint 压力。\n","date":"2025-12-11","externalUrl":null,"permalink":"/posts/oracle-redo-storm-log-file-switch-checkpoint-incomplete/","section":"文章","summary":"一次 Oracle Redo 风暴处理实战：生产库磁盘使用率超过 90%，日志切换从每小时十几次飙升到数百次，AWR 显示 log file switch checkpoint incomplete 占 DB time 约 41%，最终定位 SQL_ID 0vq0s6rm8fawn 每小时执行 376 万次，约 1000+ 次/秒 UPDATE。","title":"记一次 1000+ 每秒 UPDATE 引发的 Redo 风暴：AWR 定位 log file switch checkpoint incomplete","type":"posts"},{"content":"","date":"2025-12-09","externalUrl":null,"permalink":"/tags/ebs/","section":"Tags","summary":"","title":"EBS","type":"tags"},{"content":"","date":"2025-12-09","externalUrl":null,"permalink":"/tags/left-join/","section":"Tags","summary":"","title":"LEFT JOIN","type":"tags"},{"content":" 前言 # 其实写SQL优化的实战很难，主要是很多情况是需要结合业务，而我们很多开发人员为了满足业务的需求随心随意的写SQL，就产生了很多质量较差的SQL，这些SQL可能在开发测试数据量不大的环境中正常运行，可是一到生产环境就直接把整个数据库服务器资源打满。所以我们平时在写SQL过程中多做简化工作，尽量让SQL写的让别人能读懂。多考虑条件的过滤包括关键字段索引等等，查询的数据量少了，减少了全表扫描了，自然效率也就高了。最后，要满足业务的需求又要写出易懂高质量的SQL。这其实是一个需要权衡的过程、需要做取舍。\n问题现象 # 运维人员反馈EBS系统有一个请求运行时间很长，每次运行需要10多分钟。影响数据库整体性能和业务开展。\n分析SQL # 通过跟踪请求，拿到sql_id:gcppkx5y05x3k，把SQL拿出来大致看一下。 初步梳理，这一条非常复杂的插入SQL。看到一共有插入23个字段，主体SQL关联7个表和4个子查询。如下：\nINSERT INTO CUX_TWOVOTE_SALEINVOICE_NEW (SUPPLIERID, SALINVOICENO, SALINVDATE, SALSUMVALUE, SALINVTYPE, SALCSTCODE, SALCSTNAME, GOODS, GOODNAME, VAT_HEADER_ID, VAT_LINE_ID, PO_LINE_ID, SOURCE_PO_LINE_ID, PO_HEADER_ID, SOURCE_PO_HEADER_ID, PO_NUMBER, ORG_ID, INTER_ORG_ID, ITEM_ID, LOT_NUMBER, REQUEST_ID, ATTRIBUTE1, ATTRIBUTE2) SELECT CAVL.DEPARTMENT_CODE, DECODE( (SELECT COUNT(1) FROM CUX_SC_MINHANG_CLIENT WHERE ACCOUNT_NUMBER = CAVH.CUSTOMER_NUMBER), 0, CAVH.VAT_NUMBER, DECODE(INSTR(CAVH.INVOICE_CATEGORY, \u0026#39;全电\u0026#39;), 0, CAVH.VAT_INVOICE_CODE || CAVH.VAT_NUMBER, CAVH.VAT_NUMBER)) VAT_NUMBER, TO_CHAR(CAVH.VAT_DATE, \u0026#39;yyyy-mm-dd\u0026#39;) VAT_DATE, CAVH.AMOUNT_INC_TAX SALSUMVALUE, COPL.PROPERTY7_NAME SALINVTYPE, CAVH.CUSTOMER_NUMBER, CAVH.CUSTOMER_NAME, CAVL.ITEM_CODE || \u0026#39;|\u0026#39; || CAVL.PACKAGE_NUM ITEM_CODE, CAVL.ITEM_DESC, CAVH.VAT_HEADER_ID, CAVL.VAT_LINE_ID, DECODE( (SELECT COUNT(1) FROM CUX_OU_PROPERTY_LINES_T COUL, PO_LINES_ALL PL, PO_HEADERS_ALL PH WHERE PH.PO_HEADER_ID = PL.PO_HEADER_ID AND PH.VENDOR_ID = COUL.ITEM_ID AND PL.PO_LINE_ID = MLN.N_ATTRIBUTE6 AND COUL.PROPERTY_TYPE = \u0026#39;V\u0026#39; AND NVL(COUL.PROPERTY5_NAME, \u0026#39;N\u0026#39;) \u0026lt;\u0026gt; \u0026#39;N\u0026#39;), 0, MLN.N_ATTRIBUTE6, NVL(COMR.PO_LINE_ID, MLN.N_ATTRIBUTE6)) PO_LINE_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE6 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN (SELECT MLN_SOURCE.N_ATTRIBUTE6 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID AND COMR_SOURCE.RELATE_PO_LINE_ID = MLN.N_ATTRIBUTE6) ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE6, COMR.PO_LINE_ID) END AS SOURCE_PO_LINE_ID, MLN.N_ATTRIBUTE5 PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE5 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN (SELECT MLN_SOURCE.N_ATTRIBUTE5 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID AND COMR_SOURCE.RELATE_PO_LINE_ID = MLN.N_ATTRIBUTE6) ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE5, COMR.PO_HEADER_ID) END AS SOURCE_PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.C_ATTRIBUTE1 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN (SELECT MLN_SOURCE.C_ATTRIBUTE1 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID AND COMR_SOURCE.RELATE_PO_LINE_ID = MLN.N_ATTRIBUTE6) ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.C_ATTRIBUTE1, \u0026#39;\u0026#39;) END AS PO_NUMBER, COMR.ORG_ID, COMR.INTERCOMPANY_ORG_ID, CAVL.ITEM_ID, CAVL.LOT_NUMBER, :B1, CAVH.VAT_INVOICE_CODE, CAVH.VAT_NUMBER FROM CUX_AR_VAT_HEADERS CAVH, CUX_AR_VAT_LINES CAVL, CUX_OE_MTL_RESERVATIONS COMR, CUX_OE_ORDER_HEADERS COOH, MTL_LOT_NUMBERS MLN, CUX_MST_ITEM ISI, CUX_FND_LOOKUP_VALUES SCP, (SELECT ITEM_ID, PROPERTY7_NAME, OU_ID FROM CUX_OU_PROPERTY_LINES_T WHERE PROPERTY_TYPE = \u0026#39;C\u0026#39; AND NVL(PROPERTY7_NAME, \u0026#39;N\u0026#39;) \u0026lt;\u0026gt; \u0026#39;N\u0026#39;) COPL, (SELECT T.TRANSACTION_TYPE_ID FROM OE_TRANSACTION_TYPES_ALL TT, OE_TRANSACTION_TYPES_TL T, FND_DOCUMENT_SEQUENCES A WHERE TT.TRANSACTION_TYPE_ID = T.TRANSACTION_TYPE_ID AND T.LANGUAGE = USERENV(\u0026#39;LANG\u0026#39;) AND TT.ATTRIBUTE1 = A.DOC_SEQUENCE_ID AND TT.TRANSACTION_TYPE_CODE = \u0026#39;ORDER\u0026#39; AND TT.ATTRIBUTE15 \u0026lt;\u0026gt; \u0026#39;01\u0026#39;) TT_TYPE, (SELECT HOU.ORGANIZATION_ID, FLV.MEANING FROM HR_ORGANIZATION_UNITS_V HOU, CUX_FND_LOOKUP_VALUES FLV WHERE HOU.ATTRIBUTE6 = FLV.LOOKUP_CODE AND FLV.LOOKUP_TYPE = \u0026#39;MST-0031\u0026#39; AND HOU.ATTRIBUTE6 IS NOT NULL) COM1, (SELECT HOU.ORGANIZATION_ID, FLV.MEANING FROM HR_ORGANIZATION_UNITS_V HOU, CUX_FND_LOOKUP_VALUES FLV WHERE HOU.ATTRIBUTE6 = FLV.LOOKUP_CODE AND FLV.LOOKUP_TYPE = \u0026#39;MST-0031\u0026#39; AND HOU.ATTRIBUTE6 IS NOT NULL) COM2 WHERE CAVH.VAT_HEADER_ID = CAVL.VAT_HEADER_ID AND CAVH.VAT_HEADER_ID = COMR.VAT_HEADER_ID AND COMR.HEADER_ID = COOH.HEADER_ID AND COMR.SOURCE_LINE_ID = CAVL.ORDER_LINE_ID AND COMR.INVENTORY_ITEM_ID = MLN.INVENTORY_ITEM_ID AND COMR.ORGANIZATION_ID = MLN.ORGANIZATION_ID AND COMR.LOT_NUMBER = MLN.LOT_NUMBER AND COMR.INVENTORY_ITEM_ID = ISI.INVENTORY_ITEM_ID AND COMR.ORGANIZATION_ID = ISI.ORGANIZATION_ID AND ISI.OPERATE_SCOPE = SCP.LOOKUP_CODE AND SCP.LOOKUP_TYPE = \u0026#39;MST-0004\u0026#39; AND SCP.SEGMENT4 = \u0026#39;Y\u0026#39; AND COOH.ORDER_TYPE_ID = TT_TYPE.TRANSACTION_TYPE_ID AND NVL(COOH.ORDER_SOURCE_REFERENCE, \u0026#39;N\u0026#39;) NOT IN (\u0026#39;QUICK_ORDER\u0026#39;, \u0026#39;QUICK_RET\u0026#39;) AND CAVH.CUSTOMER_ID = COPL.ITEM_ID AND CAVH.ORG_ID = COPL.OU_ID AND COMR.ORG_ID = COM1.ORGANIZATION_ID AND COMR.INTERCOMPANY_ORG_ID = COM2.ORGANIZATION_ID AND CAVH.ENABLED_FLAG = \u0026#39;Y\u0026#39; AND UPPER(CAVH.VAT_NUMBER) NOT LIKE \u0026#39;X%\u0026#39; AND UPPER(CAVH.VAT_NUMBER) NOT LIKE \u0026#39;D%\u0026#39; AND CAVH.VAT_NUMBER IS NOT NULL AND CAVH.AMOUNT_INC_TAX \u0026gt; 0 AND CAVL.AMOUNT_INC_TAX \u0026gt; 0 AND MLN.C_ATTRIBUTE4 NOT IN (SELECT MEANING FROM CUX_FND_LOOKUP_VALUES WHERE LOOKUP_TYPE = \u0026#39;AP-013\u0026#39; AND TAG = \u0026#39;SUP\u0026#39; AND SEGMENT1 = \u0026#39;Y\u0026#39; AND ENABLED_FLAG = \u0026#39;Y\u0026#39;) AND TRUNC(CAVH.LAST_UPDATE_DATE) \u0026gt;= TRUNC(SYSDATE - 1) AND NOT EXISTS (SELECT 1 FROM CUX_TWOVOTE_SALEINVOICE_NEW WHERE VAT_HEADER_ID = CAVH.VAT_HEADER_ID AND TRUNC(IMPORT_DATE) \u0026gt;= TRUNC(SYSDATE - 1)) 使用SQLHC（SQL Tuning Health-Check）工具得到执行计划如下图\n由于SQL复杂，对表和字段的定义无法从业务侧得知，如何取舍优化。只能从DBA角度来添加索引或者改写SQL逐步分析。\n先对SELECT的23个字段部分开始：\n上图执行计划里Id从12~26，写了多个标量子查询回填同几张表（MTL_LOT_NUMBERS，CUX_OE_MTL_RESERVATIONS）：等于重复访问同一数据源。如下部分\nCASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE6 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN (SELECT MLN_SOURCE.N_ATTRIBUTE6 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID AND COMR_SOURCE.RELATE_PO_LINE_ID = MLN.N_ATTRIBUTE6) ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE6, COMR.PO_LINE_ID) END AS SOURCE_PO_LINE_ID, MLN.N_ATTRIBUTE5 PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE5 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN (SELECT MLN_SOURCE.N_ATTRIBUTE5 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID AND COMR_SOURCE.RELATE_PO_LINE_ID = MLN.N_ATTRIBUTE6) ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE5, COMR.PO_HEADER_ID) END AS SOURCE_PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.C_ATTRIBUTE1 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN (SELECT MLN_SOURCE.C_ATTRIBUTE1 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID AND COMR_SOURCE.RELATE_PO_LINE_ID = MLN.N_ATTRIBUTE6) ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.C_ATTRIBUTE1, \u0026#39;\u0026#39;) END AS PO_NUMBER, 在查看标量子查询中表的数据量非常大，会造成大量的等待消耗。\nSQL\u0026gt; select count(1) from CUX.CUX_OE_MTL_RESERVATIONS; COUNT(1) ---------- 45514896 SQL\u0026gt; select count(1) from INV.MTL_LOT_NUMBERS; COUNT(1) ---------- 11859933 SQL\u0026gt; 解释一下什么是标量子查询当一个子查询介于SELECT与FROM之间，这种子查询就叫标量子查询。\n标量子查询类似一个天然的嵌套循环，而且驱动表固定为主表，嵌套循环被驱动表的连接列必须包含在索引中。同理，标量子查询中子查询的表连接列也必须包含在索引中。\n建议在实际生产工作中，尽量避免使用标量子查询。原因是：假如主表返回大量数据，主表的连接列基数又很高，那么子查询中的表会被多次扫描，从而严重影响SQL性能；如果主表数据量小，或者主表的连接列基数很低，那么这个时候也可以使用标量子查询，但要给子查询中表的连接列建立索引。\n当SQL里面有标量子查询，可以将标量子查询等价改写为外连接，从而使它们可以进行HASH连接。\n标量子查询=外层每一行都要去子表再查一次 外层行数一大 + 子表一大 ⇒ 执行次数爆炸 执行计划中Id第51行部分CUX_OU_PROPERTY_LINES_T全表扫描\n再看WHERE条件部分Id在100行部分，查看CUX_TWOVOTE_SALEINVOICE_NEW的数据量也非常大。走全表扫描也非常消耗IO\nSQL\u0026gt; select count(1) from CUX.CUX_TWOVOTE_SALEINVOICE_NEW; COUNT(1) ---------- 15734505 SQL\u0026gt; 优化SQL # 在我们通过执行计划加上表数据量和索引等信息分析后，做如下处理。\n把SELECT后重复关联标量子查询3个字段SOURCE_PO_LINE_ID、SOURCE_PO_HEADER_ID、PO_NUMBER，通过left join方式，避免重复的扫描，改写后重复部分的子查询作为主表，如下：\nSELECT ... CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE6 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN MLN_SOURCE.N_ATTRIBUTE6 ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE6, COMR.PO_LINE_ID) END AS SOURCE_PO_LINE_ID, MLN.N_ATTRIBUTE5 PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE5 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN MLN_SOURCE.N_ATTRIBUTE5 ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE5, COMR.PO_HEADER_ID) END AS SOURCE_PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.C_ATTRIBUTE1 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN MLN_SOURCE.C_ATTRIBUTE1 ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.C_ATTRIBUTE1, \u0026#39;\u0026#39;) END AS PO_NUMBER, ... FROM ... (SELECT COMR_SOURCE.RELATE_PO_LINE_ID, MLN_SOURCE.N_ATTRIBUTE6, MLN_SOURCE.N_ATTRIBUTE5, MLN_SOURCE.C_ATTRIBUTE1 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID) MLN_SOURCE WHERE ... AND MLN.N_ATTRIBUTE6 = MLN_SOURCE.RELATE_PO_LINE_ID(+) CUX_OU_PROPERTY_LINES_T全表扫描\nDECODE( (SELECT COUNT(1) FROM CUX_OU_PROPERTY_LINES_T COUL, PO_LINES_ALL PL, PO_HEADERS_ALL PH WHERE PH.PO_HEADER_ID = PL.PO_HEADER_ID AND PH.VENDOR_ID = COUL.ITEM_ID AND PL.PO_LINE_ID = MLN.N_ATTRIBUTE6 AND COUL.PROPERTY_TYPE = \u0026#39;V\u0026#39; AND NVL(COUL.PROPERTY5_NAME, \u0026#39;N\u0026#39;) \u0026lt;\u0026gt; \u0026#39;N\u0026#39;), 0, MLN.N_ATTRIBUTE6, NVL(COMR.PO_LINE_ID, MLN.N_ATTRIBUTE6)) PO_LINE_ID, 可以在PROPERTY_TYPE字段上添加索引，并重新统计信息：\nSQL\u0026gt; create index CUX.CUX_OU_PROPERTY_LINES_T_N03 on CUX.CUX_OU_PROPERTY_LINES_T (PROPERTY_TYPE) tablespace CUXD pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); 2 3 4 5 6 7 8 9 10 11 12 Index created. SQL\u0026gt; BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname =\u0026gt; \u0026#39;CUX\u0026#39;, tabname =\u0026gt; \u0026#39;CUX_OU_PROPERTY_LINES_T\u0026#39;, method_opt =\u0026gt; \u0026#39;FOR ALL COLUMNS SIZE AUTO\u0026#39;, estimate_percent =\u0026gt; DBMS_STATS.AUTO_SAMPLE_SIZE, cascade =\u0026gt; TRUE, no_invalidate =\u0026gt; FALSE ); END; / 2 3 4 5 6 7 8 9 10 11 PL/SQL procedure successfully completed. SQL\u0026gt; WHERE条件后的CUX_TWOVOTE_SALEINVOICE_NEW全表扫描\nAND NOT EXISTS (SELECT 1 FROM CUX_TWOVOTE_SALEINVOICE_NEW WHERE VAT_HEADER_ID = CAVH.VAT_HEADER_ID AND TRUNC(IMPORT_DATE) \u0026gt;= TRUNC(SYSDATE - 1)) 可以在VAT_HEADER_ID字段上添加索引，并重新统计信息：\nSQL\u0026gt; create index CUX.CUX_TWOVOTE_SALEINVOICE_NEW_N4 on CUX.CUX_TWOVOTE_SALEINVOICE_NEW (VAT_HEADER_ID) tablespace CUXD pctfree 10 initrans 2 maxtrans 255 storage ( initial 128K next 128K minextents 1 maxextents unlimited pctincrease 0 ); 2 3 4 5 6 7 8 9 10 11 12 13 Index created. SQL\u0026gt; BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname =\u0026gt; \u0026#39;CUX\u0026#39;, tabname =\u0026gt; \u0026#39;CUX_TWOVOTE_SALEINVOICE_NEW\u0026#39;, method_opt =\u0026gt; \u0026#39;FOR ALL COLUMNS SIZE AUTO\u0026#39;, estimate_percent =\u0026gt; DBMS_STATS.AUTO_SAMPLE_SIZE, cascade =\u0026gt; TRUE, no_invalidate =\u0026gt; FALSE ); END; / 2 3 4 5 6 7 8 9 10 11 PL/SQL procedure successfully completed. SQL\u0026gt; 改写后最终sql_id:3xb8q2021ztpv。如下：\nINSERT INTO CUX_TWOVOTE_SALEINVOICE_NEW (SUPPLIERID, SALINVOICENO, SALINVDATE, SALSUMVALUE, SALINVTYPE, SALCSTCODE, SALCSTNAME, GOODS, GOODNAME, VAT_HEADER_ID, VAT_LINE_ID, PO_LINE_ID, SOURCE_PO_LINE_ID, PO_HEADER_ID, SOURCE_PO_HEADER_ID, PO_NUMBER, ORG_ID, INTER_ORG_ID, ITEM_ID, LOT_NUMBER, REQUEST_ID, ATTRIBUTE1, ATTRIBUTE2) SELECT CAVL.DEPARTMENT_CODE, DECODE( (SELECT COUNT(1) FROM CUX_SC_MINHANG_CLIENT WHERE ACCOUNT_NUMBER = CAVH.CUSTOMER_NUMBER), 0, CAVH.VAT_NUMBER, DECODE(INSTR(CAVH.INVOICE_CATEGORY, \u0026#39;全电\u0026#39;), 0, CAVH.VAT_INVOICE_CODE || CAVH.VAT_NUMBER, CAVH.VAT_NUMBER)) VAT_NUMBER, TO_CHAR(CAVH.VAT_DATE, \u0026#39;yyyy-mm-dd\u0026#39;) VAT_DATE, CAVH.AMOUNT_INC_TAX SALSUMVALUE, COPL.PROPERTY7_NAME SALINVTYPE, CAVH.CUSTOMER_NUMBER, CAVH.CUSTOMER_NAME, CAVL.ITEM_CODE || \u0026#39;|\u0026#39; || CAVL.PACKAGE_NUM ITEM_CODE, CAVL.ITEM_DESC, CAVH.VAT_HEADER_ID, CAVL.VAT_LINE_ID, DECODE( (SELECT COUNT(1) FROM CUX_OU_PROPERTY_LINES_T COUL, PO_LINES_ALL PL, PO_HEADERS_ALL PH WHERE PH.PO_HEADER_ID = PL.PO_HEADER_ID AND PH.VENDOR_ID = COUL.ITEM_ID AND PL.PO_LINE_ID = MLN.N_ATTRIBUTE6 AND COUL.PROPERTY_TYPE = \u0026#39;V\u0026#39; AND NVL(COUL.PROPERTY5_NAME, \u0026#39;N\u0026#39;) \u0026lt;\u0026gt; \u0026#39;N\u0026#39;), 0, MLN.N_ATTRIBUTE6, NVL(COMR.PO_LINE_ID, MLN.N_ATTRIBUTE6)) PO_LINE_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE6 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN MLN_SOURCE.N_ATTRIBUTE6 ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE6, COMR.PO_LINE_ID) END AS SOURCE_PO_LINE_ID, MLN.N_ATTRIBUTE5 PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.N_ATTRIBUTE5 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN MLN_SOURCE.N_ATTRIBUTE5 ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.N_ATTRIBUTE5, COMR.PO_HEADER_ID) END AS SOURCE_PO_HEADER_ID, CASE WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 = MLN.N_ATTRIBUTE7 THEN MLN.C_ATTRIBUTE1 WHEN COMR.ORG_ID = COMR.INTERCOMPANY_ORG_ID AND MLN.N_ATTRIBUTE1 \u0026lt;\u0026gt; MLN.N_ATTRIBUTE7 THEN MLN_SOURCE.C_ATTRIBUTE1 ELSE DECODE(COM1.MEANING, COM2.MEANING, MLN.C_ATTRIBUTE1, \u0026#39;\u0026#39;) END AS PO_NUMBER, COMR.ORG_ID, COMR.INTERCOMPANY_ORG_ID, CAVL.ITEM_ID, CAVL.LOT_NUMBER, :B1, CAVH.VAT_INVOICE_CODE, CAVH.VAT_NUMBER FROM CUX_AR_VAT_HEADERS CAVH, CUX_AR_VAT_LINES CAVL, CUX_OE_MTL_RESERVATIONS COMR, CUX_OE_ORDER_HEADERS COOH, MTL_LOT_NUMBERS MLN, CUX_MST_ITEM ISI, CUX_FND_LOOKUP_VALUES SCP, (SELECT ITEM_ID, PROPERTY7_NAME, OU_ID FROM CUX_OU_PROPERTY_LINES_T WHERE PROPERTY_TYPE = \u0026#39;C\u0026#39; AND NVL(PROPERTY7_NAME, \u0026#39;N\u0026#39;) \u0026lt;\u0026gt; \u0026#39;N\u0026#39;) COPL, (SELECT T.TRANSACTION_TYPE_ID FROM OE_TRANSACTION_TYPES_ALL TT, OE_TRANSACTION_TYPES_TL T, FND_DOCUMENT_SEQUENCES A WHERE TT.TRANSACTION_TYPE_ID = T.TRANSACTION_TYPE_ID AND T.LANGUAGE = USERENV(\u0026#39;LANG\u0026#39;) AND TT.ATTRIBUTE1 = A.DOC_SEQUENCE_ID AND TT.TRANSACTION_TYPE_CODE = \u0026#39;ORDER\u0026#39; AND TT.ATTRIBUTE15 \u0026lt;\u0026gt; \u0026#39;01\u0026#39;) TT_TYPE, (SELECT HOU.ORGANIZATION_ID, FLV.MEANING FROM HR_ORGANIZATION_UNITS_V HOU, CUX_FND_LOOKUP_VALUES FLV WHERE HOU.ATTRIBUTE6 = FLV.LOOKUP_CODE AND FLV.LOOKUP_TYPE = \u0026#39;MST-0031\u0026#39; AND HOU.ATTRIBUTE6 IS NOT NULL) COM1, (SELECT HOU.ORGANIZATION_ID, FLV.MEANING FROM HR_ORGANIZATION_UNITS_V HOU, CUX_FND_LOOKUP_VALUES FLV WHERE HOU.ATTRIBUTE6 = FLV.LOOKUP_CODE AND FLV.LOOKUP_TYPE = \u0026#39;MST-0031\u0026#39; AND HOU.ATTRIBUTE6 IS NOT NULL) COM2, (SELECT COMR_SOURCE.RELATE_PO_LINE_ID, MLN_SOURCE.N_ATTRIBUTE6, MLN_SOURCE.N_ATTRIBUTE5, MLN_SOURCE.C_ATTRIBUTE1 FROM MTL_LOT_NUMBERS MLN_SOURCE, CUX_OE_MTL_RESERVATIONS COMR_SOURCE WHERE MLN_SOURCE.LOT_NUMBER = COMR_SOURCE.LOT_NUMBER AND MLN_SOURCE.INVENTORY_ITEM_ID = COMR_SOURCE.INVENTORY_ITEM_ID AND MLN_SOURCE.ORGANIZATION_ID = COMR_SOURCE.ORGANIZATION_ID) MLN_SOURCE WHERE CAVH.VAT_HEADER_ID = CAVL.VAT_HEADER_ID AND CAVH.VAT_HEADER_ID = COMR.VAT_HEADER_ID AND COMR.HEADER_ID = COOH.HEADER_ID AND COMR.SOURCE_LINE_ID = CAVL.ORDER_LINE_ID AND COMR.INVENTORY_ITEM_ID = MLN.INVENTORY_ITEM_ID AND COMR.ORGANIZATION_ID = MLN.ORGANIZATION_ID AND COMR.LOT_NUMBER = MLN.LOT_NUMBER AND COMR.INVENTORY_ITEM_ID = ISI.INVENTORY_ITEM_ID AND COMR.ORGANIZATION_ID = ISI.ORGANIZATION_ID AND ISI.OPERATE_SCOPE = SCP.LOOKUP_CODE AND SCP.LOOKUP_TYPE = \u0026#39;MST-0004\u0026#39; AND SCP.SEGMENT4 = \u0026#39;Y\u0026#39; AND COOH.ORDER_TYPE_ID = TT_TYPE.TRANSACTION_TYPE_ID AND NVL(COOH.ORDER_SOURCE_REFERENCE, \u0026#39;N\u0026#39;) NOT IN (\u0026#39;QUICK_ORDER\u0026#39;, \u0026#39;QUICK_RET\u0026#39;) AND CAVH.CUSTOMER_ID = COPL.ITEM_ID AND CAVH.ORG_ID = COPL.OU_ID AND COMR.ORG_ID = COM1.ORGANIZATION_ID AND COMR.INTERCOMPANY_ORG_ID = COM2.ORGANIZATION_ID AND MLN.N_ATTRIBUTE6 = MLN_SOURCE.RELATE_PO_LINE_ID(+) AND CAVH.ENABLED_FLAG = \u0026#39;Y\u0026#39; AND UPPER(CAVH.VAT_NUMBER) NOT LIKE \u0026#39;X%\u0026#39; AND UPPER(CAVH.VAT_NUMBER) NOT LIKE \u0026#39;D%\u0026#39; AND CAVH.VAT_NUMBER IS NOT NULL AND CAVH.AMOUNT_INC_TAX \u0026gt; 0 AND CAVL.AMOUNT_INC_TAX \u0026gt; 0 AND MLN.C_ATTRIBUTE4 NOT IN (SELECT MEANING FROM CUX_FND_LOOKUP_VALUES WHERE LOOKUP_TYPE = \u0026#39;AP-013\u0026#39; AND TAG = \u0026#39;SUP\u0026#39; AND SEGMENT1 = \u0026#39;Y\u0026#39; AND ENABLED_FLAG = \u0026#39;Y\u0026#39;) AND TRUNC(CAVH.LAST_UPDATE_DATE) \u0026gt;= TRUNC(SYSDATE - 1) AND NOT EXISTS (SELECT 1 FROM CUX_TWOVOTE_SALEINVOICE_NEW WHERE VAT_HEADER_ID = CAVH.VAT_HEADER_ID AND TRUNC(IMPORT_DATE) \u0026gt;= TRUNC(SYSDATE - 1)) 优化后执行计划如下\n优化前后，对比平均执行时间。573s → 98s，提升近6倍。\n总结 # 在SQL优化中经常会碰到一些复杂的、而且业务逻辑无法理解的SQL。不要急，通过执行计划一部分一部分的来优化。把全表扫描、标量子查询和驱动表的关系等搞清楚。多尝试改写的方法、尽量过滤查询数据。这样再复杂的SQL也有办法进行优化。\n根因：相关标量子查询在大结果集上被重复执行，反复访问大表（4551w/1185w），放大 IO/CPU。\n关键动作：把 3 处重复标量子查询抽成可复用派生表并 LEFT JOIN，减少重复扫描。\n配套动作：为全表扫描热点补索引并重新收集统计信息（含 VAT_HEADER_ID、PROPERTY_TYPE）。\n效果：平均耗时 573s → 98s（≈6x）。\n","date":"2025-12-09","externalUrl":null,"permalink":"/posts/oracle-scalar-subquery-sql-optimization/","section":"文章","summary":"一次 Oracle SQL 优化实战：EBS 请求执行 10 多分钟，原 SQL_ID 为 gcppkx5y05x3k。通过分析执行计划发现多个标量子查询重复扫描 MTL_LOT_NUMBERS 和 CUX_OE_MTL_RESERVATIONS 等大表，最终将重复标量子查询改写为 LEFT JOIN，并补充 VAT_HEADER_ID、PROPERTY_TYPE 等索引，执行时间从 573s 降到 98s。","title":"Oracle 标量子查询优化实战：从 573s 到 98s 的 SQL 改写案例","type":"posts"},{"content":"","date":"2025-12-09","externalUrl":null,"permalink":"/tags/sqlhc/","section":"Tags","summary":"","title":"SQLHC","type":"tags"},{"content":"","date":"2025-12-09","externalUrl":null,"permalink":"/tags/%E6%A0%87%E9%87%8F%E5%AD%90%E6%9F%A5%E8%AF%A2/","section":"Tags","summary":"","title":"标量子查询","type":"tags"},{"content":" 安装介质 # 操作系统包\ncompat-libstdc++-33-3.2.3-72.el7.x86_64.rpm\noracle安装介质\nLINUX.X64_193000_db_home.zip\n补丁\np6880880_190000_Linux-x86-64.zip\np37260974_190000_Linux-x86-64.zip\np37102264_190000_Linux-x86-64.zip\n操作系统设置 # 关闭防火墙 # systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --state 关闭selinux # setenforce 0 sed -ri \u0026#39;s/SELINUX=enforcing/SELINUX=disabled/\u0026#39; /etc/selinux/config sestatus 配置Yum源 # 有网络的条件配置清华源\nsed -e \u0026#34;s|^mirrorlist=|#mirrorlist=|g\u0026#34; \\ -e \u0026#34;s|^#baseurl=http://mirror.centos.org/centos/\\$releasever|baseurl=http://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009|g\u0026#34; \\ -e \u0026#34;s|^#baseurl=http://mirror.centos.org/\\$contentdir/\\$releasever|baseurl=http://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009|g\u0026#34; \\ -i.bak \\ /etc/yum.repos.d/CentOS-*.repo 没有网络的，配置本地源\nmount -o loop /tmp/CentOS-7-x86_64-DVD-2207-02.iso /mnt cat \u0026gt;\u0026gt; /etc/yum.repos.d/local.repo \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; [local] name=local baseurl=file:///mnt gpgcheck=0 enabled=1 EOF yum clean all yum makecache 安装依赖包 # yum install -y bc \\ binutils \\ compat-libcap1 \\ compat-libstdc++-33 \\ gcc \\ gcc-c++ \\ elfutils-libelf \\ elfutils-libelf-devel \\ glibc \\ glibc-devel \\ ksh \\ libaio \\ libaio-devel \\ libgcc \\ libstdc++ \\ libstdc++-devel \\ libxcb \\ libX11 \\ libXau \\ libXi \\ libXtst \\ libXrender \\ libXrender-devel \\ make \\ net-tools \\ nfs-utils \\ smartmontools \\ sysstat \\ e2fsprogs \\ e2fsprogs-libs \\ fontconfig-devel \\ expect \\ unzip \\ openssh-clients \\ readline* \\ psmisc --skip-broken rpm -ivh compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm 配置hosts文件 # hostnamectl set-hostname oracle19c cat \u0026gt;\u0026gt; /etc/hosts \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; 192.168.17.26 oracle19c EOF 配置sysctl.conf # cat \u0026gt;\u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; ##shmmal\u0026#39;s Calculation formula: physical memory 8G：(8*1024*1024*1024)/4096=2097152 ##shmmax\u0026#39;s Calculation formula: physical memory 8G：(8/2)*1024*1024*1024 -1=4294967295 fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmni = 4096 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 kernel.panic_on_oops = 1 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 fs.aio-max-nr = 1048576 net.ipv4.ip_local_port_range = 9000 65500 EOF /sbin/sysctl -p 配置limits.conf和pam.d # cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 16384 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 oracle hard memlock 134217728 oracle soft memlock 134217728 EOF cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; session required pam_limits.so session required /lib64/security/pam_limits.so EOF 配置 avahi-deamon # systemctl stop avahi-daemon.socket systemctl stop avahi-daemon.service systemctl disable avahi-daemon.service systemctl disable avahi-daemon.socket ##关闭 NOZEROCONF cat \u0026lt;\u0026lt;EOF \u0026gt;\u0026gt;/etc/sysconfig/network NOZEROCONF=yes EOF 关闭透明大页和 numa # sed -i \u0026#39;s/quiet/quiet transparent_hugepage=never numa=off/\u0026#39; /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/enabled echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/defrag vi /etc/rc.d/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/defrag fi chmod +x /etc/rc.d/rc.local 创建用户 # /usr/sbin/groupadd -g 54321 oinstall /usr/sbin/groupadd -g 54322 dba /usr/sbin/groupadd -g 54323 oper /usr/sbin/groupadd -g 54324 backupdba /usr/sbin/groupadd -g 54325 dgdba /usr/sbin/groupadd -g 54326 kmdba /usr/sbin/groupadd -g 54330 racdba /usr/sbin/useradd -u 54321 -g oinstall -G dba,backupdba,dgdba,kmdba,racdba,oper oracle echo \u0026#34;oracle\u0026#34;|passwd --stdin oracle id oracle 创建目录 # mkdir -p /u01/app/oracle/product/19.3.0/db_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01 安装Oracle软件 # 环境变量设置 # su - oracle cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; #Oracle Settings TMP=/tmp; export TMP TMPDIR=$TMP; export TMPDIR ORACLE_HOSTNAME=oracle19c; export ORACLE_HOSTNAME ORACLE_UNQNAME=orcl; export ORACLE_UNQNAME ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/19.3.0/db_1; export ORACLE_HOME ORACLE_SID=orcl; export ORACLE_SID ORACLE_TERM=xterm; export ORACLE_TERM PATH=/usr/sbin:$PATH; export PATH PATH=$ORACLE_HOME/bin:$PATH; export PATH export PATH=$PATH:$ORACLE_HOME/OPatch export NLS_LANG=\u0026#34;AMERICAN_AMERICA.ZHS16GBK\u0026#34; export NLS_DATE_FORMAT=\u0026#34;yyyy-mm-dd hh24:mi:ss\u0026#34; LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH if [ $USER = \u0026#34;oracle\u0026#34; ]; then if [ $SHELL = \u0026#34;/bin/ksh\u0026#34; ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi EOF 安装Oracle软件 # 软件上传解压 # chown -R oracle.oinstall /soft su - oracle cd /soft unzip -q LINUX.X64_193000_db_home.zip -d $ORACLE_HOME 配置响应文件 # cat \u0026gt;\u0026gt; /soft/db_install.rsp \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0 oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory ORACLE_BASE=/u01/app/oracle oracle.install.db.InstallEdition=EE oracle.install.db.OSDBA_GROUP=dba oracle.install.db.OSOPER_GROUP=oper oracle.install.db.OSBACKUPDBA_GROUP=backupdba oracle.install.db.OSDGDBA_GROUP=dgdba oracle.install.db.OSKMDBA_GROUP=kmdba oracle.install.db.OSRACDBA_GROUP=racdba oracle.install.db.rootconfig.executeRootScript=false oracle.install.db.rootconfig.configMethod= EOF 解压OPatch和(DB Release Updates)RU补丁包 # cd /soft unzip -o -q /soft/p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME unzip -q p37260974_190000_Linux-x86-64.zip 静默安装 Oracle 软件 # cd $ORACLE_HOME ./runInstaller -silent -force -responseFile /soft/db_install.rsp -ignorePrereq -waitForCompletion -applyRU /soft/37260974 安装完后需要切换到 root 用户下执行以下 root.sh 脚本\n/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/19.3.0/db_1/root.sh 静默创建监听 # netca -silent -responsefile /u01/app/oracle/product/19.3.0/db_1/assistants/netca/netca.rsp 静默创建数据库实例 # dbca -silent -ignorePreReqs -ignorePrereqFailure -createDatabase \\ -templateName General_Purpose.dbc -responseFile NO_VALUE \\ -databaseConfigType SINGLE \\ -gdbname orcl -sid orcl \\ -createAsContainerDatabase FALSE \\ -sysPassword oracle -systemPassword oracle -dbsnmpPassword oracle \\ -datafileDestination \u0026#39;/u01/app/oracle/oradata\u0026#39; -recoveryAreaDestination \u0026#39;/u01/app/oracle/flash_recovery_area\u0026#39; \\ -storageType FS \\ -characterset ZHS16GBK -nationalCharacterSet AL16UTF16 \\ -sampleSchema true \\ -totalMemory 2048 \\ -redoLogFileSize 1024 \\ -databaseType OLTP \\ -emConfiguration NONE 最佳参数实践 # 注意：参数最佳实践适用于 12c 及以上版本，个别参数在 11g 中可能没有；另外每个公司均有自己生产实践过的参数，以下仅供参考 alter system set db_files=2048 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set event=\u0026#39;10949 trace name context forever,level 1\u0026#39;,\u0026#39;28401 trace name context forever,level 1\u0026#39;,\u0026#39;10503 trace name context forever, level 4000\u0026#39; scope=spfile sid=\u0026#39;*\u0026#39;; alter system set parallel_degree_policy=manual scope=spfile sid=\u0026#39;*\u0026#39;; alter system set parallel_force_local=TRUE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set parallel_max_servers=128 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set audit_trail=none scope=spfile sid=\u0026#39;*\u0026#39;; alter system set deferred_segment_creation=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set archive_lag_target=1800 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_block_checking=MEDIUM scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_block_checksum=FULL scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_lost_write_protect=TYPICAL scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_writer_processes=8 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set enable_ddl_logging=true scope=spfile sid=\u0026#39;*\u0026#39;; alter system set max_dump_file_size=102400000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set max_idle_blocker_time=15 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set optimizer_adaptive_plans=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set optimizer_adaptive_statistics=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set undo_retention=86400 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set processes=6000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set control_file_record_keep_time=60 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optim_peek_user_binds\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_cursor_obsolete_threshold\u0026#34;=100 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_px_use_large_pool\u0026#34; = true scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_clusterwide_global_transactions\u0026#34; = false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_rollback_segment_count\u0026#34;=500 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_cleanup_rollback_entries\u0026#34; = 10000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_use_feedback\u0026#34; = false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_undo_autotune\u0026#34; = false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_ash_size\u0026#34; = 254M scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_extended_cursor_sharing_rel\u0026#34;=none scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_extended_cursor_sharing\u0026#34;=none scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_adaptive_cursor_sharing\u0026#34;=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_gc_policy_time\u0026#34;=0 scope=spfile; alter system set \u0026#34;_gc_undo_affinity\u0026#34;=FALSE scope=spfile; --close inmemory alter system set inmemory_size=0 scope=spfile; alter system set inmemory_query=disable scope=spfile; ----内存参数调整参考 alter system set sga_max_size=40G scope=spfile; alter system set db_cache_size=25G scope=spfile; alter system set shared_pool_size=8G scope=spfile; alter system set java_pool_size=1G scope=spfile; alter system set large_pool_size=1G scope=spfile; alter system set pga_aggregate_target=10G scope=spfile; alter system set pga_aggregate_limit=20G scope=spfile sid=\u0026#39;*\u0026#39;; -------------------------------------------------------- ALTER PROFILE DEFAULT limit FAILED_LOGIN_ATTEMPTS UNLIMITED PASSWORD_LIFE_TIME UNLIMITED; exec dbms_workload_repository.modify_snapshot_settings(interval=\u0026gt;30,retention=\u0026gt;40*24*60); BEGIN DBMS_AUTO_TASK_ADMIN.disable( client_name =\u0026gt; \u0026#39;auto space advisor\u0026#39;, operation =\u0026gt; NULL, window_name =\u0026gt; NULL); END; / BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE(client_name =\u0026gt; \u0026#39;sql tuning advisor\u0026#39;, operation =\u0026gt; NULL, window_name =\u0026gt; NULL); END; / select client_name,status from DBA_AUTOTASK_CLIENT; exec dbms_scheduler.disable(\u0026#39;ORACLE_OCM.MGMT_CONFIG_JOB\u0026#39;); exec dbms_scheduler.disable(\u0026#39;ORACLE_OCM.MGMT_STATS_CONFIG_JOB\u0026#39;); select JOB_NAME, ENABLED, STATE from dba_scheduler_jobs where owner = \u0026#39;ORACLE_OCM\u0026#39;; ","date":"2025-03-03","externalUrl":null,"permalink":"/posts/install-oracle19c-on-centos7/","section":"文章","summary":"一篇 Oracle 19c 单机安装操作文档，覆盖 CentOS 7 系统准备、Oracle 软件静默安装、监听配置、数据库实例创建和常用初始化参数调整。","title":"Oracle 19c 单机静默安装实战：CentOS 7 环境","type":"posts"},{"content":"","date":"2025-03-03","externalUrl":null,"permalink":"/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%89%E8%A3%85/","section":"Tags","summary":"","title":"数据库安装","type":"tags"},{"content":"通过openssh-rpms制作工具，完成rpm升级包的制作，大佬的工具非常强大。可以现实多操作系统版本的升级操作\nCentOS 5/6/7/8/Stream 8/9 Amazon Linux 1/2/2023 UnionTech OS Server 20 openEuler 22.03 (LTS-SP1) AnolisOS 7.9/8.6 Rocky Linux 8/9 实战CentOS7.9升级openssh到9.9版本\n准备升级需要的文件\nopenssh-rpms-main.zip 制作程序的安装包\nopenssh-9.9p1.tar.gz openssh的源码包\nopenssl-1.1.1w.tar.gz openssl的源码包\nx11-ssh-askpass-1.2.4.1.tar.gz openssh的依赖包\n环境准备 # 查看当前版本\n[root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@centos7 ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 [root@centos7 ~]# openssl version -a OpenSSL 1.0.2k-fips 26 Jan 2017 built on: reproducible build, date unspecified platform: linux-x86_64 options: bn(64,64) md2(int) rc4(8x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) compiler: gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM OPENSSLDIR: \u0026#34;/etc/pki/tls\u0026#34; engines: rdrand dynamic [root@centos7 ~]# /usr/sbin/sshd -V unknown option -- V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file] [-E log_file] [-f config_file] [-g login_grace_time] [-h host_key_file] [-o option] [-p port] [-u len] [root@centos7 ~]# 下载安装包\n解压openssh-rpms-main.zip\n[root@centos7 ~]# unzip openssh-rpms-main.zip Archive: openssh-rpms-main.zip 87327de45b536a0d61d89cf8736f4e4af9b9fa1b creating: openssh-rpms-main/ creating: openssh-rpms-main/.github/ creating: openssh-rpms-main/.github/workflows/ inflating: openssh-rpms-main/.github/workflows/build-images.yml inflating: openssh-rpms-main/.github/workflows/create-amd64-release.yml inflating: openssh-rpms-main/.github/workflows/create-arm64-release.yml inflating: openssh-rpms-main/.gitignore inflating: openssh-rpms-main/README.md creating: openssh-rpms-main/amzn1/ creating: openssh-rpms-main/amzn1/BUILD/ 。。。省略 creating: openssh-rpms-main/el6/SPECS/ inflating: openssh-rpms-main/el6/SPECS/openssh.spec creating: openssh-rpms-main/el6/SRPMS/ extracting: openssh-rpms-main/el6/SRPMS/.keep creating: openssh-rpms-main/el7/ creating: openssh-rpms-main/el7/BUILD/ extracting: openssh-rpms-main/el7/BUILD/.keep creating: openssh-rpms-main/el7/RPMS/ extracting: openssh-rpms-main/el7/RPMS/.keep creating: openssh-rpms-main/el7/SOURCES/ inflating: openssh-rpms-main/el7/SOURCES/sshd.pam.el7 creating: openssh-rpms-main/el7/SPECS/ inflating: openssh-rpms-main/el7/SPECS/openssh.spec creating: openssh-rpms-main/el7/SRPMS/ extracting: openssh-rpms-main/el7/SRPMS/.keep inflating: openssh-rpms-main/pullsrc.sh inflating: openssh-rpms-main/version.env [root@centos7 ~]# 把三个源码包放到downloads目录下\n[root@centos7 ~]# mv openssh-9.9p1.tar.gz openssl-1.1.1w.tar.gz x11-ssh-askpass-1.2.4.1.tar.gz /root/openssh-rpms-main/downloads mv: overwrite â/root/openssh-rpms-main/downloads/x11-ssh-askpass-1.2.4.1.tar.gzâ? y [root@centos7 ~]# ls -lh /root/openssh-rpms-main/downloads total 12M -rw-r--r-- 1 root root 1.9M Jan 26 14:58 openssh-9.9p1.tar.gz -rw-r--r-- 1 root root 9.5M Jan 26 15:24 openssl-1.1.1w.tar.gz -rw-r--r-- 1 root root 29K Jan 26 15:24 x11-ssh-askpass-1.2.4.1.tar.gz [root@centos7 ~]# 安装依赖 # [root@centos7 ~]# yum groupinstall -y \u0026#34;Development Tools\u0026#34; Loaded plugins: fastestmirror, langpacks There is no installed groups file. Maybe run: yum groups mark convert (see man yum) Loading mirror speeds from cached hostfile Resolving Dependencies --\u0026gt; Running transaction check ---\u0026gt; Package autoconf.noarch 0:2.69-11.el7 will be installed --\u0026gt; Processing Dependency: m4 \u0026gt;= 1.4.14 for package: autoconf-2.69-11.el7.noarch ---\u0026gt; Package automake.noarch 0:1.13.4-3.el7 will be installed --\u0026gt; Processing Dependency: perl(Thread::Queue) for package: automake-1.13.4-3.el7.noarch --\u0026gt; Processing Dependency: perl(TAP::Parser) for package: automake-1.13.4-3.el7.noarch ---\u0026gt; Package bison.x86_64 0:3.0.4-2.el7 will be installed 。。。省略 Installed: autoconf.noarch 0:2.69-11.el7 automake.noarch 0:1.13.4-3.el7 bison.x86_64 0:3.0.4-2.el7 byacc.x86_64 0:1.9.20130304-3.el7 cscope.x86_64 0:15.8-10.el7 ctags.x86_64 0:5.8-13.el7 diffstat.x86_64 0:1.57-4.el7 doxygen.x86_64 1:1.8.5-4.el7 flex.x86_64 0:2.5.37-6.el7 gcc.x86_64 0:4.8.5-44.el7 gcc-c++.x86_64 0:4.8.5-44.el7 gcc-gfortran.x86_64 0:4.8.5-44.el7 indent.x86_64 0:2.2.11-13.el7 intltool.noarch 0:0.50.2-7.el7 libtool.x86_64 0:2.4.2-22.el7_3 patch.x86_64 0:2.7.1-12.el7_7 patchutils.x86_64 0:0.3.3-5.el7_9 rcs.x86_64 0:5.9.0-7.el7 redhat-rpm-config.noarch 0:9.1.0-88.el7.centos rpm-build.x86_64 0:4.11.3-48.el7_9 rpm-sign.x86_64 0:4.11.3-48.el7_9 subversion.x86_64 0:1.7.14-16.el7 swig.x86_64 0:2.0.10-5.el7 systemtap.x86_64 0:4.0-13.el7 Dependency Installed: apr.x86_64 0:1.4.8-7.el7 apr-util.x86_64 0:1.5.2-6.el7_9.1 cpp.x86_64 0:4.8.5-44.el7 dwz.x86_64 0:0.11-3.el7 gettext-common-devel.noarch 0:0.19.8.1-3.el7 gettext-devel.x86_64 0:0.19.8.1-3.el7 glibc-devel.x86_64 0:2.17-326.el7_9.3 glibc-headers.x86_64 0:2.17-326.el7_9.3 kernel-debug-devel.x86_64 0:3.10.0-1160.119.1.el7 kernel-headers.x86_64 0:3.10.0-1160.119.1.el7 libgfortran.x86_64 0:4.8.5-44.el7 libquadmath.x86_64 0:4.8.5-44.el7 libquadmath-devel.x86_64 0:4.8.5-44.el7 libstdc++-devel.x86_64 0:4.8.5-44.el7 m4.x86_64 0:1.4.16-10.el7 perl-Test-Harness.noarch 0:3.28-3.el7 perl-Thread-Queue.noarch 0:3.02-2.el7 perl-XML-Parser.x86_64 0:2.41-10.el7 perl-srpm-macros.noarch 0:1-8.el7 python-srpm-macros.noarch 0:3-34.el7 subversion-libs.x86_64 0:1.7.14-16.el7 systemtap-client.x86_64 0:4.0-13.el7 systemtap-devel.x86_64 0:4.0-13.el7 Dependency Updated: glibc.x86_64 0:2.17-326.el7_9.3 glibc-common.x86_64 0:2.17-326.el7_9.3 Complete! [root@centos7 ~]# yum install -y imake rpm-build pam-devel krb5-devel zlib-devel libXt-devel libX11-devel gtk2-devel perl perl-IPC-Cmd Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Package rpm-build-4.11.3-48.el7_9.x86_64 already installed and latest version Package 4:perl-5.16.3-299.el7_9.x86_64 already installed and latest version Resolving Dependencies --\u0026gt; Running transaction check ---\u0026gt; Package gtk2-devel.x86_64 0:2.24.31-1.el7 will be installed --\u0026gt; Processing Dependency: pango-devel \u0026gt;= 1.20.0-1 for package: gtk2-devel-2.24.31-1.el7.x86_64 --\u0026gt; Processing Dependency: glib2-devel \u0026gt;= 2.28.0-1 for package: gtk2-devel-2.24.31-1.el7.x86_64 。。。省略 Updated: libX11-devel.x86_64 0:1.6.7-5.el7_9 Dependency Updated: expat.x86_64 0:2.1.0-15.el7_9 krb5-libs.x86_64 0:1.15.1-55.el7_9 libX11.x86_64 0:1.6.7-5.el7_9 libX11-common.noarch 0:1.6.7-5.el7_9 zlib.x86_64 0:1.2.7-21.el7_9 Complete! [root@centos7 ~]# 修改version.env变量 # 把OPENSSLSRC和OPENSSHSRC修改成相应版本信息\n[root@centos7 ~]# cat /root/openssh-rpms-main/version.env # custom defined components OPENSSLSRC=openssl-1.1.1w.tar.gz OPENSSHSRC=openssh-9.9p1.tar.gz PKGREL=1 ASKPASSSRC=x11-ssh-askpass-1.2.4.1.tar.gz # for EL5 only PERLSRC=perl-5.38.2.tar.gz # version numbers extracting OPENSSHVER=${OPENSSHSRC%%.tar.gz} OPENSSHVER=${OPENSSHVER##openssh-} OPENSSLVER=${OPENSSLSRC%%.tar.gz} OPENSSLVER=${OPENSSLVER##openssl-} PERLVER=${PERLSRC%%.tar.gz} PERLVER=${PERLVER##perl-} # Github Proxy, this arg is very useful for Chinese users. # You can try this: https://github.akams.cn/ GH_PROXY=\u0026#34;\u0026#34; [root@centos7 ~]# 开始编译生成安装包 # 进入openssh-rpms-main程序目录使用compile.sh命令生成安装包，最后echo $?查看是否返回0正确\n[root@centos7 ~]# cd openssh-rpms-main/ [root@centos7 openssh-rpms-main]# ./compile.sh el7 ~/openssh-rpms-main/el7 ~/openssh-rpms-main â/root/openssh-rpms-main/downloads/openssh-9.9p1.tar.gzâ -\u0026gt; â./SOURCES/openssh-9.9p1.tar.gzâ â/root/openssh-rpms-main/downloads/openssl-1.1.1w.tar.gzâ -\u0026gt; â./SOURCES/openssl-1.1.1w.tar.gzâ â/root/openssh-rpms-main/downloads/x11-ssh-askpass-1.2.4.1.tar.gzâ -\u0026gt; â./SOURCES/x11-ssh-askpass-1.2.4.1.tar.gzâ Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Y0T3Io + umask 022 + cd /root/openssh-rpms-main/el7/BUILD + cd /root/openssh-rpms-main/el7/BUILD + rm -rf openssh-9.9p1 + /usr/bin/gzip -dc /root/openssh-rpms-main/el7/SOURCES/openssh-9.9p1.tar.gz + /usr/bin/tar -xf - + STATUS=0 + \u0026#39;[\u0026#39; 0 -ne 0 \u0026#39;]\u0026#39; + cd openssh-9.9p1 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + mkdir -p openssl + tar xfz /root/openssh-rpms-main/el7/SOURCES/openssl-1.1.1w.tar.gz --strip-components=1 -C openssl + pushd openssl ~/openssh-rpms-main/el7/BUILD/openssh-9.9p1/openssl ~/openssh-rpms-main/el7/BUILD/openssh-9.9p1 + ./config shared zlib -fPIC Operating system: x86_64-whatever-linux2 Configuring OpenSSL version 1.1.1w (0x1010117fL) for linux-x86_64 。。。省略 Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/openssh-rpms-main/el7/BUILDROOT/openssh-9.9p1-1.el7.x86_64 Wrote: /root/openssh-rpms-main/el7/SRPMS/openssh-9.9p1-1.el7.src.rpm Wrote: /root/openssh-rpms-main/el7/RPMS/x86_64/openssh-9.9p1-1.el7.x86_64.rpm Wrote: /root/openssh-rpms-main/el7/RPMS/x86_64/openssh-clients-9.9p1-1.el7.x86_64.rpm Wrote: /root/openssh-rpms-main/el7/RPMS/x86_64/openssh-server-9.9p1-1.el7.x86_64.rpm Wrote: /root/openssh-rpms-main/el7/RPMS/x86_64/openssh-debuginfo-9.9p1-1.el7.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.9RqveV + umask 022 + cd /root/openssh-rpms-main/el7/BUILD + cd openssh-9.9p1 + rm -rf /root/openssh-rpms-main/el7/BUILDROOT/openssh-9.9p1-1.el7.x86_64 + exit 0 ~/openssh-rpms-main [root@centos7 openssh-rpms-main]# echo $? 0 [root@centos7 openssh-rpms-main]# 检查rpm升级包 # [root@centos7 openssh-rpms-main]# cd /root/openssh-rpms-main/el7/RPMS/x86_64/ [root@centos7 x86_64]# ls -lh total 18M -rw-r--r-- 1 root root 4.9M Jan 26 15:35 openssh-9.9p1-1.el7.x86_64.rpm -rw-r--r-- 1 root root 5.1M Jan 26 15:35 openssh-clients-9.9p1-1.el7.x86_64.rpm -rw-r--r-- 1 root root 4.5M Jan 26 15:35 openssh-debuginfo-9.9p1-1.el7.x86_64.rpm -rw-r--r-- 1 root root 2.7M Jan 26 15:35 openssh-server-9.9p1-1.el7.x86_64.rpm [root@centos7 x86_64]# 备份配置文件 # [root@centos7 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%Y%m%d) [root@centos7 ~]# cp /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.$(date +%Y%m%d) [root@centos7 ~]# cp /etc/pam.d/sshd /etc/pam.d/sshd.$(date +%Y%m%d) [root@centos7 ~]# RPM升级 # [root@centos7 x86_64]# cd /root/openssh-rpms-main/el7/RPMS/x86_64 [root@centos7 x86_64]# rpm -ivh --force --nodeps --replacepkgs --replacefiles openssh-*.rpm Preparing... ################################# [100%] Updating / installing... 1:openssh-9.9p1-1.el7 ################################# [ 25%] 2:openssh-clients-9.9p1-1.el7 ################################# [ 50%] 3:openssh-server-9.9p1-1.el7 ################################# [ 75%] 4:openssh-debuginfo-9.9p1-1.el7 ################################# [100%] [root@centos7 x86_64]# 修改ssh目录文件权限 # [root@centos7 x86_64]# ls -lh /etc/ssh total 568K -rw------- 1 root root 530K Jan 26 15:35 moduli -rw-r--r-- 1 root root 1.6K Jan 26 15:35 ssh_config -rw------- 1 root root 3.6K Jan 26 15:35 sshd_config -rw------- 1 root root 3.9K Jan 26 16:13 sshd_config.20250126 -rw-r-----. 1 root ssh_keys 227 Mar 7 2023 ssh_host_ecdsa_key -rw-r--r--. 1 root root 162 Mar 7 2023 ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys 387 Mar 7 2023 ssh_host_ed25519_key -rw-r--r--. 1 root root 82 Mar 7 2023 ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys 1.7K Mar 7 2023 ssh_host_rsa_key -rw-r--r--. 1 root root 382 Mar 7 2023 ssh_host_rsa_key.pub [root@centos7 x86_64]# chmod 600 /etc/ssh/ssh_host_rsa_key [root@centos7 x86_64]# chmod 600 /etc/ssh/ssh_host_ecdsa_key [root@centos7 x86_64]# chmod 600 /etc/ssh/ssh_host_ed25519_key [root@centos7 x86_64]# ls -lh /etc/ssh total 568K -rw------- 1 root root 530K Jan 26 15:35 moduli -rw-r--r-- 1 root root 1.6K Jan 26 15:35 ssh_config -rw------- 1 root root 3.6K Jan 26 15:35 sshd_config -rw------- 1 root root 3.9K Jan 26 16:13 sshd_config.20250126 -rw-------. 1 root ssh_keys 227 Mar 7 2023 ssh_host_ecdsa_key -rw-r--r--. 1 root root 162 Mar 7 2023 ssh_host_ecdsa_key.pub -rw-------. 1 root ssh_keys 387 Mar 7 2023 ssh_host_ed25519_key -rw-r--r--. 1 root root 82 Mar 7 2023 ssh_host_ed25519_key.pub -rw-------. 1 root ssh_keys 1.7K Mar 7 2023 ssh_host_rsa_key -rw-r--r--. 1 root root 382 Mar 7 2023 ssh_host_rsa_key.pub [root@centos7 x86_64]# 重启服务并测试 # [root@centos7 x86_64]# systemctl restart sshd [root@centos7 x86_64]# [C:\\~]$ ssh 192.168.17.70 #开启xshell客户端进行连接测试 Connecting to 192.168.17.70:22... Connection established. To escape to local shell, press \u0026#39;Ctrl+Alt+]\u0026#39;. WARNING! The remote SSH server rejected X11 forwarding request. Last login: Sun Jan 26 15:31:03 2025 from 192.168.17.1 [root@centos7 ~]# ssh -V OpenSSH_9.9p1, OpenSSL 1.1.1w 11 Sep 2023 [root@centos7 ~]# openssl version -a OpenSSL 1.0.2k-fips 26 Jan 2017 built on: reproducible build, date unspecified platform: linux-x86_64 options: bn(64,64) md2(int) rc4(8x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) compiler: gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM OPENSSLDIR: \u0026#34;/etc/pki/tls\u0026#34; engines: rdrand dynamic [root@centos7 ~]# /usr/sbin/sshd -V OpenSSH_9.9p1, OpenSSL 1.1.1w 11 Sep 2023 [root@centos7 ~]# ","date":"2025-01-26","externalUrl":null,"permalink":"/posts/opensshupgrade/","section":"文章","summary":"通过 openssh-rpms 制作 OpenSSH 9.9p1 RPM 升级包，完成 CentOS 7.9 环境下的依赖安装、源码准备、RPM 编译、备份配置、升级安装和服务验证。","title":"CentOS 7.9 OpenSSH 升级到 9.9p1 实战","type":"posts"},{"content":"","date":"2025-01-26","externalUrl":null,"permalink":"/tags/openssh/","section":"Tags","summary":"","title":"OpenSSH","type":"tags"},{"content":"","date":"2025-01-26","externalUrl":null,"permalink":"/tags/openssl/","section":"Tags","summary":"","title":"OpenSSL","type":"tags"},{"content":"","date":"2025-01-26","externalUrl":null,"permalink":"/tags/rpm/","section":"Tags","summary":"","title":"RPM","type":"tags"},{"content":"","date":"2025-01-26","externalUrl":null,"permalink":"/tags/%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA/","section":"Tags","summary":"","title":"系统加固","type":"tags"},{"content":" 安装介质 # 操作系统包\ncompat-libstdc++-33-3.2.3-72.el7.x86_64.rpm pdksh-5.2.14-37.el5_8.1.x86_64.rpm\noracle安装介质\np13390677_112040_Linux-x86-64_1of7.zip p13390677_112040_Linux-x86-64_2of7.zip p13390677_112040_Linux-x86-64_3of7.zip\noracle补丁，执行root.sh\np18370031_112040_Linux-x86-64.zip\nasm安装包\noracleasm-support-2.1.11-2.el7.x86_64.rpm kmod-oracleasm-2.0.8-28.0.1.el7.x86_64.rpm oracleasmlib-2.0.12-1.el7.x86_64.rpm\n百度网盘下载\n链接: https://pan.baidu.com/s/1c1Zl2N6w1RgGyS2WRTpG2g 提取码: rfc2\n安装步骤 # 系统版本 # cat /etc/centos-release 关闭防火墙 # systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --state 关闭selinux # setenforce 0 sed -ri \u0026#39;s/SELINUX=enforcing/SELINUX=disabled/\u0026#39; /etc/selinux/config sestatus 配置Yum源 # 有网络的条件配置清华源\nsudo sed -e \u0026#39;s|^mirrorlist=|#mirrorlist=|g\u0026#39; \\ -e \u0026#39;s|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g\u0026#39; \\ -i.bak \\ /etc/yum.repos.d/CentOS-*.repo 没有网络的，配置本地源\nmount -o loop /root/CentOS-7-x86_64-DVD-2207-02.iso /mnt cat \u0026gt;\u0026gt; /etc/yum.repos.d/local.repo \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; [local] name=local baseurl=file:///mnt gpgcheck=0 enabled=1 EOF yum clean all yum makecache 移除虚拟嵌套 # yum remove libvirt-libs -y 配置hosts文件 # hostnamectl set-hostname rac-1 cat \u0026gt;\u0026gt; /etc/hosts \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; 192.168.17.20 rac-1 192.168.17.21 rac-2 18.18.18.1 rac-1-priv 18.18.18.2 rac-2-priv 192.168.17.23 rac-1-vip 192.168.17.24 rac-2-vip 192.168.17.25 rac-scan EOF 配置sysctl.conf # cat \u0026gt;\u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; fs.file-max = 6815744 kernel.sem = 10000 10240000 10000 1024 kernel.shmmni = 4096 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_max = 1048576 fs.aio-max-nr = 40960000 vm.dirty_ratio = 20 vm.dirty_background_ratio = 3 vm.dirty_writeback_centisecs = 100 vm.dirty_expire_centisecs = 500 vm.swappiness = 10 vm.min_free_kbytes = 524288 vm.nr_hugepages = 529 #注意sga 32G 设置16408 64G设置32792 128G设置65560 256G设置131096 EOF /sbin/sysctl -p 配置limits.conf # cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; oracle soft nofile 1048576 oracle hard nofile 1048576 oracle soft nproc 131072 oracle hard nproc 131072 oracle soft stack 10240 oracle hard stack 32768 oracle soft core 6291456 oracle hard core 6291456 oracle soft memlock 241591910 oracle hard memlock 241591910 grid soft nofile 1048576 grid hard nofile 1048576 grid soft nproc 131072 grid hard nproc 131072 grid soft stack 10240 grid hard stack 32768 grid soft core 6291456 grid hard core 6291456 grid soft memlock 241591910 grid hard memlock 241591910 EOF cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; session required pam_limits.so session required /lib64/security/pam_limits.so EOF 安装所需包 # yum install -y bc \\ binutils \\ compat-libcap1 \\ compat-libstdc++-33 \\ gcc \\ gcc-c++ \\ elfutils-libelf \\ elfutils-libelf-devel \\ glibc \\ glibc-devel \\ ksh \\ libaio \\ libaio-devel \\ libgcc \\ libstdc++ \\ libstdc++-devel \\ libxcb \\ libX11 \\ libXau \\ libXi \\ libXtst \\ libXrender \\ libXrender-devel \\ make \\ net-tools \\ nfs-utils \\ smartmontools \\ sysstat \\ e2fsprogs \\ e2fsprogs-libs \\ fontconfig-devel \\ expect \\ unzip \\ openssh-clients \\ readline* \\ tigervnc* \\ psmisc --skip-broken rpm -ivh compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm rpm -e ksh-20120801-144.el7_9.x86_64 rpm -ivh pdksh-5.2.14-37.el5_8.1.x86_64.rpm # 检查安装包 rpm -q bc binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ elfutils-libelf elfutils-libelf-devel glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libxcb libX11 libXau libXi libXtst libXrender libXrender-devel make net-tools nfs-utils smartmontools sysstat e2fsprogs e2fsprogs-libs fontconfig-devel expect unzip openssh-clients readline | grep \u0026#34;not installed\u0026#34; 注意ksh not installed是因为pdksh这个包和它有冲突 关闭ntp和chrony服务 # systemctl stop ntpd systemctl disable ntpd.service mv /etc/ntp.conf /etc/ntp.conf.bak systemctl stop chronyd systemctl disable chronyd mv /etc/chrony.conf /etc/chrony.conf_bak 关闭透明大页和numa # 查看透明大页是否关闭(always表示启用,never表示禁用)\ncat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/enabled echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/defrag vi /etc/rc.d/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never \u0026gt; /sys/kernel/mm/transparent_hugepage/defrag Fi chmod +x /etc/rc.d/rc.local 修改grub配置文件添加\u0026quot;transparent_hugepage=never\u0026quot;：\n# grep CMDLINE /etc/default/grub vi /etc/default/grub GRUB_CMDLINE_LINUX=\u0026#34;rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never numa=off\u0026#34; # 直接或者用sed修改 sed -i \u0026#39;s/quiet/quiet transparent_hugepage=never numa=off/\u0026#39; /etc/default/grub cat /etc/default/grub # 重建/boot/grub2/grub.cfg文件 grub2-mkconfig -o /boot/grub2/grub.cfg [root@rac-1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-61edbdff9a994c8e987f8f628d240f19 Found initrd image: /boot/initramfs-0-rescue-61edbdff9a994c8e987f8f628d240f19.img done [root@rac-1 ~]# # 重启OS shutdown -r now 禁用avahi-daemon # 建议关闭avahi-daemon\nyum install -y avahi* systemctl stop avahi-daemon.socket systemctl stop avahi-daemon.service systemctl disable avahi-daemon.socket systemctl disable avahi-daemon.service systemctl status avahi-daemon.socket systemctl status avahi-daemon.service pgrep -f avahi-daemon | awk \u0026#39;{print \u0026#34;kill -9 \u0026#34;$2}\u0026#39; # 配置NOZEROCONF=yes cat \u0026gt;\u0026gt; /etc/sysconfig/network \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; NOZEROCONF = yes EOF 创建组和用户 # 创建组 /usr/sbin/groupadd -g 54321 oinstall /usr/sbin/groupadd -g 54322 dba /usr/sbin/groupadd -g 54323 oper /usr/sbin/groupadd -g 54324 backupdba /usr/sbin/groupadd -g 54325 dgdba /usr/sbin/groupadd -g 54326 kmdba /usr/sbin/groupadd -g 54327 asmdba /usr/sbin/groupadd -g 54328 asmoper /usr/sbin/groupadd -g 54329 asmadmin /usr/sbin/groupadd -g 54330 racdba 创建用户 /usr/sbin/useradd -u 11012 -g oinstall -G asmadmin,asmdba,asmoper,dba,racdba,oper grid /usr/sbin/useradd -u 54321 -g oinstall -G asmdba,dba,backupdba,dgdba,kmdba,racdba,oper oracle 修改密码 echo \u0026#34;sinopharm\u0026#34; |passwd oracle --stdin echo \u0026#34;sinopharm\u0026#34; |passwd grid --stdin 创建目录 # mkdir -p /u01/app/11.2.0/grid mkdir -p /u01/app/grid mkdir -p /u01/app/oracle/product/11.2.0/db mkdir -p /u01/app/oraInventory mkdir -p /backup mkdir -p /home/oracle/scripts chown -R oracle:oinstall /backup chown -R oracle:oinstall /home/oracle/scripts chown -R grid:oinstall /u01 chown -R grid:oinstall /u01/app/grid chown -R grid:oinstall /u01/app/11.2.0/grid chown -R grid:oinstall /u01/app/oraInventory chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01 修改profile # cat \u0026gt;\u0026gt; /etc/profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; if [ $USER = \u0026#34;oracle\u0026#34; ] || [ $USER = \u0026#34;grid\u0026#34; ] ; then if [ $SHELL = \u0026#34;/bin/ksh\u0026#34; ]; then ulimit -p 131072 ulimit -n 1048576 else ulimit -u 131072 -n 1048576 fi fi EOF 环境变量设置 # su - grid cat \u0026gt;\u0026gt; /home/grid/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; #Grid Settings export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK export NLS_DATE_FORMAT=\u0026#34;yyyy-mm-dd hh24:mi:ss\u0026#34; export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/11.2.0/grid export ORACLE_TERM=xterm export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=+ASM1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH EOF su - oracle cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; #Oracle Settings umask 022 export TMP=/tmp export TMPDIR=$TMP export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK export NLS_DATE_FORMAT=\u0026#34;yyyy-mm-dd hh24:mi:ss\u0026#34; export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db export ORACLE_TERM=xterm export TNS_ADMIN=$ORACLE_HOME/network/admin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export ORACLE_SID=orcl1 export PATH=/usr/sbin:$PATH export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH EOF 大页内存设置 # grep -i huge /proc/meminfo # Oracle数据库设置sga_target # 配置/etc/sysctl.conf vm.nr_hugepages = 529 #注意sga 32G 设置16408 64G设置32792 128G设置65560 256G设置131096 上传安装包解压 # chown grid:oinstall p13390677_112040_Linux-x86-64_3of7.zip su - grid unzip p13390677_112040_Linux-x86-64_3of7.zip chown oracle:oinstall p13390677_112040_Linux-x86-64_1of7.zip chown oracle:oinstall p13390677_112040_Linux-x86-64_2of7.zip su - oracle unzip p13390677_112040_Linux-x86-64_1of7.zip unzip p13390677_112040_Linux-x86-64_2of7.zip 配置SSH对等 # cd grid/sshsetup/ ./sshUserSetup.sh -user grid -hosts \u0026#34;rac-1 rac-2\u0026#34; -advanced -exverify -confirm –noPromptPassphrase cd database/sshsetup/ ./sshUserSetup.sh -user oracle -hosts \u0026#34;rac-1 rac-2\u0026#34; -advanced -exverify -confirm –noPromptPassphrase 配置ASM共享存储 # # 格式化磁盘 lsblk fdisk /dev/sdb fdisk /dev/sdc fdisk /dev/sdd fdisk /dev/sde # 同步到异机 partprobe # 安装asm软件 rpm -ivh oracleasm-support-2.1.11-2.el7.x86_64.rpm rpm -ivh kmod-oracleasm-2.0.8-28.0.1.el7.x86_64.rpm rpm -ivh oracleasmlib-2.0.12-1.el7.x86_64.rpm # 初始化asm /usr/sbin/oracleasm configure -i grid asmadmin y y /usr/sbin/oracleasm init # 清理磁盘，注意谨慎操作 dd if=/dev/zero of=/dev/sdb1 bs=1024 count=100 dd if=/dev/zero of=/dev/sdc1 bs=1024 count=100 dd if=/dev/zero of=/dev/sdd1 bs=1024 count=100 dd if=/dev/zero of=/dev/sde1 bs=1024 count=100 # 创建OCRVOTE磁盘组和DATA磁盘组 oracleasm createdisk ocrvote01 /dev/sdb1 oracleasm createdisk ocrvote02 /dev/sdc1 oracleasm createdisk ocrvote03 /dev/sdd1 oracleasm createdisk data01 /dev/sde1 # 异机扫描磁盘组 oracleasm scandisks oracleasm listdisks cvuqdisk安装 # # 两台主机都安装cvuqdisk包 cd grid/rpm rpm -ivh cvuqdisk-1.0.9-1.rpm 安装grid软件 # # 准备工作检查 cd grid ./runcluvfy.sh stage -pre crsinst -n rac-1,rac-2 -fixup -verbose ./runInstaller 安装补丁 # 原因：RHEL7使用systemd而不是initd运行进程和重启进程，而root.sh是通过传统的initd运行ohasd进程，此为Linux7安装11204版本，执行root.sh时存在的BUG，需要在执行root.sh前安装补丁18370031修复\n18370031补丁安装（双节点执行） 上传补丁包 p18370031_112040_Linux-x86-64.zip chown grid:oinstall p18370031_112040_Linux-x86-64.zip unzip -q p18370031_112040_Linux-x86-64.zip cd 18370031/ opatch napply -oh $ORACLE_HOME -local . [grid@rac-1 18370031]$ opatch napply -oh $ORACLE_HOME -local . Oracle Interim Patch Installer version 11.2.0.3.4 Copyright (c) 2012, Oracle Corporation. All rights reserved. Oracle Home : /u01/app/11.2.0/grid Central Inventory : /u01/app/oraInventory from : /u01/app/11.2.0/grid/oraInst.loc OPatch version : 11.2.0.3.4 OUI version : 11.2.0.4.0 Log file location : /u01/app/11.2.0/grid/cfgtoollogs/opatch/opatch2024-04-23_10-50-57AM_1.log Verifying environment and performing prerequisite checks... OPatch continues with these patches: 18370031 Do you want to proceed? [y|n] y User Responded with: Y All checks passed. Please shutdown Oracle instances running out of this ORACLE_HOME on the local system. (Oracle Home = \u0026#39;/u01/app/11.2.0/grid\u0026#39;) Is the local system ready for patching? [y|n] y User Responded with: Y Backing up files... Applying interim patch \u0026#39;18370031\u0026#39; to OH \u0026#39;/u01/app/11.2.0/grid\u0026#39; Patching component oracle.crs, 11.2.0.4.0... Verifying the update... Patch 18370031 successfully applied. Log file location: /u01/app/11.2.0/grid/cfgtoollogs/opatch/opatch2024-04-23_10-50-57AM_1.log OPatch succeeded. [grid@rac-1 18370031]$ 执行root.sh脚本 # [root@rac-1 ~]# /u01/app/oraInventory/orainstRoot.sh Changing permissions of /u01/app/oraInventory. Adding read,write permissions for group. Removing read,write,execute permissions for world. Changing groupname of /u01/app/oraInventory to oinstall. The execution of the script is complete. [root@rac-1 ~]# /u01/app/11.2.0/grid/root.sh Performing root user operation for Oracle 11g The following environment variables are set as: ORACLE_OWNER= grid ORACLE_HOME= /u01/app/11.2.0/grid Enter the full pathname of the local bin directory: [/usr/local/bin]: Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ... Creating /etc/oratab file... Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params Creating trace directory User ignored Prerequisites during installation Installing Trace File Analyzer OLR initialization - successful root wallet root wallet cert root cert export peer wallet profile reader wallet pa wallet peer wallet keys pa wallet keys peer cert request pa cert request peer cert pa cert peer root cert TP profile reader root cert TP pa root cert TP peer pa cert TP pa peer cert TP profile reader pa cert TP profile reader peer cert TP peer user cert pa user cert Adding Clusterware entries to oracle-ohasd.service CRS-2672: Attempting to start \u0026#39;ora.mdnsd\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2676: Start of \u0026#39;ora.mdnsd\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded CRS-2672: Attempting to start \u0026#39;ora.gpnpd\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2676: Start of \u0026#39;ora.gpnpd\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded CRS-2672: Attempting to start \u0026#39;ora.cssdmonitor\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2672: Attempting to start \u0026#39;ora.gipcd\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2676: Start of \u0026#39;ora.cssdmonitor\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded CRS-2676: Start of \u0026#39;ora.gipcd\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded CRS-2672: Attempting to start \u0026#39;ora.cssd\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2672: Attempting to start \u0026#39;ora.diskmon\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2676: Start of \u0026#39;ora.diskmon\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded CRS-2676: Start of \u0026#39;ora.cssd\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded ASM created and started successfully. Disk Group OCRVOTE created successfully. clscfg: -install mode specified Successfully accumulated necessary OCR keys. Creating OCR keys for user \u0026#39;root\u0026#39;, privgrp \u0026#39;root\u0026#39;.. Operation successful. CRS-4256: Updating the profile Successful addition of voting disk 2e2ff15375484fabbfc8c13a88290759. Successful addition of voting disk 7fd1b4dc71304f99bf1c5b4c635e8e91. Successful addition of voting disk 3024add0cc754febbf637f859a27dd1a. Successfully replaced voting disk group with +OCRVOTE. CRS-4256: Updating the profile CRS-4266: Voting file(s) successfully replaced ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 2e2ff15375484fabbfc8c13a88290759 (ORCL:OCRVOTE01) [OCRVOTE] 2. ONLINE 7fd1b4dc71304f99bf1c5b4c635e8e91 (ORCL:OCRVOTE02) [OCRVOTE] 3. ONLINE 3024add0cc754febbf637f859a27dd1a (ORCL:OCRVOTE03) [OCRVOTE] Located 3 voting disk(s). CRS-2672: Attempting to start \u0026#39;ora.asm\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2676: Start of \u0026#39;ora.asm\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded CRS-2672: Attempting to start \u0026#39;ora.OCRVOTE.dg\u0026#39; on \u0026#39;rac-1\u0026#39; CRS-2676: Start of \u0026#39;ora.OCRVOTE.dg\u0026#39; on \u0026#39;rac-1\u0026#39; succeeded Configure Oracle Grid Infrastructure for a Cluster ... succeeded [root@rac-1 ~]# [root@rac-2 ~]# /u01/app/oraInventory/orainstRoot.sh Changing permissions of /u01/app/oraInventory. Adding read,write permissions for group. Removing read,write,execute permissions for world. Changing groupname of /u01/app/oraInventory to oinstall. The execution of the script is complete. [root@rac-2 ~]# /u01/app/11.2.0/grid/root.sh Performing root user operation for Oracle 11g The following environment variables are set as: ORACLE_OWNER= grid ORACLE_HOME= /u01/app/11.2.0/grid Enter the full pathname of the local bin directory: [/usr/local/bin]: Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ... Creating /etc/oratab file... Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params Creating trace directory User ignored Prerequisites during installation Installing Trace File Analyzer OLR initialization - successful Adding Clusterware entries to oracle-ohasd.service CRS-4402: The CSS daemon was started in exclusive mode but found an active CSS daemon on node rac-1, number 1, and is terminating An active cluster was found during exclusive startup, restarting to join the cluster Configure Oracle Grid Infrastructure for a Cluster ... succeeded [root@rac-2 ~]# 安装Oracle软件 # ./runInstaller #root执行 /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0.4/db_1/root.sh 安装中报错ins_emagent.mk解决\ncd $ORACLE_HOME/sysman/lib sed -i \u0026#39;s/^\\(\\s*\\$(MK_EMAGENT_NMECTL)\\)\\s*$/\\1 -lnnz11/g\u0026#39; ins_emagent.mk 执行root.sh，/u01/app/oracle/product/11.2.0/db/root.sh\n[root@rac-1 ~]# /u01/app/oracle/product/11.2.0/db/root.sh Performing root user operation for Oracle 11g The following environment variables are set as: ORACLE_OWNER= oracle ORACLE_HOME= /u01/app/oracle/product/11.2.0/db Enter the full pathname of the local bin directory: [/usr/local/bin]: The contents of \u0026#34;dbhome\u0026#34; have not changed. No need to overwrite. The contents of \u0026#34;oraenv\u0026#34; have not changed. No need to overwrite. The contents of \u0026#34;coraenv\u0026#34; have not changed. No need to overwrite. Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. Finished product-specific root actions. [root@rac-1 ~]# [root@rac-2 ~]# /u01/app/oracle/product/11.2.0/db/root.sh Performing root user operation for Oracle 11g The following environment variables are set as: ORACLE_OWNER= oracle ORACLE_HOME= /u01/app/oracle/product/11.2.0/db Enter the full pathname of the local bin directory: [/usr/local/bin]: The contents of \u0026#34;dbhome\u0026#34; have not changed. No need to overwrite. The contents of \u0026#34;oraenv\u0026#34; have not changed. No need to overwrite. The contents of \u0026#34;coraenv\u0026#34; have not changed. No need to overwrite. Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. Finished product-specific root actions. [root@rac-2 ~]# 创建库 # dbca #数据库创建后，修改部分参数，具体应用再做详细调整 --调整最大进程数（以下值为一般设定值，根据具体应用要求） alter system set processes=1000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set resource_manager_plan=\u0026#39;FORCE:\u0026#39; scope =spfile sid=\u0026#39;*\u0026#39;; --禁用AUDIT alter system set audit_trail=none scope=spfile sid=\u0026#39;*\u0026#39;; alter system set undo_retention=10800 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set session_cached_cursors=500 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_files=2000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set max_shared_servers=0 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set sec_max_failed_login_attempts=100 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set deferred_segment_creation=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set parallel_force_local=true scope=spfile sid=\u0026#39;*\u0026#39;; alter system set parallel_max_servers=32 scope=spfile sid=\u0026#39;*\u0026#39;; --关闭密码大小写敏感 alter system set sec_case_sensitive_logon=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set open_cursors=3000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set open_link =40 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set open_links_per_instance =40 scope=spfile sid=\u0026#39;*\u0026#39;; --使用sga自动调整 --alter system set sga_target=0 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_cache_size=120g scope=spfile sid=\u0026#39;*\u0026#39;; alter system set shared_pool_size=25g scope=spfile sid=\u0026#39;*\u0026#39;; alter system set large_pool_size=512m scope=spfile sid=\u0026#39;*\u0026#39;; alter system set java_pool_size=512m scope=spfile sid=\u0026#39;*\u0026#39;; alter system set db_cache_advice=off scope=spfile sid=\u0026#39;*\u0026#39;; alter system set gcs_server_processes=6 scope=spfile sid=\u0026#39;*\u0026#39;; --关闭结果集缓存 alter system set result_cache_max_size = 0 sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_b_tree_bitmap_plans\u0026#34;=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_gc_policy_time\u0026#34;=0 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_gc_defer_time\u0026#34;=3 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_lm_tickets\u0026#34;=5000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_use_feedback\u0026#34;=false sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_undo_autotune\u0026#34;=false scope=both sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_bloom_filter_enabled\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_cleanup_rollback_entries\u0026#34;=2000 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_px_use_large_pool\u0026#34;=true scope=spfile sid=\u0026#39;*\u0026#39;; --关闭use_adaptive_log_file_sync特性 ALTER SYSTEM SET \u0026#34;_use_adaptive_log_file_sync\u0026#34;=FALSE scope=both sid=\u0026#39;*\u0026#39;; --关闭密码延迟验证特性 alter system set event=\u0026#39;28401 trace name context forever,level 1\u0026#39;,\u0026#39;10949 trace name context forever,level 1\u0026#39;scope=spfile sid=\u0026#39;*\u0026#39;; --关闭直接路径读特性 alter system set \u0026#34;_serial_direct_read”=NEVER scope=spfile sid=\u0026#39;*\u0026#39;; #关闭ACS特性 alter system set \u0026#34;_optimizer_extended_cursor_sharing_rel\u0026#34;=NONE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_extended_cursor_sharing\u0026#34;=NONE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_adaptive_cursor_sharing\u0026#34;=false scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_optimizer_mjc_enabled\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_sort_elimination_cost_ratio\u0026#34;=1 scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_partition_large_extents\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_index_partition_large_extents\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; --使用sga自动调整，这个不能关闭 --alter system set \u0026#34;_memory_imm_mode_without_autosga\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_clusterwide_global_transactions\u0026#34;=FALSE scope=spfile sid=\u0026#39;*\u0026#39;; alter system set \u0026#34;_part_access_version_by_number\u0026#34;=FALSE scope=spfile; alter system set \u0026#34;_partition_large_extents\u0026#34;=FALSE scope=spfile; alter system set \u0026#34;_sort_elimination_cost_ratio\u0026#34;=1 scope=spfile; alter system set \u0026#34;_use_adaptive_log_file_sync\u0026#34;=FALSE scope=spfile; alter system set \u0026#34;_lm_sync_timeout\u0026#34;=1200 scope=spfile; alter system set \u0026#34;_ksmg_granule_size\u0026#34;=134217728 scope=spfile; alter system set \u0026#34;_external_scn_logging_threshold_seconds\u0026#34;=3600 scope=spfile; alter system set \u0026#34;_datafile_write_errors_crash_instance\u0026#34;=false scope=spfile; alter system set event=\u0026#39;28401 TRACE NAME CONTEXT FOREVER, LEVEL 1:60025 trace name context forever:10949 trace name context forever,level 1\u0026#39; sid=\u0026#39;*\u0026#39; scope=spfile; CRS资源调整 # CRS默认每秒检查一次网络建库情况，如果发现网络存在异常比如闪断，那么将会立刻将SCAN/LISTENER等资源failover切换。可能影响业务。建议将check频率调大，建议将public 网络的检查频率从1秒修改为6秒\n# 用grid账号执行查询 crsctl stat res ora.net1.network -p # 用root账号执行调整 /u01/app/11.2.0/grid/bin/crsctl modify res ora.net1.network -attr \u0026#34;CHECK_INTERVAL=6\u0026#34; 关闭系统自带JOB # 关闭优化器统计顾问等\nexec dbms_scheduler.disable(\u0026#39;ORACLE_OCM.MGMT_CONFIG_JOB\u0026#39;); exec dbms_scheduler.disable(\u0026#39;ORACLE_OCM.MGMT_STATS_CONFIG_JOB\u0026#39;); BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE( client_name =\u0026gt; \u0026#39;auto space advisor\u0026#39;, operation =\u0026gt; NULL, window_name =\u0026gt; NULL); END; / BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE( client_name =\u0026gt; \u0026#39;sql tuning advisor\u0026#39;, operation =\u0026gt; NULL, window_name =\u0026gt; NULL); END; / ","date":"2024-04-23","externalUrl":null,"permalink":"/posts/install-oracle11grac-on-centos7/","section":"文章","summary":"一篇 Oracle 11g RAC 安装实战文档，覆盖双节点 CentOS 7.9 环境准备、ASM 共享存储、Grid 安装、root.sh 补丁处理、Oracle 软件安装、RAC 建库和常用参数优化。","title":"Oracle 11.2.0.4 RAC 在 CentOS 7.9 上安装实战","type":"posts"},{"content":"","date":"2024-03-06","externalUrl":null,"permalink":"/tags/online-redo/","section":"Tags","summary":"","title":"Online Redo","type":"tags"},{"content":"Oracle单实例调整在线重做日志文件大小的步骤如下：\n查看当前日志的大小 # sqlplus / as sysdba select group#, bytes, status from v$log; 操作如下\n[oracle@ora-test ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Mar 6 14:56:01 2024 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL\u0026gt; select group#, bytes, status from v$log; GROUP# BYTES STATUS ---------- ---------- -------------------------------- 1 52428800 CURRENT 2 52428800 INACTIVE 3 52428800 INACTIVE SQL\u0026gt; 上面的在线重做日志为 50MB，我们将其大小调整为 1GB # 查看在线重做日志位置\nselect group#, member from v$logfile; 操作日志\nSQL\u0026gt; select group#, member from v$logfile; GROUP# MEMBER ---------- ------------------------------------------------------------ 1 /u01/app/oracle/oradata/orcl/redo01.log 2 /u01/app/oracle/oradata/orcl/redo02.log 3 /u01/app/oracle/oradata/orcl/redo03.log SQL\u0026gt; 创建 3 个新的日志组 # 它们命名为组 4、5 和 6，每个大小为 1GB\nalter database add logfile group 4 \u0026#39;/u01/app/oracle/oradata/orcl/redo04.log\u0026#39; size 1G; alter database add logfile group 5 \u0026#39;/u01/app/oracle/oradata/orcl/redo05.log\u0026#39; size 1G; alter database add logfile group 6 \u0026#39;/u01/app/oracle/oradata/orcl/redo06.log\u0026#39; size 1G; 操作如下\nSQL\u0026gt; alter database add logfile group 4 \u0026#39;/u01/app/oracle/oradata/orcl/redo04.log\u0026#39; size 1G; Database altered. SQL\u0026gt; alter database add logfile group 5 \u0026#39;/u01/app/oracle/oradata/orcl/redo05.log\u0026#39; size 1G; Database altered. SQL\u0026gt; alter database add logfile group 6 \u0026#39;/u01/app/oracle/oradata/orcl/redo06.log\u0026#39; size 1G; Database altered. SQL\u0026gt; 查询v$log查看在线重做日志状态 # CURRENT：当前的，正在被使用的日志文件，同一时刻只有一个日志文件会处于CURRENT状态，处于CURRENT的日志文件被LGWR进程实时的写入 ACTIVE：活动的，未被LGWR写，刚切换完成，尚未发生检查点，实例恢复时需要的重做日志文件为ACTIVE（处于ACTIVE的日志文件组无法删除） INACTIVE：不活动的，实例恢复时不需要的重做日志文件为INACTIVE UNUSED：还没有被写入的空白日志文件 CLEARING：正在被清除的日志文件，日志清除后状态变为UNUSED CLEARING_CURRENT：正在被清除的CURRENT日志文件 select group#, status from v$log; 操作如下\nSQL\u0026gt; select group#, bytes, status from v$log; GROUP# BYTES STATUS ---------- ---------- -------------------------------- 1 52428800 CURRENT 2 52428800 INACTIVE 3 52428800 INACTIVE 4 1073741824 UNUSED 5 1073741824 UNUSED 6 1073741824 UNUSED 6 rows selected. SQL\u0026gt; 切换在线重做日志文件到第4组 # 优先删除状态是INACTIVE,如果是ACTIVE的状态的话，手动发起检查点\nalter system switch logfile; select group#, status from v$log; alter system checkpoint; 操作如下\nSQL\u0026gt; alter system switch logfile; System altered. SQL\u0026gt; alter system switch logfile; System altered. SQL\u0026gt; alter system switch logfile; System altered. SQL\u0026gt; select group#, status from v$log; GROUP# STATUS ---------- -------------------------------- 1 ACTIVE 2 INACTIVE 3 INACTIVE 4 ACTIVE 5 ACTIVE 6 CURRENT 6 rows selected. SQL\u0026gt; alter system checkpoint; System altered. SQL\u0026gt; select group#, status from v$log; GROUP# STATUS ---------- -------------------------------- 1 INACTIVE 2 INACTIVE 3 INACTIVE 4 INACTIVE 5 INACTIVE 6 CURRENT 6 rows selected. SQL\u0026gt; 删除原在线重做日志文件1~3组 # 注意状态是INACTIVE可删除\nalter database drop logfile group 1; alter database drop logfile group 2; alter database drop logfile group 3; 操作如下\nSQL\u0026gt; alter database drop logfile group 1; Database altered. SQL\u0026gt; alter database drop logfile group 2; Database altered. SQL\u0026gt; alter database drop logfile group 3; Database altered. SQL\u0026gt; 检查调整后的在线重做日志 # select group#, bytes, status from v$log; select group#, member from v$logfile; 操作如下\nSQL\u0026gt; select group#, bytes, status from v$log; GROUP# BYTES STATUS ---------- ---------- -------------------------------- 4 1073741824 INACTIVE 5 1073741824 INACTIVE 6 1073741824 CURRENT SQL\u0026gt; select group#, member from v$logfile; GROUP# MEMBER ---------- ------------------------------------------------------------ 4 /u01/app/oracle/oradata/orcl/redo04.log 5 /u01/app/oracle/oradata/orcl/redo05.log 6 /u01/app/oracle/oradata/orcl/redo06.log SQL\u0026gt; ","date":"2024-03-06","externalUrl":null,"permalink":"/posts/resize-onlineredo/","section":"文章","summary":"通过新增大容量 redo log group、切换当前日志、执行 checkpoint、删除旧日志组的方式，将 Oracle 单实例在线重做日志从 50MB 调整到 1GB。","title":"Oracle 单实例在线 Redo Log 日志文件大小调整实战","type":"posts"},{"content":"","date":"2024-03-06","externalUrl":null,"permalink":"/tags/redo-log/","section":"Tags","summary":"","title":"Redo Log","type":"tags"},{"content":"","date":"2024-03-06","externalUrl":null,"permalink":"/tags/%E6%97%A5%E5%BF%97%E7%BB%84/","section":"Tags","summary":"","title":"日志组","type":"tags"},{"content":" 前言 # 本人琐碎的日常感悟😎，权当是自娱自乐。存在不少谬误，大家小心阅读。\n杂谈 # 在今年本人所在的公司也发生了巨大的变化。领导层调动，公司降级等等。现今唯一没变化的就是公司大部分组织架构（相信不久的将来应该会有动作，也许我就下一个被优化的）。\n回顾在我们公司那么多年来技术方面，由于Oracle生态，稳定强大性能，使得开发更专注于业务逻辑的实现，能更快速简单的实现业务功能，把架构简单化。一方面给员工带来技术红利和对业务的熟练度。但另一方面员工对新兴技术的脱节，公司也在以盈利为目标的下，把员工个人利益和内部关联交易绑定中，逐渐迷失自我。\n随着公司合并，也让我感觉陷入一个思维怪圈，比如重金招一大批大厂架构师专家，放弃了原有的简单设计，不是从解决问题的根本出发（企业的业务与互联网企业完全不同），从而选择了一个更为复杂，不管什么系统都是套上大型互联网企业一堆先进的技术栈，写出长长漂漂亮亮的PPT，最终不负责任丢给企业让领导拍板，项目起点非常高，预算投入小则百万投入大则千万，项目周期半年起。殊不知原来在大型互联网企业是业务面临各种各样复杂性和巨大不确定负载挑战，他们从头到尾构建了一套自有IT体系，从研发到运营，为此投入了大量技术人员和资金以及时间成本。但我们当前公司的研发和运维人数能和大型互联网企业比吗？（也就是正真能干活技术岗并不多）很难想象在现在这样的经济大环境下有多少企业愿意拿出大量的资金来不计时间成本的打造这样团队？\n其次数字化转型也让我困惑，业务系统全生命周期拥有成本、系统改造后的安全稳定运行、企业研发队伍的能力、运维支撑能力、存量系统改造、企业业务发展的支撑能力等。在这些条件情况下企业把希望寄托于云平台。企业IT基础设施都要上公有云，建立自己私有云。殊不知采购成本的问题，云上的都不是免费，大到虚拟机，RDS数据库，可扩展存储S3，大规模构建训练部署机器学习模型，小到安全，流量，备份都需要收费。如果长远来看，仔细算下来，发现这玩意可能就是一个无底洞。\n再次技术到底有没有国界？到底是近些年国产化呼声高？还是因为不“安全”就不选择？到底是外企不给卖？还是我们担心他们真不卖给我们了，我们怎么办？这些也许每个人心里都有自己的答案。比如我们企业在采购上是不是有点用力过猛，一刀切了（不允许采购国外软硬件）。本人的想法是站在当下选择适合不适合我们企业（不管是不是国产化的东西）。当然国家肯定也要有自己的技术和创新，但完全割裂的做法我个人觉得不可取。\n写于2023年11月27日 ","date":"2023-11-27","externalUrl":null,"permalink":"/posts/grzt/","section":"文章","summary":"从公司组织变化、技术架构选择、云平台成本、国产化采购和数字化转型等角度，记录一次关于企业技术路线的个人杂谈。","title":"关于公司技术路线与数字化转型的一点杂谈","type":"posts"},{"content":"","date":"2023-11-27","externalUrl":null,"permalink":"/tags/%E5%9B%BD%E4%BA%A7%E5%8C%96/","section":"Tags","summary":"","title":"国产化","type":"tags"},{"content":"","date":"2023-11-27","externalUrl":null,"permalink":"/tags/%E6%8A%80%E6%9C%AF%E7%AE%A1%E7%90%86/","section":"Tags","summary":"","title":"技术管理","type":"tags"},{"content":"","date":"2023-11-27","externalUrl":null,"permalink":"/tags/%E4%BC%81%E4%B8%9A%E6%9E%B6%E6%9E%84/","section":"Tags","summary":"","title":"企业架构","type":"tags"},{"content":"","date":"2023-11-27","externalUrl":null,"permalink":"/tags/%E4%BA%91%E5%B9%B3%E5%8F%B0/","section":"Tags","summary":"","title":"云平台","type":"tags"},{"content":"","date":"2023-11-27","externalUrl":null,"permalink":"/categories/%E6%9D%82%E8%B0%88/","section":"Categories","summary":"","title":"杂谈","type":"categories"},{"content":"","date":"2023-11-27","externalUrl":null,"permalink":"/tags/%E8%81%8C%E5%9C%BA%E6%80%9D%E8%80%83/","section":"Tags","summary":"","title":"职场思考","type":"tags"},{"content":"如果您想重新创建临时表空间，请按照以下步骤操作👌\n查找现有临时表空间详细信息 # 脚本如下：\nset linesize 200 col file_name for a60 select tablespace_name,file_name from dba_temp_files; 操作结果如下：\nSQL\u0026gt; set linesize 200 SQL\u0026gt; col file_name for a60 SQL\u0026gt; select tablespace_name,file_name from dba_temp_files; TABLESPACE_NAME FILE_NAME ------------------------------ ------------------------------------------------------------ TEMP /u01/app/oracle/oradata/orcl/temp01.dbf SQL\u0026gt; 创建另一个临时表空间 TEMP1 # 脚本如下：\nCREATE TEMPORARY TABLESPACE TEMP1 TEMPFILE \u0026#39;/u01/app/oracle/oradata/orcl/temp02.dbf\u0026#39; SIZE 2G; 操作结果如下：\nSQL\u0026gt; CREATE TEMPORARY TABLESPACE TEMP1 TEMPFILE \u0026#39;/u01/app/oracle/oradata/orcl/temp02.dbf\u0026#39; SIZE 2G; Tablespace created. SQL\u0026gt; 移动默认数据库临时表空间 # 脚本如下：\nALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP1; 操作结果如下：\nSQL\u0026gt; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP1; Database altered. SQL\u0026gt; 如果任何会话正在使用临时空间，则看情况杀死它们 # 脚本如下：\nSELECT b.tablespace,b.segfile#,b.segblk#,b.blocks,a.sid,a.serial#, a.username,a.osuser, a.status FROM v$session a,v$sort_usage b WHERE a.saddr = b.session_addr; ALTER SYSTEM KILL SESSION \u0026#39;SID,SERIAL#\u0026#39; IMMEDIATE; 操作结果如下：\nSQL\u0026gt; SELECT b.tablespace,b.segfile#,b.segblk#,b.blocks,a.sid,a.serial#, a.username,a.osuser, a.status FROM v$session a,v$sort_usage b WHERE a.saddr = b.session_addr; 2 3 4 no rows selected SQL\u0026gt; 删除原始临时表空间 # 脚本如下：\nDROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES; 操作结果如下：\nSQL\u0026gt; DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES; Tablespace dropped. SQL\u0026gt; 如果要将名称从 TEMP1 重新更改为 TEMP，请按照以下步骤操作👌\n创建TEMP表空间 # 脚本如下：\nCREATE TEMPORARY TABLESPACE TEMP TEMPFILE \u0026#39;/u01/app/oracle/oradata/orcl/temp03.dbf\u0026#39; SIZE 2000M; 操作结果如下：\nSQL\u0026gt; CREATE TEMPORARY TABLESPACE TEMP TEMPFILE \u0026#39;/u01/app/oracle/oradata/orcl/temp03.dbf\u0026#39; SIZE 2000M; Tablespace created. SQL\u0026gt; 将 TEMP 设置为默认表空间 # 脚本如下：\nALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp; 操作结果如下：\nSQL\u0026gt; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp; Database altered. SQL\u0026gt; 删除表空间 TEMP1 的临时表 # 脚本如下：\nDROP TABLESPACE temp1 INCLUDING CONTENTS AND DATAFILES; 操作结果如下：\nSQL\u0026gt; DROP TABLESPACE temp1 INCLUDING CONTENTS AND DATAFILES; Tablespace dropped. SQL\u0026gt; ","date":"2023-11-23","externalUrl":null,"permalink":"/posts/recreate-temp-tablespace/","section":"文章","summary":"通过创建 TEMP1、切换默认临时表空间、确认临时段使用情况、删除旧 TEMP、重新创建 TEMP 并切回默认临时表空间，完成 Oracle TEMP 表空间重建。","title":"Oracle 删除并重建 TEMP 临时表空间操作实战","type":"posts"},{"content":"","date":"2023-11-23","externalUrl":null,"permalink":"/tags/%E4%B8%B4%E6%97%B6%E8%A1%A8%E7%A9%BA%E9%97%B4/","section":"Tags","summary":"","title":"临时表空间","type":"tags"},{"content":" 安装介质 # 操作系统包\ncompat-libstdc++-33-3.2.3-72.el7.x86_64.rpm pdksh-5.2.14-37.el5_8.1.x86_64.rpm\noracle安装介质\np13390677_112040_Linux-x86-64_1of7.zip p13390677_112040_Linux-x86-64_2of7.zip\n百度网盘下载\n链接: https://pan.baidu.com/s/1-VFR4XFpT-E34Hu_2r5Ztg 提取码: wusd\n操作系统设置 # 关闭防火墙 # systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --state 关闭selinux # setenforce 0 sed -ri \u0026#39;s/SELINUX=enforcing/SELINUX=disabled/\u0026#39; /etc/selinux/config sestatus 配置Yum源 # 有网络的条件配置源\nsed -e \u0026#34;s|^mirrorlist=|#mirrorlist=|g\u0026#34; \\ -e \u0026#34;s|^#baseurl=http://mirror.centos.org/centos/\\$releasever|baseurl=http://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009|g\u0026#34; \\ -e \u0026#34;s|^#baseurl=http://mirror.centos.org/\\$contentdir/\\$releasever|baseurl=http://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009|g\u0026#34; \\ -i.bak \\ /etc/yum.repos.d/CentOS-*.repo 没有网络的，配置本地源\nmount -o loop /tmp/CentOS-7-x86_64-DVD-2207-02.iso /mnt cat \u0026gt;\u0026gt; /etc/yum.repos.d/local.repo \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; [local] name=local baseurl=file:///mnt gpgcheck=0 enabled=1 EOF yum clean all yum makecache 配置hosts文件 # hostnamectl set-hostname oracle11g cat \u0026gt;\u0026gt; /etc/hosts \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; 192.168.1.8 oracle11g EOF 配置sysctl.conf # cat \u0026gt;\u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmni = 4096 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 kernel.panic_on_oops = 1 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 fs.aio-max-nr = 1048576 net.ipv4.ip_local_port_range = 9000 65500 EOF /sbin/sysctl -p memTotal=$(grep MemTotal /proc/meminfo | awk \u0026#39;{print $2}\u0026#39;) totalMemory=$((memTotal / 2048)) shmall=$((memTotal / 4)) if [ $shmall -lt 2097152 ]; then shmall=2097152 fi shmmax=$((memTotal * 1024 - 1)) if [ \u0026#34;$shmmax\u0026#34; -lt 4294967295 ]; then shmmax=4294967295 fi echo $shmall echo $shmmax 配置limits.conf # cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 oracle soft nproc 2047 oracle hard nproc 16384 oracle hard memlock 134217728 oracle soft memlock 134217728 EOF 配置 pam.d # cat \u0026gt;\u0026gt; /etc/pam.d/login \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; session required pam_limits.so session required /lib64/security/pam_limits.so EOF 安装所需包 # yum install -y bc \\ binutils \\ compat-libcap1 \\ compat-libstdc++-33 \\ gcc \\ gcc-c++ \\ elfutils-libelf \\ elfutils-libelf-devel \\ glibc \\ glibc-devel \\ ksh \\ libaio \\ libaio-devel \\ libgcc \\ libstdc++ \\ libstdc++-devel \\ libxcb \\ libX11 \\ libXau \\ libXi \\ libXtst \\ libXrender \\ libXrender-devel \\ make \\ net-tools \\ nfs-utils \\ smartmontools \\ sysstat \\ e2fsprogs \\ e2fsprogs-libs \\ fontconfig-devel \\ expect \\ unzip \\ openssh-clients \\ readline* \\ psmisc --skip-broken rpm -e ksh-20120801-144.el7_9.x86_64 rpm -ivh pdksh-5.2.14-37.el5_8.1.x86_64.rpm rpm -q bc binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ elfutils-libelf elfutils-libelf-devel glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libxcb libX11 libXau libXi libXtst libXrender libXrender-devel make net-tools nfs-utils smartmontools sysstat e2fsprogs e2fsprogs-libs fontconfig-devel expect unzip openssh-clients readline 创建用户 # groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper useradd -u 54321 -g oinstall -G dba,oper oracle echo \u0026#34;oracle\u0026#34;|passwd --stdin oracle 创建目录 # mkdir -p /u01/app/oracle/product/11.2.0.4/db_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01 关闭 avahi-deamon 和 NOZEROCONF # systemctl stop avahi-daemon.socket systemctl stop avahi-daemon.service systemctl disable avahi-daemon.service systemctl disable avahi-daemon.socket ##关闭 NOZEROCONF cat \u0026lt;\u0026lt;EOF \u0026gt;\u0026gt;/etc/sysconfig/network NOZEROCONF=yes EOF 关闭透明大页和 numa # sed -i \u0026#39;s/quiet/quiet transparent_hugepage=never numa=off/\u0026#39; /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg init 6 cat /sys/kernel/mm/transparent_hugepage/enabled 安装Oracle软件 # 环境变量设置 # su - oracle cat \u0026gt;\u0026gt; /home/oracle/.bash_profile \u0026lt;\u0026lt; \u0026#34;EOF\u0026#34; #Oracle Settings TMP=/tmp; export TMP TMPDIR=$TMP; export TMPDIR ORACLE_HOSTNAME=oracle11g; export ORACLE_HOSTNAME ORACLE_UNQNAME=orcl; export ORACLE_UNQNAME ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/db_1; export ORACLE_HOME ORACLE_SID=orcl; export ORACLE_SID ORACLE_TERM=xterm; export ORACLE_TERM PATH=/usr/sbin:$PATH; export PATH PATH=$ORACLE_HOME/bin:$PATH; export PATH export NLS_LANG=\u0026#34;AMERICAN_AMERICA.ZHS16GBK\u0026#34; export NLS_DATE_FORMAT=\u0026#34;yyyy-mm-dd hh24:mi:ss\u0026#34; LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH if [ $USER = \u0026#34;oracle\u0026#34; ]; then if [ $SHELL = \u0026#34;/bin/ksh\u0026#34; ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi EOF 安装Oracle软件 # unzip p13390677_112040_Linux-x86-64_1of7.zip unzip p13390677_112040_Linux-x86-64_2of7.zip cd database/ export LANG=en_US.UTF-8 export LC_CTYPE=en_US.iso88591 ./runInstaller #root执行 /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0.4/db_1/root.sh 安装中报错ins_emagent.mk解决\ncd $ORACLE_HOME/sysman/lib sed -i \u0026#39;s/^\\(\\s*\\$(MK_EMAGENT_NMECTL)\\)\\s*$/\\1 -lnnz11/g\u0026#39; ins_emagent.mk 创建监听和库 # netca lnsrctl status dbca #数据库创建后，修改部分参数，具体应用再做详细调整 sqlplus / as sysdba alter system set sec_case_sensitive_logon = false scope=both; alter system set deferred_segment_creation = false scope=both; alter profile default limit failed_login_attempts unlimited; alter profile default limit password_life_time unlimited; alter system set event=\u0026#39;28401 trace name context forever,level 1\u0026#39;,\u0026#39;10949 trace name context forever,level 1\u0026#39; sid=\u0026#39;*\u0026#39; scope=spfile; alter system set \u0026#34;_optimizer_adaptive_cursor_sharing\u0026#34;=false sid=\u0026#39;*\u0026#39; scope=spfile; alter system set \u0026#34;_optimizer_extended_cursor_sharing\u0026#34;=none sid=\u0026#39;*\u0026#39; scope=spfile; alter system set \u0026#34;_optimizer_extended_cursor_sharing_rel\u0026#34;=none sid=\u0026#39;*\u0026#39; scope=spfile; alter system set \u0026#34;_optimizer_use_feedback\u0026#34;=false sid =\u0026#39;*\u0026#39; scope=spfile; alter system set \u0026#34;_undo_autotune\u0026#34;=false sid=\u0026#39;*\u0026#39; scope=spfile; alter system set \u0026#34;_optimizer_null_aware_antijoin\u0026#34;=false sid =\u0026#39;*\u0026#39; scope=spfile; BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE( client_name =\u0026gt; \u0026#39;auto space advisor\u0026#39;, operation =\u0026gt; NULL, window_name =\u0026gt; NULL); END; / BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE( client_name =\u0026gt; \u0026#39;sql tuning advisor\u0026#39;, operation =\u0026gt; NULL, window_name =\u0026gt; NULL); END; / ","date":"2023-11-13","externalUrl":null,"permalink":"/posts/install-oracle11gr2-on-centos7/","section":"文章","summary":"一篇 Oracle 11gR2 单机安装实战文档，覆盖 CentOS 7.9 环境准备、Oracle 用户配置、软件安装、监听建库和常用初始化参数设置。","title":"Oracle 11.2.0.4 单机在 CentOS 7.9 上安装实战","type":"posts"},{"content":"","date":"2023-11-13","externalUrl":null,"permalink":"/tags/oracle-11gr2/","section":"Tags","summary":"","title":"Oracle 11gR2","type":"tags"},{"content":"console.log(\u0026#39;Hello World!\u0026#39;); 你好，世界!\n","date":"2023-11-13","externalUrl":null,"permalink":"/posts/hello-world/","section":"文章","summary":"这是一篇 Hugo 博客初始化测试文章，用于验证文章发布、代码块显示和页面渲染是否正常。","title":"Hello World","type":"posts"},{"content":"","date":"2023-11-13","externalUrl":null,"permalink":"/tags/hello-world/","section":"Tags","summary":"","title":"Hello World","type":"tags"},{"content":"","date":"2023-11-13","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"2023-11-13","externalUrl":null,"permalink":"/tags/markdown/","section":"Tags","summary":"","title":"Markdown","type":"tags"},{"content":"","date":"2023-11-13","externalUrl":null,"permalink":"/categories/%E5%8D%9A%E5%AE%A2/","section":"Categories","summary":"","title":"博客","type":"categories"},{"content":"","date":"2023-11-13","externalUrl":null,"permalink":"/tags/%E5%8D%9A%E5%AE%A2%E5%88%9D%E5%A7%8B%E5%8C%96/","section":"Tags","summary":"","title":"博客初始化","type":"tags"},{"content":"你好，我是 Greatfinish，一名长期工作在生产一线的 DBA / 数据库运维工程师。\n拥有 15年以上数据库行业从业经验，目前主要从事医药健康行业相关数据库工作。\n擅长 Oracle 数据库的运维管理、架构设计与实施、性能调优等全栈能力，并具备多数据库平台的实践经验与迁移适配能力。\n持有 Oracle OCP / OCM、PostgreSQL PGCE / PGCM、MySQL 8.0 OCP 等主流数据库认证，以及 OGCP、YCA、OBCA、PCTA、KCA 等多项国产数据库认证证书。\n热爱持续学习，也乐于分享数据库、Linux、性能优化与生产故障处理相关的实战经验与技术知识。\n这个博客主要记录我在数据库、操作系统、故障处理和生产运维中的实践经验。相比单纯整理概念，我更希望这里的文章能保留真实问题的排查过程、判断依据、处理步骤和复盘总结。\n专注方向 # 我主要关注以下技术领域：\nOracle 数据库运维、备份恢复、性能优化、RAC、Data Guard PostgreSQL 锁分析、性能诊断、会话与 SQL 排查 达梦、Vastbase 等国产数据库安装部署与问题处理 MongoDB / DDS 迁移、连接、备份恢复与验证 Linux 操作系统层 CPU、I/O、内存、网络诊断 数据库生产故障处理、应急恢复与运维体系建设 为什么写这个博客 # 很多生产故障真正有价值的部分，不只是最后执行了哪条命令，而是：\n为什么判断是这个方向； 中间排除了哪些可能； 哪些现象容易误导； 关键证据来自哪里； 生产环境应该如何降低风险； 事后应该如何总结和改进。 这个博客就是为了把这些过程沉淀下来。\n博客内容 # 这里会持续更新几类内容：\n生产故障案例 # 记录 Oracle、PostgreSQL、Linux、达梦、MongoDB 等生产问题的完整处理过程，包括现象、分析、定位、解决和复盘。\n数据库实战文档 # 整理安装部署、补丁升级、备份恢复、迁移验证、参数调整、权限处理等可落地的操作文档。\n性能诊断方法 # 围绕 AWR、ASH、SQL Monitor、iostat、vmstat、sar、pidstat、tcpdump 等工具，记录生产环境中的判断方法。\n运维经验总结 # 包括脚本、巡检、监控、容量规划、故障预案、变更注意事项和稳定性建设经验。\n我的理念 # 我一直认为，DBA 的价值不只是会执行命令，而是能在复杂生产环境里做出可靠判断。\n真正的生产运维能力，来自：\n对系统机制的理解； 对现象和证据的交叉验证； 对风险边界的敬畏； 对每一次故障的复盘； 对长期稳定性的持续建设。 关于本站 # 本站使用 Hugo + Blowfish 构建，主要用于沉淀个人技术文章和生产案例。\n如果你也关注数据库、Linux、性能优化和生产故障处理，希望这里的内容能给你一些参考。\n","externalUrl":null,"permalink":"/about/","section":"首页","summary":"","title":"关于我","type":"page"}]