Mysql复制过程:
第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务串行的写入二进制日志,即
使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二部分就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通>的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件>。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。
目录
Mysql主从复制
角色
系统
服务
IP地址
master
centos7
mysql5.7
192.168.100.10
slave
centos7
mysql5.7
192.168.100.20
slave
centos7
mysql5.7
192.168.100.30
安装mysql
主从服务器上都分别进行操作
1.下载yum源:
1
$ wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
2.安装yum源
1
$ rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
3.安装mysql
1
$ yum install -y mysql-community-server
4.启动服务并开启自启
1
2
$ systemctl start mysqld
$ systemctl enable mysqld
5.修改root密码
mysql5.7安装后自动在日志生成默认密码
1
2
$ cat /var/log/mysqld.log | grep password
2018-07-23T14:26:26.645579Z 1 [ Note] A temporary password is generated for root@localhost: d!; Gi9GoDg!y
登录mysql重新设置密码
1
2
3
$ mysql -uroot -p #回车然后输入刚才找到的密码
> alter user 'root' @'localhost' identified by '123456.Com' ;
> flush privileges;
配置主从
配置主库
6.修改配置文件
1
2
3
4
5
6
7
$ vim /etc/my.conf
[ mysqld]
log-bin = mysql-bin
server-id = 1
...
$ systemctl restart mysqld
7.为从库授权
1
2
> grant replication slave on *.* to 'test' @'192.168.100.%' identified by '123456.Com' ;
> flush privileges;
8.获取Binlog的日志名和偏移量
1
2
3
4
5
6
> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
配置从库
9.修改配置文件
192.168.100.20标识设置为2,192.168.100.30标识设置为3
1
2
3
4
5
6
7
8
9
10
$ vim /etc/my.conf
[ mysqld]
server-id = 2
...
[ mysqld]
server-id = 3
...
$ systemctl restart mysqld
10.配置主从信息
1
2
3
4
5
6
7
> change master to
-> master_host = '192.168.100.10' , #主库服务器的IP
-> master_port = 3306, #主库端口
-> master_user = 'test' , #主库用于复制的用户
-> master_password = '123456.Com' , #用户密码
-> master_log_file = 'mysql-bin.000001' , #主库的Binlog日志名
-> master_log_pos = 154; #Binlog日志的偏移量
11.启动slave线程
测试同步
12.主库创建数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> create database test default character set = 'utf8' ;
> use test;
> create table student(
-> id INT( 11) NOT NULL AUTO_INCREMENT,
-> name VARCHAR( 20) NOT NULL DEFAULT '0' ,
-> age INT( 11) NOT NULL DEFAULT '0' ,
-> sex VARCHAR( 10) NOT NULL DEFAULT '0' ,
-> PRIMARY KEY ( id)) ;
> insert into student values( 1,'张三' ,20,'男' ) ,( 2,'李四' ,'19' ,'男' ) ;
> select * from student;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 1 | 张三 | 20 | 男 |
| 2 | 李四 | 19 | 男 |
+----+--------+-----+-----+
13.查看从库slave状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> show slave status\G ;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.100.10
Master_User: test
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1529
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 1695
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
> select * from test.student;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 1 | 张三 | 20 | 男 |
| 2 | 李四 | 19 | 男 |
+----+--------+-----+-----+