mysql主从复制,初体验

12 阅读2分钟

主从复制初体验

一: 配置主数据库

  1. 在数据库服务器 /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      # 忽略系统库

  1. 重启主数据库
service mysql restart
或者
docker restart mysql
  1. 检查log-bin是否生效
# 进入数据库
mysql -uroot -p

SHOW VARIABLES LIKE 'log_bin';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
生效成功
  1. 创建复制用户
# 创建复制用户并授权(可修改用户名和密码)
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'replica_pass';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

  1. 获取二进制文件信息
SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001|      123 | mydatabase   |                  |
+------------------+----------+--------------+------------------+

记住 FilePosition,稍后配置从库时需要用到。

二: 配置从数据库

  1. 在数据库服务器 /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          # 设置从库为只读

  1. 重启从数据库
service mysql restart
或者
docker restart mysql
  1. 连接主数据库
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

  1. 启动主从复制
START SLAVE;
  1. 查看状态
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步骤就可以了

  1. 停止从数据库的复制操作
STOP SLAVE;
SHOW SLAVE STATUS\G;