MySQL数据库同步那点事儿,手把手教你实际操作怎么弄才靠谱
- 问答
- 2026-01-05 06:13:38
- 22
说到MySQL数据库同步,说白了就是让两个或多个数据库保持数据一致,一个变了,其他的也跟着变,这事儿听起来高大上,但实际操作起来,只要你跟着步骤来,也没那么玄乎,今天咱们就聊最常用、也相对靠谱的一种方法:基于二进制日志(Binlog)的主从复制,你就把它想象成老板和秘书的关系,老板(主库)说的每一句话、做的每一个决定,秘书(从库)都拿小本本(Binlog)记下来,然后照着做一遍,这样秘书那里就有一份和老板一模一样的记录。
第一步:准备工作,把家伙事儿备齐
你得至少有两台安装了MySQL的服务器,一台当主库(Master),另一台或多台当从库(Slave),虚拟机、云服务器都行,只要它们之间网络能通,为了减少麻烦,建议主从库的MySQL大版本号尽量一致。
假设我们有两台机器:
- 主库IP:192.168.1.100
- 从库IP:192.168.1.101
第二步:配置主库(老板得发话)
-
开启Binlog日志:Binlog是同步的基石,主库必须开启,找到主库的MySQL配置文件,通常是
my.cnf或者my.ini,在[mysqld]这个段落下面,加上或修改这几行:[mysqld] log-bin=mysql-bin # 开启Binlog,并设置日志文件的前缀 server-id=1 # 给主库一个唯一的ID,这里设为1,从库不能重复改完保存,然后重启MySQL服务让配置生效。

-
创建一个用于复制的账号:不能让从库用root账号来连主库,这不安全,我们得专门创建一个账号,只给它复制的权限,登录主库的MySQL,执行以下命令:
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'SecurePassword123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101'; FLUSH PRIVILEGES;
这句的意思是:创建一个用户名为
repl,密码是SecurePassword123!的用户,并且只允许从168.1.101这个IP地址登录,授予它所有数据库的所有表的复制权限。 -
查看主库状态:这一步非常关键,我们要记下主库当前的一个“坐标”,从库之后要从这个坐标开始同步,继续在主库MySQL执行:
SHOW MASTER STATUS;
你会看到一个结果,类似这样: +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 把
File和Position这两个值牢牢记下来,一会儿配置从库要用,记下这个坐标后,暂时不要再对主库做任何数据操作,以免坐标改变。
第三步:配置从库(秘书要跟上)
-
配置从库的server-id:和主库类似,修改从库的MySQL配置文件,在
[mysqld]段落下加上:
[mysqld] server-id=2 # 设置一个唯一的ID,只要和主库不一样就行改完保存,重启从库的MySQL服务。
-
设置主库信息:登录从库的MySQL,执行一条命令,告诉从库:“你的老板是谁,怎么联系,从哪儿开始干活”。
CHANGE MASTER TO MASTER_HOST='192.168.1.100', -- 主库的IP地址 MASTER_USER='repl', -- 刚才在主库创建的那个账号 MASTER_PASSWORD='SecurePassword123!', -- 账号的密码 MASTER_LOG_FILE='mysql-bin.000001', -- 刚才记下的File名 MASTER_LOG_POS=154; -- 刚才记下的Position位置
这一步就像给秘书一张纸条,上面写着老板的办公室门牌号、秘书的工号和密码,以及工作记录本的第几页第几行开始抄。
-
启动同步:在从库上继续执行:
START SLAVE;
好了,秘书现在开始正式工作了。
第四步:检查同步状态,看看靠不靠谱

光启动了不行,得看看它干得顺不顺利,在从库上执行:
SHOW SLAVE STATUS\G
(这里用\G是为了让结果竖着显示,好看清楚)
在输出的一大堆信息里,你最需要关注的是这两行:
Slave_IO_Running: Yes:这表示从库的IO线程正常运行,正在从主库拉取Binlog日志。Slave_SQL_Running: Yes:这表示从库的SQL线程正常运行,正在执行拉取过来的SQL语句。
只要这两个都是 Yes,恭喜你,同步链路已经成功建立了!
你可以在主库里随便做个测试,比如创建一个数据库、一张表,或者插入一条数据,然后马上去从库查看,变化应该立刻(取决于网络延迟)就出现了。
再说几点实操中容易遇到的坑和注意事项:
- 数据一致性:如果你的主库在配置之前已经有数据了,那么在做上述步骤之前,必须先把主库的数据完整地导入到从库,可以用
mysqldump工具进行全量备份,然后在从库恢复,否则,从库从一个空库开始同步,肯定会报错。 - 网络是爹:主从同步严重依赖网络稳定性,如果网络经常断,同步可能会中断,上面提到的
SHOW SLAVE STATUS命令里如果看到错误信息,很多都是网络问题导致的。 - 版本兼容:虽然不同小版本一般兼容,但大版本差异太大可能会有问题,所以尽量保持主从版本一致最省心。
- 监控不能少:同步一旦搭好,不能就扔那不管了,要定期检查
Slave_IO_Running和Slave_SQL_Running的状态,或者部署一些监控脚本,一旦发现变成No了,能及时报警处理。
这套主从复制的方法,是MySQL世界里最经典、最成熟的同步方案,能满足大多数场景下的需求,比如做读写分离、备份、或者高可用架构的基础,你按照这个流程亲手走一遍,基本上就能把MySQL同步这事儿弄明白了。
本文由寇乐童于2026-01-05发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/74784.html
