三更 發表於 2026-2-27 10:37:00

MYSQL主从配置

<h1 class="md-end-block md-heading"><span class="md-plain md-expand">1、Mysql主从配置</span></h1>
<p class="md-end-block md-p"><span class="md-plain">MySQL的主备(主从)配置是一种常见的</span><span class="md-pair-s "><strong><span class="md-plain">数据高可用性和数据备份方案</span></strong></span><span class="md-plain">,主要用于实现数据的实时复制,确保数据的一致性和系统的容错能力。下面我将详细介绍如何配置MySQL的主备环境。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">1.1、 环境准备</span></h2>
<p class="md-end-block md-p"><span class="md-plain">确保你的服务器上已经安装了MySQL,并且至少有两台服务器,一台作为主服务器(Master),另一台作为从服务器(Slave)。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">2. 配置主服务器(Master)</span></h2>
<h3 class="md-end-block md-heading"><span class="md-plain">修改配置文件</span></h3>
<p class="md-end-block md-p"><span class="md-plain">在主服务器的MySQL配置文件(通常是</span><span class="md-pair-s" spellcheck="false"><code>my.cnf</code></span><span class="md-plain">或</span><span class="md-pair-s" spellcheck="false"><code>my.ini</code></span><span class="md-plain">)中添加或修改以下配置:</span></p>
<pre class="language-ini highlighter-hljs" data-dark-theme="true"><code>&nbsp;
&nbsp;server-id = 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 唯一的服务ID,Master设为1
&nbsp;log-bin = mysql-bin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 启用二进制日志
&nbsp;binlog-do-db = your_database &nbsp; # 需要复制的数据库名,可多行配置多个数据库
binlog-ignore-db = performance_schema       # 设置不需要同步的数据库,如mysql数据库(配置了该项,需要复制的数据库不配置,则除此数据库外其余数据库全部复制)</code></pre>
<p class="md-end-block md-p"><span class="md-plain">重启mysql服务</span></p>
<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>systemctl restart mysqld</code></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">创建复制用户</span></h3>
<p class="md-end-block md-p"><span class="md-plain">登录MySQL,创建一个用于复制的专用用户:</span></p>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded highlighter-hljs" lang="perl" spellcheck="false" data-dark-theme="true"><code>&nbsp;# 创建用户并设置密码
&nbsp;# 创建一个名为 replicator 的用户,@'%' 表示该用户可以从任何主机(远程或本地)连接数据库 IDENTIFIED BY 'password'•:为用户设置密码为 password
&nbsp;CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
&nbsp;# MySQL 中用于配置复制权限的 SQL 命令,命令解析如下:
&nbsp;# GRANT REPLICATION SLAVE•:授予复制权限,允许用户进行数据同步操作。
&nbsp;# ON *.*:表示对所有数据库和表生效。
&nbsp;# TO 'replicator'@'%':将权限授予用户 replicator,并允许该用户从任何主机连接(% 表示任意主机)
&nbsp;GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
&nbsp;​
&nbsp;FLUSH PRIVILEGES; # 配置生效</code></pre>
<h4 class="md-end-block md-heading"><span class="md-plain">查看二进制日志位置和文件名</span></h4>
<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>SHOW MASTER STATUS;</code></span></p>
<p class="md-end-block md-p"><span class="md-plain">记录下</span><span class="md-pair-s" spellcheck="false"><code>File</code></span><span class="md-plain">和</span><span class="md-pair-s" spellcheck="false"><code>Position</code></span><span class="md-plain">的值,稍后配置从服务器时会用到。</span></p>
<p class="md-end-block md-p"><span class="md-plain">查看二进制日志文件是否开启:<code>SHOW VARIABLES LIKE 'log_bin';</code>on :开启<br></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">3. 配置从服务器(Slave)</span></h2>
<h3 class="md-end-block md-heading"><span class="md-plain">修改配置文件</span></h3>
<p class="md-end-block md-p"><span class="md-plain">在从服务器的MySQL配置文件中添加或修改以下配置:</span></p>
<pre class="language-ini highlighter-hljs" data-dark-theme="true"><code>
server-id = 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 唯一的服务ID,Slave设为2,与Master不同
relay-log = slave-relay-bin &nbsp; &nbsp;# 中继日志文件名,可选配置 表示中继日志文件将从 slave-relay-bin.000001 开始命名,系统会自动管理后续文件的编号
read_only = 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 从服务器设置为只读模式,可选配置,防止误操作修改数据,0:读写,1:只读</code></pre>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">重启MySQL服务</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-pair-s" spellcheck="false"><code>systemctl restart mysqld</code></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">配置复制源(Slave连接Master)</span></h3>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">登录从服务器的MySQL,执行以下命令:</span></p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>CHANGE MASTER TO MASTER_HOST='master_ip',MASTER_USER='replicator',MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=123;
# 说明如下:
# MASTER_HOST='master_ip', &nbsp; &nbsp; &nbsp; # 主服务器IP地址
# MASTER_USER='replicator', &nbsp; &nbsp; &nbsp;# 复制用户名称
# MASTER_PASSWORD='password', &nbsp; &nbsp;# 复制用户密码
# MASTER_LOG_FILE='mysql-bin.000001', &nbsp;# 从SHOW MASTER STATUS得到的File值
# MASTER_LOG_POS=123; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 从SHOW MASTER STATUS得到的Position值</code></pre>
<p class="md-end-block md-p"><span class="md-plain">注意替换</span><span class="md-pair-s" spellcheck="false"><code>master_ip</code></span><span class="md-plain">、</span><span class="md-pair-s" spellcheck="false"><code>password</code></span><span class="md-plain">、</span><span class="md-pair-s" spellcheck="false"><code>mysql-bin.000001</code></span><span class="md-plain">和</span><span class="md-pair-s" spellcheck="false"><code>123</code></span><span class="md-plain">为实际的IP地址、密码和日志位置。</span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">启动复制线程</span></h3>
<p>启动复制线程:<code>START SLAVE;</code></p>
<p>查看从库状态:<code>SHOW SLAVE STATUS\G;</code></p>
<p class="md-end-block md-p"><span class="md-plain">检查</span><span class="md-pair-s" spellcheck="false"><code>Slave_IO_Running</code></span><span class="md-plain">和</span><span class="md-pair-s" spellcheck="false"><code>Slave_SQL_Running</code></span><span class="md-plain">两个字段是否都为</span><span class="md-pair-s" spellcheck="false"><code>Yes</code></span><span class="md-plain">,以确认复制正常运行。</span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">4、测试和验证配置</span></h3>
<p class="md-end-block md-p"><span class="md-plain md-expand">在主服务器上执行一些数据库操作,然后检查从服务器上的相应数据库是否同步了这些操作。如果一切正常,你的MySQL主备配置就成功了。</span></p>
<p class="md-end-block md-p"><span class="md-plain md-expand">如果没有同步,建议按照以下步骤检查后,再试</span></p>
<ol>
<li class="md-end-block md-p"><span class="md-plain md-expand">检查主库是否开始二进制日志文件</span></li>
<li class="md-end-block md-p"><span class="md-plain md-expand">重新关闭再开启从库复制线程</span></li>
<li class="md-end-block md-p"><span class="md-plain md-expand">查看从库复制线程状态是否正常</span></li>
</ol>
<h3><span class="md-plain md-expand">5、清除主库二进制文件</span></h3>
<p><span class="md-plain md-expand">以此二进制文件为例:<code>mysql-bin.000577</code></span></p>
<p class="marklang-paragraph">在MySQL主从配置后,‌<strong>不能直接删除主库的&nbsp;<code>mysql-bin.000577</code>&nbsp;文件</strong>‌,否则会导致主从复制中断,从库无法同步数据,甚至引发数据不一致。</p>
<p class="marklang-paragraph">是否能删除该文件,取决于‌<strong>从库是否已经完全读取并应用了该日志文件中的所有变更</strong>‌。如果从库仍在使用该文件,删除后从库会报错并停止复制。</p>
<p class="marklang-paragraph">要安全删除&nbsp;<code>mysql-bin.000577</code>,必须使用MySQL提供的命令,而非直接删除文件系统中的文件。以下是推荐的操作步骤:</p>
<p class="marklang-paragraph">1、检查从库同步状态</p>
<p class="marklang-paragraph">在从库上执行以下命令,查看从库当前读取的binlog文件和位置:</p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>SHOW SLAVE STATUS\G</code></pre>
<p class="marklang-paragraph">关注两个关键字段:</p>
<ul>
<li><code>Master_Log_File</code>:从库当前正在读取的主库binlog文件名。</li>
<li><code>Read_Master_Log_Pos</code>:从库已读取到该文件中的位置。</li>
</ul>
<p class="marklang-paragraph">如果&nbsp;<code>Master_Log_File</code>&nbsp;的值是&nbsp;<code>mysql-bin.000577</code>&nbsp;或更早的文件,说明从库仍在使用该文件,‌<strong>此时不能删除</strong>‌。</p>
<p><span class="md-plain md-expand">2、确认从库已处理完该文件</span></p>
<p><span class="md-plain md-expand">确认从库不再需要后,在主库客户端执行以下命令删除该文件及之前的所有binlog:</span></p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>PURGE BINARY LOGS TO 'mysql-bin.000578';</code></pre>
<p>&nbsp;这条命令会删除&nbsp;<code>mysql-bin.000577</code>&nbsp;及之前的所有binlog文件,但保留&nbsp;<code>mysql-bin.000578</code>&nbsp;及之后的文件。</p>
<p class="marklang-paragraph">或者,如果想按时间删除(例如删除2026年2月5日之前的所有日志):</p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>PURGE BINARY LOGS BEFORE '2026-02-05 00:00:00';</code></pre>
<h3>5.1、推荐的长期管理策略</h3>
<p>为避免手动操作的麻烦和风险,建议配置‌<strong>自动清理机制</strong>‌:</p>
<p><strong>MySQL 8.0+</strong>‌(推荐):</p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>SET GLOBAL binlog_expire_logs_seconds = 604800; -- 保留7天(单位:秒)</code></pre>
<p>‌<strong>MySQL 5.7 及之前</strong>‌:</p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>SET GLOBAL expire_logs_days = 7; -- 保留7天</code></pre>
<p class="md-end-block md-p">修改后,建议将参数写入配置文件(如&nbsp;<code>my.cnf</code>)以永久生效:</p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>
binlog_expire_logs_seconds = 604800</code></pre>
<blockquote>
<p class="md-end-block md-p">‌<strong>重要提醒</strong>‌:在删除任何binlog前,务必确保从库同步正常,且已对关键数据进行备份。误删正在使用的binlog将导致主从复制永久中断,恢复难度极大。‌</p>
</blockquote>
<h4 class="md-end-block md-p">修改单个二进制存储大小</h4>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>SET GLOBAL max_binlog_size = 1073741824;-- 设置单个binlog文件的最大大小为1GB</code></pre>
<p>或者将参数写入配置文件(如&nbsp;<code>my.cnf</code>)以永久生效:</p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>
max_binlog_size = 1073741824-- 设置单个binlog文件的最大大小为1GB</code></pre>
<p>重启mysql服务端即可生效</p>
<p class="md-end-block md-p"><strong>查看修改后的配置信息:</strong></p>
<pre class="language-sql highlighter-hljs" data-dark-theme="true"><code>-- 查看配置二进制日志保留日期
show variables like 'expire_logs_days';

-- 查看配置二进制单个文件存储大小
show variables like 'innodb_log_file_size';</code></pre>
<p class="md-end-block md-p">&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    无论风雨,和自己一决胜负吧<br><br>
来源:https://www.cnblogs.com/aerfazhe/p/19130756
頁: [1]
查看完整版本: MYSQL主从配置