主从搭建
搭建的版本是:5.6.36,zip压缩版,这个版本很重要,5.7的因为没有data文件需要另一套的执行方式。windows环境,一个物理主机,两个MySQL,通过修改端口号的方式实现。将my-default.ini改名为my.ini之后,两个my.ini文件的内容分别是
端口3306的主MySQL:
basedir = E:\complie\mysql\mysql0
datadir = E:\complie\mysql\mysql0data
server_id = 1
port = 3306
log-bin=mysql-bin
端口3307的从MySQL:
basedir = E:\complie\mysql\mysql1
datadir = E:\complie\mysql\mysql1data
server_id = 2
port = 3307
log-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;
mysql> set global read_only=1;
读写锁
mysql> unlock tables;
mysql> set global read_only=0;