目录
一、环境准备
二、主库配置
1. 修改配置文件
2. 创建复制用户
3. 查看主库状态
三、从库配置
1. 修改配置文件
2. 配置主从同步
四、验证同步状态
1. 查看从库状态
2. 测试数据同步
五、MySQL主从同步与Canal、Otter在功能上的区别
六、创建mysql用户并赋权(样例解析)
第一条语句:创建用户
第二条语句:授予数据库权限
第三条语句:授予全局复制权限
综合总结
以下是一个完整的MySQL 5.7主从同步实例,包含环境准备、配置步骤及验证过程:
一、环境准备
- 主库(Master)
- IP:192.168.1.100
- 操作系统:CentOS 7
- MySQL版本:5.7.44
- 从库(Slave)
- IP:192.168.1.101
- 操作系统:CentOS 7
- MySQL版本:5.7.44
二、主库配置
1. 修改配置文件
编辑/etc/my.cnf,添加以下内容:
[mysqld] server-id=1 # 主库唯一ID log-bin=mysql-bin # 开启二进制日志 binlog_format=ROW # 推荐使用ROW格式 binlog-do-db=test # 仅同步test库(可选) expire_logs_days=7 # 日志保留7天重启MySQL:
systemctl restart mysqld2. 创建复制用户
登录MySQL,执行:
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101'; FLUSH PRIVILEGES;3. 查看主库状态
执行:
SHOW MASTER STATUS;**记录输出中的File和Position**(如mysql-bin.000001、154),后续从库配置需使用。
三、从库配置
1. 修改配置文件
编辑/etc/my.cnf,添加以下内容:
[mysqld] server-id=2 # 从库唯一ID(不能与主库重复) relay-log=mysql-relay-bin # 开启中继日志 read_only=1 # 从库只读(生产环境建议开启)重启MySQL:
systemctl restart mysqld2. 配置主从同步
登录从库MySQL,执行:
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='Repl@123456', MASTER_LOG_FILE='mysql-bin.000001', # 主库记录的File MASTER_LOG_POS=154; # 主库记录的Position START SLAVE; # 启动同步四、验证同步状态
1. 查看从库状态
在从库执行:
SHOW SLAVE STATUS\G关键字段说明:
Slave_IO_Running:Yes表示从库正在拉取主库日志。Slave_SQL_Running:Yes表示从库正在执行日志中的SQL。Seconds_Behind_Master:0表示无延迟(若为NULL,需检查网络或权限)。
2. 测试数据同步
在主库插入数据:
USE test; INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30);在从库查询数据:
USE test; SELECT * FROM users; # 应看到与主库一致的数据五、MySQL主从同步与Canal、Otter在功能上的区别
MySQL主从复制(通过binlog):
是MySQL数据库内置的功能,通过复制binlog日志来实现数据的同步。
支持异步、半同步和全同步复制。
主要用于数据备份、读写分离、高可用性等场景。
Canal:
是阿里巴巴开源的基于MySQL binlog的增量日志订阅和消费组件。
模拟MySQL slave的交互协议,伪装自己为MySQL slave,向MySQL master发送dump协议,获取binlog,解析并存储。
常用于将MySQL的数据变更同步到其他数据存储(如Elasticsearch、Redis、HBase等)或用于缓存更新、消息通知等。
Otter:
也是阿里巴巴开源的分布式数据库同步系统,基于Canal。
提供分布式、可靠、低延迟的数据同步解决方案,支持双向同步、冲突检测和解冲突等。
主要用于跨机房、跨地域的数据同步,支持多源、多目标、双向同步等复杂场景。
六、创建mysql用户并赋权(样例解析)
mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY '123456'; mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%'; mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';这些SQL语句的总体目的是:创建一个名为 `maxwell`` 的数据库用户,并授予其特定的权限,通常是为了让这个用户能够作为MySQL的数据同步工具(如Maxwell、Canal等)连接并捕获数据库的变更。
第一条语句:创建用户
mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY '123456';
含义解释:
CREATE USER: 这是创建一个新用户的命令。'maxwell'@'%': 这是指定用户名和允许其连接的主机。'maxwell': 是新创建的用户名。'@': 是分隔符。'%': 是一个通配符,代表任意主机。这意味着,用户maxwell可以从任何IP地址或任何一台机器上连接到这个MySQL服务器。这在开发和测试环境中很方便,但在生产环境中存在安全风险,通常会限制为特定的IP地址(例如'maxwell'@'192.168.1.100')。
IDENTIFIED BY '123456': 这部分设置了用户的登录密码。用户maxwell的密码被设置为123456。
一句话总结:创建一个名为maxwell的用户,密码是123456,并允许他从任何地方连接到MySQL服务器。
第二条语句:授予数据库权限
mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%';
含义解释:
GRANT: 这是授予权限的命令。ALL: 这是一个权限的简写,代表所有权限(如SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER等)。ON maxwell.*: 这指定了权限应用的范围。maxwell: 是数据库名。.*: 是一个通配符,代表该数据库中的所有表。- 所以
maxwell.*的意思是:在maxwell这个数据库里的所有表上。
TO 'maxwell'@'%': 指明将权限授予哪个用户。这里就是授予我们刚刚创建的maxwell用户。
一句话总结:授予用户maxwell对名为maxwell的数据库及其所有表拥有完全的增删改查和管理权限。这通常是为了让maxwell工具能自己创建和操作它所需要的状态表、配置表等。
第三条语句:授予全局复制权限
mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';
含义解释:
GRANT: 授予权限的命令。SELECT, REPLICATION CLIENT, REPLICATION SLAVE: 这是授予的三个核心权限,每个都非常重要:SELECT: 允许用户从任何表中读取数据。对于数据同步工具来说,这是为了能读取表的元数据(如表结构)和初始数据。REPLICATION CLIENT: 允许用户查询主服务器的二进制日志(binlog)文件和位置信息。执行SHOW MASTER STATUS;命令就需要这个权限。这是数据同步工具找到从哪里开始读取变更的关键。REPLICATION SLAVE: 允许用户连接到主服务器并请求其binlog数据流。这是实现数据实时同步的核心权限。没有这个权限,工具就无法接收到数据库的增量变更。
ON *.*: 这指定了权限应用的范围。- 第一个
*代表所有数据库。 - 第二个
*代表所有表。 - 所以
*.*的意思是:在整个MySQL服务器实例的所有数据库和所有表上。这使得这些权限成为全局权限。
- 第一个
TO 'maxwell'@'%': 再次指明将这些权限授予用户maxwell。
一句话总结:授予用户maxwell在整个MySQL服务器范围内的全局权限,使其能够读取任何数据、查询复制状态,以及作为“从库”一样拉取主库的二进制日志数据。
综合总结
这三条SQL语句组合在一起,完整地完成了为数据同步工具(如Maxwell)准备专用账户的工作:
- 创建账户:先建立一个叫
maxwell的登录凭证。 - 配置工作空间:给这个账户一个专属的数据库(
maxwell),让它在里面可以自由地读写和管理自己的配置信息,而不会干扰其他业务数据库。 - 授予核心能力:最后,授予它读取整个MySQL实例变更数据(binlog)的核心能力,这是实现实时数据同步的根本。
因此,执行完这些命令后,maxwell这个用户就具备了连接MySQL、监控并捕获所有数据库变更所需的最小(但必要)权限集合。