<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>技术 - DevOps on Loen blog</title><link>https://blog.loen.top/posts/tech-devops/</link><description>Recent content in 技术 - DevOps on Loen blog</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://blog.loen.top/posts/tech-devops/index.xml" rel="self" type="application/rss+xml"/><item><title>🧐 为什么 HttpServletRequest 的 Body 只能被读取一次？</title><link>https://blog.loen.top/posts/tech-devops/-%E4%B8%BA%E4%BB%80%E4%B9%88-httpservletrequest-%E7%9A%84-body-%E5%8F%AA%E8%83%BD%E8%A2%AB%E8%AF%BB%E5%8F%96%E4%B8%80%E6%AC%A1/</link><pubDate>Wed, 10 Dec 2025 13:26:48 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/-%E4%B8%BA%E4%BB%80%E4%B9%88-httpservletrequest-%E7%9A%84-body-%E5%8F%AA%E8%83%BD%E8%A2%AB%E8%AF%BB%E5%8F%96%E4%B8%80%E6%AC%A1/</guid><description>&lt;p&gt;它触及了 &lt;strong&gt;Java Web容器（Servlet规范）&lt;/strong&gt; 处理 &lt;strong&gt;HTTP请求体（Request Body）&lt;/strong&gt; 的核心机制，以及 &lt;strong&gt;输入/输出流（IO Stream）&lt;/strong&gt; 的基本特性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-为什么-httpservletrequest-的-body-只能被读取一次"&gt;🧐 为什么 &lt;code&gt;HttpServletRequest&lt;/code&gt; 的 Body 只能被读取一次？&lt;/h2&gt;
&lt;p&gt;核心原因在于 HTTP 协议和 Java I/O 流的本质，尤其是对于 &lt;strong&gt;流式数据 (Streamed Data)&lt;/strong&gt; 的处理。&lt;/p&gt;
&lt;h3 id="1-http-请求体的本质是输入流-input-stream"&gt;1. HTTP 请求体的本质是“输入流” (Input Stream)&lt;/h3&gt;
&lt;p&gt;在 Java Web 应用中，当服务器接收到一个 HTTP 请求时，请求的 Header（如方法、路径、Content-Type）会被解析成字符串/集合等对象，但请求的 Body（如 POST/PUT 请求中的 JSON、XML、文件内容）通常是一个 &lt;strong&gt;字节序列&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Web 容器（如 Tomcat）不会一次性将整个 Body 加载到内存中，而是将其暴露为一个 &lt;strong&gt;&lt;code&gt;ServletInputStream&lt;/code&gt;&lt;/strong&gt;（通过 &lt;code&gt;request.getInputStream()&lt;/code&gt; 获取）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;流（Stream）&lt;/strong&gt; 的概念就像水管里的水流：数据是按顺序从源头（客户端）流向目的地（服务器）的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;读取（Read）&lt;/strong&gt; 意味着水被抽走了。一旦一个字节的数据被读取并处理，它就从流中&lt;strong&gt;消耗&lt;/strong&gt;掉了，&lt;strong&gt;无法回溯&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这种设计是出于对 &lt;strong&gt;性能和内存&lt;/strong&gt; 的优化，特别是处理 &lt;strong&gt;大文件上传&lt;/strong&gt; 或 &lt;strong&gt;超大请求体&lt;/strong&gt; 时。如果每次请求都必须把整个 Body 缓存起来，服务器很快就会耗尽内存（OOM）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-对比-list-或-map-等集合"&gt;2. 对比 &lt;code&gt;List&lt;/code&gt; 或 &lt;code&gt;Map&lt;/code&gt; 等集合&lt;/h3&gt;
&lt;p&gt;您提到 &lt;code&gt;List&lt;/code&gt; 和 &lt;code&gt;Map&lt;/code&gt; 可以多次读取，这是因为它们是 &lt;strong&gt;内存中的数据结构 (In-Memory Data Structures)&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>redis 中的lua脚本是如何执行的?</title><link>https://blog.loen.top/posts/tech-devops/redis-%E4%B8%AD%E7%9A%84lua%E8%84%9A%E6%9C%AC%E6%98%AF%E5%A6%82%E4%BD%95%E6%89%A7%E8%A1%8C%E7%9A%84/</link><pubDate>Tue, 09 Dec 2025 14:42:04 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/redis-%E4%B8%AD%E7%9A%84lua%E8%84%9A%E6%9C%AC%E6%98%AF%E5%A6%82%E4%BD%95%E6%89%A7%E8%A1%8C%E7%9A%84/</guid><description>&lt;h2 id="redis-中-lua-脚本的执行机制"&gt;Redis 中 Lua 脚本的执行机制&lt;/h2&gt;
&lt;h3 id="1-lua-脚本是如何执行的"&gt;1. Lua 脚本是如何执行的？&lt;/h3&gt;
&lt;p&gt;Redis 使用 EVAL 和 EVALSHA 命令执行 Lua 脚本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- EVAL 命令格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EVAL&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}&amp;#34;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;key1&lt;/span&gt; &lt;span class="n"&gt;key2&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- EVALSHA 使用脚本的 SHA1 校验和执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SCRIPT&lt;/span&gt; &lt;span class="n"&gt;LOAD&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;return &amp;#39;hello&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EVALSHA&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sha1_hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;执行特点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原子性&lt;/strong&gt;：脚本作为一个整体执行，期间不会被其他命令打断&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单线程&lt;/strong&gt;：Redis 单线程执行，避免并发问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事务性&lt;/strong&gt;：优于 Redis 事务（MULTI/EXEC），没有事务失败问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-lua-脚本以什么形式存在于-redis-中"&gt;2. Lua 脚本以什么形式存在于 Redis 中？&lt;/h3&gt;
&lt;p&gt;脚本在 Redis 中以两种形式存在：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 1. 临时形式：EVAL 直接执行（不持久化）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EVAL&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;return redis.call(&amp;#39;GET&amp;#39;, &amp;#39;foo&amp;#39;)&amp;#34;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 2. 缓存形式：SCRIPT LOAD 后缓存在内存中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SCRIPT&lt;/span&gt; &lt;span class="n"&gt;LOAD&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;return redis.call(&amp;#39;GET&amp;#39;, &amp;#39;foo&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 返回 SHA1: 6b1bf486c81ceb7edf3c093f4c48582e38c0e791&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 脚本会缓存在服务器的脚本缓存字典中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 查看缓存中的所有脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SCRIPT&lt;/span&gt; &lt;span class="n"&gt;EXISTS&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sha1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sha2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 清空脚本缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SCRIPT&lt;/span&gt; &lt;span class="n"&gt;FLUSH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;存储特点：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>HTTP 响应html时body体的分块行为</title><link>https://blog.loen.top/posts/tech-devops/http-%E5%93%8D%E5%BA%94html%E6%97%B6body%E4%BD%93%E7%9A%84%E5%88%86%E5%9D%97%E8%A1%8C%E4%B8%BA/</link><pubDate>Fri, 14 Nov 2025 13:29:49 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/http-%E5%93%8D%E5%BA%94html%E6%97%B6body%E4%BD%93%E7%9A%84%E5%88%86%E5%9D%97%E8%A1%8C%E4%B8%BA/</guid><description>&lt;p&gt;你观察到的这个现象非常有意思！这通常是由以下几种情况造成的：&lt;/p&gt;
&lt;h2 id="1-分块传输编码chunked-transfer-encoding"&gt;1. &lt;strong&gt;分块传输编码（Chunked Transfer Encoding）&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这是最常见的原因。当服务器使用 &lt;code&gt;Transfer-Encoding: chunked&lt;/code&gt; 时，响应体会被分成多个块传输。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例结构：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HTTP/1.1 200 OK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Content-Type: text/html;charset=utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Transfer-Encoding: chunked
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2000 ← 第一个块的大小（16进制，8192字节）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{...json数据...} ← 实际的数据内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 ← 结束块（大小为0）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Wireshark 显示示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HTTP/1.1 200 OK\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Content-Type: text/html;charset=utf-8\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Transfer-Encoding: chunked\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2000\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#34;status&amp;#34;: &amp;#34;success&amp;#34;, &amp;#34;data&amp;#34;: [...]}\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0\r\n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;\r\n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-自定义的响应格式"&gt;2. &lt;strong&gt;自定义的响应格式&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;有些框架或中间件会添加自定义的头部信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 类似这样的服务器端代码可能产生这种格式&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWriter&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 自定义长度标识&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWriter&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWriter&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 结束标识&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-调试或监控信息"&gt;3. &lt;strong&gt;调试或监控信息&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;开发环境中的中间件可能添加调试信息：&lt;/p&gt;</description></item><item><title>mysql 分析执行计划</title><link>https://blog.loen.top/posts/tech-devops/mysql-%E5%88%86%E6%9E%90%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92/</link><pubDate>Sat, 30 Aug 2025 16:17:15 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/mysql-%E5%88%86%E6%9E%90%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92/</guid><description>&lt;p&gt;完全不用担心！记不住 &lt;code&gt;EXPLAIN&lt;/code&gt; 的输出字段是非常正常的，因为它包含的信息确实很多。这其实不是一个需要死记硬背的东西，而是一个&lt;strong&gt;需要理解其核心思想并通过查看来熟练使用的工具&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;下面我给您一个超实用的 &lt;strong&gt;“三步速查指南”&lt;/strong&gt; 和 &lt;strong&gt;核心字段详解&lt;/strong&gt;，您以后遇到就翻出来看，看多了自然就熟了。&lt;/p&gt;
&lt;h3 id="三步速查指南如何快速判断sql性能"&gt;三步速查指南：如何快速判断SQL性能？&lt;/h3&gt;
&lt;p&gt;拿到一条 &lt;code&gt;EXPLAIN&lt;/code&gt; 结果，不要一个个字段看晕了，按照这三个步骤来分析：&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="-第一步先看"&gt;✅ &lt;strong&gt;第一步：先看 &lt;code&gt;type&lt;/code&gt; 列（访问类型）—— 这是最重要的指标！&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;这列告诉你 MySQL &lt;strong&gt;如何查找数据&lt;/strong&gt;。从好到坏排列，理想状态是尽量靠前：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;类型 (值)&lt;/th&gt;
 &lt;th style="text-align: left"&gt;含义&lt;/th&gt;
 &lt;th style="text-align: left"&gt;性能&lt;/th&gt;
 &lt;th style="text-align: left"&gt;解读&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;system&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;系统表，只有一行数据&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;最佳&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;忽略，极少见。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;const&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;通过主键或唯一索引一次就找到&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;极佳&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;WHERE id = 1&lt;/code&gt;，效率最高。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;eq_ref&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;联表查询时，使用主键或唯一索引关联&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;极佳&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;常见于 &lt;code&gt;A JOIN B ON A.id = B.id&lt;/code&gt;。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;ref&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;使用普通非唯一索引查找&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;优秀&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;WHERE name = 'Alice'&lt;/code&gt;（name是普通索引）。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;range&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;索引范围扫描&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;良好&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;WHERE id &amp;gt; 100&lt;/code&gt;，&lt;code&gt;BETWEEN&lt;/code&gt;，&lt;code&gt;IN&lt;/code&gt;。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;index&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;全索引扫描&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;较差&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;比全表扫描好点，但需要扫描整个索引树。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;&lt;code&gt;ALL&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;全表扫描&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;最差&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;警报！&lt;/strong&gt; 性能杀手，需要优化。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;您的例子解读：&lt;/strong&gt;
&lt;code&gt;type: ALL&lt;/code&gt; -&amp;gt; &lt;strong&gt;这是最坏的情况&lt;/strong&gt;，说明MySQL正在对 &lt;code&gt;com_order&lt;/code&gt; 表进行全表扫描，性能极差。&lt;/p&gt;</description></item><item><title>慢查询排行榜</title><link>https://blog.loen.top/posts/tech-devops/%E6%85%A2%E6%9F%A5%E8%AF%A2%E6%8E%92%E8%A1%8C%E6%A6%9C/</link><pubDate>Sat, 30 Aug 2025 15:31:24 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/%E6%85%A2%E6%9F%A5%E8%AF%A2%E6%8E%92%E8%A1%8C%E6%A6%9C/</guid><description>&lt;h3 id="事先申明-这项目不是我写ヾoﾉヾ"&gt;事先申明 这项目不是我写ヾ(o◕∀◕)ﾉヾ&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Profile
Rank Query ID Response time Calls R/Call 
==== =================================== =============== ====== ======= 
 1 0x43213F365998840ACD9C3079B9E87DAE 857789.5898 ... 230501 3.7214 0.47 SELECT com_order
 2 0xDF3E01C0AD745FDFF16601E364C36572 107786.6011 ... 7621 14.1434 8.21 SELECT com_order_step
 3 0x8F9F477B37A66516C7CD43B477D3A270 68362.6915 ... 3105 22.0170 4.60 UPDATE com_order_detail
 4 0x4A0BE95958C84E7A96EDFB2C21FB67C1 61784.0898 ... 18351 3.3668 0.05 SELECT com_order
 5 0x118C6D89A59CD6963430E2D2D19BB258 47610.6692 ... 11604 4.1030 0.19 SELECT com_order
 6 0xE53F09B2262794BEC6E2688CAA143431 45380.2740 ... 12985 3.4948 0.06 SELECT com_order com_goods_co
 7 0x2C3A955FE023BE233878F80DEBE1C7F5 45306.2355 ... 10324 4.3884 2.03 SELECT com_order
 8 0x881AF4FC304C67F886CE7F4B92F5F836 32297.1495 ... 2164 14.9247 2.56 SELECT com_order com_goods co
 9 0xE2B66B13B936E38828F345F8840CB173 17972.5383 ... 943 19.0589 3.67 SELECT com_order com_goods co
 10 0xBA63E58F684365ED5EF9EBECF6211154 12255.0037 ... 633 19.3602 1.64 SELECT com_order com_goods co
 11 0x9AF174602EBD35D03339D52BD6BA454A 6755.3975 0.5% 976 6.9215 0.58 SELECT com_goods com_order
 12 0xAE8DB0A6FE47D628D931A483CCAE8A75 6587.3134 0.5% 737 8.9380 3.80 SELECT com_order com_goods co
 13 0x41CD552DAEB5C20B6442CE78748915D4 6388.0521 0.5% 1074 5.9479 0.38 SELECT com_goods com_order
 14 0x5821670C589337A3F5230781CA62B830 5463.3930 0.4% 1452 3.7627 0.88 UPDATE com_order
 17 0x29284E1C020294A86F3B5089534E1F25 3770.1613 0.3% 130 29.0012 0.02 SELECT com_order com_goods co
 18 0x4FD4F24768F143A7E142658B51C74256 3136.3929 0.2% 285 11.0049 5.74 SELECT com_order com_goods co
 19 0x7D5D8A24C7C014336145D6174DD83F54 3082.0708 0.2% 183 16.8419 1.81 SELECT com_order com_goods co
 20 0x827B61B85C77531BFAD687333071E9C2 2498.9570 0.2% 640 3.9046 1.01 SELECT com_goods com_order
 21 0x92DB913CB9BC963C7C2815C23F00603E 2251.8580 0.2% 75 30.0248 0.00 INSERT com_order_step
 22 0x1E42A48C29626389B6911D90A3C7BE41 2137.8542 0.2% 69 30.9834 1.65 INSERT com_order_detail
 23 0x55FA21C415B57A8C8BEE934489C5C092 2030.6716 0.1% 486 4.1783 0.17 SELECT com_order com_goods co
 24 0xB7098BC79C0AF47C49F17C710D3D3357 1920.8152 0.1% 64 30.0127 0.00 INSERT com_order
 25 0x3718B70A1AD6C2B67B67703C6EBE839C 1704.2796 0.1% 456 3.7375 0.01 SELECT com_order
 26 0x1FA49422BC44151C0D4FA0D8AA44BB27 1659.9687 0.1% 120 13.8331 0.01 SELECT com_order com_goods co
 27 0x5A7C30146FFACC7F55CC11096B93B354 1607.1963 0.1% 442 3.6362 0.28 SELECT com_order
 30 0x43D8E9778CDD92BE946D19B37645F74C 1196.9710 0.1% 218 5.4907 2.59 SELECT com_order_detail com_o
 31 0xFB9EE232DEF62B88A9E803150ABE2D9D 1163.1644 0.1% 52 22.3685 3.58 SELECT ers_cash_list com_orde
 32 0x342763F4807710266FE036FD2AC058B9 1137.1729 0.1% 59 19.2741 4.43 SELECT ers_cash_list com_orde
 33 0x37AE68F96E70CDFF548417176CAEB2AF 1002.2846 0.1% 209 4.7956 0.64 SELECT com_goods com_order
 34 0xCFD2BFF2205FD63DD0FF201E7734D7FD 865.9522 0.1% 178 4.8649 0.17 SELECT com_goods com_order
 35 0x6AF371BEED556B36FD41230774042645 810.7413 0.1% 27 30.0275 0.00 UPDATE com_order
 36 0xFB49BD352A70DA19A7B45E49CA0FB56A 755.3083 0.1% 82 9.2111 0.01 SELECT com_order com_goods co
 37 0x591DFEABF77D53A9DB97E97F66DB2BCC 686.2606 0.0% 173 3.9668 0.22 SELECT com_order com_goods co
 38 0xAD6FBF179A5CC50419715DCE46FC7EB1 682.1636 0.0% 182 3.7482 0.11 SELECT ers_cash_list com_orde
 39 0xE360E29586DD3B1FA65F5AE61988A6CB 676.1795 0.0% 141 4.7956 0.24 SELECT com_order com_goods co
 40 0xCB8BD72D494052A7A56DD28BDDFDCBDC 657.7839 0.0% 87 7.5607 0.47 SELECT com_order com_goods co
 41 0xB1E04439EF51C794A915EB4866531585 537.9265 0.0% 153 3.5159 0.01 SELECT com_order com_goods co
 42 0x594D5C2699347573F74DE0CDC2CEFC32 529.2930 0.0% 20 26.4647 0.55 SELECT ers_cash_list com_orde
 43 0x27D2F92EBA60A1D41619A371781312A2 503.5509 0.0% 96 5.2453 0.00 SELECT com_order com_goods co
 44 0xD3F5CCA83C841835CC79BAE5E68A8CFF 496.4855 0.0% 132 3.7613 0.10 SELECT ers_cash_list com_orde
 45 0x7D3AA779A8224BC6F6C452E880162A64 475.0059 0.0% 55 8.6365 1.97 SELECT com_order_detail com_o
 46 0xB5A0A353B20D286F197F13E71BBAFC81 444.7246 0.0% 117 3.8011 0.37 SELECT com_order
 47 0xC695CA39DA1088B7ED82E1BEB33B4B7B 419.5935 0.0% 15 27.9729 0.46 SELECT ers_cash_list com_orde
 48 0xB10F790621F5CA1C97B99EAA126E00B2 346.4819 0.0% 17 20.3813 4.26 SELECT ers_cash_list com_orde
 50 0x0C170F407F3F8F9BA2A097013DF2317A 333.6224 0.0% 24 13.9009 2.32 SELECT ers_cash_list com_orde
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就贴出前五十个,留作纪念;&lt;/p&gt;</description></item><item><title>mysql慢日志分析--头部数据解读</title><link>https://blog.loen.top/posts/tech-devops/mysql%E6%85%A2%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90--%E5%A4%B4%E9%83%A8%E6%95%B0%E6%8D%AE%E8%A7%A3%E8%AF%BB/</link><pubDate>Sat, 30 Aug 2025 14:58:52 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/mysql%E6%85%A2%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90--%E5%A4%B4%E9%83%A8%E6%95%B0%E6%8D%AE%E8%A7%A3%E8%AF%BB/</guid><description>&lt;h2 id="起因"&gt;起因:&lt;/h2&gt;
&lt;p&gt;领导突发奇想使用阿里云的dns解析做负载均衡,我感觉他之前可能只做过单机项目,所以想体验负载均衡,其实目前生产系统的业务量远远打不满的单机节点的,领导做事情不需要向大头兵解释,咱也不晓得他啥时候改的解析,事后来记录一下盘查慢日志的过程.&lt;/p&gt;
&lt;h3 id="关于阿里云的域名dns"&gt;关于阿里云的域名dns&lt;/h3&gt;
&lt;p&gt;解析能配置多个ip,正常来说不会使用这种方式去做负载均衡,因为dns解析生效时间不可控,修改解析生效时间需要等待很长时间,阿里云要同步全球dns服务器,不同的客户端ip访问的dns服务器可能得到不同的结果.&lt;/p&gt;
&lt;h1 id="特别是当你某台机器故障时你是没办法即时清理掉这个故障节点的"&gt;特别是当你某台机器故障时,你是没办法即时清理掉这个故障节点的;&lt;/h1&gt;
&lt;h3 id="分析慢查询日志使用的工具是-pt-query-digest下面是分析后的文件头部汇总统计"&gt;分析慢查询日志使用的工具是 &lt;a href="https://docs.percona.com/percona-toolkit/pt-query-digest.html"&gt;pt-query-digest&lt;/a&gt;,下面是分析后的文件头部,汇总统计:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;40.3s user time, 210ms system time, 68.71M rss, 263.14M vsz
Current date: Fri Aug 29 17:19:51 2025
Hostname: VM-0-13-centos
Files: mysql-slow.log
Overall: 308.93k total, 300 unique, 0.03 QPS, 0.15x concurrency ________
Time range: 2025-05-15T17:37:29 to 2025-08-29T09:19:39
Attribute total min max avg 95% stddev median
============ ======= ======= ======= ======= ======= ======= =======
Exec time 1384350s 3s 4979s 4s 6s 13s 4s
Lock time 230s 0 14s 743us 144us 61ms 103us
Rows sent 33.29M 0 2.37M 113.00 487.09 8.40k 0.99
Rows examine 629.53G 0 259.56M 2.09M 2.26M 1.90M 1.95M
Query size 46.40M 8 108.83k 157.50 271.23 308.67 124.25
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="这是一个mysql慢查询日志分析报告的开头部分逐行解释"&gt;这是一个MySQL慢查询日志分析报告的开头部分，逐行解释：&lt;/h3&gt;
&lt;h2 id="第2行---系统资源使用情况"&gt;第2行 - 系统资源使用情况&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 40.3s user time, 210ms system time, 68.71M rss, 263.14M vsz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;40.3s user time&lt;/strong&gt;: 用户态CPU时间，表示分析工具本身运行了40.3秒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;210ms system time&lt;/strong&gt;: 内核态CPU时间，系统调用耗时210毫秒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;68.71M rss&lt;/strong&gt;: 常驻内存集大小，程序实际使用的物理内存约68.71MB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;263.14M vsz&lt;/strong&gt;: 虚拟内存大小，程序分配的虚拟内存约263.14MB&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="第3-6行---基本信息"&gt;第3-6行 - 基本信息&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Current date: Fri Aug 29 17:19:51 2025
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Hostname: VM-0-13-centos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Files: mysql-slow.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Overall: 308.93k total, 300 unique, 0.03 QPS, 0.15x concurrency ________
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;分析时间：2025年8月29日17:19:51&lt;/li&gt;
&lt;li&gt;主机名：VM-0-13-centos&lt;/li&gt;
&lt;li&gt;分析文件：mysql-slow.log&lt;/li&gt;
&lt;li&gt;总体统计：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;308.93k total&lt;/strong&gt;: 总共308,930条慢查询记录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;300 unique&lt;/strong&gt;: 300种不同的查询模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0.03 QPS&lt;/strong&gt;: 平均每秒0.03个查询（非常低）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0.15x concurrency&lt;/strong&gt;: 平均并发度0.15&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="第7行---时间范围"&gt;第7行 - 时间范围&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Time range: 2025-05-15T17:37:29 to 2025-08-29T09:19:39
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;慢查询日志覆盖的时间范围：从2025年5月15日到8月29日，跨度约3个多月&lt;/p&gt;</description></item><item><title>pt-query-digest 完全指南：从入门到高级实战</title><link>https://blog.loen.top/posts/tech-devops/pt-query-digest-%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E9%AB%98%E7%BA%A7%E5%AE%9E%E6%88%98/</link><pubDate>Fri, 29 Aug 2025 17:35:34 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/pt-query-digest-%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E9%AB%98%E7%BA%A7%E5%AE%9E%E6%88%98/</guid><description>&lt;h2 id="一什么是-pt-query-digest"&gt;一、什么是 pt-query-digest？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pt-query-digest&lt;/code&gt; 是 Percona Toolkit 中的明星工具，用于分析 MySQL 慢查询日志。它能够将庞大的慢日志文件转化为易懂的性能分析报告，帮助DBA快速定位数据库性能瓶颈。&lt;/p&gt;
&lt;h2 id="二安装与配置"&gt;二、安装与配置&lt;/h2&gt;
&lt;h3 id="安装方法"&gt;安装方法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CentOS/RHEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install percona-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu/Debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install percona-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it --rm -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:/data percona/percona-toolkit pt-query-digest --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="启用mysql慢查询日志"&gt;启用MySQL慢查询日志&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 在MySQL中执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slow_query_log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ON&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;long_query_time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 超过2秒的查询记录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slow_query_log_file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/var/log/mysql/slow.log&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log_queries_not_using_indexes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ON&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="三基础使用"&gt;三、基础使用&lt;/h2&gt;
&lt;h3 id="1-基本分析"&gt;1. 基本分析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 最简单的分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest /var/log/mysql/slow.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出到文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log &amp;gt; slow_report.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析最近的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest /var/log/mysql/slow.log --since&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;24h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-排序和限制"&gt;2. 排序和限制&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 按执行时间排序，显示前10条&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --order-by&lt;span class="o"&gt;=&lt;/span&gt;Query_time:sum --limit&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 按锁定时间排序&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --order-by&lt;span class="o"&gt;=&lt;/span&gt;Lock_time:sum --limit&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 按执行次数排序&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --order-by&lt;span class="o"&gt;=&lt;/span&gt;Count:sum --limit&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-过滤特定查询"&gt;3. 过滤特定查询&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 只分析SELECT语句&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{arg} =~ m/^SELECT/i&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析特定表的查询&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{arg} =~ m/users/i&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 排除特定用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{user} !~ m/root/i&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="四中级应用"&gt;四、中级应用&lt;/h2&gt;
&lt;h3 id="1-生成不同类型的报告"&gt;1. 生成不同类型的报告&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成HTML报告&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --report-format&lt;span class="o"&gt;=&lt;/span&gt;html &amp;gt; report.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成JSON格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --report-format&lt;span class="o"&gt;=&lt;/span&gt;json &amp;gt; report.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 详细查询报告&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --report-format&lt;span class="o"&gt;=&lt;/span&gt;query_report
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-时间范围分析"&gt;2. 时间范围分析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析特定时间范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --since&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-08-28 00:00:00&amp;#34;&lt;/span&gt; --until&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-08-29 23:59:59&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析最近12小时&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --since&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;12h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析特定时间段（每天9点到18点）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --time-range&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;09:00-18:00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-对比分析"&gt;3. 对比分析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 两个时间段的对比&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --since&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-08-20&amp;#34;&lt;/span&gt; --until&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-08-25&amp;#34;&lt;/span&gt; &amp;gt; week1.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --since&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-08-26&amp;#34;&lt;/span&gt; --until&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-08-29&amp;#34;&lt;/span&gt; &amp;gt; week2.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用review模式存储历史数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --review &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost,D&lt;span class="o"&gt;=&lt;/span&gt;monitor,t&lt;span class="o"&gt;=&lt;/span&gt;query_review
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="五高级实战技巧"&gt;五、高级实战技巧&lt;/h2&gt;
&lt;h3 id="1-实时监控分析"&gt;1. 实时监控分析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 实时分析当前进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest --processlist &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost --interval 0.01 --print --no-stream
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 监控并只显示慢查询&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest --processlist &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{Time} &amp;gt; 2&amp;#39;&lt;/span&gt; --interval &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-高级过滤技巧"&gt;2. 高级过滤技巧&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 复合过滤：查询时间大于5秒且扫描行数大于10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{Query_time} &amp;gt; 5 &amp;amp;&amp;amp; $event-&amp;gt;{Rows_examined} &amp;gt; 10000&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 特定数据库和用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{db} eq &amp;#34;mydb&amp;#34; &amp;amp;&amp;amp; $event-&amp;gt;{user} eq &amp;#34;app_user&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 错误查询分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{Error} ne &amp;#34;&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-生成可执行的优化建议"&gt;3. 生成可执行的优化建议&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成创建索引的建议&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --report-format&lt;span class="o"&gt;=&lt;/span&gt;query_report --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{Rows_examined} &amp;gt; 100000&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -A5 -B5 &lt;span class="s2"&gt;&amp;#34;SELECT\|UPDATE\|DELETE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="4-与explain结合分析"&gt;4. 与Explain结合分析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 提取需要分析的SQL语句&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --order-by&lt;span class="o"&gt;=&lt;/span&gt;Query_time:sum --limit&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; --output&lt;span class="o"&gt;=&lt;/span&gt;slow_queries.sql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 然后手动执行EXPLAIN分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql -e &lt;span class="s2"&gt;&amp;#34;EXPLAIN SELECT * FROM users WHERE created_at &amp;gt; &amp;#39;2025-01-01&amp;#39;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="六解读分析报告"&gt;六、解读分析报告&lt;/h2&gt;
&lt;h3 id="报告关键指标解读"&gt;报告关键指标解读&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Overall: 308.93k total, 300 unique, 0.03 QPS, 0.15x concurrency
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Time range: 2025-05-15T17:37:29 to 2025-08-29T09:19:39
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Attribute total min max avg 95% stddev median
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ============ ======= ======= ======= ======= ======= ======= =======
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Exec time 1384350s 3s 4979s 4s 6s 13s 4s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Lock time 230s 0 14s 743us 144us 61ms 103us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Rows sent 33.29M 0 2.37M 113.00 487.09 8.40k 0.99
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Rows examine 629.53G 0 259.56M 2.09M 2.26M 1.90M 1.95M
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exec time&lt;/strong&gt;: 查询执行时间，关注max和95%值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rows examine&lt;/strong&gt;: 扫描行数，值过大说明索引问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rows sent&lt;/strong&gt;: 返回行数，与扫描行数比值越小越好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lock time&lt;/strong&gt;: 锁等待时间，过高可能有锁竞争&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七实战案例"&gt;七、实战案例&lt;/h2&gt;
&lt;h3 id="案例1分析并优化慢查询"&gt;案例1：分析并优化慢查询&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 找出最耗时的查询&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --order-by&lt;span class="o"&gt;=&lt;/span&gt;Query_time:sum --limit&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 查看具体查询的执行计划&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{fingerprint} =~ m/SELECT.*users/&amp;#39;&lt;/span&gt; --output&lt;span class="o"&gt;=&lt;/span&gt;explain_queries.sql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 生成优化建议&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="案例2监控生产环境实时性能"&gt;案例2：监控生产环境实时性能&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# realtime_monitor.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; true&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; ===&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pt-query-digest --processlist &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --filter &lt;span class="s1"&gt;&amp;#39;$event-&amp;gt;{Time} &amp;gt; 2&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --order-by&lt;span class="o"&gt;=&lt;/span&gt;Time:max &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --limit&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="案例3每日性能报告"&gt;案例3：每日性能报告&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# daily_report.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REPORT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/tmp/mysql_report_&lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;.html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest /var/log/mysql/slow.log &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --since&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;24h&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --report-format&lt;span class="o"&gt;=&lt;/span&gt;html &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;gt; &lt;span class="nv"&gt;$REPORT_FILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 发送邮件报告&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mail -s &lt;span class="s2"&gt;&amp;#34;MySQL Daily Report &lt;/span&gt;&lt;span class="nv"&gt;$DATE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; dba@company.com &amp;lt; &lt;span class="nv"&gt;$REPORT_FILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="八常见问题排查"&gt;八、常见问题排查&lt;/h2&gt;
&lt;h3 id="1-内存不足处理"&gt;1. 内存不足处理&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析大文件时使用分段处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest slow.log --memory-limit&lt;span class="o"&gt;=&lt;/span&gt;1G --chunk-size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-网络分析"&gt;2. 网络分析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析远程数据库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest --processlist &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;db-prod.example.com,u&lt;span class="o"&gt;=&lt;/span&gt;monitor,p&lt;span class="o"&gt;=&lt;/span&gt;password --interval&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-批量处理多个文件"&gt;3. 批量处理多个文件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分析多个慢日志文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pt-query-digest /var/log/mysql/slow.log*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="九最佳实践"&gt;九、最佳实践&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定期分析&lt;/strong&gt;：设置每天自动分析慢日志&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建立基线&lt;/strong&gt;：保存历史报告用于对比&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重点关注&lt;/strong&gt;：95%百分位的值比平均值更重要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结合监控&lt;/strong&gt;：与Prometheus、Grafana等监控系统结合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队协作&lt;/strong&gt;：将报告分享给开发团队共同优化&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="十总结"&gt;十、总结&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pt-query-digest&lt;/code&gt; 是MySQL性能优化不可或缺的工具。从简单的日志分析到复杂的性能监控，它都能提供有价值的见解。掌握这个工具，你就能：&lt;/p&gt;</description></item><item><title>mysql慢查询相关的属性</title><link>https://blog.loen.top/posts/tech-devops/mysql%E6%85%A2%E6%9F%A5%E8%AF%A2%E7%9B%B8%E5%85%B3%E7%9A%84%E5%B1%9E%E6%80%A7/</link><pubDate>Fri, 29 Aug 2025 17:32:30 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/mysql%E6%85%A2%E6%9F%A5%E8%AF%A2%E7%9B%B8%E5%85%B3%E7%9A%84%E5%B1%9E%E6%80%A7/</guid><description>&lt;p&gt;&amp;ndash; 查看慢查询日志是否开启以及日志文件位置
SHOW VARIABLES LIKE &amp;lsquo;slow_query_log%&amp;rsquo;;&lt;/p&gt;
&lt;p&gt;&amp;ndash; 查看慢查询的时间阈值（单位：秒）
SHOW VARIABLES LIKE &amp;rsquo;long_query_time';&lt;/p&gt;
&lt;p&gt;&amp;ndash; 查看是否记录未使用索引的查询（即使它们执行得很快）
SHOW VARIABLES LIKE &amp;rsquo;log_queries_not_using_indexes';&lt;/p&gt;
&lt;p&gt;&amp;ndash; 查看慢查询日志的输出方式（FILE 或 TABLE）
SHOW VARIABLES LIKE &amp;rsquo;log_output';&lt;/p&gt;</description></item><item><title>慢查询sql分析工具:percona-toolkit安装</title><link>https://blog.loen.top/posts/tech-devops/%E6%85%A2%E6%9F%A5%E8%AF%A2sql%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7percona-toolkit%E5%AE%89%E8%A3%85/</link><pubDate>Fri, 29 Aug 2025 17:29:42 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/%E6%85%A2%E6%9F%A5%E8%AF%A2sql%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7percona-toolkit%E5%AE%89%E8%A3%85/</guid><description>&lt;h2 id="方法一添加percona官方yum源推荐"&gt;方法一：添加Percona官方Yum源（推荐）&lt;/h2&gt;
&lt;h3 id="1-安装percona的yum仓库"&gt;1. 安装Percona的yum仓库&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载并安装Percona的yum源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启用Percona Toolkit仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo percona-release &lt;span class="nb"&gt;enable&lt;/span&gt; tools release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 更新yum缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum makecache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装percona-toolkit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install percona-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="方法二使用epel仓库"&gt;方法二：使用EPEL仓库&lt;/h2&gt;
&lt;h3 id="1-首先安装epel仓库"&gt;1. 首先安装EPEL仓库&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装EPEL仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install epel-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 再次尝试安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install percona-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="方法三直接下载rpm包安装"&gt;方法三：直接下载RPM包安装&lt;/h2&gt;
&lt;h3 id="1-手动下载并安装"&gt;1. 手动下载并安装&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看系统架构&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果是x86_64架构，下载对应的RPM包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://repo.percona.com/yum/release/7/RPMS/x86_64/percona-toolkit-3.5.5-1.el7.x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装下载的RPM包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install percona-toolkit-3.5.5-1.el7.x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或者使用rpm命令直接安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rpm -ivh percona-toolkit-3.5.5-1.el7.x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="方法四使用tar包安装无需root权限"&gt;方法四：使用tar包安装（无需root权限）&lt;/h2&gt;
&lt;h3 id="1-下载二进制tar包"&gt;1. 下载二进制tar包&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载最新版本的tar包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://www.percona.com/downloads/percona-toolkit/3.5.5/binary/tarball/percona-toolkit-3.5.5_x86_64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解压&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -zxvf percona-toolkit-3.5.5_x86_64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 进入目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; percona-toolkit-3.5.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 直接使用pt-query-digest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./bin/pt-query-digest --help
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或者添加到PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=$PATH:/path/to/percona-toolkit-3.5.5/bin&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="验证安装"&gt;验证安装&lt;/h2&gt;
&lt;p&gt;安装完成后验证：&lt;/p&gt;</description></item><item><title>redis配置文件--gemini解读</title><link>https://blog.loen.top/posts/tech-devops/redis%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6--gemini%E8%A7%A3%E8%AF%BB/</link><pubDate>Wed, 27 Aug 2025 16:07:41 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/redis%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6--gemini%E8%A7%A3%E8%AF%BB/</guid><description>&lt;p&gt;好的，这是您提供的 Redis 配置文件（&lt;code&gt;redis.conf&lt;/code&gt;）中注释部分的中文翻译。我将按照原文的结构和段落，为您逐一翻译。&lt;/p&gt;
&lt;h3 id="配置注释翻译"&gt;&lt;strong&gt;配置注释翻译&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;文件头部（General）&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 请注意，为了读取配置文件，Redis 必须以文件路径作为第一个参数启动：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ./redis-server /path/to/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 单位说明：当需要指定内存大小时，可以使用常见的形式，如 1k, 5GB, 4M 等：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1k =&amp;gt; 1000 字节
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1kb =&amp;gt; 1024 字节
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1m =&amp;gt; 1000000 字节
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1mb =&amp;gt; 1024*1024 字节
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1g =&amp;gt; 1000000000 字节
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1gb =&amp;gt; 1024*1024*1024 字节
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 单位不区分大小写，因此 1GB、1Gb 和 1gB 都表示相同的值。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;模块 (MODULES)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>深入浅出 TCP 协议：从水管到数据包的奇妙旅程</title><link>https://blog.loen.top/posts/tech-devops/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA-tcp-%E5%8D%8F%E8%AE%AE%E4%BB%8E%E6%B0%B4%E7%AE%A1%E5%88%B0%E6%95%B0%E6%8D%AE%E5%8C%85%E7%9A%84%E5%A5%87%E5%A6%99%E6%97%85%E7%A8%8B/</link><pubDate>Fri, 22 Aug 2025 13:46:42 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA-tcp-%E5%8D%8F%E8%AE%AE%E4%BB%8E%E6%B0%B4%E7%AE%A1%E5%88%B0%E6%95%B0%E6%8D%AE%E5%8C%85%E7%9A%84%E5%A5%87%E5%A6%99%E6%97%85%E7%A8%8B/</guid><description>&lt;p&gt;&lt;img src="https://b3logfile.com/bing/20201028.jpg?imageView2/1/w/960/h/540/interlace/1/q/100" alt=""&gt;&lt;/p&gt;
&lt;h1 id="深入浅出-tcp-协议从水管到数据包的奇妙旅程"&gt;深入浅出 TCP 协议：从水管到数据包的奇妙旅程&lt;/h1&gt;
&lt;p&gt;今天我们深入探讨了 TCP (传输控制协议) 这一互联网基石的奥秘，从宏观的连接概念到微观的数据流转，希望能帮助大家更好地理解这个“幕后英雄”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-tcp-与应用层协议自定义的挑战"&gt;1. TCP 与应用层协议：自定义的挑战&lt;/h2&gt;
&lt;h3 id="问如果我想基于-tcp-做一套自己的应用层协议需要具备哪些能力"&gt;问：如果我想基于 TCP 做一套自己的应用层协议需要具备哪些能力？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;答：&lt;/strong&gt; 要在 TCP 之上构建自己的应用层协议，你需要深入理解网络编程基础、具备强大的协议设计能力，并考虑安全和性能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心能力包括：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;网络编程基础：&lt;/strong&gt; 熟练掌握 Socket 编程（创建、绑定、监听、连接、收发数据、关闭），并理解 TCP 的面向连接、可靠传输、流量控制、拥塞控制等特性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议设计能力：&lt;/strong&gt; 这是核心。你需要定义：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;消息格式：&lt;/strong&gt; 明确消息头（包含类型、长度、序列号等元数据）和消息体。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消息边界：&lt;/strong&gt; 解决 TCP 的“粘包”问题，常用方法是使用&lt;strong&gt;长度前缀&lt;/strong&gt;或&lt;strong&gt;特殊结束符&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议语义：&lt;/strong&gt; 定义消息类型、操作、请求/响应模式、错误处理、会话管理（如心跳）等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;序列化/反序列化：&lt;/strong&gt; 如何将数据结构转换为字节流发送，以及如何将字节流解析回数据结构（例如使用 JSON、Protocol Buffers 或自定义二进制格式）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发和多线程/多进程编程：&lt;/strong&gt; 服务器端需要处理大量并发连接，你需要选择合适的并发模型（如多线程、多进程、事件驱动/异步 I/O）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全考虑：&lt;/strong&gt; 如果处理敏感数据，需要考虑加密（建议直接使用 &lt;strong&gt;TLS/SSL&lt;/strong&gt;）、认证、授权和数据完整性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化与可伸缩性：&lt;/strong&gt; 包括数据压缩、连接池、负载均衡、缓存等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具与调试：&lt;/strong&gt; 熟练使用 Wireshark 等抓包工具，并做好日志记录和测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="问http-协议已被广泛使用浏览器都支持如果是我自定义的应用层协议浏览器肯定不认识例如我定义一个-hkkp-协议首先肯定要有一套客户端发起请求的规范消息体的数据结构如何定义然后服务端要有对应的解码规范我这样理解对吗"&gt;问：HTTP 协议已被广泛使用，浏览器都支持。如果是我自定义的应用层协议，浏览器肯定不认识。例如我定义一个 HKKP 协议，首先肯定要有一套客户端发起请求的规范，消息体的数据结构如何定义，然后服务端要有对应的解码规范，我这样理解对吗？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;答：&lt;/strong&gt; 你的理解&lt;strong&gt;完全正确&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;构建自定义应用层协议的核心挑战就在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浏览器不认识：&lt;/strong&gt; 浏览器只支持标准协议如 HTTP(S)。自定义协议需要你&lt;strong&gt;自己编写专门的客户端程序&lt;/strong&gt;来“说”这种语言。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端规范：&lt;/strong&gt; 你需要详细定义客户端如何构造 HKKP 请求，包括：
&lt;ul&gt;
&lt;li&gt;基于 TCP 建立连接。&lt;/li&gt;
&lt;li&gt;请求的结构（例如：包含方法、路径、请求头、请求体等概念）。&lt;/li&gt;
&lt;li&gt;字段的含义和数据编码方式（文本或二进制）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端解码规范：&lt;/strong&gt; 服务端必须严格按照客户端发送时的&lt;strong&gt;编码规范&lt;/strong&gt;来解码和解析收到的字节流，才能正确理解请求内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简而言之，客户端和服务器必须遵循同一套你定义的“语言”规则，才能进行有效的通信。&lt;/p&gt;</description></item><item><title>tcpdump命令详解</title><link>https://blog.loen.top/posts/tech-devops/tcpdump%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3/</link><pubDate>Fri, 22 Aug 2025 13:45:16 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/tcpdump%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3/</guid><description>&lt;p&gt;tcpdump 是 Linux/Unix 系统中一款强大的命令行网络抓包工具，可实时捕获网络接口上的数据包并解析，常用于网络故障排查、协议分析、流量监控等场景。以下从基本语法、核心选项、过滤规则、高级用法及实用案例等方面详细讲解。&lt;/p&gt;
&lt;h3 id="一基本语法"&gt;一、基本语法&lt;/h3&gt;
&lt;p&gt;tcpdump 的核心语法结构为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tcpdump [选项] [过滤表达式]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;选项&lt;/strong&gt;：控制抓包的行为（如指定接口、输出格式、保存文件等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过滤表达式&lt;/strong&gt;：筛选需要捕获的数据包（如指定主机、端口、协议等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="二核心选项详解"&gt;二、核心选项详解&lt;/h3&gt;
&lt;p&gt;选项用于调整抓包的范围和输出方式，常用选项如下：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;选项&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;示例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;-i &amp;lt;接口&amp;gt;&lt;/td&gt;
 &lt;td&gt;指定抓包的网络接口（如 eth0、lo）；-i any表示所有接口&lt;/td&gt;
 &lt;td&gt;tcpdump -i eth0（抓 eth0 接口的包）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-n&lt;/td&gt;
 &lt;td&gt;不进行 DNS 解析（直接显示 IP，不转主机名）&lt;/td&gt;
 &lt;td&gt;tcpdump -n（输出 IP 而非域名）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-nn&lt;/td&gt;
 &lt;td&gt;不解析 IP 和端口（端口显示数字，不转服务名如 80 不显示 http）&lt;/td&gt;
 &lt;td&gt;tcpdump -nn（IP 和端口均为数字）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-v/-vv/-vvv&lt;/td&gt;
 &lt;td&gt;增加输出详细程度（v：基本详情；vv：更多协议细节；vvv：最详细）&lt;/td&gt;
 &lt;td&gt;tcpdump -vv（显示较详细的包信息）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-c &amp;lt;数量&amp;gt;&lt;/td&gt;
 &lt;td&gt;只捕获指定数量的数据包后退出&lt;/td&gt;
 &lt;td&gt;tcpdump -c 10（抓 10 个包后停止）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-w &amp;lt;文件&amp;gt;&lt;/td&gt;
 &lt;td&gt;将捕获的原始数据包保存到文件（不解析，需用-r读取）&lt;/td&gt;
 &lt;td&gt;tcpdump -w traffic.pcap（保存到 traffic.pcap）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-r &amp;lt;文件&amp;gt;&lt;/td&gt;
 &lt;td&gt;从保存的文件中读取数据包（用于离线分析）&lt;/td&gt;
 &lt;td&gt;tcpdump -r traffic.pcap（读取 pcap 文件）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-s &amp;lt;长度&amp;gt;&lt;/td&gt;
 &lt;td&gt;设置抓包的 “快照长度”（默认 65535 字节，足够捕获完整包）&lt;/td&gt;
 &lt;td&gt;tcpdump -s 0（捕获完整包，0 等价于 65535）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-A&lt;/td&gt;
 &lt;td&gt;以 ASCII 码显示数据包内容（适合查看 HTTP 等文本协议）&lt;/td&gt;
 &lt;td&gt;tcpdump -A（直观查看数据包的文本内容）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-X&lt;/td&gt;
 &lt;td&gt;同时以十六进制和 ASCII 码显示数据包内容（兼顾二进制和文本）&lt;/td&gt;
 &lt;td&gt;tcpdump -X（十六进制 + ASCII 混合显示）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-e&lt;/td&gt;
 &lt;td&gt;显示数据链路层信息（如 MAC 地址、VLAN 标签）&lt;/td&gt;
 &lt;td&gt;tcpdump -e（输出包含源 / 目的 MAC）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-t&lt;/td&gt;
 &lt;td&gt;不显示时间戳&lt;/td&gt;
 &lt;td&gt;tcpdump -t（去掉输出中的时间）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;-tttt&lt;/td&gt;
 &lt;td&gt;显示完整时间戳（格式：年 - 月 - 日 时：分: 秒。微秒）&lt;/td&gt;
 &lt;td&gt;tcpdump -tttt（精确到微秒的时间）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="三过滤表达式核心功能"&gt;三、过滤表达式（核心功能）&lt;/h3&gt;
&lt;p&gt;过滤表达式是 tcpdump 的灵魂，用于精准筛选目标数据包。表达式由 “类型 + 方向 + 协议” 组合而成，支持逻辑运算（and/or/not）。&lt;/p&gt;</description></item><item><title>MySQL与Oracle的主要区别1</title><link>https://blog.loen.top/posts/tech-devops/mysql%E4%B8%8Eoracle%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8C%BA%E5%88%AB1/</link><pubDate>Fri, 22 Aug 2025 13:39:26 +0800</pubDate><guid>https://blog.loen.top/posts/tech-devops/mysql%E4%B8%8Eoracle%E7%9A%84%E4%B8%BB%E8%A6%81%E5%8C%BA%E5%88%AB1/</guid><description>&lt;p&gt;MySQL和Oracle都是流行的关系型数据库管理系统，但它们在多个方面存在显著差异：&lt;/p&gt;
&lt;h2 id="1-公司所有权与许可"&gt;1. 公司所有权与许可&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;：最初由MySQL AB开发，现为Oracle公司所有，开源(GPL许可)和商业许可双模式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt;：Oracle公司专有商业软件，需要购买许可证&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-架构与性能"&gt;2. 架构与性能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;轻量级设计&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适合中小型应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;读写操作通常较快&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持有限的分区功能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;企业级架构&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;针对大规模、高并发环境优化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;高级分区选项(范围、列表、哈希、复合分区)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更复杂的优化器&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-功能对比"&gt;3. 功能对比&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;存储过程/函数&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle有更强大的PL/SQL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MySQL的存储过程功能相对简单&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;事务支持&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle：完全ACID兼容，高级并发控制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MySQL：只有InnoDB引擎支持完整ACID&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;复制与高可用&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MySQL：主从复制简单易用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle：Data Guard、RAC等企业级解决方案&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-扩展性与集群"&gt;4. 扩展性与集群&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主要通过主从复制扩展&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分片需要应用层实现&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Real Application Clusters(RAC)支持多节点共享存储&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自动存储管理(ASM)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;高级数据分区&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-安全性"&gt;5. 安全性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oracle提供更细粒度的安全控制：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虚拟私有数据库(VPD)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;细粒度审计&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据加密选项更丰富&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-成本"&gt;6. 成本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;：社区版免费，企业版需付费&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt;：许可证费用昂贵，按CPU核心计费&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="7-使用场景"&gt;7. 使用场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL适合&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Web应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中小型系统&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要快速开发的项目&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;预算有限的情况&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oracle适合&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大型企业应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要高可用性和灾难恢复的关键系统&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;复杂事务处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据仓库和大数据分析&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="8-sql语法差异"&gt;8. SQL语法差异&lt;/h2&gt;
&lt;p&gt;两者在SQL语法上有一些不同，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;分页查询语法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;日期函数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字符串处理函数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;序列/自增字段的实现方式&lt;/p&gt;</description></item></channel></rss>