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线程

1
> start 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 ||
+----+--------+-----+-----+