作者:xiaotong
myslq主从复制原理
MySQL 主从复制用于实现数据在多个 MySQL 实例之间的同步。它基于主服务器(master)将写操作记录为二进制日志,然后从服务器(slave)通过读取并应用这些二进制日志来实现数据的复制。
主从复制的原理如下:
-
配置主服务器(Master):首先,在主服务器上启用二进制日志(binary logging)。二进制日志记录了主服务器上执行的所有写操作(例如 INSERT、UPDATE、DELETE),以二进制形式保存在文件中,称为二进制日志文件(binary log files)。
-
启动从服务器(Slave):在从服务器上配置需要与主服务器进行复制同步的数据库。然后,配置从服务器连接到主服务器并获取二进制日志文件的位置信息。
-
主服务器发送二进制日志:当主服务器接收到写操作时,它将这些操作记录到二进制日志中,并将二进制日志文件发送到从服务器。
-
从服务器获取二进制日志:从服务器连接到主服务器,并根据配置信息请求获取二进制日志文件及其位置信息。
-
应用二进制日志:从服务器接收到二进制日志文件后,按顺序读取并应用其中记录的写操作,将其在从服务器上执行,从而实现主从数据的同步。
-
进行持续复制:一旦从服务器开始复制主服务器的数据,它会持续连接并读取新的二进制日志文件,以便实时同步主服务器上的写操作。
通过这种方式,主从复制实现了数据的异地备份、负载均衡以及故障恢复等功能。从服务器可以用作读取查询的副本,从而减轻主服务器的负载,并提高整体系统的可用性和性能。
需要注意的是,在配置主从复制时,还需要考虑网络稳定性、主从服务器的时间一致性、主服务器的备份等因素,以确保复制过程的可靠性和一致性。
注意注意注意,请详细检查每一步每一个字段是否出错!我总结的时候因疏忽浪费一个半小时
主从复制步骤如下:
1.运行主服务器:映射 log日志 data数据 conf配置
docker run -d -p 3307:3306 --privileged=true
-v /mysql-master/mysql/log:/var/log/mysql
-v /mysql-master/mysql/data:/var/lib/mysql
-v/mysql-master/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql-master mysql:5.7
2.修改conf配置文件如下(修改完需要重启容器):
[mysqld]
设置serverid,同一局域网中需要唯一
server_id=101
指定不需要同步的数据库名称
binlog-ignore-db=mysql
开启二进制日志功能
log-bin=mall-mysql-bin
设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
设置使用的二进制日志格式(mixed.statement,row)
binlog_format=mixed
二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
3.进入mysql执行一下命令创建用户并授权 创建一个 MySQL 用户可以通过以下步骤完成:
- 连接到 MySQL 数据库服务器:
mysql -u root -p
根据提示输入 MySQL 的 root 用户密码。
- 创建一个新用户:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
将 username 替换为你想要创建的用户名,将 password 替换为用户的密码。如果你希望用户能够从任何主机连接到数据库,可以将 'localhost' 更改为 '%'。
- 授予用户适当的权限。例如,授予用户对所有数据库的只读权限:
GRANT SELECT ON *.* TO 'username'@'localhost';
如果你希望授予用户更多权限,请根据需要调整权限。
- 刷新权限以使更改生效:
FLUSH PRIVILEGES;
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON . TO 'slave'@'%'; FLUSH PRIVILEGES; SHOW GRANTS FOR 'slave'@'%';
4.创建从服务器并修改my.conf如下 [mysqld]
设置server_id,同一局域网中需要唯一
server_id=102
指定不需要同步的数据库名称
binlog-ignore-db=mysql
开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
设置使用的二进制日志格式(mixed.statement.row)
binlog_format=mixed
二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
relay log配置中继日志
relay_log=mall-mysql-relay-bin
log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
slave设置为只读(具有super权限的用户除外)
read_only=1 5.查看主服务器状态 并记录 show master status 一定要记录后面MASTER_LOG_POS会用到
6.从服务器绑定主服务器,并查看是否配置成功(注意是在从数据库中进行配置) show slave status \G; \G键值对 CHANGE MASTER TO MASTER_HOST='121.36.254.198', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_PORT=3307, MASTER_LOG_FILE='mall-mysql-bin.000001', MASTER_LOG_POS=594, MASTER_CONNECT_RETRY=30; 这里千万千万别写错了,我这里写错了mall-mysql-bin.000001 写成mall-mysl-bin.000001 漏了个q,白给1个半小时兄弟们 还有就是主从操作一定要分清出啊!主服务器建立一个用户授权,然后查看主服务器状态记录Position,其他的都交给副服务器!!!
从数据库中使用start slave命令开启同步
show slave status \G 查看状态是否都是yes