DataBases
简介
MariaDB
MySQL
数据类型
创建表
索引 index
主键 primary key
外键 foreign key
数据导入与导出
where条件判断
用户授权与密码
数据备份与恢复
数据热备
主从同步
读写分离
多实例
分库分表
集群-MHA
集群-PXC
存储引擎
本文档使用 MrDoc 发布
-
+
首页
主从同步
## 简介 MySQL主从同步是一种常用的数据库复制技术,将一个数据库的数据复制到另一个数据库中,以实现数据备份、负载均衡和高可用性等目的。 主从同步是异步的,主服务器和从服务器之间的延迟可能会导致从服务器上的数据不是最新的。 此外,主从同步还需要处理一些复杂的问题,例如数据冲突和主从服务器的故障转移等。 主从同步的工作原理如下: 1. 在主服务器上,MySQL会将所有的数据更改记录到二进制日志中(binlog),包括对数据库的插入、更新和删除操作等。 2. 从服务器会连接到主服务器,并请求复制二进制日志。主服务器会将二进制日志传输到从服务器上。 3. 从服务器会将接收到的二进制日志应用到自己的数据库中,以实现与主服务器的数据同步。 4. 从服务器会定期向主服务器发送心跳包,以确保主服务器仍然处于活动状态,如果主服务器出现故障,从服务器可以自动切换到另一个主服务器上 ## 结构1(1主多从) ### 配置 Master-主 修改主配置文件,添加日志ID=51、日志名 ```asp vim /etc/my.cnf ``` ```asp server_id=51 log-bin=master51 ``` 重启服务 ```asp systemctl restart mysqld ``` 查看日志文件和偏移量 ```asp show master status; ``` 创建授权用户done ```asp grant replication slave on *.* to done@"%" identified by 'password'; ``` 查看授权用户 ```asp show grants for done@'%'; ``` ### 配置 Slave-1 修改主配置文件,添加日志ID=52 ```asp vim /etc/my.cnf ``` ```asp server_id=52 ``` 重启服务 ```asp systemctl restart mysqld ``` 备份主数据库A(--master记录当前备份的时偏移量) ```asp mysqldump -uroot -p'password' --master-data db1 > /root/db1.sql ``` 将备份文件传输给新加的从数据库C ```asp scp db1.sql root@192.168.1.53:/root ``` 登录 ```asp mysql -uroot -p'password' ``` 声明备份的偏移量 ```asp mysql> change master to master_host='192.168.1.51', #添加主数据库A的IP -> master_user='repluser', #添加用户 -> master_password='password', #添加登录密码 -> master_log_file='master51.000001', #声明需要读取的日志文件名 -> master_log_pos=154; #声明备份的偏移量 ``` 启动slave ```asp start slave; ``` 查看slave状态 ```asp show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes #复制进程正在运行 Slave_SQL_Running: Yes #SQL 进程正在运行 cat /var/lib/mysql/master.info #查看本地保存的master信息 25 master51.000003 154 192.168.1.51 repluser password 3306 ``` ### 配置 Slave-2 修改主配置文件,添加日志ID=52 ```asp vim /etc/my.cnf ``` ```asp server_id=52 ``` 重启服务 ```asp systemctl restart mysqld ``` 备份主数据库A(--master记录当前备份的时偏移量) ```asp mysqldump -uroot -p'password' --master-data db1 > /root/db1.sql ``` 将备份文件传输给新加的从数据库C ```asp scp db1.sql root@192.168.1.53:/root ``` 登录数据库C ```asp mysql -uroot -p'password' ``` ```asp mysql> change master to master_host='192.168.1.51', #添加主数据库A的IP -> master_user='repluser', #添加用户 -> master_password='password', #添加登录密码 -> master_log_file='master51.000001', #声明需要读取的日志文件名 -> master_log_pos=154; #声明备份的偏移量 ``` 启动slave ```asp start slave; ``` 查看slave状态 ```asp show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes #复制进程正在运行 Slave_SQL_Running: Yes #SQL 进程正在运行 ``` ## 结构2(1主1从1从) ### 配置 Master-A 修改主配置文件添加日志ID、修改日志名 ```asp vim /etc/my.cnf ``` ```asp server_id=53 log-bin=master53 ``` 重启服务 ```asp systemctl restart mysqld ``` 查看日志文件和偏移量 ```asp show master status; ``` 为数据库B创建授权用户 ```asp mysql> grant replication slave on *.* to done@"%" identified by 'password'; ``` 查看授权用户 ```asp show grants for done@'%'; ``` ### 配置 Master-B + slave-A 修改主配置文件添加日志ID、修改日志名、开启级联复制 ```asp vim /etc/my.cnf ``` ```asp server_id=54 log-bin=master54 log_slave_updates ``` 重启服务 ```asp systemctl restart mysqld ``` 为数据库C创建授权用户 ```asp mysql> grant replication slave on *.* to done@'%' identified by 'password'; ``` 查看日志文件和偏移量 ```asp show master status; ``` 登录数据库 ```asp mysql -uroot -p'password' ``` ```asp mysql> change master to master_host='192.168.1.53', #添加主数据库A的IP -> master_user='repluser', #添加用户 -> master_password='password', #添加登录密码 -> master_log_file='master53.000002', #声明需要读取的日志文件名 -> master_log_pos=720; #声明备份的偏移量 ``` 查看主从状态 ```asp show slave status\G; ``` ### 配置 slave-B 修改主配置文件 ```asp vim /etc/my.cnf ``` 添加日志ID ```asp server_id=53 ``` 重启服务 ```asp systemctl restart mysqld ``` 登录数据库 ```asp mysql -uroot -p'password' ``` ```asp mysql> change master to master_host='192.168.1.53', #添加主数据库A的IP -> master_user='repluser', #添加用户 -> master_password='password', #添加登录密码 -> master_log_file='master54.000001', #声明需要读取的日志文件名 -> master_log_pos=437; #声明备份的偏移量 ``` ## 结构3(主主结构,基于8.4.0) ### Master主-A 环境配置 修改主配置文件添加日志ID修改日志名 ```asp vim /etc/my.cnf ``` ```asp [mysqld] server_id=1 ## 设置server_id,同一局域网中需要唯一 log_bin=node1 ## 开启二进制日志功能 binlog_cache_size=1M ## 设置二进制日志使用内存大小(事务) binlog_format=mixed ## 设置使用的二进制日志格式(mixed,statement,row) slave_skip_errors=1062 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,比如1062错误是指一些主键重复,1032错误是因为主从数据库数据不一 ``` 重启服务 ```asp systemctl restart mysqld ``` 创建同步授权用户 ```asp CREATE USER 'done'@'%'; ``` 创建同步授权用户密码 ```asp ALTER USER 'done'@'%' IDENTIFIED BY 'password'; ``` 创建同步授权用户权限 ```asp GRANT Replication slave ON *.* TO 'done'@'%'; ``` 刷新 ```asp flush privileges; ``` 查看授权用户 ```asp show grants for done@'%'; ``` 查询master状态: ```asp SHOW BINARY LOG STATUS; ``` ### Master主-B 环境配置 修改主配置文件添加日志ID修改日志名 ```asp vim /etc/my.cnf ``` ```asp [mysqld] server_id=2 log_bin=node2 binlog_cache_size=1M binlog_format=mixed slave_skip_errors=1062 ``` 重启服务 ```asp systemctl restart mysqld ``` 创建同步授权用户 ```asp CREATE USER 'done'@'%'; ``` 创建同步授权用户密码 ```asp ALTER USER 'done'@'%' IDENTIFIED BY 'password'; ``` 创建同步授权用户权限 ```asp GRANT Replication slave ON *.* TO 'done'@'%'; ``` 刷新 ```asp flush privileges; ``` 查看授权用户 ```asp show grants for done@'%'; ``` 查询master状态: ```asp SHOW BINARY LOG STATUS; ``` ### Master主-A 开启同步 ```asp CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'k8s-node1', #复制源的主机名或 IP 地址 SOURCE_USER = 'done', #用于连接到复制源的用户名 SOURCE_PASSWORD = 'password', #对应用户的密码 SOURCE_PORT = 3307, #复制源使用的端口号 SOURCE_LOG_FILE = 'node1.000001', #从哪个二进制日志文件开始复制 SOURCE_LOG_POS = 158, #从二进制日志文件的哪个位置开始复制 SOURCE_SSL = 1; #启用 SSL 连接以确保安全性 ``` 启动 ```asp START REPLICA; ``` 查看复制状态 ```asp SHOW REPLICA STATUS\G; ``` ### Master主-B 开启同步 ```asp CHANGE REPLICATION SOURCE TO SOURCE_HOST='k8s-node2', SOURCE_USER='done', SOURCE_PASSWORD='password', SOURCE_PORT=3308, SOURCE_LOG_FILE='node2.000001', SOURCE_LOG_POS=158, SOURCE_SSL=1; ``` 启动 ```asp START REPLICA; ``` 查看复制状态 ```asp SHOW REPLICA STATUS\G; ``` ### 重置同步 关闭并重置同步信息 ```asp STOP REPLICA; RESET REPLICA ALL; ```
done
2025年3月22日 16:49
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码