<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>开发环境 on heyaohua's Blog</title><link>https://blog.heyaohua.com/tags/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</link><description>Recent content in 开发环境 on heyaohua's Blog</description><image><title>heyaohua's Blog</title><url>https://blog.heyaohua.com/og-image.png</url><link>https://blog.heyaohua.com/og-image.png</link></image><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 19 Mar 2024 12:00:00 +0800</lastBuildDate><atom:link href="https://blog.heyaohua.com/tags/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/index.xml" rel="self" type="application/rss+xml"/><item><title>Redis Docker开发环境配置指南</title><link>https://blog.heyaohua.com/posts/2024/03/redis-docker-development-guide/</link><pubDate>Tue, 19 Mar 2024 12:00:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2024/03/redis-docker-development-guide/</guid><description>本文档详细介绍如何使用Docker搭建Redis开发环境，包括环境配置、启动方式、维护方法等内容。</description><content:encoded><![CDATA[<h1 id="redis-docker开发环境配置指南">Redis Docker开发环境配置指南</h1>
<p>本文档详细介绍如何使用Docker搭建Redis开发环境，包括环境配置、启动方式、维护方法等内容。</p>
<h2 id="目录结构">目录结构</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Redis_Docker/
</span></span><span style="display:flex;"><span>├── .env                # 环境变量配置文件
</span></span><span style="display:flex;"><span>├── README.md          # 项目说明文档
</span></span><span style="display:flex;"><span>├── config/            # 配置文件目录
</span></span><span style="display:flex;"><span>│   └── redis.conf    # Redis配置文件
</span></span><span style="display:flex;"><span>├── data/             # 数据存储目录
</span></span><span style="display:flex;"><span>└── logs/             # 日志文件目录
</span></span></code></pre></div><h2 id="配置文件说明">配置文件说明</h2>
<h3 id="1-docker-composeyml">1. docker-compose.yml</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">version</span>: <span style="color:#f1fa8c">&#39;3.8&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">redis</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">container_name</span>: redis-server
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">image</span>: redis:7.2
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f1fa8c">&#34;${REDIS_PORT}:6379&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">volumes</span>:
</span></span><span style="display:flex;"><span>      - ./data:/data
</span></span><span style="display:flex;"><span>      - ./logs:/var/log/redis
</span></span><span style="display:flex;"><span>      - ./config/redis.conf:/usr/local/etc/redis/redis.conf
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">command</span>: redis-server /usr/local/etc/redis/redis.conf
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">environment</span>:
</span></span><span style="display:flex;"><span>      - TZ=Asia/Shanghai
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">networks</span>:
</span></span><span style="display:flex;"><span>      - redis-network
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">healthcheck</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">test</span>: [<span style="color:#f1fa8c">&#34;CMD&#34;</span>, <span style="color:#f1fa8c">&#34;redis-cli&#34;</span>, <span style="color:#f1fa8c">&#34;ping&#34;</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">interval</span>: 10s
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">timeout</span>: 5s
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">retries</span>: <span style="color:#bd93f9">5</span>
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">start_period</span>: 5s
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">networks</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">redis-network</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">driver</span>: bridge
</span></span></code></pre></div><h3 id="2-env-环境变量配置">2. .env 环境变量配置</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># Redis 配置环境变量
</span></span><span style="display:flex;"><span>REDIS_PORT=6379           # Redis端口映射
</span></span><span style="display:flex;"><span>REDIS_PASSWORD=your_password  # Redis访问密码
</span></span></code></pre></div><h3 id="3-redisconf-主要配置">3. redis.conf 主要配置</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 网络设置
</span></span><span style="display:flex;"><span>bind 0.0.0.0
</span></span><span style="display:flex;"><span>port 6379
</span></span><span style="display:flex;"><span>protected-mode yes
</span></span><span style="display:flex;"><span>tcp-keepalive 300
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 基本设置
</span></span><span style="display:flex;"><span>databases 16
</span></span><span style="display:flex;"><span>loglevel notice
</span></span><span style="display:flex;"><span>logfile &#34;/var/log/redis/redis.log&#34;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 内存设置
</span></span><span style="display:flex;"><span>maxmemory 256mb
</span></span><span style="display:flex;"><span>maxmemory-policy allkeys-lru
</span></span><span style="display:flex;"><span>maxmemory-samples 5
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 持久化设置
</span></span><span style="display:flex;"><span>save 900 1      # 900秒内至少1个键被修改
</span></span><span style="display:flex;"><span>save 300 10     # 300秒内至少10个键被修改
</span></span><span style="display:flex;"><span>save 60 10000   # 60秒内至少10000个键被修改
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># AOF设置
</span></span><span style="display:flex;"><span>appendonly yes
</span></span><span style="display:flex;"><span>appendfilename &#34;appendonly.aof&#34;
</span></span><span style="display:flex;"><span>appendfsync everysec
</span></span></code></pre></div><h2 id="使用说明">使用说明</h2>
<h3 id="1-启动服务">1. 启动服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 启动服务</span>
</span></span><span style="display:flex;"><span>docker-compose up -d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看服务状态</span>
</span></span><span style="display:flex;"><span>docker-compose ps
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看日志</span>
</span></span><span style="display:flex;"><span>docker-compose logs redis
</span></span></code></pre></div><h3 id="2-连接redis">2. 连接Redis</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 使用容器内的redis-cli</span>
</span></span><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> redis redis-cli -a your_password
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 使用主机的redis-cli（如果已安装）</span>
</span></span><span style="display:flex;"><span>redis-cli -h localhost -p <span style="color:#bd93f9">6379</span> -a your_password
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 测试连接</span>
</span></span><span style="display:flex;"><span>redis-cli -h localhost -p <span style="color:#bd93f9">6379</span> -a your_password ping
</span></span></code></pre></div><h3 id="3-停止服务">3. 停止服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 停止服务</span>
</span></span><span style="display:flex;"><span>docker-compose down
</span></span></code></pre></div><h2 id="数据持久化">数据持久化</h2>
<p>Redis配置了双重持久化机制：</p>
<h3 id="1-rdb持久化">1. RDB持久化</h3>
<ul>
<li>文件位置：data/dump.rdb</li>
<li>自动保存策略：</li>
<li>900秒内至少1个键被修改</li>
<li>300秒内至少10个键被修改</li>
<li>60秒内至少10000个键被修改</li>
</ul>
<h3 id="2-aof持久化">2. AOF持久化</h3>
<ul>
<li>文件位置：data/appendonly.aof</li>
<li>同步策略：everysec（每秒同步）</li>
<li>重写策略：auto-aof-rewrite-percentage 100</li>
</ul>
<h2 id="性能优化">性能优化</h2>
<h3 id="1-内存配置">1. 内存配置</h3>
<ul>
<li>maxmemory：设置为256MB</li>
<li>maxmemory-policy：使用allkeys-lru策略</li>
<li>maxmemory-samples：设置为5</li>
</ul>
<h3 id="2-网络优化">2. 网络优化</h3>
<ul>
<li>tcp-keepalive：300秒</li>
<li>tcp-backlog：511</li>
</ul>
<h3 id="3-持久化优化">3. 持久化优化</h3>
<ul>
<li>appendfsync：everysec</li>
<li>no-appendfsync-on-rewrite：no</li>
</ul>
<h2 id="安全配置">安全配置</h2>
<h3 id="1-网络安全">1. 网络安全</h3>
<ul>
<li>protected-mode：启用</li>
<li>bind：0.0.0.0（允许所有IP访问）</li>
<li>requirepass：设置访问密码</li>
</ul>
<h3 id="2-客户端限制">2. 客户端限制</h3>
<ul>
<li>maxclients：10000</li>
<li>timeout：0（不自动断开空闲连接）</li>
</ul>
<h2 id="监控和维护">监控和维护</h2>
<h3 id="1-性能监控">1. 性能监控</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 查看服务器信息
</span></span><span style="display:flex;"><span>redis-cli -a your_password INFO
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 监控命令执行
</span></span><span style="display:flex;"><span>redis-cli -a your_password MONITOR
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 查看慢查询日志
</span></span><span style="display:flex;"><span>redis-cli -a your_password SLOWLOG GET
</span></span></code></pre></div><h3 id="2-内存分析">2. 内存分析</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 查看内存使用情况
</span></span><span style="display:flex;"><span>redis-cli -a your_password INFO memory
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 查看大键
</span></span><span style="display:flex;"><span>redis-cli -a your_password --bigkeys
</span></span></code></pre></div><h3 id="3-数据备份">3. 数据备份</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 手动触发RDB备份
</span></span><span style="display:flex;"><span>redis-cli -a your_password SAVE
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 异步触发RDB备份
</span></span><span style="display:flex;"><span>redis-cli -a your_password BGSAVE
</span></span></code></pre></div><h2 id="常见问题处理">常见问题处理</h2>
<h3 id="1-连接失败">1. 连接失败</h3>
<ul>
<li>检查密码是否正确</li>
<li>确认端口映射是否正确</li>
<li>验证Redis服务是否正常运行</li>
</ul>
<h3 id="2-内存问题">2. 内存问题</h3>
<ul>
<li>检查maxmemory设置</li>
<li>查看内存使用情况</li>
<li>考虑调整内存策略</li>
</ul>
<h3 id="3-持久化问题">3. 持久化问题</h3>
<ul>
<li>检查磁盘空间</li>
<li>查看AOF/RDB文件状态</li>
<li>确认写入权限</li>
</ul>
<h2 id="最佳实践">最佳实践</h2>
<h3 id="1-安全建议">1. 安全建议</h3>
<ul>
<li>使用强密码</li>
<li>限制可访问的IP</li>
<li>定期更新Redis版本</li>
</ul>
<h3 id="2-性能建议">2. 性能建议</h3>
<ul>
<li>合理设置内存上限</li>
<li>选择适当的持久化策略</li>
<li>监控慢查询</li>
</ul>
<h3 id="3-运维建议">3. 运维建议</h3>
<ul>
<li>定期备份数据</li>
<li>监控系统资源</li>
<li>保持日志分析</li>
</ul>
]]></content:encoded></item><item><title>PostgreSQL Docker开发环境配置指南</title><link>https://blog.heyaohua.com/posts/2024/03/postgresql-docker-development-guide/</link><pubDate>Tue, 19 Mar 2024 11:30:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2024/03/postgresql-docker-development-guide/</guid><description>本文档详细介绍如何使用Docker搭建PostgreSQL开发环境，包括环境配置、启动方式、维护方法等内容。</description><content:encoded><![CDATA[<h1 id="postgresql-docker开发环境配置指南">PostgreSQL Docker开发环境配置指南</h1>
<p>本文档详细介绍如何使用Docker搭建PostgreSQL开发环境，包括环境配置、启动方式、维护方法等内容。</p>
<h2 id="目录结构">目录结构</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>PgSQL_Docker/
</span></span><span style="display:flex;"><span>├── .env                  # 环境变量配置文件
</span></span><span style="display:flex;"><span>├── README.md            # 项目说明文档
</span></span><span style="display:flex;"><span>├── config/              # 配置文件目录
</span></span><span style="display:flex;"><span>│   ├── pg_hba.conf     # 访问控制配置
</span></span><span style="display:flex;"><span>│   └── postgresql.conf  # PostgreSQL主配置文件
</span></span><span style="display:flex;"><span>├── data/               # 数据存储目录
</span></span><span style="display:flex;"><span>└── logs/               # 日志文件目录
</span></span></code></pre></div><h2 id="配置文件说明">配置文件说明</h2>
<h3 id="1-docker-composeyml">1. docker-compose.yml</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">version</span>: <span style="color:#f1fa8c">&#39;3.8&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">postgres</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">container_name</span>: postgres-server
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">image</span>: postgres:15
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">environment</span>:
</span></span><span style="display:flex;"><span>      - POSTGRES_DB=${POSTGRES_DB}
</span></span><span style="display:flex;"><span>      - POSTGRES_USER=${POSTGRES_USER}
</span></span><span style="display:flex;"><span>      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f1fa8c">&#34;${POSTGRES_PORT}:5432&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">volumes</span>:
</span></span><span style="display:flex;"><span>      - ./data:/var/lib/postgresql/data
</span></span><span style="display:flex;"><span>      - ./logs:/var/log/postgresql
</span></span><span style="display:flex;"><span>      - ./config/postgresql.conf:/etc/postgresql/postgresql.conf
</span></span><span style="display:flex;"><span>      - ./config/pg_hba.conf:/etc/postgresql/pg_hba.conf
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">command</span>: postgres -c &#39;config_file=/etc/postgresql/postgresql.conf&#39;
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">networks</span>:
</span></span><span style="display:flex;"><span>      - postgres-network
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">healthcheck</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">test</span>: [<span style="color:#f1fa8c">&#34;CMD-SHELL&#34;</span>, <span style="color:#f1fa8c">&#34;pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}&#34;</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">interval</span>: 10s
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">timeout</span>: 5s
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">retries</span>: <span style="color:#bd93f9">5</span>
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">start_period</span>: 10s
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">networks</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">postgres-network</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">driver</span>: bridge
</span></span></code></pre></div><h3 id="2-env-环境变量配置">2. .env 环境变量配置</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># PostgreSQL 配置环境变量
</span></span><span style="display:flex;"><span>POSTGRES_DB=test_db           # 数据库名称
</span></span><span style="display:flex;"><span>POSTGRES_USER=data           # 默认超级用户
</span></span><span style="display:flex;"><span>POSTGRES_PASSWORD=your_password  # 用户密码
</span></span><span style="display:flex;"><span>POSTGRES_PORT=5432          # 端口映射
</span></span></code></pre></div><h3 id="3-postgresqlconf-主要配置">3. postgresql.conf 主要配置</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 连接设置
</span></span><span style="display:flex;"><span>listen_addresses = &#39;*&#39;
</span></span><span style="display:flex;"><span>port = 5432
</span></span><span style="display:flex;"><span>max_connections = 100
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 内存设置
</span></span><span style="display:flex;"><span>shared_buffers = 128MB
</span></span><span style="display:flex;"><span>work_mem = 4MB
</span></span><span style="display:flex;"><span>maintenance_work_mem = 64MB
</span></span><span style="display:flex;"><span>effective_cache_size = 512MB
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 写入设置
</span></span><span style="display:flex;"><span>wal_level = replica
</span></span><span style="display:flex;"><span>max_wal_size = 1GB
</span></span><span style="display:flex;"><span>min_wal_size = 80MB
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 日志设置
</span></span><span style="display:flex;"><span>log_destination = &#39;stderr&#39;
</span></span><span style="display:flex;"><span>logging_collector = on
</span></span><span style="display:flex;"><span>log_directory = &#39;/var/log/postgresql&#39;
</span></span><span style="display:flex;"><span>log_filename = &#39;postgresql-%Y-%m-%d_%H%M%S.log&#39;
</span></span><span style="display:flex;"><span>log_rotation_age = 1d
</span></span><span style="display:flex;"><span>log_rotation_size = 10MB
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 区域设置
</span></span><span style="display:flex;"><span>datestyle = &#39;iso, mdy&#39;
</span></span><span style="display:flex;"><span>timezone = &#39;UTC&#39;
</span></span><span style="display:flex;"><span>lc_messages = &#39;en_US.utf8&#39;
</span></span></code></pre></div><h3 id="4-pg_hbaconf-访问控制配置">4. pg_hba.conf 访问控制配置</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># TYPE  DATABASE        USER            ADDRESS                 METHOD
</span></span><span style="display:flex;"><span>local   all            all                                     trust
</span></span><span style="display:flex;"><span>host    all            all             127.0.0.1/32           scram-sha-256
</span></span><span style="display:flex;"><span>host    all            all             ::1/128                scram-sha-256
</span></span><span style="display:flex;"><span>host    all            all             0.0.0.0/0              scram-sha-256
</span></span></code></pre></div><h2 id="使用说明">使用说明</h2>
<h3 id="1-启动服务">1. 启动服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 启动服务</span>
</span></span><span style="display:flex;"><span>docker-compose up -d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看服务状态</span>
</span></span><span style="display:flex;"><span>docker-compose ps
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看日志</span>
</span></span><span style="display:flex;"><span>docker-compose logs postgres
</span></span></code></pre></div><h3 id="2-连接数据库">2. 连接数据库</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 使用超级用户连接</span>
</span></span><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> postgres psql -U data -d test_db
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看用户列表和权限</span>
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">\d</span>u
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看数据库列表</span>
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">\l</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 退出psql</span>
</span></span><span style="display:flex;"><span><span style="color:#f1fa8c">\q</span>
</span></span></code></pre></div><h3 id="3-停止服务">3. 停止服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 停止服务</span>
</span></span><span style="display:flex;"><span>docker-compose down
</span></span></code></pre></div><h2 id="用户和权限管理">用户和权限管理</h2>
<p>PostgreSQL使用角色（Role）概念来管理用户权限。在我们的配置中：</p>
<ol>
<li>通过<code>POSTGRES_USER</code>环境变量创建的用户（本例中为&quot;data&quot;）是超级用户，具有所有权限：</li>
<li>Superuser（超级用户权限）</li>
<li>Create role（创建角色权限）</li>
<li>Create DB（创建数据库权限）</li>
<li>Replication（复制权限）</li>
<li></li>
</ol>
<p>Bypass RLS（绕过行级安全性）</p>
<ol start="7">
<li></li>
</ol>
<p>创建新用户示例：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff79c6">CREATE</span> <span style="color:#ff79c6">ROLE</span> username <span style="color:#ff79c6">WITH</span> LOGIN PASSWORD <span style="color:#f1fa8c">&#39;password&#39;</span>;
</span></span></code></pre></div><ol>
<li>授予权限示例：</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>GRANT ALL PRIVILEGES ON DATABASE dbname TO username;
</span></span></code></pre></div><h2 id="数据备份和恢复">数据备份和恢复</h2>
<h3 id="备份数据">备份数据</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 备份整个数据库</span>
</span></span><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> postgres pg_dump -U data test_db &gt; backup.sql
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 备份特定表</span>
</span></span><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> postgres pg_dump -U data -t table_name test_db &gt; table_backup.sql
</span></span></code></pre></div><h3 id="恢复数据">恢复数据</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 恢复数据</span>
</span></span><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> -T postgres psql -U data test_db &lt; backup.sql
</span></span></code></pre></div><h2 id="性能优化建议">性能优化建议</h2>
<ol>
<li>内存配置</li>
<li><code>shared_buffers</code>: 建议设置为系统内存的25%</li>
<li><code>effective_cache_size</code>: 建议设置为系统内存的50%</li>
<li></li>
</ol>
<p><code>work_mem</code>: 根据并发连接数调整</p>
<ol start="5">
<li></li>
</ol>
<p>写入性能</p>
<ol start="6">
<li><code>wal_buffers</code>: 建议设置为16MB</li>
<li><code>checkpoint_timeout</code>: 可根据写入压力调整</li>
<li></li>
</ol>
<p><code>max_wal_size</code>: 根据磁盘空间调整</p>
<ol start="9">
<li></li>
</ol>
<p>连接池</p>
<ol start="10">
<li>建议使用pgBouncer等连接池管理工具</li>
<li>避免频繁创建新连接</li>
</ol>
<h2 id="常见问题处理">常见问题处理</h2>
<ol>
<li>容器无法启动</li>
<li>检查端口占用：<code>lsof -i :5432</code></li>
<li>检查配置文件权限</li>
<li></li>
</ol>
<p>查看错误日志：<code>docker-compose logs postgres</code></p>
<ol start="5">
<li></li>
</ol>
<p>连接失败</p>
<ol start="6">
<li>确认用户名和密码正确</li>
<li>检查pg_hba.conf配置</li>
<li></li>
</ol>
<p>验证网络连接</p>
<ol start="9">
<li></li>
</ol>
<p>性能问题</p>
<ol start="10">
<li>检查慢查询日志</li>
<li>使用EXPLAIN分析查询计划</li>
<li>优化索引和查询语句</li>
</ol>
<h2 id="安全建议">安全建议</h2>
<ol>
<li>密码安全</li>
<li>使用强密码</li>
<li>定期更换密码</li>
<li></li>
</ol>
<p>避免在命令行中明文输入密码</p>
<ol start="5">
<li></li>
</ol>
<p>网络安全</p>
<ol start="6">
<li>限制访问IP</li>
<li>使用SSL连接</li>
<li></li>
</ol>
<p>定期更新PostgreSQL版本</p>
<ol start="9">
<li></li>
</ol>
<p>权限控制</p>
<ol start="10">
<li>遵循最小权限原则</li>
<li>使用角色管理权限</li>
<li>启用行级安全性（RLS）</li>
</ol>
<h2 id="维护建议">维护建议</h2>
<ol>
<li>定期维护</li>
<li>执行VACUUM操作</li>
<li>更新统计信息</li>
<li></li>
</ol>
<p>检查日志文件大小</p>
<ol start="5">
<li></li>
</ol>
<p>监控</p>
<ol start="6">
<li>监控连接数</li>
<li>监控磁盘使用</li>
<li></li>
</ol>
<p>监控查询性能</p>
<ol start="9">
<li></li>
</ol>
<p>备份策略</p>
<ol start="10">
<li>定期备份</li>
<li>测试恢复流程</li>
</ol>
]]></content:encoded></item><item><title>MySQL Docker开发环境配置指南</title><link>https://blog.heyaohua.com/posts/2024/03/mysql-docker-development-guide/</link><pubDate>Tue, 19 Mar 2024 11:00:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2024/03/mysql-docker-development-guide/</guid><description>重要配置说明： - - 容器异常退出时自动重启 - - 环境变量配置，支持从.env文件读取 - - 数据持久化配置，确保数据安全 - - 端口映射，允 …</description><content:encoded><![CDATA[<h1 id="如何使用docker启动mysql开发环境">如何使用Docker启动MySQL开发环境</h1>
<h2 id="目录结构">目录结构</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>MySQL_Docker/
</span></span><span style="display:flex;"><span>├── docker-compose.yml    # Docker Compose 配置文件
</span></span><span style="display:flex;"><span>├── .env                 # 环境变量配置
</span></span><span style="display:flex;"><span>├── config/
</span></span><span style="display:flex;"><span>│   └── my.cnf          # MySQL 配置文件
</span></span><span style="display:flex;"><span>├── data/               # MySQL 数据目录 (挂载)
</span></span><span style="display:flex;"><span>└── logs/               # MySQL 日志目录 (挂载)
</span></span></code></pre></div><h2 id="配置文件说明">配置文件说明</h2>
<h3 id="1-docker-composeyml-配置要点">1. docker-compose.yml 配置要点</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">version</span>: <span style="color:#f1fa8c">&#39;3.8&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">mysql</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">image</span>: mysql:8.0
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">container_name</span>: mysql-server
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">restart</span>: unless-stopped
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">environment</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">MYSQL_ROOT_PASSWORD</span>: ${MYSQL_ROOT_PASSWORD:-root123}
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">MYSQL_DATABASE</span>: ${MYSQL_DATABASE:-testdb}
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">MYSQL_USER</span>: ${MYSQL_USER:-testuser}
</span></span><span style="display:flex;"><span>      <span style="color:#ff79c6">MYSQL_PASSWORD</span>: ${MYSQL_PASSWORD:-testpass}
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f1fa8c">&#34;${MYSQL_PORT:-3306}:3306&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">volumes</span>:
</span></span><span style="display:flex;"><span>      - ./data:/var/lib/mysql
</span></span><span style="display:flex;"><span>      - ./logs:/var/log/mysql
</span></span><span style="display:flex;"><span>      - ./config/my.cnf:/etc/mysql/conf.d/my.cnf
</span></span></code></pre></div><p><strong>重要配置说明：</strong></p>
<ul>
<li><code>restart: unless-stopped</code> - 容器异常退出时自动重启</li>
<li><code>environment</code> - 环境变量配置，支持从.env文件读取</li>
<li><code>volumes</code> - 数据持久化配置，确保数据安全</li>
<li><code>ports</code> - 端口映射，允许外部访问</li>
</ul>
<h3 id="2-mysql配置文件-mycnf-要点">2. MySQL配置文件 (my.cnf) 要点</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>[mysqld]
</span></span><span style="display:flex;"><span># 基本设置
</span></span><span style="display:flex;"><span>port = <span style="color:#bd93f9">3306</span>
</span></span><span style="display:flex;"><span>bind-address = <span style="color:#bd93f9">0.0</span>.<span style="color:#bd93f9">0.0</span>
</span></span><span style="display:flex;"><span>default-storage-engine = InnoDB
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 字符集设置（重要）
</span></span><span style="display:flex;"><span>character-set-server = utf<span style="color:#bd93f9">8</span>mb<span style="color:#bd93f9">4</span>
</span></span><span style="display:flex;"><span>collation-server = utf<span style="color:#bd93f9">8</span>mb<span style="color:#bd93f9">4</span>_unicode_ci
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 连接设置
</span></span><span style="display:flex;"><span>max_connections = <span style="color:#bd93f9">200</span>
</span></span><span style="display:flex;"><span>max_connect_errors = <span style="color:#bd93f9">10</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 缓冲区设置
</span></span><span style="display:flex;"><span>innodb_buffer_pool_size = <span style="color:#bd93f9">256</span>M
</span></span><span style="display:flex;"><span>innodb_log_file_size = <span style="color:#bd93f9">64</span>M
</span></span><span style="display:flex;"><span>innodb_log_buffer_size = <span style="color:#bd93f9">16</span>M
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 日志设置
</span></span><span style="display:flex;"><span>log-error = /var/log/mysql/error.log
</span></span><span style="display:flex;"><span>slow_query_log = <span style="color:#bd93f9">1</span>
</span></span><span style="display:flex;"><span>slow_query_log_file = /var/log/mysql/slow.log
</span></span><span style="display:flex;"><span>long_query_time = <span style="color:#bd93f9">2</span>
</span></span></code></pre></div><p><strong>配置注意事项：</strong></p>
<ol>
<li>字符集必须设置为utf8mb4，以支持完整的Unicode字符集</li>
<li>根据服务器内存调整缓冲区大小</li>
<li>开启慢查询日志便于性能优化</li>
<li>MySQL 8.0已不支持查询缓存（query_cache）相关配置</li>
</ol>
<h3 id="3-环境变量配置-env">3. 环境变量配置 (.env)</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>MYSQL_ROOT_PASSWORD=your_root_password
</span></span><span style="display:flex;"><span>MYSQL_DATABASE=your_database
</span></span><span style="display:flex;"><span>MYSQL_USER=your_user
</span></span><span style="display:flex;"><span>MYSQL_PASSWORD=your_password
</span></span><span style="display:flex;"><span>MYSQL_PORT=3306
</span></span></code></pre></div><p><strong>安全注意事项：</strong></p>
<ul>
<li>生产环境必须修改默认密码</li>
<li>.env文件不要提交到版本控制系统</li>
<li>定期更换密码</li>
<li>避免使用弱密码</li>
</ul>
<h2 id="启动和维护">启动和维护</h2>
<h3 id="启动服务">启动服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker-compose up -d
</span></span></code></pre></div><h3 id="查看服务状态">查看服务状态</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker-compose ps
</span></span></code></pre></div><h3 id="查看日志">查看日志</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 查看容器日志</span>
</span></span><span style="display:flex;"><span>docker-compose logs mysql
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看错误日志</span>
</span></span><span style="display:flex;"><span>tail -f logs/error.log
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看慢查询日志</span>
</span></span><span style="display:flex;"><span>tail -f logs/slow.log
</span></span></code></pre></div><h3 id="停止服务">停止服务</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker-compose down
</span></span></code></pre></div><h2 id="常见问题处理">常见问题处理</h2>
<h3 id="1-容器无法启动或反复重启">1. 容器无法启动或反复重启</h3>
<ul>
<li>检查数据目录权限</li>
<li>查看错误日志（logs/error.log）</li>
<li>确认配置文件语法正确</li>
<li>验证端口是否被占用</li>
</ul>
<h3 id="2-连接失败">2. 连接失败</h3>
<ul>
<li>确认容器运行状态</li>
<li>检查端口映射</li>
<li>验证用户名密码</li>
<li>检查防火墙设置</li>
</ul>
<h3 id="3-性能问题">3. 性能问题</h3>
<ul>
<li>检查慢查询日志</li>
<li>调整缓冲区大小</li>
<li>优化索引</li>
<li>监控资源使用情况</li>
</ul>
<h2 id="数据备份建议">数据备份建议</h2>
<h3 id="1-使用docker-compose执行备份">1. 使用docker-compose执行备份</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> mysql mysqldump -u root -p database_name &gt; backup.sql
</span></span></code></pre></div><h3 id="2-自动备份脚本示例">2. 自动备份脚本示例</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#ff79c6">#!/bin/bash
</span></span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">backup_dir</span><span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;backups&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">date_format</span><span style="color:#ff79c6">=</span><span style="color:#ff79c6">$(</span>date +%Y%m%d_%H%M%S<span style="color:#ff79c6">)</span>
</span></span><span style="display:flex;"><span>docker-compose <span style="color:#8be9fd;font-style:italic">exec</span> -T mysql mysqldump -u root -p database_name &gt; <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">backup_dir</span><span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">/backup_</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">date_format</span><span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">.sql&#34;</span>
</span></span></code></pre></div><h2 id="安全建议">安全建议</h2>
<ol>
<li>网络安全</li>
<li>限制端口访问</li>
<li>使用专用网络</li>
<li></li>
</ol>
<p>启用SSL/TLS加密</p>
<ol start="5">
<li></li>
</ol>
<p>账户安全</p>
<ol start="6">
<li>定期更换密码</li>
<li>限制用户权限</li>
<li></li>
</ol>
<p>删除未使用的账户</p>
<ol start="9">
<li></li>
</ol>
<p>数据安全</p>
<ol start="10">
<li>定期备份</li>
<li>加密敏感数据</li>
<li>监控异常访问</li>
</ol>
<h2 id="性能优化建议">性能优化建议</h2>
<ol>
<li>硬件资源</li>
<li>适当分配内存</li>
<li>使用SSD存储</li>
<li></li>
</ol>
<p>监控CPU使用率</p>
<ol start="5">
<li></li>
</ol>
<p>配置优化</p>
<ol start="6">
<li>调整缓冲池大小</li>
<li>优化日志设置</li>
<li></li>
</ol>
<p>配置合适的连接数</p>
<ol start="9">
<li></li>
</ol>
<p>查询优化</p>
<ol start="10">
<li>建立合适的索引</li>
<li>优化SQL语句</li>
<li>定期维护统计信息</li>
</ol>
]]></content:encoded></item></channel></rss>