设置主库(Master)
修改配置
/etc/my.cnf(windows系统my.ini)
[mysqld]
binlog-format=row
server-id=1 # 主库的唯一 ID
log-bin=mysql-bin # 启用二进制日志,主从复制依赖于此
binlog-do-db=your_database # 需要同步的数据库名称,多个数据库可添加多行binlog-do-db=database1
binlog-do-db=database2
重启 MySQL 服务
创建用于复制的用户
-- 创建slave用户
CREATE USER 'slave_test'@'%';
-- 设置密码
ALTER USER 'slave_test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave_test'@'%';
查看主库状态
SHOW MASTER STATUS;
File:当前的二进制日志文件名。
Position:二进制日志的偏移量,从该位置开始读取数据。
设置从库(Slave)
修改配置
[mysqld]
server-id=2 # 从库的唯一 ID,不能与主库或其他从库相同
relay-log=relay-log # 设置中继日志文件名前缀
read-only=1 # 设置只读模式,防止误操作
重启 MySQL 服务
连接到主库
CHANGE MASTER TO MASTER_HOST='xx',
MASTER_USER='slave_test',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000021',MASTER_LOG_POS=2522041;
MASTER_HOST:主库的 IP 地址。
MASTER_USER:在主库上创建的用于复制的用户。
MASTER_PASSWORD:复制用户的密码。
MASTER_LOG_FILE:主库的二进制日志文件名。
MASTER_LOG_POS:二进制日志的位置偏移量。
启动复制进程
START SLAVE;
查看从库状态
SHOW SLAVE STATUS
Slave_IO_Running:应为 Yes,表示从库的 IO 线程正在读取主库的日志。
Slave_SQL_Running:应为 Yes,表示从库的 SQL 线程正在执行主库传递的日志。
Last_IO_Error 和 Last_SQL_Error:如果存在错误信息,会在此处显示
验证主从复制是否成功
在主库上创建测试数据
DROP TABLE IF EXISTS test;
CREATE TABLE test (id INT (11) NOT NULL AUTO_INCREMENT,name VARCHAR (50) DEFAULT NULL,PRIMARY KEY (id)) DEFAULT CHARSET=utf8mb4;
INSERT INTO test (id,name) VALUES (1,'Test Data');
在从库上检查数据同步情况
SELECT*FROM test;
修改异常
Could not execute Update_rows event on table xx.sys_one_click_import_details; Can't find record in 'sys_one_click_import_details', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000022, end_log_pos 1290280
查看异常
bin\mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS Data\mysql-bin.000022 > 1290280.log
linux使用
/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000022 | grep -A '10' 1290280
修改从库配置
vim /etc/my.cnf
slave-skip-errors = 1032
重启数据库,重新连接到主库