实现MySQL主从复制需要进行的配置
主服务器:
- 开启二进制日志
- 配置唯一的server-id
- 获得master二进制日志文件名及位置
- 创建一个用于slave和master通信的用户账号
从服务器:
- 配置唯一的server-id
- 备份master节点数据库
- 将master节点数据库还原到slave数据库
- 使用master分配的用户账号读取master二进制日志
- 启用slave服务
一、准备工作:
最好确保主备节点服务器一致
[root@pg_slave mysql]# more /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
查看数据库版本,数据库版本一致。
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.28 |
+-----------+
1 row in set (0.00 sec)
Master节点:192.168.7.131
Slave节点:192.168.7.132
二、主数据库master修改:
1.修改mysql配置
修改配置文件/etc/my.cnf
MySQL安装启动后,默认已经开启二进制日志;Master节点log-bin和server-id保持不变即可。
如果想要更改二进制日志的位置,则需要进行二进制日志的迁移。
1.停止数据库
[root@pg_master mysql]# systemctl stop mysqld
2.安装MySQL工具集
wget https://cdn.mysql.com/Downloads/MySQLGUITools/mysql-utilities-1.6.5-1.el7.noarch.rpm
yum localinstall -y mysql-utilities-1.6.5-1.el7.noarch.rpm
3.启动mysqlbinlogmove工具
3.1创建新的二进制目录日志/binlogs
mkdir /binlogs
3.2执行二进制文件迁移
[root@pg_master mysql]# mysqlbinlogmove --bin-log-basename=binlog --binlog-dir=/var/lib/mysql/ /binlogs
Traceback (most recent call last):
File “/usr/bin/mysqlbinlogmove”, line 26, in
import mysql.utilities.command.binlog_admin as binlog_admin
ImportError: No module named utilities.command.binlog_admin
报错,执行该语句后正常
[root@pg_master mysql]# ln -s /usr/lib/python2.7/site-packages/mysql/utilities /usr/lib64/python2.7/site-packages/mysql/utilities
3.3手动将binlog.index文件拷贝到/binlogs[否则提示mysqld: File ‘/binlogs.index’ not found (OS errno 13 - Permission denied)]
mv /var/lib/mysql/binlog.index /binlogs
chgrp -R mysql /binlogs && chown -R mysql.mysql /binlogs
3.4关闭SElinux
不关闭会导致启动失败
日志提示 mysqld: File ‘/binlogs/binlog.rec’ not found (OS errno 13 - Permission denied)
journalctl -xe 查看详细信息提示
SELinux is preventing /usr/sbin/mysqld from write access on the directory binlogs. For complete SELinux messages run: sealert -l cbf41024-ac8d-4cd9-a5b7-a9
查看SELinux状态:
1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled
2、getenforce ##也可以用这个命令检查
关闭SELinux:
1、临时关闭(不用重启机器):
setenforce 0 ##设置SELinux 成为permissive模式
##setenforce 1 设置SELinux 成为enforcing模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
4.更新my.cnf,修改log_bin位置
log_bin=/binlogs/binlog
server_id=1
5.启动MySQL服务器
systemctl start mysqld
mysql> show variables like ‘log_bin%’;
±--------------------------------±----------------------+
| Variable_name | Value |
±--------------------------------±----------------------+
| log_bin | ON |
| log_bin_basename | /binlogs/binlog |
| log_bin_index | /binlogs/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
±--------------------------------±----------------------+
5 rows in set (0.04 sec)
在[mysqld]部分插入如下两行
[mysqld]
log-bin=/binlogs/binlog #开启二进制日志
server-id=1 #设置server-id
2.修改Master允许远程连接
2.1如果新建用户
MySQL 8 默认认证方式改为 SHA2 了,需要把这个认证方式改为密码认证[WITH mysql_native_password]
并且在mysql8中不能使用赋权的方式创建用户。
mysql> CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';#创建用户
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';#分配权限
mysql>flush privileges; #刷新权限
2.2 如果已存在用户,则rename
RENAME USER 'root'@'localhost' TO 'root'@'%'; --原有账号修改 host 使这个账号可远程访问
2.重启mysql,创建用于同步的用户账号
打开mysql会话
shell>mysql -hlocalhost -uname -ppassword
创建用户并授权:用户:rel1密码:1qaz@WSX
mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';#创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';#分配权限
mysql>flush privileges; #刷新权限
3.查看Master状态(binlog.000008)和位置(157)
mysql> show master status\G
*************************** 1. row ***************************
File: binlog.000008
Position: 157
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
二、从服务器slave修改:
1.修改mysql配置
同样找到my.cnf配置文件,添加server-id
[mysqld]
server-id=2 #设置server-id,必须唯一
2.备份主库数据
mysqldump -h 192.168.7.131 -uroot -p --all_databases --routines --events --single-transaction > dump.sql
3.备份完成后恢复此备份
mysql -uroot -p -f <dump.sql
4.重置slave
因为我之前配置过主从复制,先重置slave状态。
mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.04 sec)
5.执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
CHANGE MASTER TO
MASTER_HOST='192.168.7.131',
MASTER_USER='repl',
MASTER_PASSWORD='1qaz@WSX',
MASTER_LOG_FILE='binlog.000008',
MASTER_LOG_POS=157;
6.开启slave,并查看状态
Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0
前两个都是Yes,Seconds_Behind_Master为0,则说明同步状态正常
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.7.131
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000008
Read_Master_Log_Pos: 157
Relay_Log_File: pg_slave-relay-bin.000002
Relay_Log_Pos: 323
Relay_Master_Log_File: binlog.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7.在Master节点创建表,测试同步情况
略。




