开发一个新项目需要用到 mysql
主从读写分离,开发环境来搭建一主一从的 mysql
满足基本需要,记录一下具体步骤。
现状和需求
有两台服务器分别运行一个 mysql 5.7
的实例:
服务器IP | 端口 | mysql实例 | 主从 |
---|---|---|---|
192.168.0.10 | 3306 | mysql1 | 主 |
192.168.0.11 | 3307 | mysql2 | 从 |
mysql1
有需要设置主从的数据库 paca
,设置 mysql1
为主库,mysql2
为从库,为数据库 paca
设置一主一从,具体操作步骤。
实现步骤
配置主服务器 mysql1
修改 mysql1
配置
在 mysql1
服务器上,设置服务 id
并打开二进制日志,打开 MySQL
配置文件(通常是 /etc/my.cnf
或 /etc/mysql/my.cnf
),并进行以下修改:
[mysqld]
server-id = 1
log-bin = mysql-bin
重启 mysql
重启 mysql
确保配置生效,并确认二进制日志 log bin
已开启。
sudo systemctl restart mysql
进入 mysql
确认已开启。
mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)
创建复制用户
进入 mysql
创建用于复制的用户,这里创建的用户为 repl_user
,密码 12346
,根据需求修改。
CREATE USER 'repl_user'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
记录二进制
进入 mysql
查看当前二进制日志文件和位置。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 110200 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
记录 File
和 Position
的值,后面会在配置从服务器时用到。
配置从服务器
编辑 MySQL 配置文件
在 mysql2
服务器上,打开 MySQL
配置文件,并进行以下修改:
[mysqld]
server-id=2
replicate_do_db=paca
这里的 replicate_do_db
表示需要复制的数据库,如果不在从数据库配置这个参数,将会复制 mysql1
上的所有数据库。
重启 mysql
sudo systemctl restart mysql
从主服务器复制数据库
使用 mysqldump
或其他数据库同步工具将主服务器的 paca
数据库同步到从服务器的 paca
。
设置从服务器复制配置
进入 mysql
运行以下命令配置从服务器。
CHANGE MASTER TO
MASTER_HOST='192.168.0.10',
MASTER_PORT=3306,
MASTER_USER='repl_user',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=110200;
START SLAVE;
其中的 MASTER_LOG_FILE
和 MASTER_LOG_POS
的值使用上面记录的主服务器的二进制文件和位置信息。
检查复制状态
SHOW SLAVE STATUS\G;
看到类似的输出:
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.10
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 110200
Relay_Log_File: f2bb61719e78-relay-bin.000004
Relay_Log_Pos: 108106
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: paca
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 110200
Relay_Log_Space: 108320
...
可以看到 Slave_IO_Running: Yes
和 Slave_SQL_Running: Yes
并且 Slave_IO_State: Waiting for master to send event
可见主从已经设置成功了。
接下来可以在主库做一些增删改操作,可以看到从库自动同步了。
注意问题
- 在开始配置到确认配置前,应该保证没有新的增删改发生在主服务器,如果数据发生了变化,为保证数据一致,则需要重新将变化同步到从服务器的数据库且配置从服务器的
Position
。 - 保证从服务器可以访问主服务器的
mysql
服务,可以在配置前在从服务器上使用mysql
命令连接主服务器测试。