MySql主从搭建、复制及配置实现

来源:互联网 发布:网络保密协议范本 编辑:程序博客网 时间:2024/06/05 08:58

主从搭建

搭建的版本是:5.6.36,zip压缩版,这个版本很重要,5.7的因为没有data文件需要另一套的执行方式。windows环境,一个物理主机,两个MySQL,通过修改端口号的方式实现。

将my-default.ini改名为my.ini之后,两个my.ini文件的内容分别是
端口3306的主MySQL:
basedir = E:\complie\mysql\mysql0datadir = E:\complie\mysql\mysql0dataserver_id = 1port = 3306log-bin=mysql-bin
端口3307的从MySQL:
basedir = E:\complie\mysql\mysql1datadir = E:\complie\mysql\mysql1dataserver_id = 2port = 3307log-bin=mysql-bin
配置好环境变量后,分别在其对应的bin文件中执行有选择的命令,记得用管理员的身份打开cmd

mysqld --install mysql3306 #安装mysqld remove mysql3306 #不成功时可以使用此命令删除net start mysql3306 #启动服务net stop mysql3306 #停止服务

最重要的两步,修改注册表,将默认data中的数据拷贝到新的data中去

由于在本机搭建了两个MySQL,需要手动修改注册表,不然在安装第二个mysql的时候就会出现问题,因此,要把第二个的注册表的image路径修改了

修改方式:在开始菜单输入regedit命令打开注册表,找到HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> services -> mysql3307,选中后将ImagePath参数值改成“E:\complie\mysql\mysql0\bin\mysqld” –defaults-file=”E:\complie\mysql\mysql1\my.ini” mysql3307




由于修改了默认的数据存放的路径,因此在需要将解压后MySQL中data文件中的内容拷贝到新的data文件夹中去,不然会出现各种奇怪的问题

主从配置

关于主从复制的原理,可以参考这篇文章https://segmentfault.com/a/1190000008942618

主MySQL执行
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'127.0.0.1' IDENTIFIED BY '123456';FLUSH PRIVILEGES;SHOW MASTER STATUS;

从MySQL执行
CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysqld-bin.000001',MASTER_LOG_POS=426;START SLAVE;SHOW SLAVE status

停止slave,删除主从关系
stop slave;
reset slave all;

重启master命令:reset master;

出现的问题:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
主从my.cnf中的server_id并不同,google之后,发现主从数据目录(/data/mysql)都有一个auto.cnf文件,里面记录的server-uuid是相同的,把从服务器的此文件删除,并重启服务器,连接成功
产生以上错误的原因是本人在在虚拟机上配置,只在一个服务器上装了mysqld,然后复制了服务器,导致两服务器的mysql配置完全相同,实际中应该不会遇到此问题


Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
从:mysql>stop slave;
主:mysql>flush logs;
主:mysql>show master status;
从:mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000002',MASTER_LOG_POS=120;
从:mysql> slave start;


以上两个问题解决后可以看到,从的salve_IO_state变为Waiting for master to send event,这样就是成功的,从主MySQL建立新的数据库后,从MySQL也可以同步建立



读写分离命令

读锁
mysql> flush tables with read lock;
mysql> set global read_only=1;

读写锁
mysql> unlock tables;
mysql> set global read_only=0;

数据库的读写分离的好处