最近在做主从数据库,数据备份,还有读写分离,将操作过程记录一下
一、环境准备
- 服务器信息:
- 主库(Master):IP 192.168.1.100,MySQL 版本 ≥5.6
- 从库(Slave):IP 192.168.1.101,MySQL 版本与主库一致
- 网络要求:
- 主从服务器间可互相访问(默认端口 3306 开放)。
- 确保主从库的 server-id 唯一。
二、主库(Master)配置
1.修改主库配置文件
编辑 MySQL 配置文件 my.cnf(路径通常为 /etc/my.cnf 或
/etc/mysql/mysql.conf.d/mysqld.cnf):
ini
复制
[mysqld]
# 主库唯一标识(必须唯一)
server-id = 1
# 开启二进制日志(核心配置)
log-bin = mysql-bin
# 二进制日志格式(建议使用ROW格式)
binlog_format = ROW
# 可选:指定需要复制的数据库(不配置则默认同步所有库)
# binlog_do_db = db1
# binlog_do_db = db2
重启 MySQL 服务:
bash
复制
systemctl restart mysqld
2.创建复制账号
登录主库 MySQL,创建用于复制的账号并授权:
sql
复制
-- 创建用户(用户名 repl,密码 repl_password)
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
3.获取主库当前 Binlog 状态
执行以下命令,记录 File 和 Position 的值(从库配置时需要):
sql
复制
SHOW MASTER STATUS;
输出示例:
复制
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
三、从库(Slave)配置
1.修改从库配置文件
编辑从库的 my.cnf:
ini
复制
[mysqld]
server-id = 2 # 唯一标识,不能与主库相同
relay-log = mysql-relay-bin # 中继日志名称
read-only = 1 # 从库只读(可选,根据业务需求)
重启 MySQL 服务:
bash
复制
systemctl restart mysqld
2.配置主库连接信息
登录从库 MySQL,执行以下命令指定主库信息:
sql
复制
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100', -- 主库 IP
MASTER_USER = 'repl', -- 主库复制账号
MASTER_PASSWORD = 'repl_password',
MASTER_PORT = 3306, -- 主库端口
MASTER_LOG_FILE = 'mysql-bin.000001', -- 主库的 Binlog 文件名
MASTER_LOG_POS = 154; -- 主库的 Binlog 位置
3.启动复制线程
sql
复制
START SLAVE;
四、数据同步(若主库已有数据)
如果主库已有数据,需先将主库数据完整备份并导入从库:
1.主库备份数据
使用 mysqldump 备份数据(注意记录备份时的 Binlog 位置):
bash
复制
# 备份所有数据库(推荐锁表保证一致性)
mysqldump -u root -p --all-databases --master-data=2 > master_dump.sql
- --master-data=2:在备份文件中记录主库的 File 和 Position。
2.导入数据到从库
将备份文件传输到从库服务器,并导入:
bash
复制
mysql -u root -p < master_dump.sql
3.重新配置从库
如果备份文件中已包含 File 和 Position,可直接使用备份文件中的值:
sql
复制
STOP SLAVE;
CHANGE MASTER TO ...; -- 使用备份文件中的 MASTER_LOG_FILE 和 MASTER_LOG_POS
START SLAVE;
五、验证主从复制
1.检查从库复制状态
在从库执行:
sql
复制
SHOW SLAVE STATUS\G;
关注以下字段:
- Slave_IO_Running:必须为 Yes(表示 I/O 线程正常)。
- Slave_SQL_Running:必须为 Yes(表示 SQL 线程正常)。
- Seconds_Behind_Master:表示复制延迟(0 表示无延迟)。
- Last_IO_Error/Last_SQL_Error:错误信息(如有问题需排查)。
2.测试数据同步
- 在主库执行写入操作(如建表、插入数据):
- sql
- 复制
- CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table (id INT); INSERT INTO test_table VALUES (1);
- 在从库查询是否同步成功:
- sql
- 复制
- SELECT * FROM test_db.test_table;
六、常见问题处理
- Slave_IO_Running 为 No:
- 检查主从网络连通性(telnet 主库IP 3306)。
- 验证复制账号权限和密码是否正确。
- 检查主库的 bind-address 是否允许从库连接。
- Slave_SQL_Running 为 No:
- 查看 Last_SQL_Error 字段定位错误。
- 常见原因:主从数据不一致(如从库被手动写入数据)。
- 解决方法:重新同步数据或跳过错误(谨慎操作):
- sql
- 复制
- STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; -- 跳过1个错误 START SLAVE;