百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

MySQL 主从数据库配置(mysql主从原理怎么配置文件)

wptr33 2025-03-13 21:06 26 浏览

最近在做主从数据库,数据备份,还有读写分离,将操作过程记录一下

一、环境准备

  1. 服务器信息
  2. 主库(Master):IP 192.168.1.100,MySQL 版本 ≥5.6
  3. 从库(Slave):IP 192.168.1.101,MySQL 版本与主库一致
  4. 网络要求
  5. 主从服务器间可互相访问(默认端口 3306 开放)。
  6. 确保主从库的 server-id 唯一。

二、主库(Master)配置

1.修改主库配置文件

编辑 MySQL 配置文件 my.cnf(路径通常为 /etc/my.cnf 或
/etc/mysql/mysql.conf.d/mysqld.cnf):

ini

复制

[mysqld]
# 主库唯一标识(必须唯一)
server-id = 1
# 开启二进制日志(核心配置)
log-bin = mysql-bin
# 二进制日志格式(建议使用ROW格式)
binlog_format = ROW
# 可选:指定需要复制的数据库(不配置则默认同步所有库)
# binlog_do_db = db1
# binlog_do_db = db2

重启 MySQL 服务:

bash

复制

systemctl restart mysqld

2.创建复制账号

登录主库 MySQL,创建用于复制的账号并授权:

sql

复制

-- 创建用户(用户名 repl,密码 repl_password)
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

3.获取主库当前 Binlog 状态

执行以下命令,记录 File 和 Position 的值(从库配置时需要):

sql

复制

SHOW MASTER STATUS;

输出示例:

复制

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154      |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

三、从库(Slave)配置

1.修改从库配置文件

编辑从库的 my.cnf:

ini

复制

[mysqld]
server-id = 2        # 唯一标识,不能与主库相同
relay-log = mysql-relay-bin  # 中继日志名称
read-only = 1         # 从库只读(可选,根据业务需求)

重启 MySQL 服务:

bash

复制

systemctl restart mysqld

2.配置主库连接信息

登录从库 MySQL,执行以下命令指定主库信息:

sql

复制

CHANGE MASTER TO
  MASTER_HOST = '192.168.1.100',  -- 主库 IP
  MASTER_USER = 'repl',           -- 主库复制账号
  MASTER_PASSWORD = 'repl_password',
  MASTER_PORT = 3306,             -- 主库端口
  MASTER_LOG_FILE = 'mysql-bin.000001',  -- 主库的 Binlog 文件名
  MASTER_LOG_POS = 154;           -- 主库的 Binlog 位置

3.启动复制线程

sql

复制

START SLAVE;

四、数据同步(若主库已有数据)

如果主库已有数据,需先将主库数据完整备份并导入从库:

1.主库备份数据

使用 mysqldump 备份数据(注意记录备份时的 Binlog 位置):

bash

复制

# 备份所有数据库(推荐锁表保证一致性)
mysqldump -u root -p --all-databases --master-data=2 > master_dump.sql
  • --master-data=2:在备份文件中记录主库的 File 和 Position。

2.导入数据到从库

将备份文件传输到从库服务器,并导入:

bash

复制

mysql -u root -p < master_dump.sql

3.重新配置从库

如果备份文件中已包含 File 和 Position,可直接使用备份文件中的值:

sql

复制

STOP SLAVE;
CHANGE MASTER TO ...;  -- 使用备份文件中的 MASTER_LOG_FILE 和 MASTER_LOG_POS
START SLAVE;

五、验证主从复制

1.检查从库复制状态

在从库执行:

sql

复制

SHOW SLAVE STATUS\G;

关注以下字段:

  • Slave_IO_Running:必须为 Yes(表示 I/O 线程正常)。
  • Slave_SQL_Running:必须为 Yes(表示 SQL 线程正常)。
  • Seconds_Behind_Master:表示复制延迟(0 表示无延迟)。
  • Last_IO_Error/Last_SQL_Error:错误信息(如有问题需排查)。

2.测试数据同步

  • 在主库执行写入操作(如建表、插入数据):
  • sql
  • 复制
  • CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table (id INT); INSERT INTO test_table VALUES (1);
  • 在从库查询是否同步成功:
  • sql
  • 复制
  • SELECT * FROM test_db.test_table;

六、常见问题处理

  1. Slave_IO_Running 为 No
  2. 检查主从网络连通性(telnet 主库IP 3306)。
  3. 验证复制账号权限和密码是否正确。
  4. 检查主库的 bind-address 是否允许从库连接。
  5. Slave_SQL_Running 为 No
  6. 查看 Last_SQL_Error 字段定位错误。
  7. 常见原因:主从数据不一致(如从库被手动写入数据)。
  8. 解决方法:重新同步数据或跳过错误(谨慎操作):
  9. sql
  10. 复制
  11. STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; -- 跳过1个错误 START SLAVE;

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...