原作者:Etel Sverdlov 转载&翻译:https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql
如何在MySQL中设置主从复制
关于MySQL复制
MySQL复制是一个允许您通过将MySQL数据从主数据库自动复制到从数据库来轻松维护MySQL数据的多个副本的过程。这可能有很多原因,包括为数据设置备份,在不使用主数据库的情况下对其进行分析,或仅仅作为向外扩展的方法。
本教程将介绍一个非常简单的mysql复制示例 - 一个master将向单个slave发送信息。要使进程正常工作,您需要两个IP地址:一个主服务器和一个从服务器。
本教程将使用以下IP地址:
12.34.56.78-主数据库
12.23.34.45-从属数据库
PS:请自行更改IP地址 , 并事先配置好主从服务器的网段Subnet、网关GateWay、地址IPAdress、DNS。
建立
本文假设您拥有具有sudo权限的用户并安装了MySQL。如果您没有mysql,可以使用以下命令安装它:
sudo apt-get install mysql-server mysql-client
RHEL/Fedora/CentOS/Oracle系统的使用下面命令:
# 默认包管理命令,这里没有写版本号,目前来看默认是mysql8.0,如果需要安装特定版本,请 yum search mysql-server 查找 sudo yum install mysql-server mysql-client # 如果您已经安装了dnf包管理器,也可以使用下面命令: sudo dnf install mysql-server mysql-client
第一步 - 配置主数据库
打开主服务器上的mysql配置文件。
sudo nano /etc/mysql/my.cnf
进入该文件后,我们需要进行一些更改。
第一步是找到看起来像这样的部分,将服务器绑定到本地主机:
bind-address = 127.0.0.1
将标准IP地址替换为服务器的IP地址。
bind-address = 12.34.56.78
下一个配置更改是指位于[mysqld]部分中的server-id。您可以为此位置选择任意数字(从1开始可能更容易),但该数字必须是唯一的,并且不能与复制组中的任何其他服务器ID匹配。我要继续设置为 1号 节点。
# 确保取消注释此行。
server-id = 1
转到log_bin行。这是保留复制的真实细节的地方。从站将复制日志中注册的所有更改。对于此步骤,我们只需要取消注释引用log_bin的行:
log_bin = /var/log/mysql/mysql-bin.log
最后,我们需要指定将在从属服务器上复制的数据库。您可以通过为所需的所有数据库重复此行来包含多个数据库。
binlog_do_db = newdatabase
完成所有更改后,继续保存并退出配置文件。
刷新MySQL。
sudo service mysql restart
接下来的步骤将在MySQL shell中进行。
打开MySQL shell。
mysql -u root -p
我们需要为奴隶授予特权。您可以使用此行命名您的从站并设置其密码。该命令应采用以下格式:
GRANT REPLICATION SLAVE ON *。* to'slave_user'@'%' Identified by 'password' ;
接着输入下列命令:
flush privileges;
下一部分有点挑剔。要完成此任务,您需要打开一个新窗口或选项卡,以及您已经使用了几步的新窗口或选项卡。
在当前选项卡中 切换到“newdatabase”。
use newdatabase;
然后,锁定数据库以防止任何新的更改:
FLUSH TABLES WITH READ LOCK;
然后键入:
SHOW MASTER STATUS;
你会看到一个看起来像这样的表:
mysql> SHOW MASTER STATUS; + ------------------ + ---------- + -------------- + ---- -------------- + | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | + ------------------ + ---------- + -------------- + ---- -------------- + | mysql-bin.000001 | 107 | newdatabase | | + ------------------ + ---------- + -------------- + ---- -------------- + 1行(0.00秒)
这是从数据库开始复制的位置。记录这些数字,它们将在以后有用。
如果在同一窗口中进行任何新更改,数据库将自动解锁。因此,您应该打开新选项卡或窗口,然后继续执行后续步骤。
继续使用数据库仍然锁定,在新窗口中使用mysqldump导出数据库(确保在bash shell中输入此命令,而不是在MySQL中)。
mysqldump -u root -p --opt newdatabase> newdatabase.sql
现在,返回到原始窗口,解锁数据库(使其再次可写)。完成退出shell。
UNLOCK TABLES;
QUIT;
现在,您已完成master数据库的配置。
第二步 - 配置从属数据库
配置master数据库后。您可以搁置一段时间,我们现在将开始配置从属数据库。
登录到从属服务器,打开MySQL shell并创建将从主服务器复制的新数据库(然后退出):
CREATE DATABASE newdatabase;
EXIT;
导入先前从master数据库导出的数据库。
mysql -u root -p newdatabase </path/to/newdatabase.sql
现在我们需要以与主服务器相同的方式配置从服务器配置:
sudo nano /etc/mysql/my.cnf
我们必须确保在此配置中设置了一些内容。第一个是server-id。如前所述,这个数字必须是唯一的。由于它是默认设置(仍为1),因此请务必更改它的不同之处。
server-id = 2
在此之后,请确保您已正确填写以下三个条件:
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
您将需要添加relay-log行:默认情况下不存在。完成所有必要的更改后,保存并退出从属配置文件。
再次重启MySQL:
sudo service mysql restart
下一步是从MySQL shell中启用复制。
再次打开MySQL shell并输入以下详细信息,替换值以匹配您的信息:
CHANGE MASTER TO MASTER_HOST='12.34.56.78',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
该命令同时完成了几件事:
它将当前服务器指定为主服务器的从属服务器。
它为服务器提供正确的登录凭据
最后,它让从服务器知道从哪里开始复制; 主日志文件和日志位置来自我们之前写下的数字。
有了这个 ,您已经配置了主服务器和从服务器,激活从服务器:
START SLAVE;
您可以通过键入此命令来查看从复制的详细信息。\ G重新排列文本以使其更具可读性。
SHOW SLAVE STATUS\G
如果在连接时出现问题,您可以尝试使用命令启动slave以跳过它:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;
全部完成。
看更多
MySQL复制有很多不同的选择,这只是一个简短的概述。
英文原作者:Etel Sverdlov 翻译作者:Miazzy Chaos 英文原文:https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql