MySQL主从同步

MySQL主从同步
原理:
1)主库将数据库的变更操作记录到Binlog日志文件中
2)从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中
3)从库读取中继日志信息在从库中进行Replay,更新从库数据信息

1、将主从节点的防火墙全部关闭 安装数据库

2、主节点参数修改
主库的参数配置如下:
/etc/my.cnf
#MASTER-SLAVE
server-id = 1
binlog-do-db=hr
#binlog-do-db=
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#expire_logs_days=7

参数说明:
server-id = 1 主节点的server-id,集群中每一台服务器的server-id都不允许相同
binlog-do-db=hr 你需要复制的库 hr
#binlog-do-db=test
binlog-ignore-db=mysql #不需要复制的库
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#expire_logs_days=7 binlog日志过期天数设置

3、重新启动mysql数据库服务
service mysql restart;

4、创建复制用户(主库)
GRANT ALL PRIVILEGES ON . TO ‘repl’@‘%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
FLUSH PRIVILEGES;

5、从节点参数配置
/etc/my.cnf
server-id = 2
read_only = 1
#super_read_only=1
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
master_info_repository=TABLE
relay_log_info_repository=TABLE
#relay_log_recovery=1

参数说明
server-id = 2
从服务器的server-id 不能和主服务器相同
read_only = 1
#super_read_only=1
设置从库只读状态,避免在从库上写操作,但该指令对超级管理员是无效的,mysql5.7增加了一个新的参数super_read_only,该参数使得超级管理员也无法进行写操作。但是super_read_only这个参数大部分都是关闭掉的
relay-log=slave-relay-bin
中转(中继)日志文件前缀名(base name) 也是默认在datadir目录下
relay-log-index=slave-relay-bin.index
中转(中继)日志后缀名,默认host_name-relay-bin.index,在datadir目录下。
master_info_repository=TABLE 把master.info(主从状态,配置信息)记录下来,默认记录到file里面,建议使用表记录
relay_log_info_repository=TABLE
realy_log_info_repository用来决定slave同步的位置信息记录在哪里,同样有两个参数。如果relay_log_info_repository=file,就会创建一个realy-log.info,如果relay_log_info_repository=table,就会创建mysql.slave_relay_info表来记录同步的位置信息。
#relay_log_recovery=1 #从机禁止写
为了让从库是crash safe的必须要设置relay_log_recovery=1,该参数的含义是:当从库发生崩溃或重启时,它会把那些未做完的中继日志删除,并向主库重新获取日志,再次产生中继日志的恢复,建议在从库上开启relay_log_recovery参数,默认是关闭的。当然了你为了从库得到更好的优化效果的话,请把它关掉

6、获取主库状态信息
show master status\G;

7、配置从库信息,从库mysql输入如下命令
change master to
master_host=‘192.168.100.111’,
master_port=3306,
master_user=‘repl’,
master_password=‘123456’,
master_log_file=‘mysql-bin-3306.000001’,
master_log_pos=604;

8、启动从库 进行测试
start slave;
show slave status \G;

如果你的虚拟机崩溃了恢复后导致无法同步,或者你多次配置从库的主库信息初始化阶段失败的话。
报错信息为:初始化信息失败
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log
先执行
reset slave; 清空你之前的配置的从库信息
然后再重启从库
start slave;

### MySQL 主从同步配置教程 MySQL主从同步是一种常见的数据库复制技术,通过该技术可以实现数据的高可用性和负载均衡。以下是关于MySQL主从同步的具体配置方法以及常见问题及其解决方案。 #### 配置步骤概述 1. **环境准备** 在开始配置之前,需要确保主服务器和从服务器均已正确安装并运行MySQL服务[^3]。此外,还需要确认两台服务器之间的网络连通性正常,并设置好相应的防火墙规则以允许必要的端口通信(默认为3306)。 2. **主服务器配置** - 授权从服务器连接:在主服务器上执行`GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password';`命令授予从服务器权限。 - 修改主服务器配置文件(通常是`my.cnf`),添加以下内容: ```ini log-bin=mysql-bin server-id=1 binlog-do-db=test_db ``` 上述配置启用了二进制日志功能,并设置了唯一的server-id[^4]。 - 重启MySQL服务使更改生效。 - 登录MySQL控制台,验证二进制日志是否已启用:`SHOW MASTER STATUS;` 3. **从服务器配置** - 修改从服务器的配置文件,同样需要指定唯一的服务ID号: ```ini server-id=2 relay-log=mysql-relay-bin replicate-do-db=test_db ``` - 重启MySQL服务。 - 执行以下命令完成剩余参数配置: ```sql CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.xxxxxx', MASTER_LOG_POS=yyyyyy; START SLAVE; ``` 4. **验证同步状态** 使用`SHOW SLAVE STATUS\G;`查看同步状态。如果一切正常,则可以看到`Slave_IO_Running: Yes` 和 `Slave_SQL_Running: Yes` 的输出结果。 --- ### 常见问题及解决方案 1. **UUID冲突问题** 当启动从库时遇到错误提示:“Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs”,这表明主从服务器具有相同的UUID值。可以通过删除旧的数据目录下的auto.cnf文件来解决此问题[^1]。 2. **初始数据导入不一致** 若未先将主服务器中的现有数据导出至从服务器,在后续同步过程中可能出现数据丢失或异常情况。建议按照以下方式处理: - 锁定主服务器上的表格以防修改:`FLUSH TABLES WITH READ LOCK;` - 导出整个数据库结构与数据:`mysqldump --all-databases --single-transaction > dbdump.sql` - 将生成好的备份文件传输到从服务器并恢复之[^2]。 3. **延迟过高现象** 如果发现从节点落后于主节点较多时间单位,可能是因为某些大型事务耗尽了资源所致。优化策略包括但不限于调整缓冲区大小、增加硬件性能指标或者考虑采用半同步机制减少潜在风险。 4. **SQL线程停止工作** 出现类似“Last_Error”的报错信息意味着存在语法差异或者其他兼容性障碍阻止进一步操作继续推进下去。仔细检查对应位置处具体发生了什么状况之后再采取相应措施予以纠正即可恢复正常运作模式。 --- ```python # 示例Python脚本用于监控MySQL主从延时 import mysql.connector def check_replication_delay(host, user, password): cnx = mysql.connector.connect(user=user, password=password, host=host,database="information_schema") cursor = cnx.cursor() query = ("SELECT Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master FROM SLAVE_STATUS;") cursor.execute(query) result = cursor.fetchone() io_running, sql_running, delay = result if not (io_running == "Yes" and sql_running == "Yes"): print(f"Replication is broken! IO Running:{io_running}, SQL Running:{sql_running}") elif delay > 60: print(f"High Replication Delay detected ({delay} seconds).") check_replication_delay('localhost','root','your_password') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值