@gordon.gan/specflow 1.4.0-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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/prompts/approval/database-guidance.md +79 -0
- package/prompts/approval/generate.md +569 -290
- package/skills/database/LICENSE +405 -0
- package/skills/database/ORIGIN.md +6 -0
- package/skills/database/README.md +30 -0
- package/skills/database/elasticsearch/LICENSE.txt +202 -0
- package/skills/database/elasticsearch/SKILL.md +199 -0
- package/skills/database/elasticsearch/examples/01-fulltext-search.md +215 -0
- package/skills/database/elasticsearch/examples/02-aggregation-report.md +206 -0
- package/skills/database/elasticsearch/examples/03-reindex-zero-downtime.md +200 -0
- package/skills/database/elasticsearch/examples/04-cluster-monitoring.md +204 -0
- package/skills/database/elasticsearch/references/01-query-dsl-fulltext.md +162 -0
- package/skills/database/elasticsearch/references/02-query-dsl-term.md +210 -0
- package/skills/database/elasticsearch/references/03-aggregations-metric.md +161 -0
- package/skills/database/elasticsearch/references/04-aggregations-bucket.md +236 -0
- package/skills/database/elasticsearch/references/05-mapping-types.md +134 -0
- package/skills/database/elasticsearch/references/06-analyzers.md +187 -0
- package/skills/database/elasticsearch/references/07-cluster-ops.md +225 -0
- package/skills/database/elasticsearch/references/08-elk-integration.md +170 -0
- package/skills/database/mysql/SKILL.md +195 -0
- package/skills/database/mysql/examples/01-connection-pool.md +75 -0
- package/skills/database/mysql/examples/02-slow-query-optimization.md +98 -0
- package/skills/database/mysql/examples/03-master-slave-setup.md +144 -0
- package/skills/database/mysql/examples/04-backup-strategy.md +212 -0
- package/skills/database/mysql/references/01-functions-string.md +103 -0
- package/skills/database/mysql/references/02-functions-date.md +152 -0
- package/skills/database/mysql/references/03-functions-aggregate-window.md +167 -0
- package/skills/database/mysql/references/04-functions-json.md +129 -0
- package/skills/database/mysql/references/05-sql-ddl-types.md +235 -0
- package/skills/database/mysql/references/06-index-optimization.md +232 -0
- package/skills/database/mysql/references/07-replication-ha.md +213 -0
- package/skills/database/mysql/references/08-backup-restore.md +207 -0
- package/skills/database/mysql/references/09-advanced-features.md +345 -0
- package/skills/database/oracle/LICENSE.txt +202 -0
- package/skills/database/oracle/SKILL.md +238 -0
- package/skills/database/oracle/examples/01-plsql-procedure.md +90 -0
- package/skills/database/oracle/examples/02-awr-analysis.md +99 -0
- package/skills/database/oracle/examples/03-rman-backup.md +108 -0
- package/skills/database/oracle/examples/04-dataguard-setup.md +146 -0
- package/skills/database/oracle/references/01-functions-string.md +91 -0
- package/skills/database/oracle/references/02-functions-date.md +71 -0
- package/skills/database/oracle/references/03-analytic-functions.md +103 -0
- package/skills/database/oracle/references/04-plsql-guide.md +303 -0
- package/skills/database/oracle/references/05-performance-tuning.md +164 -0
- package/skills/database/oracle/references/06-backup-recovery.md +115 -0
- package/skills/database/oracle/references/07-dataguard-rac.md +76 -0
- package/skills/database/oracle/references/08-security.md +170 -0
- package/skills/database/oracle/references/09-sql-syntax.md +152 -0
- package/skills/database/oracle/references/10-features.md +174 -0
- package/skills/database/postgresql/LICENSE.txt +202 -0
- package/skills/database/postgresql/SKILL.md +182 -0
- package/skills/database/postgresql/examples/.gitkeep +0 -0
- package/skills/database/postgresql/examples/01-jsonb-query.md +72 -0
- package/skills/database/postgresql/examples/02-cte-recursive.md +110 -0
- package/skills/database/postgresql/examples/03-performance-tuning.md +114 -0
- package/skills/database/postgresql/examples/04-streaming-replication.md +113 -0
- package/skills/database/postgresql/references/.gitkeep +0 -0
- package/skills/database/postgresql/references/01-functions-string.md +174 -0
- package/skills/database/postgresql/references/02-functions-datetime.md +54 -0
- package/skills/database/postgresql/references/03-functions-aggregate-window.md +142 -0
- package/skills/database/postgresql/references/04-functions-jsonb.md +117 -0
- package/skills/database/postgresql/references/05-fulltext-search.md +109 -0
- package/skills/database/postgresql/references/06-index-types.md +95 -0
- package/skills/database/postgresql/references/07-partition-fdw.md +133 -0
- package/skills/database/postgresql/references/08-replication-backup.md +215 -0
- package/skills/database/redis/LICENSE.txt +202 -0
- package/skills/database/redis/SKILL.md +922 -0
- package/skills/database/redis/examples/01-cache-usage.md +104 -0
- package/skills/database/redis/examples/02-session-storage.md +72 -0
- package/skills/database/redis/examples/03-leaderboard.md +63 -0
- package/skills/database/redis/examples/04-redis-cluster-setup.md +70 -0
- package/skills/database/redis/examples/05-stream-queue.md +65 -0
- package/skills/database/redis/references/command-quick-ref.md +180 -0
- package/skills/database/redis/references/commands-admin-key.md +413 -0
- package/skills/database/redis/references/commands-set-sorted-advanced.md +539 -0
- package/skills/database/redis/references/commands-string-hash-list.md +458 -0
- package/skills/database/redis/references/memory-optimization.md +150 -0
- package/skills/database/redis/references/redis-conf-production.md +139 -0
- package/skills/specflow-approval/SKILL.md +100 -181
- package/templates/approval.md +295 -221
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# 集群运维
|
|
2
|
+
|
|
3
|
+
## 节点类型
|
|
4
|
+
|
|
5
|
+
| 类型 | 角色 | 职责 | 推荐配置 |
|
|
6
|
+
|------|------|------|---------|
|
|
7
|
+
| **Master** | `[master]` | 集群管理、元数据、选主 | 3 个专用, 4C 8G |
|
|
8
|
+
| **Data** | `[data]` | 存储数据、查询/聚合 | N 个, 8C 32G+ SSD |
|
|
9
|
+
| **Ingest** | `[ingest]` | 数据预处理管道 | 日志量大时可用 |
|
|
10
|
+
| **Coordinating** | `[]` | 请求分发、结果合并 | 大查询场景, 8C 32G+ |
|
|
11
|
+
|
|
12
|
+
**生产环境推荐**:3 个专用 Master + N 个 Data + 2 个 Coordinating。
|
|
13
|
+
|
|
14
|
+
## 发现与选主
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
# elasticsearch.yml
|
|
18
|
+
discovery.seed_hosts: ["node1:9300", "node2:9300", "node3:9300"]
|
|
19
|
+
cluster.initial_master_nodes: ["node1", "node2", "node3"]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**防脑裂**:专用 Master 节点、奇数个 (≥3)、堆内存 ≤50% 物理内存。
|
|
23
|
+
|
|
24
|
+
## 分片分配与再平衡
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 查看分片分配
|
|
28
|
+
GET /_cat/shards?v
|
|
29
|
+
|
|
30
|
+
# 延迟分片分配 (重启节点时)
|
|
31
|
+
PUT /_all/_settings
|
|
32
|
+
{
|
|
33
|
+
"settings": {
|
|
34
|
+
"index.unassigned.node_left.delayed_timeout": "5m"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# 取消再平衡 (维护时)
|
|
39
|
+
PUT /_cluster/settings
|
|
40
|
+
{
|
|
41
|
+
"transient": {
|
|
42
|
+
"cluster.routing.rebalance.enable": "none"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# 重新路由
|
|
47
|
+
POST /_cluster/reroute
|
|
48
|
+
{
|
|
49
|
+
"commands": [
|
|
50
|
+
{
|
|
51
|
+
"move": {
|
|
52
|
+
"index": "my_index",
|
|
53
|
+
"shard": 0,
|
|
54
|
+
"from_node": "node-1",
|
|
55
|
+
"to_node": "node-2"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 快照与恢复 (Snapshot/Restore)
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# 1. 注册快照仓库
|
|
66
|
+
PUT /_snapshot/my_backup
|
|
67
|
+
{
|
|
68
|
+
"type": "s3",
|
|
69
|
+
"settings": {
|
|
70
|
+
"bucket": "my-es-backups",
|
|
71
|
+
"region": "us-east-1",
|
|
72
|
+
"base_path": "elasticsearch/backups"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# 2. 创建快照
|
|
77
|
+
PUT /_snapshot/my_backup/snapshot_20240101
|
|
78
|
+
{
|
|
79
|
+
"indices": "logs-*,products",
|
|
80
|
+
"ignore_unavailable": true,
|
|
81
|
+
"include_global_state": true
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# 3. 查看状态
|
|
85
|
+
GET /_snapshot/my_backup/snapshot_20240101/_status
|
|
86
|
+
|
|
87
|
+
# 4. 恢复
|
|
88
|
+
POST /_snapshot/my_backup/snapshot_20240101/_restore
|
|
89
|
+
{
|
|
90
|
+
"indices": "products",
|
|
91
|
+
"rename_pattern": "(.+)",
|
|
92
|
+
"rename_replacement": "restored_$1"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# 5. SLM 自动管理
|
|
96
|
+
PUT /_slm/policy/daily_snapshot
|
|
97
|
+
{
|
|
98
|
+
"name": "<daily-snap-{now/d}>",
|
|
99
|
+
"repository": "my_backup",
|
|
100
|
+
"schedule": "0 30 1 * * ?",
|
|
101
|
+
"retention": {
|
|
102
|
+
"expire_after": "30d",
|
|
103
|
+
"min_count": 5,
|
|
104
|
+
"max_count": 50
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## ILM — 索引生命周期管理
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
PUT /_ilm/policy/logs_policy
|
|
113
|
+
{
|
|
114
|
+
"policy": {
|
|
115
|
+
"phases": {
|
|
116
|
+
"hot": {
|
|
117
|
+
"min_age": "0ms",
|
|
118
|
+
"actions": {
|
|
119
|
+
"rollover": {
|
|
120
|
+
"max_size": "50GB",
|
|
121
|
+
"max_age": "1d",
|
|
122
|
+
"max_docs": 5000000
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"warm": {
|
|
127
|
+
"min_age": "7d",
|
|
128
|
+
"actions": {
|
|
129
|
+
"shrink": { "number_of_shards": 1 },
|
|
130
|
+
"forcemerge": { "max_num_segments": 1 },
|
|
131
|
+
"allocate": { "require": { "box_type": "warm" } }
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"cold": {
|
|
135
|
+
"min_age": "30d",
|
|
136
|
+
"actions": {
|
|
137
|
+
"searchable_snapshot": {
|
|
138
|
+
"snapshot_repository": "my_backup"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"delete": {
|
|
143
|
+
"min_age": "365d",
|
|
144
|
+
"actions": { "delete": {} }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**生命周期**:hot (热节点 SSD) → warm (温节点 HDD) → cold (可搜索快照) → delete。
|
|
152
|
+
|
|
153
|
+
## 监控命令
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# 集群健康
|
|
157
|
+
GET /_cluster/health?pretty
|
|
158
|
+
|
|
159
|
+
# 节点信息
|
|
160
|
+
GET /_cat/nodes?v&h=name,node.role,heap.percent,ram.percent,cpu,load_1m,master
|
|
161
|
+
|
|
162
|
+
# 索引信息
|
|
163
|
+
GET /_cat/indices?v&h=index,docs.count,store.size,pri.store.size
|
|
164
|
+
GET /_cat/shards?v
|
|
165
|
+
|
|
166
|
+
# 热点线程 (排查 CPU 突增)
|
|
167
|
+
GET /_nodes/hot_threads
|
|
168
|
+
|
|
169
|
+
# 待处理任务
|
|
170
|
+
GET /_cat/pending_tasks
|
|
171
|
+
|
|
172
|
+
# 节点统计
|
|
173
|
+
GET /_nodes/stats/indices,os,process,jvm,fs,transport,http
|
|
174
|
+
|
|
175
|
+
# 任务管理
|
|
176
|
+
GET /_tasks?detailed&actions=*byquery
|
|
177
|
+
POST /_tasks/<task_id>/_cancel
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## 性能优化
|
|
181
|
+
|
|
182
|
+
### 分片黄金法则
|
|
183
|
+
|
|
184
|
+
- 每个分片 20-50GB (最佳)
|
|
185
|
+
- 每 GB 堆内存 20-25 个分片 (含副本)
|
|
186
|
+
- 案例: 1TB → 20-25 主分片 × 1 副本 = 40-50 总分片
|
|
187
|
+
|
|
188
|
+
### 写入优化
|
|
189
|
+
|
|
190
|
+
1. 关闭 refresh (`refresh_interval: -1`)
|
|
191
|
+
2. 增加 translog 同步间隔 (`30s`)
|
|
192
|
+
3. Bulk API (5-15MB/批)
|
|
193
|
+
4. 副本数设为 0 (写完恢复)
|
|
194
|
+
5. 合理 mapping (关闭 norms 等)
|
|
195
|
+
|
|
196
|
+
### 查询优化
|
|
197
|
+
|
|
198
|
+
- filter 优先 (可缓存, 不贡献算分)
|
|
199
|
+
- 避免 script 查询
|
|
200
|
+
- search_after 替代深度 from+size
|
|
201
|
+
- 限制 _source 返回字段
|
|
202
|
+
|
|
203
|
+
### 慢查询日志
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
PUT /_settings
|
|
207
|
+
{
|
|
208
|
+
"index.search.slowlog.threshold.query.warn": "2s",
|
|
209
|
+
"index.search.slowlog.threshold.query.info": "500ms",
|
|
210
|
+
"index.search.slowlog.threshold.fetch.warn": "1s",
|
|
211
|
+
"index.indexing.slowlog.threshold.index.warn": "10s"
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Profile API
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
GET /products/_search
|
|
219
|
+
{
|
|
220
|
+
"profile": true,
|
|
221
|
+
"query": {
|
|
222
|
+
"match": { "title": "手机" }
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# ELK Stack 集成
|
|
2
|
+
|
|
3
|
+
## Elastic Stack 架构
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Kibana (可视化/仪表盘/Dev Tools)
|
|
7
|
+
↓
|
|
8
|
+
Elasticsearch (存储/搜索/聚合)
|
|
9
|
+
↓
|
|
10
|
+
Logstash (ETL) ← Filebeat (日志) ← Metricbeat (指标) ← 其他 Beats
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Logstash 配置
|
|
14
|
+
|
|
15
|
+
```ruby
|
|
16
|
+
# logstash.conf — 接收文件日志, 解析后写入 ES
|
|
17
|
+
input {
|
|
18
|
+
beats {
|
|
19
|
+
port => 5044
|
|
20
|
+
}
|
|
21
|
+
file {
|
|
22
|
+
path => "/var/log/app/*.log"
|
|
23
|
+
start_position => "beginning"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
filter {
|
|
28
|
+
# 解析 Nginx 日志
|
|
29
|
+
grok {
|
|
30
|
+
match => { "message" => "%{COMBINEDAPACHELOG}" }
|
|
31
|
+
}
|
|
32
|
+
# 解析 JSON 格式
|
|
33
|
+
json {
|
|
34
|
+
source => "message"
|
|
35
|
+
target => "parsed"
|
|
36
|
+
skip_on_invalid_json => true
|
|
37
|
+
}
|
|
38
|
+
# 添加时间戳
|
|
39
|
+
date {
|
|
40
|
+
match => ["timestamp", "ISO8601"]
|
|
41
|
+
target => "@timestamp"
|
|
42
|
+
}
|
|
43
|
+
# 地理 IP 解析
|
|
44
|
+
geoip {
|
|
45
|
+
source => "client_ip"
|
|
46
|
+
target => "geo"
|
|
47
|
+
}
|
|
48
|
+
# 字段处理
|
|
49
|
+
mutate {
|
|
50
|
+
remove_field => ["message", "original"]
|
|
51
|
+
convert => ["response", "integer"]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
output {
|
|
56
|
+
elasticsearch {
|
|
57
|
+
hosts => ["localhost:9200"]
|
|
58
|
+
index => "nginx-logs-%{+YYYY.MM.dd}"
|
|
59
|
+
user => "elastic"
|
|
60
|
+
password => "${ES_PASSWORD}"
|
|
61
|
+
ssl => true
|
|
62
|
+
cacert => "/etc/elasticsearch/certs/ca.crt"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Logstash 是 ETL 工具,适合复杂数据转换(grok/geoip/useragent)。纯日志采集场景推荐 Filebeat(更轻量)。
|
|
68
|
+
|
|
69
|
+
## Filebeat 配置
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
# filebeat.yml — 轻量级日志采集
|
|
73
|
+
filebeat.inputs:
|
|
74
|
+
- type: log
|
|
75
|
+
enabled: true
|
|
76
|
+
paths:
|
|
77
|
+
- /var/log/nginx/access.log
|
|
78
|
+
- /var/log/nginx/error.log
|
|
79
|
+
fields:
|
|
80
|
+
service: nginx
|
|
81
|
+
env: production
|
|
82
|
+
fields_under_root: true
|
|
83
|
+
|
|
84
|
+
- type: log
|
|
85
|
+
enabled: true
|
|
86
|
+
paths:
|
|
87
|
+
- /var/log/app/*.log
|
|
88
|
+
multiline:
|
|
89
|
+
pattern: '^\d{4}-\d{2}-\d{2}'
|
|
90
|
+
negate: true
|
|
91
|
+
match: after # 合并多行异常堆栈
|
|
92
|
+
|
|
93
|
+
filebeat.config.modules:
|
|
94
|
+
path: ${path.config}/modules.d/*.yml
|
|
95
|
+
reload.enabled: true
|
|
96
|
+
|
|
97
|
+
output.elasticsearch:
|
|
98
|
+
hosts: ["localhost:9200"]
|
|
99
|
+
username: "elastic"
|
|
100
|
+
password: "${ES_PASSWORD}"
|
|
101
|
+
index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
|
|
102
|
+
|
|
103
|
+
setup.kibana:
|
|
104
|
+
host: "localhost:5601"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Filebeat 特点**:轻量级、资源占用低、支持多行合并 (Java 异常堆栈)、模块化配置。
|
|
108
|
+
|
|
109
|
+
## Metricbeat 配置
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
# metricbeat.yml — 系统和应用指标采集
|
|
113
|
+
metricbeat.config.modules:
|
|
114
|
+
path: ${path.config}/modules.d/*.yml
|
|
115
|
+
reload.enabled: true
|
|
116
|
+
|
|
117
|
+
metricbeat.modules:
|
|
118
|
+
- module: system
|
|
119
|
+
metricsets:
|
|
120
|
+
- cpu
|
|
121
|
+
- memory
|
|
122
|
+
- network
|
|
123
|
+
- diskio
|
|
124
|
+
- filesystem
|
|
125
|
+
- process
|
|
126
|
+
period: 10s
|
|
127
|
+
enabled: true
|
|
128
|
+
- module: elasticsearch
|
|
129
|
+
metricsets:
|
|
130
|
+
- node
|
|
131
|
+
- node_stats
|
|
132
|
+
- cluster_stats
|
|
133
|
+
- index
|
|
134
|
+
period: 10s
|
|
135
|
+
hosts: ["localhost:9200"]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Kibana 核心功能
|
|
139
|
+
|
|
140
|
+
| 功能 | 说明 |
|
|
141
|
+
|------|------|
|
|
142
|
+
| **Discover** | 日志搜索浏览 (KQL / Lucene 查询) |
|
|
143
|
+
| **Dashboard** | 仪表盘组合多个可视化 |
|
|
144
|
+
| **Visualize** | 创建图表 (柱状图/折线图/饼图/地图) |
|
|
145
|
+
| **Maps** | 地理空间分析 |
|
|
146
|
+
| **Canvas** | 自定义报告设计 |
|
|
147
|
+
| **Machine Learning** | 异常检测/预测 |
|
|
148
|
+
| **APM** | 应用性能监控 |
|
|
149
|
+
| **Security** | SIEM 安全分析 |
|
|
150
|
+
|
|
151
|
+
## KQL 查询语法
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
service.name: "my-app" AND http.response.status_code >= 400
|
|
155
|
+
agent.hostname: "web-*" AND NOT response_time > 5s
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## 实战: 构建 Nginx 日志分析管道
|
|
159
|
+
|
|
160
|
+
1. **Filebeat** 采集 `/var/log/nginx/access.log`
|
|
161
|
+
2. **Logstash** (可选) 解析日志 → grok 提取字段 + geoip 解析 IP
|
|
162
|
+
3. **Elasticsearch** 存储到 `nginx-logs-YYYY.MM.dd` 索引 (ILM 管理)
|
|
163
|
+
4. **Kibana** 创建 Dashboard: 请求量趋势、状态码分布、TOP URL、地理分布
|
|
164
|
+
|
|
165
|
+
**完整 pipeline 参考**:
|
|
166
|
+
```bash
|
|
167
|
+
# 使用 Filebeat Nginx 模块 (免手动配置)
|
|
168
|
+
filebeat modules enable nginx
|
|
169
|
+
filebeat setup
|
|
170
|
+
```
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mysql
|
|
3
|
+
description: Provides comprehensive guidance for MySQL including SQL syntax, functions, indexing, optimization, replication, backup, and high availability. Use when the user asks about MySQL, needs to write MySQL queries, design database schemas, optimize performance, or manage MySQL databases.
|
|
4
|
+
license: Complete terms in LICENSE.txt
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# MySQL — 关系型数据库管理系统
|
|
8
|
+
|
|
9
|
+
MySQL 是最流行的开源关系型数据库管理系统(RDBMS),以 InnoDB 存储引擎为核心,支持 ACID 事务、外键约束和多种复制架构。
|
|
10
|
+
|
|
11
|
+
## Workflow — 使用流程
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
遇到 MySQL 需求时,按以下顺序决策:
|
|
15
|
+
|
|
16
|
+
1. 明确场景
|
|
17
|
+
├── 建库建表 / 设计 schema? → DDL 与数据类型参考 (references/05)
|
|
18
|
+
├── 复杂查询 / 报表分析? → DML + 聚合/窗口函数 (references/03)
|
|
19
|
+
├── 性能慢 / 优化 SQL? → 索引与执行计划 (references/06)
|
|
20
|
+
├── 备份 / 恢复? → 备份与恢复 (references/08)
|
|
21
|
+
├── 主从 / 高可用? → 复制与高可用 (references/07)
|
|
22
|
+
├── 存储过程 / 分区 / 事务? → 高级特性 (references/09)
|
|
23
|
+
├── 字符串/日期/JSON 函数? → 函数参考 (references/01-04)
|
|
24
|
+
└── 实战配置 / 搭建? → 示例 (examples/)
|
|
25
|
+
|
|
26
|
+
2. 引擎选择: InnoDB (99% 场景) → MyISAM (只读归档) → MEMORY (临时表)
|
|
27
|
+
3. 索引设计: 主键先 → 查询/排序/JOIN 列建索引 → 检查最左前缀
|
|
28
|
+
4. 生产措施: 开启慢查询 → 配置主从复制 → 制定备份策略
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## When to Use / When NOT to
|
|
32
|
+
|
|
33
|
+
| ✅ Use When | ❌ Skip When |
|
|
34
|
+
|------------|-------------|
|
|
35
|
+
| 需要 ACID 事务保障的业务系统(订单、支付、账户) | 高频 KV 存取(<1ms 延迟,用 Redis) |
|
|
36
|
+
| 数据结构固定、关系明确的 OLTP 场景 | 文档型非结构化数据(用 MongoDB) |
|
|
37
|
+
| 需要复杂 JOIN/子查询的报表分析 | 海量日志/时序数据(用 ClickHouse) |
|
|
38
|
+
| 中小规模到中大规模 OLTP(百万~亿级) | 超大规模分布式事务(用 TiDB) |
|
|
39
|
+
| 主从复制读写分离架构 | 图关系数据(用 Neo4j) |
|
|
40
|
+
| 需要丰富内置函数和存储过程 | 全文搜索引擎为主(用 Elasticsearch) |
|
|
41
|
+
|
|
42
|
+
## Boundary — 能力边界
|
|
43
|
+
|
|
44
|
+
| ✅ 完全适用 | ⚠️ 有条件适用 | ❌ 不适用(替代方案) |
|
|
45
|
+
|-----------|--------------|------------------|
|
|
46
|
+
| OLTP 业务系统 | 单表过亿行(需分库分表) | 纯内存缓存 → Redis |
|
|
47
|
+
| ACID 事务一致性 | 跨分片分布式事务(XA/Seata) | 文档存储 → MongoDB |
|
|
48
|
+
| 复杂 SQL(JOIN/子查询/聚合) | 实时流计算(MySQL + Flink) | 全文搜索 → Elasticsearch |
|
|
49
|
+
| 主从复制读写分离 | 强一致多主写入(Galera/PXC) | 时序大数据 → ClickHouse |
|
|
50
|
+
| mysqldump/XtraBackup 备份 | JSON 深度查询(不如 MongoDB) | 分布式强一致 → TiDB |
|
|
51
|
+
| 分区表(RANGE/LIST/HASH) | 高并发写入 > 1万 TPS | 图数据库 → Neo4j |
|
|
52
|
+
|
|
53
|
+
## SQL 语法速查
|
|
54
|
+
|
|
55
|
+
| 类别 | 核心语法 | 详情参考 |
|
|
56
|
+
|------|---------|---------|
|
|
57
|
+
| DDL | `CREATE/ALTER/DROP TABLE`,数据类型、约束 | references/05-sql-ddl-types.md |
|
|
58
|
+
| DML | `INSERT/UPDATE/DELETE`,`ON DUPLICATE KEY UPDATE` | 同上 |
|
|
59
|
+
| DQL | `SELECT/JOIN/GROUP BY/HAVING/UNION`,CTE,子查询 | references/03, 09 |
|
|
60
|
+
| 事务 | `START TRANSACTION/COMMIT/ROLLBACK/SAVEPOINT` | references/09-advanced-features.md |
|
|
61
|
+
| 分页 | `LIMIT/OFFSET`(小表),`WHERE id > :last` 游标(大表) | references/06-index-optimization.md |
|
|
62
|
+
|
|
63
|
+
## 函数速查
|
|
64
|
+
|
|
65
|
+
| 类别 | 最常用函数 | 详情参考 |
|
|
66
|
+
|------|-----------|---------|
|
|
67
|
+
| 字符串 | `CONCAT, SUBSTRING, REPLACE, LPAD, GROUP_CONCAT, LENGTH` | references/01-functions-string.md |
|
|
68
|
+
| 日期时间 | `NOW, DATE_FORMAT, DATEDIFF, DATE_ADD, TIMESTAMPDIFF` | references/02-functions-date.md |
|
|
69
|
+
| 聚合 | `COUNT, SUM, AVG, MAX, MIN, GROUP_CONCAT` | references/03-functions-aggregate-window.md |
|
|
70
|
+
| 窗口 (8.0+) | `ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, NTILE` | references/03-functions-aggregate-window.md |
|
|
71
|
+
| JSON (5.7+) | `JSON_EXTRACT, JSON_SET, JSON_CONTAINS, JSON_TABLE` | references/04-functions-json.md |
|
|
72
|
+
| 条件 | `IF, IFNULL, COALESCE, CASE WHEN` | references/05-sql-ddl-types.md |
|
|
73
|
+
|
|
74
|
+
## 高级特性索引
|
|
75
|
+
|
|
76
|
+
| 特性 | 简介 | 参考 |
|
|
77
|
+
|------|------|------|
|
|
78
|
+
| 视图 (View) | 存储的查询定义,简化复杂查询和权限控制 | references/09-advanced-features.md |
|
|
79
|
+
| CTE (8.0+) | 命名临时结果集,支持递归树形查询 | 同上 |
|
|
80
|
+
| 存储过程 | 封装多条 SQL 带事务控制的业务逻辑 | 同上 |
|
|
81
|
+
| 触发器 | 自动响应 INSERT/UPDATE/DELETE 的事件处理 | 同上 |
|
|
82
|
+
| 事务与锁 | ACID、MVCC、四种隔离级别、行锁/表锁/死锁 | 同上 |
|
|
83
|
+
| 分区表 | RANGE/LIST/HASH/KEY 分区,数据归档加速 | 同上 |
|
|
84
|
+
| 全文索引 (5.6+) | FULLTEXT + MATCH AGAINST 代替 LIKE 搜索 | references/06-index-optimization.md |
|
|
85
|
+
| 函数索引 (8.0.13+) | 对表达式/函数结果建索引 | 同上 |
|
|
86
|
+
| 降序索引 (8.0+) | 混合排序方向的索引优化 | 同上 |
|
|
87
|
+
| 主从复制 | Binlog + Relay Log 实现数据同步 | references/07-replication-ha.md |
|
|
88
|
+
| 半同步复制 | 至少一个 Slave 确认,平衡性能与一致性 | 同上 |
|
|
89
|
+
| InnoDB Cluster | Group Replication + MySQL Router 原生 HA | 同上 |
|
|
90
|
+
| XtraBackup | 物理热备份,支持增量 | references/08-backup-restore.md |
|
|
91
|
+
| PITR | 利用 Binlog 实现时间点恢复 | 同上 |
|
|
92
|
+
|
|
93
|
+
## 引擎对比
|
|
94
|
+
|
|
95
|
+
| 特性 | InnoDB | MyISAM | MEMORY |
|
|
96
|
+
|------|--------|--------|--------|
|
|
97
|
+
| 事务 | ✅ ACID | ❌ | ❌ |
|
|
98
|
+
| 外键 | ✅ | ❌ | ❌ |
|
|
99
|
+
| 行级锁 | ✅ 行锁 | ❌ 表锁 | ❌ 表锁 |
|
|
100
|
+
| MVCC | ✅ | ❌ | ❌ |
|
|
101
|
+
| 崩溃恢复 | ✅ redo log | ❌ 需 REPAIR TABLE | ❌ 重启即丢 |
|
|
102
|
+
| 全文索引 | ✅ 5.6+ | ✅ | ❌ |
|
|
103
|
+
| 缓存 | Buffer Pool(数据和索引) | Key Cache(仅索引) | 全内存 |
|
|
104
|
+
| 适用场景 | 99% 场景默认首选 | 只读归档(极少用) | 临时表 |
|
|
105
|
+
| 表大小限制 | 64TB | 256TB | max_heap_table_size |
|
|
106
|
+
|
|
107
|
+
## Gotchas — 常见陷阱
|
|
108
|
+
|
|
109
|
+
| # | 反模式 | 问题 | 正确做法 |
|
|
110
|
+
|---|--------|------|---------|
|
|
111
|
+
| 1 | 金额用 FLOAT/DOUBLE | 浮点精度误差 | 用 `DECIMAL(10,2)` |
|
|
112
|
+
| 2 | WHERE 列用函数/隐式转换 | 索引失效,全表扫描 | 避免函数操作列,类型匹配 |
|
|
113
|
+
| 3 | 大批量分页用 OFFSET | OFFSET 越深越慢 | 游标分页 `WHERE id > :last` |
|
|
114
|
+
| 4 | 全表无主键 | 无法行级锁,复制延迟 | 每个表必须有 BIGINT 主键 |
|
|
115
|
+
| 5 | SELECT * 生产使用 | 浪费带宽,无法覆盖索引 | 显式列出需要列 |
|
|
116
|
+
| 6 | 大字段无前缀索引 | 索引过大,B+ 树效率低 | 前缀索引 `col(N)` |
|
|
117
|
+
| 7 | 长事务不提交 | undo log 膨胀,MVCC 开销 | 控制事务大小,及时 COMMIT |
|
|
118
|
+
| 8 | 索引过多 | 写入性能降低 | 单表索引 ≤ 5-8 个 |
|
|
119
|
+
| 9 | COUNT(*) InnoDB 大表 | 需要扫描全表(MyISAM 才缓存) | 用近似值或计数表 |
|
|
120
|
+
| 10 | LIKE '%keyword%' 搜索 | 无法用索引 | FULLTEXT + MATCH AGAINST |
|
|
121
|
+
| 11 | NOT IN (子查询) | 不做半连接优化 | 用 NOT EXISTS |
|
|
122
|
+
| 12 | 字符集混用 | 乱码、索引隐性转换 | 统一 utf8mb4 |
|
|
123
|
+
| 13 | TEXT/BLOB 过多 | 行溢出,性能差 | 拆分到子表或 OSS |
|
|
124
|
+
| 14 | REPLACE 常见误解 | 实际是 DELETE+INSERT | 明确需求后用 ON DUPLICATE KEY UPDATE |
|
|
125
|
+
| 15 | 不做备份验证 | 备份损坏但无人知 | 每月定期恢复演练 |
|
|
126
|
+
|
|
127
|
+
## FAQ
|
|
128
|
+
|
|
129
|
+
| # | 问题 | 答案 |
|
|
130
|
+
|---|------|------|
|
|
131
|
+
| 1 | 如何选择 DATETIME 还是 TIMESTAMP? | TIMESTAMP 自动时区转换(范围 1970-2038),DATETIME 无时区影响(范围 1000-9999) |
|
|
132
|
+
| 2 | VARCHAR 最大长度设多少合适? | 根据业务设合理值(50-200),不要无意义设 255(临时表排序按定义长度分配内存) |
|
|
133
|
+
| 3 | 如何快速插入百万级数据? | `LOAD DATA INFILE` (最快),或批量 INSERT(每批 500-1000 行),关闭 AUTOCOMMIT |
|
|
134
|
+
| 4 | 什么时候需要分库分表? | 单表 > 5000 万行或单实例 > 2TB 且预期继续增长 |
|
|
135
|
+
| 5 | MySQL 8.0 vs 5.7 选哪个? | 新项目选 8.0(窗口函数、CTE、降序索引、原子 DDL、Hash Join) |
|
|
136
|
+
| 6 | 如何监控 MySQL 性能? | 慢查询日志 + pt-query-digest + Prometheus + Grafana + performance_schema |
|
|
137
|
+
| 7 | 主从延迟怎么处理? | 检查 Slave 硬件、拆分大事务、开启并行复制、关键读走主库 |
|
|
138
|
+
| 8 | 误操作删除了数据怎么办? | 立即停止写入 → 用 Binlog PITR 恢复到误操作前的时间点 |
|
|
139
|
+
| 9 | InnoDB 为什么比 MyISAM 好? | 事务、行锁、崩溃恢复、MVCC、外键。MyISAM 已过时 |
|
|
140
|
+
| 10 | 如何查看当前数据库的活跃连接? | `SHOW PROCESSLIST;` 或 `SELECT * FROM sys.session;` |
|
|
141
|
+
| 11 | 如何安全地在大表上添加索引? | MySQL 8.0 用 `ALGORITHM=INPLACE, LOCK=NONE`;或用 pt-online-schema-change |
|
|
142
|
+
| 12 | 唯一索引和普通索引怎么选? | 需要唯一约束用 UNIQUE;只需加速查询用普通索引 |
|
|
143
|
+
| 13 | 有哪些推荐的管理工具? | CLI: mysql CLI;GUI: Sequel Ace / DataGrip / Navicat;命令行: Percona Toolkit |
|
|
144
|
+
| 14 | utf8mb4 和 utf8 有什么区别? | utf8 是 utf8mb3(最多 3 字节),不支持 emoji;utf8mb4 支持完整的 Unicode(含 emoji)|
|
|
145
|
+
| 15 | 如何排查死锁? | `SHOW ENGINE INNODB STATUS;` 查看 LATEST DETECTED DEADLOCK 部分 |
|
|
146
|
+
|
|
147
|
+
## Keywords
|
|
148
|
+
|
|
149
|
+
MySQL, Database, RDBMS, SQL, DDL, DML, DQL, DCL, InnoDB, MyISAM, MEMORY, ACID, transaction, index, B-Tree, EXPLAIN, query optimization, replication, master-slave, binlog, backup, restore, XtraBackup, mysqldump, PITR, partition, view, stored procedure, trigger, CTE, window function, JSON, utf8mb4, performance_schema, slow query, connection pool, sharding, high availability, HA
|
|
150
|
+
|
|
151
|
+
## References
|
|
152
|
+
|
|
153
|
+
### 官方文档
|
|
154
|
+
- [MySQL 8.0 Reference Manual](https://dev.mysql.com/doc/refman/8.0/en/)
|
|
155
|
+
- [MySQL 8.0 Release Notes](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/)
|
|
156
|
+
|
|
157
|
+
### 工具
|
|
158
|
+
- [Percona XtraBackup](https://www.percona.com/software/mysql-database/percona-xtrabackup)
|
|
159
|
+
- [Percona Toolkit](https://www.percona.com/software/database-tools/percona-toolkit)
|
|
160
|
+
- [Orchestrator](https://github.com/openark/orchestrator) — MySQL 高可用管理
|
|
161
|
+
- [gh-ost](https://github.com/github/gh-ost) — 在线表结构变更
|
|
162
|
+
|
|
163
|
+
### 本 skill 深度参考
|
|
164
|
+
- references/01-functions-string.md — 字符串函数大全
|
|
165
|
+
- references/02-functions-date.md — 日期时间函数大全
|
|
166
|
+
- references/03-functions-aggregate-window.md — 聚合与窗口函数
|
|
167
|
+
- references/04-functions-json.md — JSON 函数
|
|
168
|
+
- references/05-sql-ddl-types.md — DDL 与数据类型详解
|
|
169
|
+
- references/06-index-optimization.md — 索引与执行计划
|
|
170
|
+
- references/07-replication-ha.md — 主从复制与高可用
|
|
171
|
+
- references/08-backup-restore.md — 备份与恢复
|
|
172
|
+
- references/09-advanced-features.md — 高级特性(视图/CTE/存储过程/触发器/事务/分区)
|
|
173
|
+
|
|
174
|
+
### 实战示例
|
|
175
|
+
- examples/01-connection-pool.md — 连接池配置
|
|
176
|
+
- examples/02-slow-query-optimization.md — 慢查询优化
|
|
177
|
+
- examples/03-master-slave-setup.md — 主从复制搭建
|
|
178
|
+
- examples/04-backup-strategy.md — 备份策略方案
|
|
179
|
+
|
|
180
|
+
## 使用流程
|
|
181
|
+
|
|
182
|
+
### Step 1: 环境准备
|
|
183
|
+
确保开发环境已安装必要的依赖和工具。
|
|
184
|
+
|
|
185
|
+
### Step 2: 配置初始化
|
|
186
|
+
根据项目需求进行基础配置。
|
|
187
|
+
|
|
188
|
+
### Step 3: 核心功能使用
|
|
189
|
+
按照示例代码实现核心功能。
|
|
190
|
+
|
|
191
|
+
### Step 4: 测试验证
|
|
192
|
+
运行测试确保功能正常。
|
|
193
|
+
|
|
194
|
+
### Step 5: 部署上线
|
|
195
|
+
完成开发后进行部署和监控。
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 示例: 连接池配置 (Java HikariCP)
|
|
2
|
+
|
|
3
|
+
## 场景
|
|
4
|
+
|
|
5
|
+
生产环境高并发 Web 应用中,合理配置数据库连接池是保证性能的关键。本例展示 HikariCP(Spring Boot 默认连接池)的最佳实践配置。
|
|
6
|
+
|
|
7
|
+
## 问题
|
|
8
|
+
|
|
9
|
+
- 连接数太少 → 请求排队等待,响应变慢
|
|
10
|
+
- 连接数太多 → MySQL 连接数耗尽(`max_connections`),系统崩溃
|
|
11
|
+
- 连接泄漏 → 连接未正确归还,池逐渐耗尽
|
|
12
|
+
|
|
13
|
+
## 解决方案
|
|
14
|
+
|
|
15
|
+
### application.yml 配置
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
spring:
|
|
19
|
+
datasource:
|
|
20
|
+
url: jdbc:mysql://localhost:3306/shop?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4
|
|
21
|
+
username: root
|
|
22
|
+
password: your_password
|
|
23
|
+
driver-class-name: com.mysql.cj.jdbc.Driver
|
|
24
|
+
hikari:
|
|
25
|
+
# 核心配置
|
|
26
|
+
maximum-pool-size: 20 # 最大连接数(核心参数)
|
|
27
|
+
minimum-idle: 5 # 最小空闲连接数
|
|
28
|
+
connection-timeout: 30000 # 等待连接超时(毫秒)
|
|
29
|
+
idle-timeout: 600000 # 空闲连接最大存活(毫秒,10min)
|
|
30
|
+
max-lifetime: 1800000 # 连接最大寿命(毫秒,30min)
|
|
31
|
+
|
|
32
|
+
# MySQL 专用优化
|
|
33
|
+
auto-commit: true
|
|
34
|
+
connection-test-query: SELECT 1
|
|
35
|
+
pool-name: ShopHikariPool
|
|
36
|
+
|
|
37
|
+
# 性能监控
|
|
38
|
+
register-mbeans: true # 开启 JMX 监控
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 常用计算公式
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
最大连接数 = ((核心数 * 2) + 有效磁盘数)
|
|
45
|
+
|
|
46
|
+
示例:
|
|
47
|
+
- 4 核 CPU + 1 SSD → (4 * 2) + 1 = 9
|
|
48
|
+
- 8 核 CPU + 1 SSD → (8 * 2) + 1 = 17
|
|
49
|
+
|
|
50
|
+
通用建议:
|
|
51
|
+
- 微服务低并发场景: 5-10
|
|
52
|
+
- Web 应用中并发场景: 15-30
|
|
53
|
+
- 高并发场景: 分库后每个库 20-50
|
|
54
|
+
|
|
55
|
+
注意: 不是越大越好。连接池大小 × 并发请求数 = MySQL 实际并发连接。
|
|
56
|
+
举例: 10 个实例 × 每个 20 连接 = 200 个 MySQL 连接。
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 验证配置
|
|
60
|
+
|
|
61
|
+
```sql
|
|
62
|
+
-- 查看实际连接数
|
|
63
|
+
SHOW STATUS LIKE 'Threads_connected';
|
|
64
|
+
SHOW STATUS LIKE 'Max_used_connections';
|
|
65
|
+
|
|
66
|
+
-- 查看连接来源
|
|
67
|
+
SELECT * FROM information_schema.processlist;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 关键要点
|
|
71
|
+
|
|
72
|
+
1. **连接池大小不是越大越好**:过多的连接会导致 MySQL 上下文切换开销和锁争用
|
|
73
|
+
2. **max-lifetime 应小于 MySQL 的 wait_timeout**(通常 28800s),避免连接被 MySQL 断开后还留在池中
|
|
74
|
+
3. **connection-test-query** 用于心跳检测,`SELECT 1` 性能最好
|
|
75
|
+
4. 建议配合 `spring.datasource.hikari.leak-detection-threshold` 检测连接泄漏
|