@gordon.gan/specflow 1.3.3-beta → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +6 -2
  2. package/dist/integrations/shared/capability-evidence.js +37 -1
  3. package/dist/integrations/shared/command-catalog.js +1 -0
  4. package/dist/integrations/shared/parity-manifest.js +6 -0
  5. package/package.json +1 -1
  6. package/prompts/approval/database-guidance.md +79 -0
  7. package/prompts/approval/generate.md +1191 -0
  8. package/skills/database/LICENSE +405 -0
  9. package/skills/database/ORIGIN.md +6 -0
  10. package/skills/database/README.md +30 -0
  11. package/skills/database/elasticsearch/LICENSE.txt +202 -0
  12. package/skills/database/elasticsearch/SKILL.md +199 -0
  13. package/skills/database/elasticsearch/examples/01-fulltext-search.md +215 -0
  14. package/skills/database/elasticsearch/examples/02-aggregation-report.md +206 -0
  15. package/skills/database/elasticsearch/examples/03-reindex-zero-downtime.md +200 -0
  16. package/skills/database/elasticsearch/examples/04-cluster-monitoring.md +204 -0
  17. package/skills/database/elasticsearch/references/01-query-dsl-fulltext.md +162 -0
  18. package/skills/database/elasticsearch/references/02-query-dsl-term.md +210 -0
  19. package/skills/database/elasticsearch/references/03-aggregations-metric.md +161 -0
  20. package/skills/database/elasticsearch/references/04-aggregations-bucket.md +236 -0
  21. package/skills/database/elasticsearch/references/05-mapping-types.md +134 -0
  22. package/skills/database/elasticsearch/references/06-analyzers.md +187 -0
  23. package/skills/database/elasticsearch/references/07-cluster-ops.md +225 -0
  24. package/skills/database/elasticsearch/references/08-elk-integration.md +170 -0
  25. package/skills/database/mysql/SKILL.md +195 -0
  26. package/skills/database/mysql/examples/01-connection-pool.md +75 -0
  27. package/skills/database/mysql/examples/02-slow-query-optimization.md +98 -0
  28. package/skills/database/mysql/examples/03-master-slave-setup.md +144 -0
  29. package/skills/database/mysql/examples/04-backup-strategy.md +212 -0
  30. package/skills/database/mysql/references/01-functions-string.md +103 -0
  31. package/skills/database/mysql/references/02-functions-date.md +152 -0
  32. package/skills/database/mysql/references/03-functions-aggregate-window.md +167 -0
  33. package/skills/database/mysql/references/04-functions-json.md +129 -0
  34. package/skills/database/mysql/references/05-sql-ddl-types.md +235 -0
  35. package/skills/database/mysql/references/06-index-optimization.md +232 -0
  36. package/skills/database/mysql/references/07-replication-ha.md +213 -0
  37. package/skills/database/mysql/references/08-backup-restore.md +207 -0
  38. package/skills/database/mysql/references/09-advanced-features.md +345 -0
  39. package/skills/database/oracle/LICENSE.txt +202 -0
  40. package/skills/database/oracle/SKILL.md +238 -0
  41. package/skills/database/oracle/examples/01-plsql-procedure.md +90 -0
  42. package/skills/database/oracle/examples/02-awr-analysis.md +99 -0
  43. package/skills/database/oracle/examples/03-rman-backup.md +108 -0
  44. package/skills/database/oracle/examples/04-dataguard-setup.md +146 -0
  45. package/skills/database/oracle/references/01-functions-string.md +91 -0
  46. package/skills/database/oracle/references/02-functions-date.md +71 -0
  47. package/skills/database/oracle/references/03-analytic-functions.md +103 -0
  48. package/skills/database/oracle/references/04-plsql-guide.md +303 -0
  49. package/skills/database/oracle/references/05-performance-tuning.md +164 -0
  50. package/skills/database/oracle/references/06-backup-recovery.md +115 -0
  51. package/skills/database/oracle/references/07-dataguard-rac.md +76 -0
  52. package/skills/database/oracle/references/08-security.md +170 -0
  53. package/skills/database/oracle/references/09-sql-syntax.md +152 -0
  54. package/skills/database/oracle/references/10-features.md +174 -0
  55. package/skills/database/postgresql/LICENSE.txt +202 -0
  56. package/skills/database/postgresql/SKILL.md +182 -0
  57. package/skills/database/postgresql/examples/.gitkeep +0 -0
  58. package/skills/database/postgresql/examples/01-jsonb-query.md +72 -0
  59. package/skills/database/postgresql/examples/02-cte-recursive.md +110 -0
  60. package/skills/database/postgresql/examples/03-performance-tuning.md +114 -0
  61. package/skills/database/postgresql/examples/04-streaming-replication.md +113 -0
  62. package/skills/database/postgresql/references/.gitkeep +0 -0
  63. package/skills/database/postgresql/references/01-functions-string.md +174 -0
  64. package/skills/database/postgresql/references/02-functions-datetime.md +54 -0
  65. package/skills/database/postgresql/references/03-functions-aggregate-window.md +142 -0
  66. package/skills/database/postgresql/references/04-functions-jsonb.md +117 -0
  67. package/skills/database/postgresql/references/05-fulltext-search.md +109 -0
  68. package/skills/database/postgresql/references/06-index-types.md +95 -0
  69. package/skills/database/postgresql/references/07-partition-fdw.md +133 -0
  70. package/skills/database/postgresql/references/08-replication-backup.md +215 -0
  71. package/skills/database/redis/LICENSE.txt +202 -0
  72. package/skills/database/redis/SKILL.md +922 -0
  73. package/skills/database/redis/examples/01-cache-usage.md +104 -0
  74. package/skills/database/redis/examples/02-session-storage.md +72 -0
  75. package/skills/database/redis/examples/03-leaderboard.md +63 -0
  76. package/skills/database/redis/examples/04-redis-cluster-setup.md +70 -0
  77. package/skills/database/redis/examples/05-stream-queue.md +65 -0
  78. package/skills/database/redis/references/command-quick-ref.md +180 -0
  79. package/skills/database/redis/references/commands-admin-key.md +413 -0
  80. package/skills/database/redis/references/commands-set-sorted-advanced.md +539 -0
  81. package/skills/database/redis/references/commands-string-hash-list.md +458 -0
  82. package/skills/database/redis/references/memory-optimization.md +150 -0
  83. package/skills/database/redis/references/redis-conf-production.md +139 -0
  84. package/skills/specflow-approval/SKILL.md +427 -0
  85. package/templates/approval.md +464 -0
@@ -0,0 +1,238 @@
1
+ ---
2
+ name: oracle
3
+ description: Provides comprehensive guidance for Oracle database including SQL, PL/SQL, functions, performance tuning (AWR/ASH), backup (RMAN), Data Guard, and RAC. Use when the user asks about Oracle, needs to write Oracle SQL, work with PL/SQL, or manage Oracle databases.
4
+ license: Complete terms in LICENSE.txt
5
+ ---
6
+
7
+ # Oracle Database — 企业级关系型数据库
8
+
9
+ Oracle Database 是全球领先的企业级关系型数据库管理系统,以其高可用性、高性能、强安全性及丰富的功能集(RAC、Data Guard、Flashback、高级分区、物化视图等)著称。
10
+
11
+ ## Workflow — 使用决策树
12
+
13
+ ```
14
+ 遇到 Oracle 相关需求时,按以下顺序决策:
15
+
16
+ Step 1: 明确场景
17
+ ├── 编写 SQL 查询/DDL/DML? → references/09-sql-syntax.md
18
+ ├── 使用内置函数? → 字符串/日期/聚合 → references/01-functions-string.md / 02-functions-date.md
19
+ ├── 窗口/分析函数? → references/03-analytic-functions.md
20
+ ├── 编写 PL/SQL? → references/04-plsql-guide.md
21
+ ├── 性能调优/执行计划? → references/05-performance-tuning.md
22
+ ├── 备份恢复? → references/06-backup-recovery.md
23
+ ├── Data Guard / RAC? → references/07-dataguard-rac.md
24
+ ├── 安全/权限/审计? → references/08-security.md
25
+ └── 分区/物化视图/Flashback/AQ? → references/10-features.md
26
+
27
+ Step 2: 选择工具
28
+ ├── 交互式查询 → SQL*Plus / SQL Developer / DBeaver
29
+ ├── 批量脚本 → SQL*Plus 静默模式
30
+ ├── PL/SQL 调试 → SQL Developer / TOAD / PL/SQL Developer
31
+ └── 自动化运维 → OEM / 脚本
32
+
33
+ Step 3: 确定环境
34
+ ├── 版本 → 19c (LTS), 21c/23c (最新)
35
+ ├── 架构 → 单实例 / RAC / Data Guard / RAC+DG
36
+ ├── CDB/PDB? → 12c+ 多租户
37
+ └── 字符集 → AL32UTF8, ZHS16GBK
38
+ ```
39
+
40
+ ## When to Use / When NOT to
41
+
42
+ | ✅ Use When | ❌ Skip When |
43
+ |------------|-------------|
44
+ | 企业级事务处理(ACID 严格保证) | 简单键值缓存(用 Redis) |
45
+ | 复杂 SQL、多表 JOIN、报表分析 | 文档存储(用 MongoDB) |
46
+ | PL/SQL 存储过程/包/触发器 | 全文搜索为主(用 Elasticsearch) |
47
+ | 海量数据分区(TB/PB 级) | 实时内存计算(用 Redis/Spark) |
48
+ | 高可用(RAC/Data Guard) | 轻量嵌入式(用 SQLite) |
49
+ | 数据仓库/OLAP 分析 | 时序数据(用 InfluxDB/TimescaleDB) |
50
+ | 数据安全与审计(TDE/FGA/VPD) | 简单 CRUD 快速开发(用 PostgreSQL) |
51
+ | 大规模 OLTP 交易系统 | 仅需文档型层次化数据(用 PostgreSQL JSONB) |
52
+
53
+ ## Boundary — 能力边界
54
+
55
+ | ✅ 完全适用 | ⚠️ 有条件适用 | ❌ 不适用 |
56
+ |------------|--------------|---------|
57
+ | OLTP/OLAP 混合负载 | 海量非结构化数据(用对象存储) | 代替 Redis 做内存缓存 |
58
+ | 复杂事务与数据一致性 | 跨数据库异构集成(GoldenGate/DB Link) | 实时流处理(Kafka/Storm) |
59
+ | PL/SQL 业务逻辑封装 | 多写场景(RAC 共享存储写) | 简单 CRUD 原型快速迭代 |
60
+ | 数据分区与物化视图 | 地理分布式多活(用 GoldenGate) | 多模型数据统一管理 |
61
+ | RAC 集群高可用 | 超低延迟(<100μs)查询 | 替代搜索引擎做全文搜索 |
62
+ | 细粒度安全审计 | 作为文档数据库存大量 JSON | 替代对象存储 |
63
+
64
+ 超出范围时请考虑:PostgreSQL(开源关系型)、MongoDB(文档)、Redis(缓存)、Elasticsearch(全文搜索)、MySQL(轻量 Web)。
65
+
66
+ ---
67
+
68
+ ## SQL 语法速查
69
+
70
+ Oracle 的 SQL 差异主要体现在以下方面。完整内容见 `references/09-sql-syntax.md`。
71
+
72
+ | 特性 | 说明 | 参考文件 |
73
+ |------|------|---------|
74
+ | 数据类型 | VARCHAR2, NUMBER, CLOB, BLOB, TIMESTAMP, INTERVAL | `references/09-sql-syntax.md` |
75
+ | 序列 | `CREATE SEQUENCE` 替代 AUTO_INCREMENT | `references/09-sql-syntax.md` |
76
+ | MERGE | UPSERT(存在则更新,不存在则插入) | `references/09-sql-syntax.md` |
77
+ | INSERT ALL | 多表条件插入 | `references/09-sql-syntax.md` |
78
+ | CONNECT BY | 层次查询(组织树) | `references/09-sql-syntax.md` |
79
+ | PIVOT/UNPIVOT | 行转列/列转行 | `references/09-sql-syntax.md` |
80
+ | LISTAGG | 列转字符串聚合 | `references/09-sql-syntax.md` |
81
+ | MODEL 子句 | 电子表格式跨行计算 | `references/09-sql-syntax.md` |
82
+ | MATCH_RECOGNIZE | 模式匹配(12c+) | `references/09-sql-syntax.md` |
83
+ | FLASHBACK QUERY | 闪回查询历史数据 | `references/09-sql-syntax.md` |
84
+ | WITH (CTE) / 递归 CTE | 公用表表达式 | `references/09-sql-syntax.md` |
85
+ | 伪列 | ROWNUM, ROWID, LEVEL, ORA_ROWSCN | `references/09-sql-syntax.md` |
86
+ | 集合操作 | UNION, INTERSECT, MINUS(Oracle 差集) | `references/09-sql-syntax.md` |
87
+
88
+ ## 函数速查
89
+
90
+ | 类别 | 关键函数 | 参考文件 |
91
+ |------|---------|---------|
92
+ | 字符串 | SUBSTR, INSTR, REPLACE, REGEXP_LIKE/SUBSTR/REPLACE, TRANSLATE, LISTAGG | `references/01-functions-string.md` |
93
+ | 数字 | ROUND, TRUNC, MOD, CEIL, FLOOR, POWER, GREATEST/LEAST | `references/01-functions-string.md` |
94
+ | 日期 | SYSDATE, EXTRACT, TO_DATE/TO_CHAR, ADD_MONTHS, MONTHS_BETWEEN, LAST_DAY, NEXT_DAY, TRUNC 日期版 | `references/02-functions-date.md` |
95
+ | 转换 | TO_CHAR/TO_NUMBER/TO_DATE, CAST, CONVERT, SCN_TO_TIMESTAMP | `references/02-functions-date.md` |
96
+ | NULL 处理 | NVL, NVL2, COALESCE, NULLIF, LNNVL | `references/01-functions-string.md` |
97
+ | 聚合 | COUNT, SUM, AVG, MEDIAN, STATS_MODE, ROLLUP/CUBE, GROUPING | `references/03-analytic-functions.md` |
98
+ | 分析/窗口 | ROW_NUMBER, RANK, DENSE_RANK, NTILE, LAG/LEAD, FIRST_VALUE/LAST_VALUE, RATIO_TO_REPORT | `references/03-analytic-functions.md` |
99
+
100
+ ---
101
+
102
+ ## 高级特性索引
103
+
104
+ | 特性 | 说明 | 参考文件 |
105
+ |------|------|---------|
106
+ | PL/SQL 块结构 | DECLARE/BEGIN/EXCEPTION/END | `references/04-plsql-guide.md` |
107
+ | 游标 (Cursor) | 显式/隐式/REF CURSOR/SYS_REFCURSOR | `references/04-plsql-guide.md` |
108
+ | 存储过程/函数 | CREATE OR REPLACE PROCEDURE/FUNCTION | `references/04-plsql-guide.md` |
109
+ | 包 (Package) | 规范+体,封装/重载/全局变量 | `references/04-plsql-guide.md` |
110
+ | 触发器 (Trigger) | DML/INSTEAD OF/DDL/系统事件 | `references/04-plsql-guide.md` |
111
+ | 集合类型 | 关联数组/嵌套表/VARRAY | `references/04-plsql-guide.md` |
112
+ | 动态 SQL | EXECUTE IMMEDIATE / DBMS_SQL / FORALL / BULK COLLECT | `references/04-plsql-guide.md` |
113
+ | 异常处理 | 预定义/自定义/RAISE_APPLICATION_ERROR | `references/04-plsql-guide.md` |
114
+ | EXPLAIN PLAN / DBMS_XPLAN | 执行计划查看与分析 | `references/05-performance-tuning.md` |
115
+ | AWR/ASH/ADDM | 性能历史/活跃会话/自动诊断 | `references/05-performance-tuning.md` |
116
+ | SQL Tuning Advisor | 自动 SQL 优化建议 | `references/05-performance-tuning.md` |
117
+ | DBMS_STATS | 统计信息收集与管理 | `references/05-performance-tuning.md` |
118
+ | SPM (SQL Plan Management) | 执行计划基线管理 | `references/05-performance-tuning.md` |
119
+ | RMAN | 全库/增量备份与恢复 | `references/06-backup-recovery.md` |
120
+ | EXPDP/IMPDP | 逻辑备份导入导出 | `references/06-backup-recovery.md` |
121
+ | 归档日志模式 | ARCHIVELOG / NOARCHIVELOG | `references/06-backup-recovery.md` |
122
+ | Data Guard | 物理备库/逻辑备库/Switchover/Failover | `references/07-dataguard-rac.md` |
123
+ | RAC | 集群/序列配置/全局等待 | `references/07-dataguard-rac.md` |
124
+ | 用户/角色/权限 | 系统权限/对象权限/Profile | `references/08-security.md` |
125
+ | FGA (细粒度审计) | 基于条件的 SQL 审计 | `references/08-security.md` |
126
+ | VPD (虚拟私有数据库) | 行级安全策略 | `references/08-security.md` |
127
+ | 数据脱敏 (Data Redaction) | 动态数据掩码 | `references/08-security.md` |
128
+ | TDE (透明数据加密) | 列级/表空间级加密 | `references/08-security.md` |
129
+ | 表空间与数据文件 | CREATE/ALTER TABLESPACE | `references/10-features.md` |
130
+ | 分区表 | RANGE/LIST/HASH/复合/间隔分区 | `references/10-features.md` |
131
+ | 索引 | B-Tree/位图/函数/域索引 | `references/10-features.md` |
132
+ | 物化视图 | 查询重写/快速刷新/ON COMMIT | `references/10-features.md` |
133
+ | Flashback | 闪回查询/表/删除/数据库 | `references/10-features.md` |
134
+ | AQ (高级队列) | 消息队列 | `references/10-features.md` |
135
+
136
+ ---
137
+
138
+ ## Gotchas — 常见陷阱
139
+
140
+ | # | 问题 | 风险 | 解决方案 |
141
+ |---|------|------|---------|
142
+ | 1 | ROWNUM ORDER BY 顺序错误 | 不是 Top-N | 子查询排序或 `FETCH FIRST`(12c+) |
143
+ | 2 | 隐式类型转换导致索引失效 | 全表扫描 | `WHERE hire_date = TO_DATE('2024-01-15','YYYY-MM-DD')` |
144
+ | 3 | NOT IN 子查询含 NULL 返回空 | 数据丢失 | 用 `NOT EXISTS` 替代 |
145
+ | 4 | SELECT INTO 无数据抛出 NO_DATA_FOUND | 过程终止 | 提前检查或用 EXCEPTION 捕获 |
146
+ | 5 | 绑定变量窥视 | 执行计划偏差 | 用 ACS / SQL Profile |
147
+ | 6 | 统计信息过旧 | 优化器选错计划 | 定期 `DBMS_STATS` 收集 |
148
+ | 7 | OLTP 用位图索引 | 行锁阻塞 | OLTP 用 B-Tree 索引 |
149
+ | 8 | UPDATE 大量行不用 FORALL | 性能极差 | 用 `FORALL` 批量 DML |
150
+ | 9 | 忽略分区裁剪 | 全分区扫描 | WHERE 条件含分区键 |
151
+ | 10 | 触发器递归/变异表 (ORA-04091) | 触发器失败 | 复合触发器/自治事务/语句级 |
152
+ | 11 | SELECT * 在视图/过程中 | 结构变更后行为异常 | 显式列出列名 |
153
+ | 12 | 大量 DISTINCT 掩盖 JOIN 不当 | 性能开销大 | 检查 JOIN 条件 |
154
+ | 13 | 物化视图 ON COMMIT 刷新影响 DML 性能 | 写操作拖慢 | 建日志 + ON DEMAND 定时刷新 |
155
+ | 14 | WHERE 中对列应用函数 | 索引失效 | 改写为范围查询 |
156
+ | 15 | DBMS_OUTPUT 打印大量数据 | 缓冲区溢出 | 仅调试用,生产用日志表 |
157
+
158
+ ---
159
+
160
+ ## FAQ
161
+
162
+ **Q1: VARCHAR2 和 NVARCHAR2 区别?**
163
+ VARCHAR2 使用数据库字符集(AL32UTF8/ZHS16GBK),NVARCHAR2 使用国家字符集(AL16UTF16)。推荐一般场景用 VARCHAR2,多语言用 NVARCHAR2。
164
+
165
+ **Q2: ROWNUM 和 ROW_NUMBER() 区别?**
166
+ ROWNUM 是伪列(先分配后排序),ROW_NUMBER() 是分析函数(排序后分配序号)。
167
+
168
+ **Q3: Oracle vs PostgreSQL 主要差异?**
169
+ | 特性 | Oracle | PostgreSQL |
170
+ |------|--------|-----------|
171
+ | 自增 | SEQUENCE / IDENTITY (12c+) | SERIAL / GENERATED AS IDENTITY |
172
+ | 字符串 | VARCHAR2 | VARCHAR / TEXT |
173
+ | 空串 | '' = NULL | '' ≠ NULL |
174
+ | 递归 | CONNECT BY / WITH RECURSIVE | WITH RECURSIVE |
175
+ | 分页 | ROWNUM / FETCH FIRST | LIMIT/OFFSET |
176
+ | UPSERT | MERGE | INSERT...ON CONFLICT |
177
+ | 表空间 | 有 | 无 |
178
+
179
+ **Q4: UNDO 和 REDO 区别?**
180
+ REDO 记录变更(重做/恢复),UNDO 记录变更前数据(回滚/一致性读/闪回)。
181
+
182
+ **Q5: 何时用物化视图?**
183
+ 查询大聚合可接受延迟、基表变更不频繁、需要跨数据库缓存、需要查询重写。
184
+
185
+ **Q6: 分区表常见误区?**
186
+ 分区不保证查询加速(需分区键)、不能解决所有大表问题、分区不是越多越好、OLTP 也适合分区。
187
+
188
+ **Q7: 什么是读一致性?**
189
+ Oracle 通过 UNDO 实现 SELECT 不加锁也不被写阻塞,查询使用查询开始时的 SCN 读取一致性版本。
190
+
191
+ **Q8: 死锁如何处理?**
192
+ Oracle 3 秒内自动检测,回滚牺牲品语句并抛 ORA-00060。最佳实践:统一访问顺序、事务简短。
193
+
194
+ **Q9: CDB 和 PDB 是什么?**
195
+ 12c+ 多租户:CDB = 容器数据库,PDB = 可插拔数据库。一个 CDB 最多 4096 个 PDB。
196
+
197
+ **Q10: KILL SESSION 后连接未断开?**
198
+ 标记为 KILLED,下次执行 SQL 时断开。`KILL SESSION 'sid,serial#' IMMEDIATE` 可立即断开。
199
+
200
+ **Q11: REDO 日志切换太频繁?**
201
+ 增加 REDO 日志大小(建议 15-30 分钟切换一次)、增加日志组数(至少 3-4 组)。
202
+
203
+ **Q12: ORA-01555 "Snapshot Too Old"?**
204
+ UNDO 数据被覆盖。增大 UNDO 表空间、减少 UNDO_RETENTION、优化长查询。
205
+
206
+ **Q13: Oracle 中如何实现分页?**
207
+ `SELECT * FROM (SELECT t.*, ROWNUM AS rn FROM (SELECT ... ORDER BY col) t) WHERE rn BETWEEN 11 AND 20` 或 12c+ `OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY`。
208
+
209
+ **Q14: 什么是 FORCE LOGGING?**
210
+ 强制所有 DML 写 REDO(即使是 NOLOGGING 操作),Data Guard 环境要求开启。
211
+
212
+ **Q15: 如何查看当前数据库版本?**
213
+ `SELECT * FROM v$version;` 或 `SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';`
214
+
215
+ ---
216
+
217
+ ## Keywords
218
+
219
+ oracle, Oracle Database, PL/SQL, SQL*Plus, RAC, Data Guard, ADG, RMAN, expdp, impdp, flashback, AWR, ASH, ADDM, DBMS_XPLAN, VARCHAR2, NUMBER, CLOB, SEQUENCE, SYNONYM, CONNECT BY, PIVOT, LISTAGG, MERGE, INSERT ALL, MODEL, MATCH_RECOGNIZE, 分析函数, 窗口函数, ROW_NUMBER, RANK, LAG, LEAD, 存储过程, 包, 触发器, 游标, REF CURSOR, 动态SQL, FORALL, BULK COLLECT, 分区表, 物化视图, 位图索引, 表空间, TDE, FGA, VPD, DBMS_STATS, SPM, CDB, PDB, 多租户, UNDO, REDO, 读一致性, ORA-01555
220
+
221
+ ## References
222
+
223
+ - `references/01-functions-string.md` — 字符串/数字/NULL 处理函数
224
+ - `references/02-functions-date.md` — 日期/转换函数
225
+ - `references/03-analytic-functions.md` — 分析函数(窗口函数)+ 聚合
226
+ - `references/04-plsql-guide.md` — PL/SQL 详解
227
+ - `references/05-performance-tuning.md` — 性能调优
228
+ - `references/06-backup-recovery.md` — 备份恢复
229
+ - `references/07-dataguard-rac.md` — Data Guard / RAC
230
+ - `references/08-security.md` — 安全与权限
231
+ - `references/09-sql-syntax.md` — SQL 语法详解
232
+ - `references/10-features.md` — 特有特性(分区/物化视图/Flashback/AQ)
233
+ - `examples/01-plsql-procedure.md` — PL/SQL 存储过程示例
234
+ - `examples/02-awr-analysis.md` — AWR 性能分析示例
235
+ - `examples/03-rman-backup.md` — RMAN 备份示例
236
+ - `examples/04-dataguard-setup.md` — Data Guard 搭建示例
237
+ - [Oracle 19c 官方文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/)
238
+ - [Oracle Live SQL (在线练习)](https://livesql.oracle.com/)
@@ -0,0 +1,90 @@
1
+ # 示例:PL/SQL 存储过程 — 员工薪资管理包
2
+
3
+ ## 场景
4
+
5
+ 创建一个完整的员工薪资管理包,支持涨薪、查询年收入、批量调整部门薪资。
6
+
7
+ ## 包规范
8
+
9
+ ```sql
10
+ CREATE OR REPLACE PACKAGE salary_mgmt AS
11
+ -- 涨薪
12
+ PROCEDURE give_raise(p_emp_id NUMBER, p_percent NUMBER);
13
+ -- 查询年收入
14
+ FUNCTION annual_income(p_emp_id NUMBER) RETURN NUMBER;
15
+ -- 批量调整部门薪资
16
+ PROCEDURE dept_raise(p_dept_id NUMBER, p_percent NUMBER);
17
+ -- 获取部门薪资统计
18
+ FUNCTION dept_stats(p_dept_id NUMBER) RETURN SYS_REFCURSOR;
19
+ END salary_mgmt;
20
+ /
21
+ ```
22
+
23
+ ## 包体
24
+
25
+ ```sql
26
+ CREATE OR REPLACE PACKAGE BODY salary_mgmt AS
27
+
28
+ PROCEDURE give_raise(p_emp_id NUMBER, p_percent NUMBER) AS
29
+ v_old_sal employees.salary%TYPE;
30
+ BEGIN
31
+ SELECT salary INTO v_old_sal FROM employees WHERE employee_id = p_emp_id FOR UPDATE;
32
+ UPDATE employees SET salary = salary * (1 + p_percent/100) WHERE employee_id = p_emp_id;
33
+ DBMS_OUTPUT.PUT_LINE('员工 ' || p_emp_id || ': ' || v_old_sal || ' → ' || ROUND(v_old_sal*(1+p_percent/100),2));
34
+ COMMIT;
35
+ EXCEPTION
36
+ WHEN NO_DATA_FOUND THEN
37
+ RAISE_APPLICATION_ERROR(-20001, '员工 ' || p_emp_id || ' 不存在');
38
+ WHEN OTHERS THEN ROLLBACK; RAISE;
39
+ END;
40
+
41
+ FUNCTION annual_income(p_emp_id NUMBER) RETURN NUMBER AS
42
+ v_sal employees.salary%TYPE;
43
+ v_comm employees.commission_pct%TYPE;
44
+ BEGIN
45
+ SELECT salary, NVL(commission_pct, 0) INTO v_sal, v_comm
46
+ FROM employees WHERE employee_id = p_emp_id;
47
+ RETURN v_sal * 12 + v_sal * NVL(v_comm, 0);
48
+ END;
49
+
50
+ PROCEDURE dept_raise(p_dept_id NUMBER, p_percent NUMBER) AS
51
+ BEGIN
52
+ UPDATE employees SET salary = salary * (1 + p_percent/100)
53
+ WHERE department_id = p_dept_id;
54
+ DBMS_OUTPUT.PUT_LINE('部门 ' || p_dept_id || ' 已更新 ' || SQL%ROWCOUNT || ' 行');
55
+ COMMIT;
56
+ END;
57
+
58
+ FUNCTION dept_stats(p_dept_id NUMBER) RETURN SYS_REFCURSOR AS
59
+ c SYS_REFCURSOR;
60
+ BEGIN
61
+ OPEN c FOR SELECT employee_id, last_name, salary,
62
+ annual_income(employee_id) AS annual
63
+ FROM employees WHERE department_id = p_dept_id
64
+ ORDER BY salary DESC;
65
+ RETURN c;
66
+ END;
67
+
68
+ END salary_mgmt;
69
+ /
70
+ ```
71
+
72
+ ## 调用示例
73
+
74
+ ```sql
75
+ -- 单员工涨薪 10%
76
+ BEGIN salary_mgmt.give_raise(100, 10); END;
77
+ /
78
+
79
+ -- 查询年收入
80
+ SELECT salary_mgmt.annual_income(100) FROM DUAL;
81
+
82
+ -- 部门批量涨薪 5%
83
+ BEGIN salary_mgmt.dept_raise(50, 5); END;
84
+ /
85
+
86
+ -- 获取部门薪资统计
87
+ VARIABLE c REFCURSOR;
88
+ EXEC :c := salary_mgmt.dept_stats(50);
89
+ PRINT c;
90
+ ```
@@ -0,0 +1,99 @@
1
+ # 示例:AWR 性能分析 — 定位 Top SQL 与等待事件
2
+
3
+ ## 场景
4
+
5
+ 某生产数据库近期响应变慢,需要通过 AWR/ASH 分析找到性能瓶颈。
6
+
7
+ ## 步骤 1:创建 AWR 快照
8
+
9
+ ```sql
10
+ -- 在性能问题期间创建快照
11
+ EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
12
+
13
+ -- 等待一段时间(比如 30 分钟)后再次创建
14
+ EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
15
+ ```
16
+
17
+ ## 步骤 2:生成 AWR 报告
18
+
19
+ ```sql
20
+ -- 查找快照 ID
21
+ SELECT snap_id, begin_interval_time, end_interval_time
22
+ FROM dba_hist_snapshot
23
+ ORDER BY snap_id DESC FETCH FIRST 5 ROWS ONLY;
24
+
25
+ -- 生成 HTML 格式 AWR 报告
26
+ -- 假设 snap_id 分别为 1250 和 1255
27
+ SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(
28
+ l_dbid => (SELECT dbid FROM v$database),
29
+ l_inst_num => 1,
30
+ l_bid => 1250,
31
+ l_eid => 1255,
32
+ l_options => 0
33
+ ));
34
+ ```
35
+
36
+ ## 步骤 3:ASH 分析 — Top 等待事件
37
+
38
+ ```sql
39
+ -- 最近 10 分钟的 Top 等待事件
40
+ SELECT event, wait_class, COUNT(*) AS session_seconds,
41
+ ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS pct
42
+ FROM v$active_session_history
43
+ WHERE sample_time > SYSTIMESTAMP - INTERVAL '10' MINUTE
44
+ GROUP BY event, wait_class
45
+ ORDER BY session_seconds DESC;
46
+ ```
47
+
48
+ ## 步骤 4:定位 Top SQL
49
+
50
+ ```sql
51
+ -- 按消耗找 Top SQL
52
+ SELECT sql_id,
53
+ ROUND(SUM(elapsed_time)/1000000, 2) AS total_sec,
54
+ COUNT(*) AS executions,
55
+ ROUND(AVG(elapsed_time)/1000, 2) AS avg_ms,
56
+ SUBSTR(MAX(sql_text), 1, 100) AS sql_sample
57
+ FROM v$active_session_history ash
58
+ JOIN v$sql sq USING (sql_id)
59
+ WHERE sample_time > SYSTIMESTAMP - INTERVAL '30' MINUTE
60
+ AND sql_id IS NOT NULL
61
+ GROUP BY sql_id
62
+ ORDER BY total_sec DESC
63
+ FETCH FIRST 5 ROWS ONLY;
64
+ ```
65
+
66
+ ## 步骤 5:分析特定 SQL 的执行计划
67
+
68
+ ```sql
69
+ -- 查看 Top SQL 的执行计划
70
+ -- 假设 Top SQL 的 sql_id 为 'abc123xyz4567'
71
+ SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id => 'abc123xyz4567', format => 'ALLSTATS LAST'));
72
+ ```
73
+
74
+ ## 步骤 6:使用 SQL Tuning Advisor
75
+
76
+ ```sql
77
+ DECLARE
78
+ v_task VARCHAR2(30);
79
+ BEGIN
80
+ v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
81
+ sql_id => 'abc123xyz4567',
82
+ scope => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE,
83
+ time_limit => 300
84
+ );
85
+ DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => v_task);
86
+ DBMS_OUTPUT.PUT_LINE('Task: ' || v_task);
87
+ END;
88
+ /
89
+
90
+ -- 查看建议
91
+ SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(task_name => 'task_name_here') FROM DUAL;
92
+ ```
93
+
94
+ ## 分析要点
95
+
96
+ - `db file sequential read` — 单块读等待,通常是索引扫描
97
+ - `log file sync` — 提交等待,检查小事务频繁提交
98
+ - `enq: TX - row lock contention` — 行锁争用,检查并发更新相同行
99
+ - `read by other session` — 缓存争用,考虑调整 buffer cache
@@ -0,0 +1,108 @@
1
+ # 示例:RMAN 备份策略 — 每周全量 + 每日增量
2
+
3
+ ## 场景
4
+
5
+ 为生产库制定一套完整的备份策略:每周日凌晨 Level 0 全量备份,周一至周六 Level 1 增量备份,同时备份归档日志。
6
+
7
+ ## RMAN 配置
8
+
9
+ ```bash
10
+ # 登录 RMAN
11
+ rman target /
12
+
13
+ # 配置备份策略(保留最近 7 天可恢复)
14
+ RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
15
+
16
+ # 启用控制文件自动备份
17
+ RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
18
+
19
+ # 启用备份优化(跳过未变更文件)
20
+ RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
21
+
22
+ # 设置备份格式
23
+ RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/orcl/%U';
24
+
25
+ # 设置设备类型和并行度
26
+ RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 2;
27
+ ```
28
+
29
+ ## 周日:Level 0 全量备份
30
+
31
+ ```bash
32
+ rman target / <<EOF
33
+ RUN {
34
+ ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
35
+ ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
36
+ BACKUP INCREMENTAL LEVEL 0 DATABASE
37
+ TAG 'LEVEL0_WEEKLY'
38
+ FORMAT '/backup/orcl/full_%d_%T_%s_%p.bkp';
39
+ BACKUP ARCHIVELOG ALL DELETE INPUT
40
+ FORMAT '/backup/orcl/arch_%d_%T_%s.bkp';
41
+ BACKUP CURRENT CONTROLFILE
42
+ FORMAT '/backup/orcl/ctrl_%d_%T_%s.bkp';
43
+ RELEASE CHANNEL c1;
44
+ RELEASE CHANNEL c2;
45
+ }
46
+ EOF
47
+ ```
48
+
49
+ ## 周一至周六:Level 1 增量备份
50
+
51
+ ```bash
52
+ rman target / <<EOF
53
+ BACKUP INCREMENTAL LEVEL 1 DATABASE
54
+ TAG 'LEVEL1_DAILY'
55
+ FORMAT '/backup/orcl/incr_%d_%T_%s_%p.bkp';
56
+ BACKUP ARCHIVELOG ALL DELETE INPUT
57
+ FORMAT '/backup/orcl/arch_%d_%T_%s.bkp';
58
+ EOF
59
+ ```
60
+
61
+ ## 验证备份
62
+
63
+ ```bash
64
+ # 验证所有备份是否可恢复
65
+ rman target /
66
+ RMAN> RESTORE DATABASE VALIDATE;
67
+
68
+ # 列出备份集
69
+ RMAN> LIST BACKUP SUMMARY;
70
+ RMAN> LIST BACKUP OF DATABASE;
71
+
72
+ # 检查特定备份是否可用
73
+ RMAN> VALIDATE BACKUPSET <bs_key>;
74
+ ```
75
+
76
+ ## 模拟恢复
77
+
78
+ ```bash
79
+ # 完全恢复(全量+增量自动应用)
80
+ rman target /
81
+ RMAN> STARTUP MOUNT;
82
+ RMAN> RESTORE DATABASE;
83
+ RMAN> RECOVER DATABASE;
84
+ RMAN> ALTER DATABASE OPEN;
85
+
86
+ # 时间点恢复(恢复到某个时间点)
87
+ rman target /
88
+ RMAN> STARTUP MOUNT;
89
+ RMAN> RESTORE DATABASE UNTIL TIME "TO_DATE('2024-08-15 14:30:00','YYYY-MM-DD HH24:MI:SS')";
90
+ RMAN> RECOVER DATABASE UNTIL TIME "TO_DATE('2024-08-15 14:30:00','YYYY-MM-DD HH24:MI:SS')";
91
+ RMAN> ALTER DATABASE OPEN RESETLOGS;
92
+ ```
93
+
94
+ ## Cron 调度
95
+
96
+ ```bash
97
+ # 编辑 crontab
98
+ # crontab -e
99
+
100
+ # 每周日凌晨 1:00 执行全量备份
101
+ 0 1 * * 0 /u01/scripts/full_backup.sh >> /u01/logs/rman_full.log 2>&1
102
+
103
+ # 每天凌晨 2:00 执行增量备份(周日除外)
104
+ 0 2 * * 1-6 /u01/scripts/incr_backup.sh >> /u01/logs/rman_incr.log 2>&1
105
+
106
+ # 每天凌晨 3:00 验证备份
107
+ 0 3 * * * /u01/scripts/validate_backup.sh >> /u01/logs/rman_val.log 2>&1
108
+ ```
@@ -0,0 +1,146 @@
1
+ # 示例:Data Guard 物理备库搭建
2
+
3
+ ## 场景
4
+
5
+ 生产库 PRIMARY (host1) 需要搭建一个物理备库 STANDBY (host2) 实现高可用,使用实时应用(Real-Time Apply)。
6
+
7
+ ## 前提条件
8
+
9
+ - 主库已启用归档模式 (`SELECT log_mode FROM v$database;` 返回 `ARCHIVELOG`)
10
+ - 主备库 Oracle 版本一致
11
+ - 主备库网络互通(1521 端口)
12
+ - 主库已设置 `FORCE LOGGING`
13
+
14
+ ## 步骤 1:主库参数配置
15
+
16
+ ```sql
17
+ -- 设置 DB_UNIQUE_NAME
18
+ ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(PRIMARY,STANDBY)' SCOPE=BOTH;
19
+ ALTER SYSTEM SET DB_UNIQUE_NAME=PRIMARY SCOPE=SPFILE;
20
+
21
+ -- 设置归档目的地
22
+ ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/archivelog/orcl VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PRIMARY' SCOPE=BOTH;
23
+
24
+ -- 备库归档传输(使用 ASYNC 模式,不影响主库性能)
25
+ ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_host:1521/orcl LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY' SCOPE=BOTH;
26
+ ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
27
+
28
+ -- 网络配置
29
+ ALTER SYSTEM SET FAL_CLIENT='PRIMARY' SCOPE=BOTH;
30
+ ALTER SYSTEM SET FAL_SERVER='STANDBY' SCOPE=BOTH;
31
+
32
+ -- 文件路径转换
33
+ ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/u01/oradata/orcl/','/u02/oradata/orcl/' SCOPE=SPFILE;
34
+ ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u01/oradata/orcl/','/u02/oradata/orcl/' SCOPE=SPFILE;
35
+
36
+ -- 启用手动备库文件管理
37
+ ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;
38
+
39
+ -- 重启数据库使 SPFILE 参数生效
40
+ SHUTDOWN IMMEDIATE;
41
+ STARTUP;
42
+ ```
43
+
44
+ ## 步骤 2:准备备库
45
+
46
+ ```text
47
+ # 备库 $ORACLE_HOME/network/admin/tnsnames.ora 配置
48
+ PRIMARY =
49
+ (DESCRIPTION =
50
+ (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521))
51
+ (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl))
52
+ )
53
+
54
+ STANDBY =
55
+ (DESCRIPTION =
56
+ (ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521))
57
+ (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl))
58
+ )
59
+
60
+ # 备库 $ORACLE_HOME/network/admin/listener.ora 配置
61
+ LISTENER =
62
+ (DESCRIPTION =
63
+ (ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521))
64
+ )
65
+ ```
66
+
67
+ ```sql
68
+ -- 备库参数文件(在备库创建 pfile,修改 db_unique_name)
69
+ -- 修改 /u01/app/oracle/admin/orcl/pfile/init.ora
70
+ -- *.db_unique_name='STANDBY'
71
+ ```
72
+
73
+ ## 步骤 3:使用 RMAN DUPLICATE 创建备库
74
+
75
+ ```bash
76
+ # 在主库执行
77
+ rman target sys/password@PRIMARY auxiliary sys/password@STANDBY <<EOF
78
+ DUPLICATE TARGET DATABASE FOR STANDBY
79
+ FROM ACTIVE DATABASE
80
+ DORECOVER
81
+ SPFILE
82
+ SET db_unique_name='STANDBY' COMMENT 'Standby'
83
+ SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/archivelog/orcl VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=STANDBY'
84
+ SET LOG_ARCHIVE_DEST_2='SERVICE=primary_host:1521/orcl LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PRIMARY'
85
+ SET FAL_CLIENT='STANDBY'
86
+ SET FAL_SERVER='PRIMARY'
87
+ SET DB_FILE_NAME_CONVERT='/u02/oradata/orcl/','/u01/oradata/orcl/'
88
+ SET LOG_FILE_NAME_CONVERT='/u02/oradata/orcl/','/u01/oradata/orcl/'
89
+ NOFILENAMECHECK;
90
+ EOF
91
+ ```
92
+
93
+ ## 步骤 4:启动备库实时应用
94
+
95
+ ```sql
96
+ -- 备库启动到 MOUNT 状态
97
+ STARTUP MOUNT;
98
+
99
+ -- 启用实时应用(备库自动应用归档日志)
100
+ ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
101
+
102
+ -- 验证实时应用状态
103
+ SELECT process, status, sequence# FROM v$managed_standby;
104
+ -- 预期看到 MRP0 进程状态为 APPLYING_LOG
105
+ ```
106
+
107
+ ## 步骤 5:启用 Active Data Guard(可选)
108
+
109
+ ```sql
110
+ -- 备库只读打开(19c 及以前)
111
+ ALTER DATABASE OPEN READ ONLY;
112
+ ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
113
+ -- 此时备库以只读方式打开,同时应用日志
114
+
115
+ -- 验证备库可用
116
+ SELECT database_role, open_mode FROM v$database;
117
+ -- 预期返回: PHYSICAL STANDBY / READ ONLY WITH APPLY
118
+ ```
119
+
120
+ ## 步骤 6:验证同步状态
121
+
122
+ ```sql
123
+ -- 主库查询
124
+ SELECT database_role, open_mode FROM v$database;
125
+ SELECT dest_name, status, error FROM v$archive_dest WHERE dest_name LIKE '%DEST_2';
126
+
127
+ -- 备库查询日志应用延迟
128
+ SELECT name, value, time_computed FROM v$dataguard_stats WHERE name LIKE '%lag%';
129
+ -- apply_lag: 应用延迟(秒)
130
+ -- transport_lag: 传输延迟(秒)
131
+ ```
132
+
133
+ ## 步骤 7:Switchover 切换(计划内)
134
+
135
+ ```bash
136
+ # 主库操作
137
+ sqlplus / as sysdba
138
+ ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY;
139
+ SHUTDOWN IMMEDIATE;
140
+ STARTUP MOUNT;
141
+
142
+ # 备库操作
143
+ sqlplus / as sysdba
144
+ ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
145
+ ALTER DATABASE OPEN;
146
+ ```