下面为你整理了mysql 主从复制(日志核心)完整教程,聚焦 binlog(主库日志)、relay log(从库日志)的配置与管理,适配 mysql 5.7/8.0 版本,新手可直接跟着操作。
一、核心日志概念(先理解再配置)
主从复制的核心是日志同步,先搞懂 2 个关键日志:
| 日志类型 | 作用 | 存储位置(默认) |
|---|---|---|
| 二进制日志(binlog) | 主库记录所有数据修改操作(增删改、ddl),是主从同步的数据源 | /var/lib/mysql/mysql-bin.* |
| 中继日志(relay log) | 从库读取主库 binlog 后,本地保存的日志文件,从库执行该日志完成数据同步 | /var/lib/mysql/relay-log.* |
二、环境准备(必做)
| 角色 | ip | mysql版本 | 核心要求 |
|---|---|---|---|
| 主库(master) | 192.168.1.10 | 5.7/8.0 | 开启 binlog、唯一 server-id |
| 从库(slave) | 192.168.1.11 | 5.7/8.0 | 唯一 server-id、开启 relay log |
前置条件:
- 主从服务器网络互通(ping 通、3306 端口开放);
- 主从 mysql 版本尽量一致;
- 主从服务器时间同步(
ntpdate ntp.aliyun.com)。
三、主库配置(核心:开启 binlog)
步骤 1:修改主库配置文件
编辑 mysql 配置文件(不同系统路径不同):
# centos/rhel:/etc/my.cnf # ubuntu/debian:/etc/mysql/mysql.conf.d/mysqld.cnf sudo nano /etc/my.cnf
添加/修改以下配置(重点开启 binlog):
[mysqld] # 1. 必须:唯一server-id(主从不能重复,建议用ip最后一段) server-id = 10 # 2. 必须:开启binlog,指定日志前缀 log-bin = mysql-bin # 3. 可选:binlog格式(推荐row,最安全) binlog_format = row # 4. 可选:同步的数据库(仅同步db_test,不写则同步所有) # binlog-do-db = db_test # 5. 可选:忽略同步的数据库 # binlog-ignore-db = mysql # 6. 可选:binlog过期时间(自动清理,避免日志占满磁盘) expire_logs_days = 7
步骤 2:重启主库 mysql 生效
# centos 7+ sudo systemctl restart mysqld # ubuntu/debian sudo systemctl restart mysql
步骤 3:主库创建复制专用用户
登录主库 mysql,创建仅用于主从复制的用户(最小权限原则):
-- 登录主库 mysql -uroot -p -- 创建用户(mysql 5.7/8.0 通用,指定从库ip访问) create user 'repl'@'192.168.1.11' identified by 'repl@123456'; -- 授权复制权限(仅需replication slave) grant replication slave on *.* to 'repl'@'192.168.1.11'; -- mysql 8.0 需刷新权限(5.7可选) flush privileges;
步骤 4:查看主库 binlog 状态(关键!)
-- 主库执行,记录2个值:file、position show master status;
输出示例(后续从库配置需要这两个值):
+------------------+----------+--------------+------------------+-------------------+ | file | position | binlog_do_db | binlog_ignore_db | executed_gtid_set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | db_test | mysql | | +------------------+----------+--------------+------------------+-------------------+
四、从库配置(核心:同步主库 binlog 到 relay log)
步骤 1:修改从库配置文件
sudo nano /etc/my.cnf # 同主库路径规则
添加/修改配置:
[mysqld] # 1. 必须:唯一server-id(不能和主库重复) server-id = 11 # 2. 可选(默认开启):指定relay log前缀 relay-log = mysql-relay-bin # 3. 必须:关闭从库binlog(如果从库不做其他从库的主库) # log-bin = mysql-bin # 注释掉或删除 # 4. 可选:从库只读(避免直接修改从库数据) read_only = 1 # 5. 可选:超级用户也只读(mysql 5.7+) super_read_only = 1
步骤 2:重启从库 mysql
sudo systemctl restart mysqld # 同主库命令
步骤 3:配置从库连接主库(核心命令)
登录从库 mysql,执行以下命令(替换括号内的主库信息):
-- 登录从库 mysql -uroot -p -- 停止从库复制(首次配置先停止) stop slave; -- 配置主从连接(关键!替换以下参数) change master to master_host='192.168.1.10', -- 主库ip master_user='repl', -- 主库创建的复制用户 master_password='repl@123456', -- 复制用户密码 master_log_file='mysql-bin.000001', -- 主库show master status的file值 master_log_pos=154; -- 主库show master status的position值 -- 启动从库复制 start slave;
mysql 8.0 注意:如果主库默认认证插件是 caching_sha2_password,需在 change master to 后追加:
master_auth_plugin='mysql_native_password';
五、验证主从复制(日志同步状态)
1. 从库查看复制状态(核心命令)
show slave status\g;
重点看 2 个参数(均为 yes 则正常):
slave_io_running: yes→ 从库 io 线程正常(读取主库 binlog 到 relay log)slave_sql_running: yes→ 从库 sql 线程正常(执行 relay log 中的操作)
2. 日志同步测试
- 主库创建数据库/表/插入数据:
create database test_db; use test_db; create table t1 (id int); insert into t1 values (1);
- 从库查看是否同步:
show databases; -- 能看到test_db use test_db; select * from t1; -- 能查到id=1
六、日志管理(日常维护)
1. 查看 binlog(主库)
-- 查看所有binlog文件 show binary logs; -- 查看binlog内容(指定文件) show binlog events in 'mysql-bin.000001';
2. 查看 relay log(从库)
-- 查看relay log文件 show relaylog events in 'mysql-relay-bin.000001';
3. 清理过期日志(避免磁盘满)
-- 主库清理binlog(保留7天) purge binary logs before date_sub(now(), interval 7 day); -- 从库清理relay log purge relay logs before date_sub(now(), interval 7 day);
七、常见日志相关故障排查
| 故障现象 | 原因及解决方案 |
|---|---|
| slave_io_running: no | 1. 主库ip/端口/账号密码错误; 2. 主库binlog文件/位置错误; 3. 主从server-id重复; 4. 主库3306端口未开放。 |
| slave_sql_running: no | 1. 从库数据与主库不一致; 2. relay log 损坏(删除损坏的relay log,重新同步); 3. 从库执行了主库没有的操作。 |
| binlog 不生成 | 主库未开启 log-bin 或 server-id 未设置;重启主库后检查。 |
| relay log 持续增长 | 从库 sql 线程卡住,先修复 slave_sql_running,再清理过期relay log。 |
到此这篇关于mysql主从复制(日志核心)完整教程的文章就介绍到这了,更多相关mysql主从复制日志核心内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论