主从复制初体验
一: 配置主数据库
- 在数据库服务器 /etc/mysql/conf.d 目录下,新增my.cnf配置
默认/etc/mysql/conf.d下的.cnf都会配加载为配置
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=netty # 只复制 mydatabase 库
binlog-ignore-db=sys # 忽略系统库
- 重启主数据库
service mysql restart
或者
docker restart mysql
- 检查log-bin是否生效
# 进入数据库
mysql -uroot -p
SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
生效成功
- 创建复制用户
# 创建复制用户并授权(可修改用户名和密码)
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'replica_pass';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
- 获取二进制文件信息
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001| 123 | mydatabase | |
+------------------+----------+--------------+------------------+
记住 File
和 Position
,稍后配置从库时需要用到。
二: 配置从数据库
- 在数据库服务器 /etc/mysql/conf.d 目录下,新增my.cnf配置
默认/etc/mysql/conf.d下的.cnf都会配加载为配置
[mysqld]
server-id=2 # 从库的 server-id,必须与主库不同
relay-log=mysql-relay-bin #存储的文件名
log-bin=mysql-bin # 如果从库也需要记录 binlog,则启用
replicate-do-table=netty.data #只同步该表 不配则全部同步
#read-only=1 # 设置从库为只读
- 重启从数据库
service mysql restart
或者
docker restart mysql
- 连接主数据库
mysql -uroot -p
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_PORT=正确的端口号,
MASTER_USER='repl',
MASTER_PASSWORD='replpassword',
MASTER_LOG_FILE='mysql-bin.000001', # 使用主库上 `SHOW MASTER STATUS` 获取的 File
MASTER_LOG_POS=12345; # 使用主库上 `SHOW MASTER STATUS` 获取的 Position
- 启动主从复制
START SLAVE;
- 查看状态
SHOW SLAVE STATUS\G;
确保以下字段为 yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这里我第一次配置错了端口,导致Slave_IO_Running: Connecting
,再次配置之后报错
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
意思是要先停止才能配置
STOP SLAVE IO_THREAD FOR CHANNEL '';
Query OK, 0 rows affected (0.02 sec)
在执行3.4.5步骤就可以了
- 停止从数据库的复制操作
STOP SLAVE;
SHOW SLAVE STATUS\G;