网上很多主从搭建的方法,但大多都是同平台下搭建,本篇文章是以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-binserver-id = 1expire_logs_days = 7修改配置文件完成后重启mysql
/etc/init.d/mysql restart 登录mysql查看server-id的值是否为1 SHOW VARIABLES LIKE 'server_id';查看binglog功能是否开启
mysql>SHOW VARIABLES LIKE 'log_bin';建立数据库whsir(我这里作为演示用,见附录3)
mysql>CREATE DATABASE whsir; 查看bin-log的信息 mysql>SHOW MASTER STATUS;FilePositionBinlog_Do_DBBinlog_Ignore_DBmysql-bin.000008107whsir1 row in set (0.00 sec)
授权可以来读取日志文件的用户
mysql>GRANT REPLICATION SLAVE ON . TO 'zhu'@'192.168.0.71' IDENTIFIED BY '123456';刷新权限,使其生效
mysql>FLUSH PRIVILEGES; 查看zhu帐号是否生效 mysql>SELECT USER,HOST FROM mysql.user;userhostroot127.0.0.1zhu192.168.0.71root::1rootlocalhosttestlocalhost为了确保主服务器的账户配置正确,我们在从slave服务器上,登录下master mysql(此处如果连不上,查看是不是防火墙问题)mysql -uzhu -p123456 -h192.168.0.70
slave windows
修改my.ini 原来配置文件中有的话就不用在添加了
[mysqld]server-id = 2log-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 mysqlnet start mysql创建whsir库(我这里做演示用,直接就创建了,没有导入数据)
mysql>CREATE DATABASE whsir; 登录mysql查看server-id的值是否为2 mysql>SHOW VARIABLES LIKE 'server_id';先停止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;上述配置好后启动slave同步
mysql>SLAVE START; 查看状态G就是结束,再加一个";" 就多余了,如果加上;会报错 mysql>SHOW SLAVE STATUSG如果看到Slave_IO_Running和Slave_SQL_Running都是Yes,Seconds_Behind_Master:0,表示主从服务器已经配置成功
附录:
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 TOmysql>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 TOmysql>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