mysql在windows环境下的主从复制原理及测试

  • 一、mysql主从复制原理
  • 二、mysql主从复制的步骤
  • 三、测试目标
  • 四、测试环境
  • 五、测试准备
  • 1、master上配置my.ini文件
  • 2、slave上配置my.ini文件
  • 3、主库操作
  • 4、Slave库操作
  • 六、开始测试
  • 七、总结
  • 1、操作过程中出现的错误
  • 2、结论


一、mysql主从复制原理

Mysql从3.25.15开始提供数据复制的功能。Mysql复制是指从一个Mysql主服务器(master)将数据复制到另一台或多台从服务器(slaves)上的过程,将主数据库的DDL和DML操作通过二进制日志传到从服务器上,然后在从服务器上对这些日志重新执行,使得主从服务器的数据保持同步。在mysql中,复制操作是异步执行的,slaves服务器不需要持续地保持连续接收master服务器的数据。

二、mysql主从复制的步骤

复制主要分为3步:
(1)主服务器将数据的改变记录到二进制日志(binary log)中。
(2)从服务器将主服务器binary log events复制到它的中继日志(relay log)中。
(3)从服务器重做中继日志中的事件,将数据的改变与主服务器保持同步。

主服务器会记录二进制信息,每个事务更新数据完成前,主服务器都将这些操作的信息记录在二进制文件中,事件写入完成后,主服务器通知存储引擎提交事务。

三、测试目标

将master的demo数据库同步到slave的demo数据库中,验证主从复制操作是异步进行的。

四、测试环境

(1)2台win10环境的电脑,能够实现联网互通。
(2)mysql版本为5.6.21解压版。
(3)IP:主(master):192.168.1.16 从(slave):192.168.1.15

五、测试准备

1、master上配置my.ini文件

在mysql的安装目录中通过配置my.ini文件中开启binlog日志,mysql默认不开启binary log 。

log_bin = “D:\mysql\binlog” (log_bin是二进制保存的位置,需要提前建好,注意没有分号,这些都会导致mysql重启报错。【一些情况下,G盘也报错,我的当初是G盘报错】)
expire_logs_days = 10 (表示二进制文件的保存的天数)
max_binlog_size = 100M (表示单个二进制文件最大的大小)

查看是否成功开启binlog日志,on表名成功开启,off表示未开启。

show variables like ‘%log_bin%’;

配置需要同步的数据库demo,不需要同步的数据库(不指定也行)。

binlog-do-db = demo
binlog-ignore-db = mysql
binlog-ignore-db = test

配置server_id,不能和slave的相同,建议和ip地址的末尾数值保持同步,好记。

server-id=16

配置完my.ini文件后要重启mysql服务。

net stop mysql
net start mysql

2、slave上配置my.ini文件

配置server_id,不能和slave的相同,其他配置采用默认的即可。

server-id=15

3、主库操作

登录mysql,按提示输入密码。

mysql -h localhost -uroot -p

将主库的demo数据库克隆一份到从库(注意是mysqldump 不是mysql)

mysqldump -u root -p -h localhost demo >d:\b.txt

创建授权用户

grant replication slave on . to ‘zxh’@‘192.168.1.15’ identified by ‘123’ ;

说明:zxh是mysql用户名,123是密码,192.168.1.15是从库的IP地址。

刷新权限

flush privileges;

显示master的状态信息,并且找到File 和 Position 的值记录下来,slave连接master时需要这两个变量。

show master status;

CentOS7系统搭建MySQL主从复制 windows mysql主从复制_主从复制的原理

4、Slave库操作

登录mysql

mysql -h localhost -uroot -p

将主库的demo数据克隆到从库

mysqldump -u root -p -h localhost demo < d:\b.txt

说明:一定提前在从库建好库,主库导出来的文件里不包含建库语句,手动拷到从库所在的主机上。

主库重新赋权

grant all privileges on . to ‘zxh’@’%’ identified by ‘123’ with grant option;

说明:%表示给了所有用户,测试这样干,不重新授权也可以

slave 与 master 建立连接,进行数据同步。

Stop slave; (连接前先停掉slave)

change master to master_host=‘192.168.1.16’,
master_user=‘zxh’,
master_password=123,
master_log_file=‘log.000004’,
master_log_pos=686;

Start slave(重启slave)

说明:slave和master建立连接前必须先停掉slave,建立连接后再开启。
Log.0000004、686和master的file和position保持一致,分别表示实现复制的binary log文件和binary log的偏移量。

查看slave数据库状态

show slave status;

CentOS7系统搭建MySQL主从复制 windows mysql主从复制_mysql_02

以上两项都为Yes说明配置成功,这是主从复制的核心,表明已经成功建立连接,可以通过I/O流进行复制了。

六、开始测试

(1)在master中的demo中进行任意的DDL和DML操作,然后查看slave是否同步成功。
经测试,成功。
(2)把slave中的mysql服务停掉,对master进行数据更新和插入操作,之后重启slave的mysql服务,数据依然保持一致,说明主从复制的操作是异步进行的。

七、总结

1、操作过程中出现的错误

(1)配置完my.ini都需要重启。
(2)从库配置文件不能出现跳过密码skip-grant-tables,否则授权失败。
(3)区分清楚哪些是在cmd下的操作,哪些在mysql的操作界面。
(4)区分是否加分号,my.ini文件里的配置都不需要分号,不同配置换行即可。

2、结论

mysql主从复制是异步进行的。