先说背景

两台机器,主库 CentOS 7,从库 Ubuntu,配 MySQL 主从复制。这篇是实际操作记录,方便下次复用。

主库配置(CentOS)

改配置文件

bash
1sudo vi /etc/my.cnf

在 [mysqld] 段加这些:

text
[mysqld]
server-id = 1                         # 主库 id,随便填,唯一就行
log_bin = /var/log/mysql/mysql-bin.log
read-only = 0                         # 0 表示读写(主库)
binlog_expire_logs_seconds = 2592000  # 日志保留 30 天
max_binlog_size = 100M
# binlog_do_db = astro_code            # 只同步指定库
# binlog_ignore_db = mysql,sys         # 不同步的库

创建日志目录

bash
1sudo mkdir -p /var/log/mysql
2sudo chown mysql:mysql /var/log/mysql
3sudo chmod 755 /var/log/mysql

重启主库

bash
1sudo systemctl restart mysqld

创建复制专用用户

主库上创建个用户给从库用:

bash
1mysql -u root -p
sql
1CREATE USER 'copyuser'@'120.26.180.149' IDENTIFIED WITH mysql_native_password BY 'MySql@123456';
2GRANT replication slave ON *.* TO 'copyuser'@'120.26.180.149';

查看主库状态

sql
1SHOW MASTER STATUS;

记下返回的 File 和 Position,从库配置的时候要用。

从库配置(Ubuntu)

改配置文件

bash
1sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
text
[mysqld]
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
read-only = 1                         # 从库只读
binlog_expire_logs_seconds = 2592000
max_binlog_size = 100M
replicate_do_db = astro_code          # 只同步这个库
replicate_ignore_db = mysql,sys       # 不同步系统库

创建日志目录

bash
1sudo mkdir -p /var/log/mysql
2sudo chown mysql:mysql /var/log/mysql
3sudo chmod 755 /var/log/mysql

重启从库

bash
1sudo systemctl restart mysql

配置同步

bash
1mysql -u root -p
sql
 1STOP SLAVE;
 2RESET SLAVE ALL;
 3
 4CHANGE MASTER TO 
 5MASTER_HOST='47.99.236.69',          -- 主库 IP
 6MASTER_USER='copyuser',              -- 刚才创建的复制用户
 7MASTER_PASSWORD='MySql@123456',
 8MASTER_LOG_FILE='mysql-bin.000004',  -- 主库 SHOW MASTER STATUS 的 File
 9MASTER_LOG_POS=161383;               -- 主库 SHOW MASTER STATUS 的 Position
10
11START SLAVE;

检查同步状态

sql
1SHOW SLAVE STATUS \G;

重点关注两个字段:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes

两个都是 Yes 就说明同步正常。

踩过的坑

日志位置对不上

主库换了配置或者重启过,binlog 文件和位置会变。重新跑一次 SHOW MASTER STATUS,拿到新的 File 和 Position,在从库重新 CHANGE MASTER TO。

主从数据不一致

从库如果之前写过数据,跟主库对不上会导致同步中断。先 STOP SLAVE,从库追上数据之后再 START SLAVE。

防火墙

主库 3306 端口要放行从库 IP:

bash
1# CentOS
2sudo firewall-cmd --permanent --add-source=从库IP --add-port=3306/tcp
3sudo firewall-cmd --reload

总结

  1. 主库:开 binlog、建复制用户、记下 File 和 Position
  2. 从库:配 server-id、指向主库的 CHANGE MASTER TO、START SLAVE
  3. 验证:SHOW SLAVE STATUS 两个线程都是 Yes 就没问题