陈长禄 發表於 2026-1-7 09:22:58

MySQL单机多实例部署两种实用方案

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、方案一:手动复制实例文件,分别启动多实例</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.1 安装基础MySQL实例</a></li><li><a href="#_lab2_0_1">1.2 复制数据目录与启动脚本</a></li><li><a href="#_lab2_0_2">1.3 修改配置文件与启动脚本</a></li><li><a href="#_lab2_0_3">1.4 修复权限并启动实例</a></li><li><a href="#_lab2_0_4">1.5 测试多实例连接</a></li></ul><li><a href="#_label1">二、方案二:使用mysqld_multi工具集中管理多实例</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_5">2.1 准备目录与配置文件</a></li><li><a href="#_lab2_1_6">2.2 初始化多实例数据目录</a></li><li><a href="#_lab2_1_7">2.3 启动多实例并验证</a></li><li><a href="#_lab2_1_8">2.4 修改实例root密码</a></li><li><a href="#_lab2_1_9">2.5 管理多实例状态与启停</a></li></ul><li><a href="#_label2">三、两种方案对比与选择建议</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、注意事项</a></li><ul class="second_class_ul"></ul></ul></div><p>在实际运维工作中,MySQL多实例部署能有效节省服务器资源、隔离不同业务数据,同时方便统一管理。本文将详细介绍两种常用的MySQL多实例部署方案,包含完整操作步骤与关键命令,适用于Linux环境下的MySQL运维场景。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、方案一:手动复制实例文件,分别启动多实例</h2>
<p>该方案通过复制已安装的MySQL基础实例,修改配置文件与启动脚本实现多实例运行,适合实例数量较少、需灵活配置的场景。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.1 安装基础MySQL实例</h3>
<p>首先需在服务器上部署一个基础MySQL实例,可通过现成的安装脚本快速完成:</p>
<div class="jb51code"><pre class="brush:bash;"># 进入脚本目录
cd /data/scripts/
# 执行安装脚本(需确保脚本已提前准备)
sh mysql_install.sh</pre></div>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>1.2 复制数据目录与启动脚本</h3>
<p>基础实例安装完成后,需为新实例复制核心文件,同时清理冗余数据避免冲突:</p>
<ol><li>停止基础MySQL实例,防止文件占用:</li></ol>
<div class="jb51code"><pre class="brush:bash;">/etc/init.d/mysql.server stop</pre></div>
<ol start="2"><li>清空基础实例的日志文件与大数据库文件,减少复制体积:</li></ol>
<div class="jb51code"><pre class="brush:bash;"># 查看MySQL目录下文件大小
cd /data/mysql
du -sh *
# 清空日志文件(&gt; 符号表示清空文件内容,保留文件本身)
cd log/
ll -h
&gt;mysql-general.log
&gt;mysql-slow.log
&gt;mysql.err
# 清空大数据库文件(替换[大数据库文件]为实际文件名,如test_db)
cd ../data/
du -sh *
rm [大数据库文件]
# 查看磁盘空间,删除备份文件(若存在)
cd /data
du -sh *
df -Th
rm mysql_bak -rf</pre></div>
<ol start="3"><li>复制数据目录与启动脚本,新实例以端口3307区分(基础实例默认3306):</li></ol>
<div class="jb51code"><pre class="brush:bash;"># 复制数据目录,命名为mysql3307
cp -rf /data/mysql /data/mysql3307
# 复制启动脚本,命名为mysql3307.server
cp /etc/init.d/mysql.server /etc/init.d/mysql3307.server</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>1.3 修改配置文件与启动脚本</h3>
<p>新实例需修改路径、端口等关键配置,避免与基础实例冲突:</p>
<ol><li>修改启动脚本中的目录路径与锁文件名称:</li></ol>
<div class="jb51code"><pre class="brush:bash;"># 编辑新实例启动脚本
vim /etc/init.d/mysql3307.server
# 在vim编辑器中执行替换命令(全局替换数据目录路径)
:%s/\/data\/mysql/\/data\/mysql3307/g
# 修改锁文件路径,避免与基础实例争抢锁文件
lock_file_path="$lockdir/mysql3307"</pre></div>
<ol start="2"><li>修改新实例的MySQL配置文件(my.cnf):</li></ol>
<div class="jb51code"><pre class="brush:plain;"># 编辑新实例配置文件
vim /data/mysql3307/conf/my.cnf
# 全局替换数据目录路径
:%s/\/data\/mysql/\/data\/mysql3307/g
# 替换sock文件名称(用于本地连接标识)
:%s/mysql.sock/mysql3307.sock/g
# 替换端口号(从3306改为3307)
:%s/3306/3307/g</pre></div>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>1.4 修复权限并启动实例</h3>
<p>MySQL运行依赖mysql用户权限,需确保新实例目录属组正确:</p>
<ol><li>修改数据目录属组:</li></ol>
<div class="jb51code"><pre class="brush:bash;">chown mysql.mysql /data/mysql3307/ -R</pre></div>
<ol start="2"><li>启动基础实例与新实例,验证进程:</li></ol>
<div class="jb51code"><pre class="brush:bash;"># 启动两个实例
/etc/init.d/mysql.server start
/etc/init.d/mysql3307.server start
# 查看MySQL进程,确认两个实例均正常运行
ps -ef | grep mysql</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202879.png" /></p>
<p class="maodian"><a name="_lab2_0_4"></a></p><h3>1.5 测试多实例连接</h3>
<p>通过端口区分登录不同实例,验证部署结果:</p>
<div class="jb51code"><pre class="brush:bash;"># 登录基础实例(默认3306端口)
mysql -uroot -p
# 查看数据库列表
show databases;
exit;
# 登录3307端口的新实例
mysql -uroot -p -P 3307
# 查看数据库列表
show databases;
exit;
# 如需停止实例,执行以下命令
/etc/init.d/mysql.server stop
/etc/init.d/mysql3307.server stop</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202856.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202878.png" /></p>
<p class="maodian"><a name="_label1"></a></p><h2>二、方案二:使用mysqld_multi工具集中管理多实例</h2>
<p>mysqld_multi是MySQL官方提供的多实例管理工具,支持通过单个配置文件管理多个实例,适合实例数量较多、需统一运维的场景。</p>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>2.1 准备目录与配置文件</h3>
<p>首先创建实例数据目录与工具配置目录,规范文件结构:</p>
<ol><li>创建两个新实例(3311、3312端口)的数据目录:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mkdir -p /data/{mysql3311,mysql3312}/data</pre></div>
<ol start="2"><li>创建mysqld_multi的配置文件与日志目录:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mkdir -p /data/mysqld_multi/conf/
mkdir /data/mysqld_multi/log/</pre></div>
<ol start="3"><li>编写mysqld_multi配置文件(my.cnf):</li></ol>
<div class="jb51code"><pre class="brush:bash;">vim /data/mysqld_multi/conf/my.cnf</pre></div>
<p>配置内容如下(包含工具全局配置与两个实例的独立配置):</p>
<div class="jb51code"><pre class="brush:plain;">
# 指定mysqld_safe与mysqladmin路径(需根据实际安装路径调整)
mysqld   = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
# 工具运行日志路径
log      = /data/mysqld_multi/log/mysqld_multi.log
# 管理实例的默认账号密码(后续可修改)
user = root
pass = martin
# 3311端口实例配置

socket   = /data/mysql3311/data/mysql3311.sock# 实例本地连接标识
port       = 3311                                  # 端口号
pid-file   = /data/mysql3311/data/mysql3311.pid    # 进程ID文件
datadir    = /data/mysql3311/data/               # 数据目录
user       = mysql                                 # 运行用户
# 3312端口实例配置

socket   = /data/mysql3312/data/mysql3312.sock
port       = 3312
pid-file   = /data/mysql3312/data/mysql3312.pid
datadir    = /data/mysql3312/data/
user       = mysql</pre></div>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>2.2 初始化多实例数据目录</h3>
<p>新实例需初始化数据目录,生成系统表与临时root密码:</p>
<div class="jb51code"><pre class="brush:sql;"># 初始化3311实例(指定数据目录与运行用户)root@localhost: k*sN45P0NaWw
mysqld --datadir=/data/mysql3311/data/ --user=mysql --initialize
# 初始化3312实例 root@localhost: *V)kHsr47Try
mysqld --datadir=/data/mysql3312/data/ --user=mysql --initialize</pre></div>
<p><strong>关键注意</strong>:初始化过程中会生成临时root密码(类似&ldquo;root@localhost: Xxxxxxxx&rdquo;),需记录下来,后续登录需使用。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202842.png" /></p>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>2.3 启动多实例并验证</h3>
<p>通过mysqld_multi工具一键启动所有实例,简化操作:</p>
<ol><li>启动所有配置的实例:</li></ol>
<div class="jb51code"><pre class="brush:plain;">mysqld_multi --defaults-extra-file=/data/mysqld_multi/conf/my.cnf start</pre></div>
<ol start="2"><li>查看实例进程,确认启动状态:</li></ol>
<div class="jb51code"><pre class="brush:bash;">ps -ef | grep mysql</pre></div>
<p>正常情况下,会显示3311与3312端口对应的MySQL进程。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202880.png" /></p>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>2.4 修改实例root密码</h3>
<p>使用临时密码登录实例,修改为自定义密码(此处统一改为&ldquo;martin&rdquo;):</p>
<ol><li>登录3311实例(通过socket文件定位实例):</li></ol>
<div class="jb51code"><pre class="brush:bash;">mysql -uroot -p -S /data/mysql3311/data/mysql3311.sock</pre></div>
<p>输入初始化时记录的临时密码,登录后执行密码修改命令:</p>
<div class="jb51code"><pre class="brush:sql;">alter user user() identified by 'martin';
exit;</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202829.png" /></p>
<ol start="2"><li>同理修改3312实例密码:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mysql -uroot -p -S /data/mysql3312/data/mysql3312.sock
alter user user() identified by 'martin';
exit;</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202866.png" /></p>
<ol start="3"><li>使用新密码验证登录:</li></ol>
<div class="jb51code"><pre class="brush:bash;"># 登录3311实例
mysql -uroot -p -S /data/mysql3311/data/mysql3311.sock
# 登录3312实例
mysql -uroot -p -S /data/mysql3312/data/mysql3312.sock</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202895.png" /></p>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>2.5 管理多实例状态与启停</h3>
<p>mysqld_multi支持查看实例状态、单独启停实例,运维更灵活:</p>
<ol><li>查看所有实例状态:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mysqld_multi --defaults-extra-file=/data/mysqld_multi/conf/my.cnf report</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709202885.png" /></p>
<ol start="2"><li>单独停止3311实例:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mysqld_multi --defaults-extra-file=/data/mysqld_multi/conf/my.cnf stop 3311</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709203086.png" /></p>
<ol start="3"><li>单独启动3311实例:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mysqld_multi --defaults-extra-file=/data/mysqld_multi/conf/my.cnf start 3311</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709203074.png" /></p>
<ol start="4"><li>再次查看状态,确认3311实例已恢复运行:</li></ol>
<div class="jb51code"><pre class="brush:bash;">mysqld_multi --defaults-extra-file=/data/mysqld_multi/conf/my.cnf report</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010709203046.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>三、两种方案对比与选择建议</h2>
<table><thead><tr><th>对比维度</th><th>方案一(手动复制实例)</th><th>方案二(mysqld_multi工具)</th></tr></thead><tbody><tr><td>适用场景</td><td>实例数量少(2-3个)、需灵活配置</td><td>实例数量多(3个以上)、需统一管理</td></tr><tr><td>配置复杂度</td><td>每个实例单独修改配置,步骤繁琐</td><td>单个配置文件集中管理,配置简洁</td></tr><tr><td>运维效率</td><td>启停需执行不同脚本,效率低</td><td>一键启停所有实例,支持单独管理</td></tr><tr><td>学习成本</td><td>无需额外学习工具,易上手</td><td>需熟悉工具命令,有一定学习成本</td></tr></tbody></table>
<p><strong>选择建议</strong>:</p>
<ul><li>若业务仅需2-3个MySQL实例,且每个实例配置差异大,优先选方案一;</li><li>若需部署多个实例(如测试环境多版本验证、生产环境多业务隔离),优先选方案二,减少运维工作量。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>四、注意事项</h2>
<ol><li>端口冲突:部署前需确认端口未被占用(使用<code>netstat -tuln | grep 端口号</code>检查);</li><li>数据备份:操作前务必备份基础实例数据,避免误删或配置错误导致数据丢失;</li><li>权限控制:所有MySQL目录需归属mysql用户,避免权限不足导致实例启动失败;</li><li>生产环境:生产环境建议为每个实例配置独立的日志文件(错误日志、慢查询日志),便于问题排查。</li></ol>
<p>通过以上两种方案,可满足不同场景下的MySQL多实例部署需求,实际操作时需根据服务器环境与业务需求灵活调整命令路径与配置参数。</p>
頁: [1]
查看完整版本: MySQL单机多实例部署两种实用方案