1.数据准备
首先在主库和从库执行下面语句,准备测试数据。
create database if not exists study character set = utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`username` varchar(30) NOT NULL,
`password` varchar(100) NOT NULL,
`create_time` datetime(6) NOT NULL,
`update_time` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user values (1, 'steven','0192023a7bbd73250516f069df18b500','2022-12-16 08:08:08', '2022-12-16 08:08:08');
insert into user values (2, 'sherry','0192023a7bbd73250516f069df18b500','2022-12-16 18:18:18', '2022-12-16 18:18:18');
2.主库操作
(1).打开binlog,并重启主数据库
vim /etc/my.cnf
#主配置
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server-id=123456
service mysqld restart
(2).给主库加全局锁,只能读不能写,保证不产生新的binlog日志
mysql> FLUSH TABLES WITH READ LOCK;
(3).查看主库binlog日志写到哪一条,需要在从数据库配置File和Position
mysql> SHOW MASTER STATUS \G;
(4).把主库所有数据库数据备份,并将备份文件上传到从库
mysqldump -u root --all-databases --master-data > dbdump.sql
scp dbdump.sql root@121.4.191.124:/root/dbdump.sql
(5).取消全局锁,新增数据,产生新的binlog日志
mysql> UNLOCK TABLES;
3.从库操作
(1).打开binlog,并重启从数据库
vim /etc/my.cnf
#从配置
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server-id=654321
service mysqld restart
(2).查看备份文件
(3).查看从库binlog日志写到哪一条
mysql> SHOW SLAVE STATUS \G;
(4).设置从库的主库并开启主从复制
mysql> CHANGE MASTER TO MASTER_HOST='121.4.211.73',MASTER_USER='root',MASTER_PASSWORD='********',MASTER_LOG_FILE='mysql-bin.000015',MASTER_LOG_POS=1543;
mysql> START SLAVE;
(5).再次查看从库binlog日志写到哪一条,发现和配置的主数据库一样
4.测试
(1).在主库往user表插入一条新数据
mysql> use study;
mysql> insert into user values (3,'owen','0192023a7bbd73250516f069df18b500','2023-01-16 08:08:08', '2023-01-16 08:08:08');
mysql> select * from user;
(2).从库查询
mysql> use study;
mysql> select * from user;
(3).检查主从binlog位置
(4).查看主从进程信息
mysql> SHOW PROCESSLIST \G;
主数据库存在一个dump binlog的线程,下载新的binlog。
mysql> SHOW PROCESSLIST \G;
从数据库存在一个等待主数据库发送dump binlog的线程,还有一个读取binlog的线程。
5.配置优化
(1).问题描述
LOG_FILE和LOG_POS不是很方便,根本原因是,备库不知道从哪一个log开始复制。
(2).思路
给每个事务分配一个全局唯一ID,GTID=server_uuid:gno,server_uuid为节点的uuid,gno为事务的流水号。GTID不仅简化了主从复制配置,而且对主从切换和故障恢复具有重要意义。
(3).主数据库操作
vim /etc/my.cnf
#主配置
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
service mysqld restart
(4).从数据库操作
vim /etc/my.cnf
#从配置
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
service mysqld restart
#暂停主从复制
mysql> STOP SLAVE;
#使用GTID进行主从复制
mysql> CHANGE MASTER TO MASTER_HOST='121.4.211.73',MASTER_USER='root',MASTER_PASSWORD='********',MASTER_AUTO_POSITIOIN=1;
#开始主从复制
mysql> START SLAVE;