MySQL实现主从复制(一主一从)

本文详细介绍了在LNMP环境中安装MySQL并进行主从配置的过程。包括下载、安装MySQL,配置服务启动、修改root密码、远程登录权限,以及防火墙设置等步骤。此外,还提供了详细的主从配置指南,包括配置文件修改、数据库操作和状态验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境及程序安装
LNMP(centos7,mysql5.7)
1.下载MySQL安装

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

2.如果不存在wget命令,执行下一步

yum -y install wget

3.下载后安装源

yum -y localinstall mysql57-community-release-el7-11.noarch.rpm 

4.安装MySQL

yum -y install mysql-community-server

5.启动服务

systemctl start mysqld

6.设置开机启动

systemctl enable mysqld
systemctl daemon-reload

7.修改 root登录密码

vim /var/log/mysqld.log

在这里插入图片描述先复制密码,登录root,不过进去后必须马上修改密码,不然会报错误

mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpasseord';
新密码最好设置字母数字下划线,不然会出现密码不符合当前策略的错误

可以设置密码格式(基于密码长度,最少8位)

mysql> set global validate_password_policy=0;

8.远程登录

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

9.防火墙(可以选择关闭防火墙或开放3306端口)

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

二、主从配置(master/slave)
1.配置主

vim /etc/mysql/mysql.conf.d/mysqld.cnf

打开MySQL配置文件,添加

bind-address        = 0.0.0.0     ###       任意IP都可以连接                                   
server_id=1   ###只要和从机上的不同就行

重启master数据库
systemctl restart mysql
登录数据库

mysql -uroot -p

查看master状态

show master status;

在这里插入图片描述
分配一个数据库账号给Slave从数据库 Server,是从服务器能够访问Master数据库

grant replication slave on *.* to 'slave'@'centos-node7' identified by 'Admin@123'

2.配置从

vim /etc/my.cnf###修改配置文件
配置文件中添加添加
server-id=2###和主机不能相同

数据库上操作

change master to master_host='192.168.3.27', master_port=3306, master_user='root', master_password='Amin@123', master_log_file='mysql-bin.000002', master_log_pos=154;

开启从库

start slave

验证从库状态

mysql>show slave status\G;    ###当两条线程IO/SQL的状态都为yes,说明主从配置成功
### MySQL主从复制配置方法 #### 配置概述 MySQL主从复制种常见的数据库同步机制,用于实现数据的实时备份和高可用性。其基本原理是将库(Master)上的写操作记录到二进制日志中,从库(Slave)通过读取这些日志并应用其中的操作来保持与库的致性[^1]。 --- #### 库(Master)配置 在库上需要启用二进制日志功能,并设置唯的`server-id`。以下是具体的配置步骤: 1. 编辑库的配置文件`my.cnf`,添加或修改以下参数: ```ini [mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=testdb # 如果只需要同步特定数据库,则指定该参数 ``` 2. 重启MySQL服务以使更改生效: ```bash systemctl restart mysql ``` 3. 创建个用于主从复制的专用用户,并授予相应的权限: ```sql CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%'; FLUSH PRIVILEGES; ``` 4. 查看库状态以获取必要的信息(如`File`和`Position`),供后续从库配置使用: ```sql SHOW MASTER STATUS; ``` --- #### 从库(Slave)配置 从库需要连接到库并拉取二进制日志进行回放。以下是具体步骤: 1. 编辑从库的配置文件`my.cnf`,设置唯且不同于库的`server-id`: ```ini [mysqld] server-id=2 relay-log=mysql-relay-bin ``` 2. 同样重启MySQL服务以加载新配置: ```bash systemctl restart mysql ``` 3. 使用`CHANGE MASTER TO`命令配置从库指向库的信息: ```sql CHANGE MASTER TO MASTER_HOST='master_ip', -- 替换为库IP地址 MASTER_USER='replica_user', -- 复制用户的用户名 MASTER_PASSWORD='password', -- 复制用户的密码 MASTER_LOG_FILE='mysql-bin.000001', -- 来自库SHOW MASTER STATUS的结果 MASTER_LOG_POS=1234; -- 来自库SHOW MASTER STATUS的结果 ``` 4. 启动从库的复制进程: ```sql START SLAVE; ``` 5. 检查从库的状态以确认复制正常运行: ```sql SHOW SLAVE STATUS\G ``` 关键字段解释: - `Slave_IO_Running`: 表示I/O线程是否正在运行。 - `Slave_SQL_Running`: 表示SQL线程是否正在运行。 - `Last_Error`: 显示最近发生的错误(如果有)。 如果发现任何异常,可以根据提示排查问题[^2]。 --- #### 常见问题及解决方案 1. **从库无法连接库** - 确认库防火墙允许来自从库的连接。 - 检查库上的复制用户是否有足够的权限。 2. **从库`server-id`未生效** - 尝试按照以下方式修复[^3]: - 修改配置文件中的`server-id`为合法值,然后重启MySQL服务; - 或者直接在MySQL控制台执行以下命令: ```sql STOP SLAVE; SET GLOBAL server_id = 2023306; START SLAVE; ``` 3. **从延迟过高** - 检查网络状况以及库的压力情况。 - 调整从库的资源分配,或者优化查询性能。 4. **查看库状态失败** - 登录库容器后,可通过以下命令验证二进制日志状态[^4]: ```bash docker exec -it mysql /bin/bash mysql -uroot -proot SHOW MASTER STATUS; ``` --- ```python # 示例脚本:自动化检测主从复制状态 import pymysql def check_replication_status(host, user, password): try: connection = pymysql.connect( host=host, user=user, password=password, cursorclass=pymysql.cursors.DictCursor ) with connection.cursor() as cursor: cursor.execute("SHOW SLAVE STATUS;") result = cursor.fetchone() io_running = result['Slave_IO_Running'] sql_running = result['Slave_SQL_Running'] last_error = result['Last_Error'] print(f"IO Thread Running: {io_running}") print(f"SQL Thread Running: {sql_running}") if last_error: print(f"Error: {last_error}") except Exception as e: print(f"An error occurred: {e}") check_replication_status('slave_host', 'root', 'password') ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值