
主库(Master):负责写(增删改)
从库(Slave):负责读(查询)、备份、高可用
**原理:**主库生成 binlog → 从库拉取并执行,实现数据一致
主从 MySQL 版本最好一致
主从服务器网络互通
主库开启 binlog
主库创建复制专用账号(REPLICATION SLAVE)
[mysqld]
# 必须开启binlog
log_bin=mysql-bin
# 唯一ID,不能和从库一样
server_id=1
# 要同步的库(可选)
# binlog_do_db = test
# 忽略的库(可选)
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
# 以下可选,建议加上
expire_logs_days = 7
binlog_format = ROW
重启主节点 mysql
systemctl restart mysqld
-- REPLICATION SLAVE, REPLICATION CLIENT 主从复制的权限
CREATE USER 'repl'@'192.168.%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
得到类似:
mysql-bin.000001156[mysqld]
server_id=2 # 必须和主库不同
read_only=1 # 从库只读(普通用户不能写)
重启 mysql
systemctl restart mysqld
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001', -- 主库查到的
MASTER_LOG_POS=156; -- 主库查到的
GET_SOURCE_PUBLIC_KEY=1; # mysql8.0
START SLAVE;
SHOW SLAVE STATUS\G
同步成功:
Slave_IO_Running: YesSlave_SQL_Running: Yes# 停止
STOP SLAVE;
# 重置
RESET SLAVE;
# 跳过错误(偶尔出错用)
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;