以下操作是在 Windows Web Server 2008 R2 操作系统下
一、环境介绍及说明
主库的版本:mysql-5.6.42-winx64.zip
主库的ip地址:127.0.0.1
主库的端口:3306
从库的版本:和主库一样
从库的ip地址:127.0.0.1
从库的端口:3307
如果有多余的服务器也可以不用都配置到一台电脑上,只需要各服务器ip能ping通就行。
注:主库和从库版本可以一致也可以不一致,需要说明一点,如果两者版本不一致,一般主库的版本需要比从库的版本低,这样就可以避免由于版本问题,有些sql不能执行的问题。
二、下载安装MySQL
MySQL官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的,这里使用zip格式的进行安装。
下载完成后解压,解压后的目录:
三、配置MySQL主从
(1)主库(MySQL-Master)的安装与配置
主库根目录下有一个 my-default.ini 命名的配置文件复制一个,改名为 my.ini,用文本编辑器打开,进行配置以下基本信息:
[mysqld]
# 服务端使用的字符集默认为8比特编码的latin1字符集,设置为utf8字符
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 设置mysql的安装目录
basedir = D:\MySQL-5.6\mysql-1
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
datadir = D:\MySQL-5.6\mysql-1\data
# 设置3306端口
port = 3306
server_id = 1 # 主库和从库需要不一致,分别配一个唯一的ID编号
log_bin=master-bin # 二进制文件存放路径,存放在根目录data文件夹下
# binlog-do-db=test # 需要复制的库,多个库用逗号隔开,如果此项不配置所有主库都参与复制,这里要是配置了,同时也要在Slave(也就是你的从库) 上设定。
# binlog-ignore-db=mysql # 不需要复制的库,和上项同理
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
default-character-set=utf8
配置好的截图:
配置好主数据库后,复制,粘贴一个,作为从数据库
打开cmd,进入主库的bin文件夹中
输入以下安装命令:
mysqld -install MySQL-Master
注:其中的MySQL-Master为主库MySQL的服务名称
这里遇到一个如下图所示的错误提示:
解决方法:在别的Windows系统的下 C:\Windows\System32 中搜索找到 msvcp100.dll,复制到服务器相同的文件夹中即可。
出现以下提示,表示安装成功。
安装成功之后,输入以下命令启动MySQL:
net start mysql-master
注:net stop mysql-master 为停止命令
服务启动成功之后,就可以登录了,如下图所示,输入 mysql -u root -p(第一次登录没有密码,直接按回车),登录成功!
登录上之后设置root用户的密码(这里修改成123456)
执行命令
use mysql;
update user set password=password("123456") where user="root";
flush privileges;
执行完毕后如下图所示:
这样就设置好了root用户的密码了。
查看设置的字符集(my.ini配置文件里把字符集设置成了utf8,为了能正常显示中文)
show variables like "%character%";show variables like "%collation%";
(2)从库(MySQL-Slave)的安装与配置
进入从库目录中,修改 my.ini 配置文件,具体文件内容如下,将里面的路径修改成你自己的从库路径。
安装从库服务。
打开cmd,进入从库的bin文件夹下
执行命令:mysqld -install MySQL-Slave
注:其中的MySQL-Slave为从库MySQL的服务名称
出现以下提示,表示安装成功。
启动从的mysql服务器
执行命令:net start mysql-slave
注:net stop mysql-slave为停止命令
出现以下提示信息表示从库启动成功
同样的,登录从库设置从库root用户的密码(这里修改成123456)
这里特别需要注意:在cmd下登录从库时需要指定设置的端口号,否则会报以下错误
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
mysql -u root -P 3307 -p(大写的P代表端口号,小写的p代表密码)
执行命令
use mysql;
update user set password=password("123456") where user="root";
flush privileges;
执行完毕后如下图所示:
至此,主、从数据库的安装及配置就完成了。
进入Windows的服务管理(进入服务管理方法,快键键Win+R打开运行框窗口,输入services.msc),即可看到主从MySQL,以及它们的状态
四、关联主库(MySQL-Master)与从库(MySQL-Slave)
上面我们已经把MySQL-Master和MySQL-Slave相关配置都已配置完成,并分别启动了,现在我们在cmd下分别登录到主库和从库中。
注意:登录主库,需要先进入到主库的bin文件夹下,再登录MySQL,然后,执行命令 show master status 查看master的状态
下图中的 File 和Position 记录下来,在从库配置中会用到 (注意:每次重启主数据库 File 和 Position 参数都会变),如下图所示:
从库,也需要先进入到从库的bin文件夹下,再登录MySQL,然后,执行命令 show slave status 查看slave的状态
我们可以发现 ,master的状态下,生成了一个二进制的日志文件,而slave下是空的,所以我们现在就要把主库与从库关联起来。只需要让从库(slave)知道主库(master)的地址就可以了。
首先我们需要在主库(master)中创建一个用户用于与从库同步的用户名和密码(这里我创建一个test用户,密码为mysql),并给test用户授权,以用于主库操作从库。
注意:是在主库中建立一个用户(专门用给从库连接的,可别迷迷糊糊的到从库的命令界面敲):
具体如下:
相关命令:
create user test;
grant replication slave on *.* to '从库用户名(test)'@'从库主机地址(127.0.0.1)'identified by '密码(mysql)';
flush privileges; # 刷新权限
现在我们切到从库(slave),把主库与从库联系起来。
执行以下命令:
change master to master_host='127.0.0.1',master_port=3306,master_user='test',master_password='mysql',master_log_file='master-bin.000015',master_log_pos=120;
然后执行命令 start slave 开启主从同步,如下图所示:
stop slave # 关闭主从同步
然后执行下列命令查看 slave 的状态
show slave status \G(注意:\G后面没有分号的)
这里出现了错误,如下图所示:
这里还有uuid的概念,配置mysql主从时,由于是直接拷贝的mysql目录,导致主从mysql uuid相同, Slave_IO无法启动,所以报错,各个数据库的server_uuid得保证不一样,用以下命令分别查看主从数据库的server_uuid
show variables like '%server_uuid%';
show variables like 'server_id'; # 查看server_id
可以看到主从数据库的server_uuid是相同的
解决方法:
找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个数据库的uuid不一样,修改后重启数据库即可
再依次执行以下命令:
stop slave # 关闭主从同步
start slave # 开启主从同步
show slave status \G(注意:\G后面没有分号的) # 查看 slave 的状态
出现如下图所示,则开启主从跟踪成功
至此,主从跟踪已经开启,并全部配置完成
五、验证主从同步
分别进入主库和从库并查看它们的数据库,然后在主库中创建一个数据库web,看一下从库有没有变化,如下图所示:
至此,主从同步已配置完毕。
说明:注意不要往从库中写数据,如果从库写入数据,master_log_pos是不会变化的,主库的信息没有发生变化,当主库又变化和从库一样的操作时就有可能会产生冲突,因此,只能在主库中写数据,从库只能读数据,当然主库也可以读数据。
还有一点,如果想同步主库里在之前就有的数据库的数据,需要手动从主库中导出数据库,然后在从库里再导入,就能同步了。
六、其他一些相关命令
查看binlog日志里面的内容
列表:show master logs
清空:reset master
刷新:flush logs
查看指定日志:show binlog events in '日志键名'
本文参考自其他博客: