注意:在mysql主库正常生产运行的时候,主从同步出现问题,需要快速实现主从同步
注意:在无论是主库还是从库,一定要确保磁盘空间足够
一、在主库机器上备份数据(master机器上操作)
1.安装innobackupex命令
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-xtrabackup-24
yum install qpress
2.在master端通过innobackup进行备份(linux shell)
#这条命令执行完成会生成一个日期命名的目录/data/sql_dump/2023-01-11_14-53-21/
innobackupex --defaults-file=/etc/my.cnf --user=root --password=*** /data/sql_dump
#xtrabackup把备份过程中可能有尚未提交的事务或已经提交但未同步数据文件的事务,写到xtrabackup_logfile文件,所以要先通过这个日志文件回滚,把未完成的事务同步到备份文件,保证数据文件处于一致性
innobackupex --apply-log /data/sql_dump/2023-01-11_14-53-21/
3.将主库备份好的目录scp到从库(linux shell)
scp -r -P 22 /data/sql_dump/2023-01-11_14-53-21/ 3i_admin@slave_host_ip:slave_host_folder
#3i_admin -- 用户
#slave_host_ip -- 从库ip
#slave_host_folder -- 需要放在从库那个文件夹下面(data/sql_dump)
4.设置从库用户,只授予同步数据的权限(进入数据库里面操作)
create user 'repl'@'%' identified by 'root';
grant REPLICATION SLAVE on *.* to 'repl'@'%';
ALTER USER 'repl'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'FhwYp75sq4vutlxed';
flush privileges;
二、连接到主库(从库机器上操作)
1.停止主从复制, 停止从库,将当前的data目录删除,将备份的目录拷贝到从库的data目录
1、在从库mysql终端执行,停止主从复制
stop slave
2、在从库linux shell执行,停止从库mysql服务
/etc/init.d/mysqld stop
3、删除/data/mysql/data/,再创建
rm -rf /data/mysql/data/
mkdir /data/mysql/data/
4、将主库scp过来的目录复制到从库/data/mysql/data/
cp /data/sql_dump/2023-01-11_14-53-21/* /data/mysql/data/
chown -R mysql.mysql /data/mysql
2.查看主库的log文件和log偏移量
cat /data/sql_dump/2023-01-11_14-53-21/xtrabackup_binlog_info
3.启动从库,并重置主库信息
1、先启动从库mysql服务
/etc/init.d/mysqld start
2、进入mysql终端,重置连接主库信息
reset master;
4.重新连接主库
CHANGE MASTER TO MASTER_HOST='主库ip', MASTER_USER='repl', MASTER_PASSWORD='FhwYp75sq4vutlxed', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000049', MASTER_LOG_POS=154, MASTER_CONNECT_RETRY=10;
5.再开启主从复制
start slave;
6.查看主从状态,并关注几个指标
show slave status\G;
Slave_IO_Running: Yes #io线程,yes为正常
Slave_SQL_Running: Yes #sql 线程,yes为正常
Seconds_Behind_Master: 0 ##主从延时,单位秒,0是正常的
4.如果主从延时不为0,可以关闭从库binlog日志
# 在从库上 修改/etc/my.cnf 配置,停掉主从同步,然后重启数据库再开启主从同步:
vim /etc/my.cnf
#binlog_format = row
#log-slave-updates = 1
#skip_slave_start = 1
#log-bin= /home/mysql/log/binlog-mysql
skip-log-bin
disable-log-bin