先说背景 两台机器,主库 CentOS 7,从库 Ubuntu,配 MySQL 主从复制。这篇是实际操作记录,方便下次复用。
主库配置(CentOS) 改配置文件 bash
复制 sudo 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 # 不同步的库[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
复制 1 sudo mkdir -p /var/log/mysql
2 sudo chown mysql:mysql /var/log/mysql
3 sudo chmod 755 /var/log/mysql sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
sudo chmod 755 /var/log/mysql展开全部 重启主库 bash
复制 1 sudo systemctl restart mysqld sudo systemctl restart mysqld展开全部 创建复制专用用户 主库上创建个用户给从库用:
bash
复制 mysql -u root -p展开全部 sql
复制 1 CREATE USER 'copyuser' @ '120.26.180.149' IDENTIFIED WITH mysql_native_password BY 'MySql@123456' ;
2 GRANT replication slave ON * . * TO 'copyuser' @ '120.26.180.149' ; CREATE USER 'copyuser'@'120.26.180.149' IDENTIFIED WITH mysql_native_password BY 'MySql@123456';
GRANT replication slave ON *.* TO 'copyuser'@'120.26.180.149';展开全部 查看主库状态 sql
复制 SHOW MASTER STATUS;展开全部 记下返回的 File 和 Position,从库配置的时候要用。
从库配置(Ubuntu) 改配置文件 bash
复制 1 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf sudo 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 # 不同步系统库[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
复制 1 sudo mkdir -p /var/log/mysql
2 sudo chown mysql:mysql /var/log/mysql
3 sudo chmod 755 /var/log/mysql sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
sudo chmod 755 /var/log/mysql展开全部 重启从库 bash
复制 1 sudo systemctl restart mysql sudo systemctl restart mysql展开全部 配置同步 bash
复制 mysql -u root -p展开全部 sql
复制 1 STOP SLAVE ;
2 RESET SLAVE ALL ;
3
4 CHANGE MASTER TO
5 MASTER_HOST = '47.99.236.69' , -- 主库 IP
6 MASTER_USER = 'copyuser' , -- 刚才创建的复制用户
7 MASTER_PASSWORD = 'MySql@123456' ,
8 MASTER_LOG_FILE = 'mysql-bin.000004' , -- 主库 SHOW MASTER STATUS 的 File
9 MASTER_LOG_POS = 161383 ; -- 主库 SHOW MASTER STATUS 的 Position
10
11 START SLAVE ; STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_HOST='47.99.236.69', -- 主库 IP
MASTER_USER='copyuser', -- 刚才创建的复制用户
MASTER_PASSWORD='MySql@123456',
MASTER_LOG_FILE='mysql-bin.000004', -- 主库 SHOW MASTER STATUS 的 File
MASTER_LOG_POS=161383; -- 主库 SHOW MASTER STATUS 的 Position
START SLAVE;展开全部 检查同步状态 sql
复制 SHOW SLAVE STATUS \G;展开全部 重点关注两个字段:
Slave_IO_Running: YesSlave_SQL_Running: Yes两个都是 Yes 就说明同步正常。
踩过的坑 日志位置对不上 主库换了配置或者重启过,binlog 文件和位置会变。重新跑一次 SHOW MASTER STATUS,拿到新的 File 和 Position,在从库重新 CHANGE MASTER TO。
主从数据不一致 从库如果之前写过数据,跟主库对不上会导致同步中断。先 STOP SLAVE,从库追上数据之后再 START SLAVE。
防火墙 主库 3306 端口要放行从库 IP:
bash
复制 1 # CentOS
2 sudo firewall-cmd --permanent --add-source= 从库IP --add-port= 3306/tcp
3 sudo firewall-cmd --reload # CentOS
sudo firewall-cmd --permanent --add-source=从库IP --add-port=3306/tcp
sudo firewall-cmd --reload展开全部 总结 主库 :开 binlog、建复制用户、记下 File 和 Position从库 :配 server-id、指向主库的 CHANGE MASTER TO、START SLAVE验证 :SHOW SLAVE STATUS 两个线程都是 Yes 就没问题