# demo/mysql

> 原生 MySQL 8.4 试点模板：单节点实例与三节点 InnoDB Cluster

---

LLMS index: [llms.txt](/llms.txt)

---

`demo/mysql` 是原生 MySQL 8.4 LTS 试点模块的四节点示例，与 [`conf/mysql.yml`](/docs/conf/mysql/) 中通过 OpenHalo 提供 MySQL 协议兼容的 PostgreSQL 内核不是同一实现。


--------

## 配置概览

- 配置名称：`demo/mysql`
- 节点数量：4 个
- `my-meta`：单节点 MySQL 8.4
- `my-test`：三节点、单主模式 InnoDB Cluster，每个成员运行 MySQL Router
- 模块状态：MYSQL PILOT，不计入正式模块数量
- 平台边界：支持声明的 x86_64 RPM/DEB 平台及 EL9/EL10 aarch64；Oracle APT 当前没有 arm64 组件，因此 Debian/Ubuntu ARM 会被前置检查拒绝

模板中的所有 `CHANGE_ME` 值必须替换，且真实部署需要明确审批。先做只读预检：

```bash
ansible-playbook -i conf/demo/mysql.yml mysql.yml -l my-meta --check
ansible-playbook -i conf/demo/mysql.yml mysql.yml -l my-test --check
```

确认要写入活动清单后，再执行 `./configure -c demo/mysql`，并对相同的完整集群范围依次运行 `node.yml` 与 `mysql.yml` 的 `--check` 和真实收敛。三节点集群不接受部分成员范围。


--------

## 配置内容

源文件地址：[`pigsty/conf/demo/mysql.yml`](https://github.com/pgsty/pigsty/blob/main/conf/demo/mysql.yml)

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#==============================================================#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># File      :   mysql.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Desc      :   MySQL 8.4 LTS standalone and three-node HA template</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Ctime     :   2026-07-16</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Mtime     :   2026-07-19</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Docs      :   https://pigsty.io/docs/mysql</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># License   :   Apache-2.0 @ https://pigsty.io/docs/about/license/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Copyright :   2018-2026  Ruohang Feng / Vonng (rh@vonng.com)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#==============================================================#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Canonical four-node MySQL platform example:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   my-meta: one standalone member</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   my-test: three-member InnoDB Cluster in single-primary mode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># This file is a template, not the active deployment inventory. Replace every</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># CHANGE_ME value and review the target addresses before configure or playbooks;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># MySQL preflight rejects any canonical CHANGE_ME credential left in place.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Native Oracle 8.4 packages are admitted on x86_64 and EL9/EL10 aarch64. Oracle&#39;s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># APT repository currently has no arm64 component, so Ubuntu/Debian ARM is rejected.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Read-only template preview (does not rewrite active pigsty.yml):</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ansible-playbook -i conf/demo/mysql.yml mysql.yml -l my-meta --check</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ansible-playbook -i conf/demo/mysql.yml mysql.yml -l my-test --check</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Each limit must include every declared member of the selected cluster group;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># partial HA member limits are rejected before any package or service change.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># After explicit approval to update active inventory, run ./configure -c demo/mysql,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># then repeat node.yml/mysql.yml --check with the same explicit limits.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># node.yml owns the shared trusted CA at /etc/pki/ca.crt; mysql.yml installs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># only MySQL/Router leaf certificates and requires node_ca to be complete.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Real playbooks install/start services and require explicit approval.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">all</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">children</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">infra</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">infra_seq</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">my-meta</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">mysql_seq</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">mysql_cluster</span><span class="p">:</span><span class="w"> </span><span class="nt">my-meta, node_cluster</span><span class="p">:</span><span class="w"> </span><span class="l">my-meta }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">my-test</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.11</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">mysql_seq</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.12</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">mysql_seq</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.13</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">mysql_seq</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">mysql_cluster</span><span class="p">:</span><span class="w"> </span><span class="nt">my-test, node_cluster</span><span class="p">:</span><span class="w"> </span><span class="l">my-test }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v4.5.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">admin_ip</span><span class="p">:</span><span class="w"> </span><span class="m">10.10.10.10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">default                   </span><span class="w"> </span><span class="c"># default | china; china uses USTC for MySQL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">repo_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">               </span><span class="c"># use signed upstream repositories directly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_repo_modules</span><span class="p">:</span><span class="w"> </span><span class="l">node,infra,mysql</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># For a Pigsty local/offline repository, enable repo and cache the complete</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># atomic platform set before provisioning targets:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># repo_enabled: true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># repo_extra_packages: [mysql]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nodename_overwrite</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_tune</span><span class="p">:</span><span class="w"> </span><span class="l">oltp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">mysql_root_password</span><span class="p">:</span><span class="w"> </span><span class="l">CHANGE_ME_MYSQL_ROOT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">mysql_monitor_password</span><span class="p">:</span><span class="w"> </span><span class="l">CHANGE_ME_MYSQL_MONITOR</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">mysql_cluster_password</span><span class="p">:</span><span class="w"> </span><span class="l">CHANGE_ME_MYSQL_CLUSTER</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Fixed MySQL 8.4, auto-tuned memory, daily local backup, and exporter are defaults.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Pigsty infrastructure credentials; replace before deployment.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">grafana_admin_password</span><span class="p">:</span><span class="w"> </span><span class="l">CHANGE_ME_GRAFANA_ADMIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">grafana_view_password</span><span class="p">:</span><span class="w"> </span><span class="l">CHANGE_ME_GRAFANA_VIEW</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">haproxy_admin_password</span><span class="p">:</span><span class="w"> </span><span class="l">CHANGE_ME_HAPROXY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span></code></pre></div>


--------

## 配置解读

- MySQL 服务端、客户端、Shell、Router 与 XtraBackup 固定为 8.4 平台，不提供任意版本安装器。
- 单节点使用 `3306`；三节点还使用 Group Replication `33061`，并在每个成员提供 Router RW `6446` 与 RO `6447`。
- 默认启用每天一次的本地全量 XtraBackup 与 `mysqld_exporter`；当前试点不提供连续 binlog 归档、PITR 或自动恢复。
- `node.yml` 负责安装共享信任锚 `/etc/pki/ca.crt`；MySQL 角色只签发并安装叶子证书。

完整约束与移除确认流程参见 [原生 MySQL 试点文档](/docs/mysql/)。
