一、MySQL 主库配置
假设我们有一个MySQL实例作为主库(Master),IP为192.168.1.100,端口默认3306。
修改my.cnf文件:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=jee_cgboot1 # 第一个需要同步的数据库名
binlog-do-db=jee_cgboot2 # 第二个需要同步的数据库名
# 添加更多需要同步的数据库名
重启MySQL服务使配置生效:
sudo systemctl restart mysql
创建用于复制的用户:
登录到MySQL主库服务器,执行以下SQL命令:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
– 创建用户可以新增、插入、更新的表
GRANT SELECT, INSERT, UPDATE ON `cm_retire_business2.0`.* TO 'app_admin'@'%';
– 查看该用户所有权限(含数据库级授权)
SHOW GRANTS FOR 'app_admin'@'%';
查看二进制日志信息:
SHOW MASTER STATUS;
记下File和Position值,后续从库配置会用到。
注意:一定要多查看主从表的position值是否一致,否则数据同步会出错
SHOW MASTER STATUS;
MySQL 从库配置
假设我们有另一个MySQL实例作为从库(Slave),IP为192.168.1.101,端口默认3306
修改my.cnf文件
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read-only=1
log-slave-updates=1
replicate-do-db=jee_cgboot1 # 第一个需要同步的数据库名
replicate-do-db=jee_cgboot2 # 第二个需要同步的数据库名
# 添加更多需要同步的数据库名
重启MySQL服务使配置生效:
sudo systemctl restart mysql
设置从库指向主库:
-- 停止
STOP SLAVE;
-- 重新配置(注意:这里不需要指定 host,因为我们用的是 %)
CHANGE MASTER TO
MASTER_HOST='192.168.10.61',
MASTER_USER='app_admin',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004', -- 替换为你实际的文件名
MASTER_LOG_POS=1087, -- 替换为你实际的位置
GET_MASTER_PUBLIC_KEY=1; -- 加上这个参数,防止公钥问题
-- 启动
START SLAVE;
-- 查看状态
SHOW SLAVE STATUS\G
确保Slave_IO_Running和Slave_SQL_Running均为Yes。然后查看数据同步情况
常见问题
Position位置不同,需要同步
1、首先查看主从的状态
SHOW MASTER STATUS;
2、第一步:主库导出(记录新位置)
– 这条命令会自动锁表、导出数据、并记录当前最新的Binlog位置
mysqldump -u root -p --all-databases --single-transaction --master-data=2 > full_backup.sql
3、在从库回复(重置同步)
# 1. 导入数据(这一步会自动包含“CHANGE MASTER TO”的配置信息)
mysql -u root -p < full_backup.sql
-- 2. 启动同步
START SLAVE;
-- 3. 检查状态(确认两个都是Yes)
SHOW SLAVE STATUS\G
二、JEECG BOOT 配置
在application.yml 中进行配置
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
url: jdbc:mysql://192.168.1.100:3306/jee_cgboot_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root_password
driver-class-name: com.mysql.cj.jdbc.Driver
slave_1:
url: jdbc:mysql://192.168.1.101:3306/jee_cgboot_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root_password
driver-class-name: com.mysql.cj.jdbc.Driver
动态数据源切换
为了实现读写分离可以在代码中根据业务需求动态切换数据源。例如,在Service层通过注解或AOP方式实现。
import org.springframework.stereotype.Service;
@Service
public class UserService {
@DS("master")
public void addUser(User user) {
// 写操作
}
@DS("slave_1")
public User getUserById(String id) {
// 读操作
}
}

1881

被折叠的 条评论
为什么被折叠?



