定义

主从复制,有两种叫法:AB复制、Replication

原理

在主mysql服务器上打开bin-log(二进制日志);

bin-log用于记录主服务器数据变化类的操作,如增删改查;

传递给从服务器,根据bin-log日志重复主同样的操作(会出现延迟情况,也会不定因素主从不能同步)

 

每个从仅可以设置一个主。

主在执行sql之后,记录二进制log文件(bin-log)。

从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则停止同步。

从这几条Replication原理来看,可以有这些推论:

主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。

如果主从的网络断开,从会在网络正常后,批量同步。

如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。

一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。

如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

 

可以应用在读写分离的场景中,用以降低单台MySQL服务器的I/O

可以实现MySQL服务的HA集群

可以是一主多从,也可以是相互主从(主主)

--------------------------------------------------------------------------------

 

做这个实验呢,要准备两台机器,之前曾经装过一个mysql,现在先把原来的mysql删除掉,重新来装。

另外,给大家显示如何在一台机器上去跑两个mysql,为了给大家演示这个功能,就在这一台机器上去实现AB两个服务 。

安装第二个mysql (机器上已装过,在此第一个我就不安装了,安装过程参照之前的就可以了)

## 拷贝程序目录

[root@wy ~]# cd /usr/local/

[root@wy local]# cp -r mysql mysql_slave

 

## 定义配置文件

[root@wy local]# cd mysql_slave/

[root@wy mysql_slave]# vim my.cnf

[mysqld]

port            = 3307

socket          = /tmp/mysql_slave.sock

datadir         = /data/mysql_slave

## 初始化操作

[root@wy mysql_slave]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql_slave

 

## 查看/data/mysql_slave是否有两个目录

[root@wy mysql_slave]# ls /data/mysql_slave/

mysql  test

## 拷贝启动脚本并编辑

[root@wy mysql_slave]# cd /etc/init.d/

[root@wy init.d]# cp mysqld mysqldslave

[root@wy init.d]# vim !$

basedir=/usr/local/mysql_slave

datadir=/data/mysql_slave

conf=$basedir/my.cnf

## 启动

[root@wy init.d]# /etc/init.d/mysqldslave start

Starting MySQL.. SUCCESS!

## 查看进程和端口

[root@wy init.d]# ps aux|grep mysql

root      1303  0.0  0.1 108172  1580 ?        S    12:50   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/wy.com.pid

mysql     1447  0.0  7.2 553008 73616 ?        Sl   12:50   0:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql --log-error=/data/mysql/wy.com.err --pid-file=/data/mysql/wy.com.pid --socket=/tmp/mysql.sock --port=3306

root      1644  0.0  0.1 106068  1500 pts/0    S    13:39   0:00 /bin/sh /usr/local/mysql_slave/bin/mysqld_safe --datadir=/data/mysql_slave --pid-file=/data/mysql_slave/wy.com.pid

mysql     1801  0.5  6.6 543484 66948 pts/0    Sl   13:39   0:00 /usr/local/mysql_slave/bin/mysqld --basedir=/usr/local/mysql_slave --datadir=/data/mysql_slave --user=mysql --log-error=/data/mysql_slave/wy.com.err --pid-file=/data/mysql_slave/wy.com.pid --socket=/tmp/mysql_slave.sock --port=3307

root      1816  0.0  0.0 103264   888 pts/0    S+   13:41   0:00 grep mysql

[root@wy init.d]# netstat -lnp|grep mysql

tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      1801/mysqld         

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1447/mysqld         

unix  2      [ ACC ]     STREAM     LISTENING     16842  1801/mysqld         /tmp/mysql_slave.sock

unix  2      [ ACC ]     STREAM     LISTENING     11000  1447/mysqld         /tmp/mysql.sock


现在我们启动了两个mysql,那我们就可以把它模拟成两个服务器,一个主,一个从,主呢3306,从呢3307,那么接下来要去做一些配置了。

Mysql两种登录方式

## 3306的socket方式和ip加port

[root@wy ~]# mysql -uroot -p123456 -S /tmp/mysql.sock

[root@wy ~]# mysql -uroot -p123456 -h127.0.0.1 -P3306

 

## 3307的socket方式和ip加port(这个mysql没有设置密码)

[root@wy ~]# mysql -S /tmp/mysql_slave.sock

[root@wy ~]# mysql -h127.0.0.1 -P3307

mysql主

## 创建测试数据库(拷贝mysql作为db1的数据)

[root@wy ~]# mysql -uroot -p123456

mysql> create database db1;

[root@wy ~]# /usr/local/mysql/bin/mysqldump -uroot -p123456 -S /tmp/mysql.sock mysql > 123.sql    

[root@wy ~]# mysql -uroot -p123456 -S /tmp/mysql.sock db1 < 123.sql

## 查看拷贝的数据库

[root@wy ~]# mysql -uroot -p123456

mysql> use db1;

mysql> show tables;

解释说明:

我们搞这个db1这个库就是为了做实验,测试主从

## 编辑配置文件

[root@wy ~]# vim /etc/my.cnf

server-id       = 1  //序列号

log-bin=mysql-wyy          //可自定义

binlog-ignore-db=mysql   //不去同步mysql

解释说明:

两个可选参数(2选1)

binlog-do-db=db1,db2 需要同步的库           白名单

binlog-ignore-db=db1,db2 忽略不同步的库        黑名单

## 重启服务

[root@wy ~]# /etc/init.d/mysqld restart

## 可看到mysql-wyy几个作为前缀的文件

[root@wy ~]# ls /data/mysql

db1  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql-wyy.000001  mysql-wyy.index  test  wy.com.err  wy.com.pid  wyydb

解释说明:

这就是它的binlog

## 创建用户并授权(专门传输binlog的用户)

[root@wy ~]# mysql -uroot -p123456

mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123456';

mysql> flush privileges;

mysql> flush tables with read lock;

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-wyy.000001 |      331 |              | mysql            |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

解释说明:

flush privileges; 将内存的内容保存到硬盘中

flush tables with read lock; 锁定read,保持数据不变

show master status; 查看主状态

mysql从

再打开一个终端

## 编辑配置文件

[root@wy ~]# vim /usr/local/mysql_slave/my.cnf

server-id       = 2

## 重启服务

[root@wy ~]# /etc/init.d/mysqldslave restart

 

## 把主上的库拷贝过来

[root@wy ~]# mysql -S /tmp/mysql_slave.sock -e "create database db1"

[root@wy ~]# mysql -S /tmp/mysql_slave.sock db1 < 123.sql

解释说明:

要想实现同步,得先保证这两个机器的库是一样的

## 实现同步

[root@wy ~]# mysql -S /tmp/mysql_slave.sock

mysql> slave stop;   

mysql> change master to master_host='主IP', master_port=端口号, master_user='授权用户', master_password='密码', master_log_file='mysql-wyy.000001', master_log_pos=331;

解释说明:

如果是默认端口号master_port=可以省略

master_log_file='配置主show master status;的File列'

master_log_pos='Position列'

mysql> slave start;

mysql> show slave status\G;

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes


## 主上,解锁表

[root@wy ~]# mysql -uroot -p123456

mysql> unlock tables;

 

## 测试

mysql> use db1;

mysql> show tables;

 

mysql> drop table help_category;

 

## 再去从上看是否删除掉了

mysql> use db1;

mysql> show tables;

 

注意:不可以在从上去操作,你一旦在从上操作了一些写入的话,那么主从机制肯定会发生紊乱