mysql主从
服务器(腾讯云内部组网):
10.206.0.4(主服务器)
10.206.0.3(从服务器)
数据库 : Mariabd 10.8
确保网络互通
主从之间能互相 ping 通。
防火墙开放 3306 端口。
建议配置 NTP 时间同步,避免因时间差导致复制异常。
bind-address(对什么ip开放):
# 1. 检查 MySQL 配置文件,通常在 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
cat /etc/my.cnf | grep bind-address
# 2. 或查看 MySQL 当前监听状态
sudo netstat -tuln | grep 3306
1.安装
# CentOS / Rocky
sudo yum install -y mysql-community-server
# Ubuntu / Debian
sudo apt update && sudo apt install -y mysql-server
1.2.修改密码
sudo grep 'temporary password' /var/log/mysqld.log #获取密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongRootPass123!'; #修改密码
2.配置主库
2.1 修改配置文件
编辑主库的 MySQL 配置文件(路径可能是 /etc/my.cnf、/etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)。
在 [mysqld] 段落下添加或修改以下内容:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
#bind-address = 0.0.0.0 #建议
2.3重启数据库
sudo systemctl restart mysqld
2.4创建专门的用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON . TO 'repl'@'%';
FLUSH PRIVILEGES;
注意:'repl'@'%' 中的 % 表示允许从任何 IP 连接。生产环境建议改为从库的具体 IP,如 'repl'@'192.168.1.101',更安全。
2.4 获取复制起点(Binlog 坐标)
先锁住主库,防止数据写入导致坐标变化:
FLUSH TABLES WITH READ LOCK;
然后查看当前的 binlog 文件名和位置:
SHOW MASTER STATUS;
输出示例:
text
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 154 | | |
+------------------+----------+--------------+------------------+
务必记录下 File 和 Position 的值,后续配置从库时会用到。
2.5 导出主库现有数据(如主库已有数据)
如果主库已有数据,需要用 mysqldump 导出并导入到从库:
mysqldump --all-databases --single-transaction --master-data=2 > backup.sql
--single-transaction:对 InnoDB 表一致性备份,不锁表。
--master-data=2:备份文件中会记录备份时刻的 binlog 坐标,便于恢复。
然后用 scp 将备份文件传到从库:
scp backup.sql root@192.168.1.101:/root/
2.6 解锁主库
sql
UNLOCK TABLES;
3、配置从库(Slave)
3.1 修改配置文件
编辑从库的 MySQL 配置文件,在 [mysqld] 段落下添加:
ini
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1
参数说明:
server-id = 2:必须与主库不同,且在整个集群中唯一。
relay_log:开启中继日志(Relay Log),I/O 线程接收的 binlog 会写入这里。
log_bin:从库也建议开启 binlog,方便将来从库提升为主库时无缝切换。
read_only = 1:从库设为只读,防止应用误写入导致数据不一致。
3.2 重启 MySQL 使配置生效
sudo systemctl restart mysqld
3.3 导入主库备份数据(如主库有数据)
mysql -u root -p < /root/backup.sql
3.4 配置复制关系
登录从库 MySQL,执行 CHANGE MASTER TO 命令,告诉从库如何连接主库以及从哪个 binlog 位置开始复制:
CHANGE MASTER TO
MASTER_HOST = '10.206.0.4',
MASTER_USER = 'repl',
MASTER_PASSWORD = '12345',
MASTER_LOG_FILE = ' mysql-bin.000006',
MASTER_LOG_POS = 933;
注意:MASTER_LOG_FILE 和 MASTER_LOG_POS 必须使用第 2.4 步中从主库 SHOW MASTER STATUS 获取的值。
3.5 启动复制
START SLAVE;
#停止复制 STOP SLAVE;
#删除所有中继日志 RESET SLAVE ALL;
四、验证复制状态
在从库执行以下命令,检查复制是否正常运行:
sql
SHOW SLAVE STATUS\G
重点看这两个字段是否都为 Yes:
字段 期望值 含义
Slave_IO_Running Yes I/O 线程正常连接主库并拉取 binlog
Slave_SQL_Running Yes SQL 线程正常重放 relay log
如果有一个不是 Yes,说明复制异常,需要查看 Last_Error 字段定位问题。
五、验证数据同步
5.1 在主库插入测试数据
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t1 VALUES (1, 'hello');
5.2 在从库查询验证
USE test_db;
SELECT * FROM t1;
如果能看到相同的数据,说明主从复制搭建成功。

浙公网安备 33010602011771号