在windows和centos做mysql主从搭建方法

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

网上很多主从搭建的方法,但大多都是同平台下搭建,本篇文章是以centos服务器为主windows2008服务器为从,搭建mysql主从。

一些想法:windows和centos平台不同,是否能做mysql主从,后来想了想,mysql也是可以在windows上跑的,同是mysql应该不会有什么问题存在,然后此篇文章产生了……

MySQL主从复制原理:

MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另一个线程(I/O线程)在Master端。

要实现MySQL的主从复制,首先必须要先打开Master端的binlog记录功能。因为整个复制过程实际上就是slave从master端获取binlog日志,然后再在slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作。

简单点来说:

就是主服务器将改变的内容记录到二进制日志文件(binlog)中,从服务器将主服务器的二进制文件拷贝到它的中继日志(relay log),并重新开启SQL线程,从中继日志中读取二进制日志,使其数据和主服务器的保持一致,最后slave端的I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

注意:如果你的版本和我所写的版本不同,可能在配置过程中会有问题出现,为了确保成功性,建议现在本地环境测试成功,再对线上服务进行操作,请确保服务器的时间同步一致。

服务器配置:

linux主192.168.0.70
版本Centos6.7 nginx1.10 php5.4.45 mysql5.5.48

windows从192.168.0.71
版本IIS7 mysql5.5.54 php5.6.29

 

master centos

设置master mysql配置文件/etc/my.cnf

[mysqld]
log-bin=mysql-bin
server-id = 1
expire_logs_days = 7

log-bin表示开启mysql的binlog日志功能,指定的mysql-bin表示日志文件的命名格式,会生成文件名为mysql-bin.000001、mysql-bin.000002、等的日志文件。

server-id是节点标识,主、从的节点必须是全局唯一,不能相同。

expire_logs_days二进制日志自动删除的天数,0则是不自动删除。

注意,log-bin和server-id都是在[mysqld]模块内的。

注意,先在my.cnf中查找相关参数并修改,如果查找不到则手动添加,参数不能重复。

修改配置文件完成后重启mysql

/etc/init.d/mysql restart

登录mysql查看server-id的值是否为1
SHOW VARIABLES LIKE 'server_id';

m1

查看binglog功能是否开启

mysql>SHOW VARIABLES LIKE 'log_bin';

m2

建立数据库whsir(我这里作为演示用,见附录3)

mysql>CREATE DATABASE whsir;

查看bin-log的信息
mysql>SHOW MASTER STATUS;
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000008 107 whsir 

1 row in set (0.00 sec)

注意:这里记住File的值:mysql-bin.000008和Position的值:107,后面会用到。

根据主从复制原理,从库想要和主库同步,必须要有一个连接的帐号,这个帐号是要在主库上创建的。

授权可以来读取日志文件的用户

mysql>GRANT REPLICATION SLAVE ON . TO 'zhu'@'192.168.0.71' IDENTIFIED BY '123456';

REPLICATION SLAVE为mysql的必须权限,此处不要ALL。

.表示所有库和表,此处也可以指定具体的库和表。例如aaa库的bbb表:aaa.bbb

'zhu'@'192.168.0.71',同步的帐号和授权的主机地址,主机地址可以使用%进行通配。

此处为演示用,密码就设置了123456。

刷新权限,使其生效

mysql>FLUSH PRIVILEGES;

查看zhu帐号是否生效
mysql>SELECT USER,HOST FROM mysql.user;
user host
root 127.0.0.1
zhu 192.168.0.71
root ::1
root localhost
test localhost

为了确保主服务器的账户配置正确,我们在从slave服务器上,登录下master mysql(此处如果连不上,查看是不是防火墙问题)
mysql -uzhu -p123456 -h192.168.0.70

 

slave windows

修改my.ini 原来配置文件中有的话就不用在添加了

[mysqld]
server-id = 2
log-bin=mysql-bin #可以注释掉log-bin,从库一般不开启log-bin功能
relay-log = mysql-relay-bin #中继日志,可注释掉
expire_logs_days = 7 #自动清理7天前的日志,前面如果注释了,此处也不用添加了,注释掉吧
read_only = on #只读
replicate-wild-do-table=whsir.% #指定复制的库和表,此处%表示通配所有,见附录9

my.ini配置中一定要配置的就是server-id其他都可以省略掉!!!

配置好my.ini后重启mysql(不知道windows中如何重启mysql的请自行google)

net stop mysql
net start mysql

m3

创建whsir库(我这里做演示用,直接就创建了,没有导入数据)

mysql>CREATE DATABASE whsir;

登录mysql查看server-id的值是否为2
mysql>SHOW VARIABLES LIKE 'server_id';

m4

先停止slave同步,也可以mysql>STOP SLAVE;

mysql>SLAVE STOP;

mysql>CHANGE MASTER TO
->MASTER_HOST='192.168.0.70',
->MASTER_USER='zhu',
->MASTER_PASSWORD='123456',
->MASTER_PORT=3306,
->MASTER_LOG_FILE='mysql-bin.000008',
->MASTER_LOG_POS=107,
->MASTER_CONNECT_RETRY=10;

MASTER_PORT是主服务器端口,默认就是3306。

MASTER_CONNECT_RETRY是连接失败后等待的秒数。

注意上面是分开写的,你也可以写在一行里。

上述操作原理其实是把用户的信息写入到了从库的data/master.info中了

上述配置好后启动slave同步

mysql>SLAVE START;

查看状态G就是结束,再加一个";" 就多余了,如果加上;会报错
mysql>SHOW SLAVE STATUSG

m5

如果看到Slave_IO_Running和Slave_SQL_Running都是Yes,Seconds_Behind_Master:0,表示主从服务器已经配置成功

Slave_IO_Running是IO的线程状态,IO线程负责从slave库到master库读取binlog日志,并写入到slave的中继日志(relay-log),Yes表示IO线程工作正常。

Slave_SQL_Running是SQL的线程状态,SQL线程负责读取中继日志(relay-log)中的数据并转换为SQL语句应用到slave库中,Yes表示SQL线程工作正常。

Seconds_Behind_Master是复制过程中,slave库比master库延迟的秒数。

 

附录:

1、从服务器遇到错误:ERROR 1201 <HY000>: Could not initialize master info structure; more error messages can be found in the mysql error log
错误原因是因为从数据库之前已经做过主从复制了,所以要先停止从库,再进行从库设置。
解决方法:
mysql>stop slave;
mysql>reset slave;
mysql>CHANGE MASTER TO
mysql>MASTER_HOST='192.168.0.70',
mysql>MASTER_USER='zhu',
mysql>MASTER_PASSWORD='123456',
mysql>MASTER_PORT=3306,
mysql>MASTER_LOG_FILE='mysql-bin.000008',
mysql>MASTER_LOG_POS=107,
mysql>MASTER_CONNECT_RETRY=10;

2、从服务器Slave_SQL_Running:No
出现问题原因:
可能slave服务器重启导致
也可能是在slave进行了写操作
解决办法一:
mysql>slave stop;
mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql>slave start;
解决办法二:
查看master服务器File和Position值,需要停止master的写操作。
mysql>SHOW MASTER STATUS;
在从服务器上停掉slave服务
mysql>slave stop;
然后在执行下面,注意更改File和Position值
mysql>CHANGE MASTER TO
mysql>MASTER_HOST='192.168.0.70',
mysql>MASTER_USER='zhu',
mysql>MASTER_PASSWORD='123456',
mysql>MASTER_PORT=3306,
mysql>MASTER_LOG_FILE='mysql-bin.000008',
mysql>MASTER_LOG_POS=107,
mysql>MASTER_CONNECT_RETRY=10;
开启slave服务
mysql>slave start;

3、如果服务器的mysql已经在跑着了,需要先锁定数据库防止写入并导出数据库。
mysql>FLUSH TABLES WITH READ LOCK; #master锁定数据库防止写入,锁表后再开一个SSH进行备份操作(当前窗口不要动)。
mysqldump -u root -p123456 --all-databases --lock-tables=false > /root/all.sql #master导出数据库
mysql -u root -p123456 < /root/all.sql #slave服务器导入数据
mysql>UNLOCK TABLES; #master解锁表

4、Slave_IO_Running: No遇到了几次这个问题,最后发现是主服务器防火墙挡住了,关闭主服务器的防火墙(或者自行添加规则),在从服务器上
mysql>slave stop;
mysql>slave start;

5、查看只读状态:show global variables like "%read_only%";

修改只读状态:set global read_only=off;或set global read_only=on;

6、重启mysql不会影响主从服务,还是尽量避免重启。

7、binglog日志自动清理
在my.ini或my.cnf中设置expire_logs_days = 7
表示二进制日志自动删除的天数,0则是不自动删除。
可以通过show variables like '%log%';查看
其中这一行就是自动删除的天数expire_logs_days | 7

8、master的SHOW MASTER STATUS;没有返回结果,检查下master的binlog配置是否正确。
mysql>SHOW VARIABLES LIKE 'log_bin';

9、relicate-wild-ignore-table是复制过滤选项,可以过滤不需要复制的数据库或表,例如:relicate-wild-ignore-table=mysql.%
replicate-wild-do-table用来指定需要复制的数据库或表,例如:replicate-wild-do-table=test.%
过滤多个,就多写一行。

注意:不要在主库上使用binlog-do-db或binlog-ignore-db选项,也不要在从库上使用relicate-do-db或relicate-ignore-db选项,因为这样可能会产生跨库更新失败的问题,推荐直接在从库上使用replicate-wild-do-table和relicate-wild-ignore-table两个选项来解决复制过滤的问题。

不停止mysql服务配置主从https://blog.whsir.com/post-606.html

windows 2008 安装mysql5.5.54https://blog.whsir.com/post-532.html

linux修改mysql字符集编码https://blog.whsir.com/post-487.html

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
1月前
|
关系型数据库 MySQL 开发工具
MySQL5.7主从配置(Docker)
MySQL5.7主从配置(Docker)
726 0
|
1月前
|
Linux 应用服务中间件 nginx
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
46 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
9天前
|
关系型数据库 MySQL Linux
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
linux CentOS 7.4下 mysql5.7.20 密码改简单的方法
17 0
|
2天前
|
关系型数据库 MySQL Linux
centos7安装mysql-带网盘安装包
centos7安装mysql-带网盘安装包
29 2
|
9天前
|
关系型数据库 MySQL Linux
CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解
CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解
44 0
|
9天前
|
SQL 关系型数据库 MySQL
mysql主从同步出错解决办法
mysql主从同步出错解决办法
7 0
|
1月前
|
canal 关系型数据库 MySQL
四种常用的 MySQL 数据同步 ES 的方法
【2月更文挑战第16天】
167 2
四种常用的 MySQL 数据同步 ES 的方法
|
1月前
|
关系型数据库 MySQL Linux
【VMware安装+centos 7Linux系统+MySQL安装】——在Linux系统中安装MySQL步骤,以及遇见的各种问题(如:vm两个虚拟网卡消失、vm网络适配器有感叹号等等)
【VMware安装+centos 7Linux系统+MySQL安装】——在Linux系统中安装MySQL步骤,以及遇见的各种问题(如:vm两个虚拟网卡消失、vm网络适配器有感叹号等等)
178 0

热门文章

最新文章