Skip to content

主从配置

使用 2 台虚拟机,其中 192.168.4.51 是主服务器,另一台 192.168.4.52 作为从服务器,通过调取主服务器上的 binlog 日志,在本地重做对应的库、表,实现与主服务器的数据同步。

环境:主服务器、从服务器都已安装好 mysql 5.7.36。

步骤一:配置主服务器 192.168.4.51

启用 binlog 日志:

bash
[root@master ~]# vim /etc/my.cnf

下面为 mysql 5.7 中的 binlog 配置,在 mysql 8.0 中有区分:

bash
server_id=51
log-bin=mysql-bin
max_binlog_size = 100M
binlog_format=row
log_slave_updates
expire_logs_days=7

用户授权(用户名自定义,客户端地址使用 % 或只指定从服务器地址,只给复制数据的权限即可):

bash
[root@master ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repluser@"%" identified by "srebro@test";
mysql> quit;

步骤二:配置从服务器 192.168.4.52

在从服务器上指定 server_id(值可以自定义,但不可以与主服务器相同):

bash
[root@slave ~]# vim /etc/my.cnf

server_id=52
relay-log=mysqld-relay-bin

在主服务器上备份数据,步骤大致如下:

  1. mysqldump 备份主库数据,加上 --master-data 选项
  2. 登录从库,指定主服务器信息,指定主从同步用户、密码
  3. 登录从库 source XXX.sql; 恢复数据
  4. start slave; 启动主从同步
  5. show slave status\G; 查看主从同步状态
  6. 查看主库和从库的数据库数量是否一致

指定 mysqldump 用户名密码:

bash
[root@localhost ~]# vim /home/.my.cnf

[mysqldump]
host=localhost
user=root
password=XXXX

找出需要备份的库名:

bash
name=`/home/application/mysql/app/bin/mysql --defaults-extra-file=/home/.my.cnf -e "show databases;" | grep -Ev "^(Database|sys|information_schema|mysql|performance_schema)$" | tr "\n"  " "`

备份数据,加上存储过程,加上备份时刻主服务器的二进制日志文件名(LOG_FILE)和位置(LOG_POS):

bash
/home/application/mysql/app/bin/mysqldump --defaults-extra-file=/home/.my.cnf --master-data --routines --set-gtid-purged=OFF --single-transaction --databases $name > /home/application/mysql/bak/full_bak/full_`date +"%F"`.sql 2>&1

将备份文件拷贝给从服务器:

bash
[root@master ~]# scp /full_2024-1230.sql root@192.168.4.52:/root/

登录从服务器,指定主服务器信息,指定主从同步用户、密码。

这里无需指定主服务器的二进制日志文件名(LOG_FILE)和位置(LOG_POS),备份 sql 时会带上备份时刻主服务器的二进制日志文件名。

bash
[root@slave ~]# mysql -uroot -pXXX

change master to \
master_host="192.168.10.5", \
master_user="repluser", \
master_password="XXXXXXX";

设置从库延迟同步时间:

bash
# 设置从库延迟一小时同步主库
CHANGE MASTER TO master_delay = 3600;

在从服务器使用备份文件恢复数据:

bash
[root@slave ~]# mysql -uroot -pXXX < /root/all.sql

在从服务器上启动 slave 服务:

bash
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

查看从服务器数据库状态:

bash
mysql> show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
...

可选配置,一般加上该配置:

bash
vim /etc/my.cnf

# 限定普通用户只读
read_only=1

# 限定 root 只读
super_read_only=on
最近更新