主题
主从配置
使用 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在主服务器上备份数据,步骤大致如下:
- mysqldump 备份主库数据,加上
--master-data选项 - 登录从库,指定主服务器信息,指定主从同步用户、密码
- 登录从库
source XXX.sql;恢复数据 start slave;启动主从同步show slave status\G;查看主从同步状态- 查看主库和从库的数据库数量是否一致
指定 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