转载本文请联系SQL数据库开发公众号。之前很多朋友都想知道MySQL主从复制的配置步骤,今天就来了。伴随着您可能遇到的每一个例外。配置环境操作系统:两台CentOS7.6Linux系统数据库版本:MySQL5.6.39主服务器IP:192.168.0.1从服务器IP:192.168.0.2在安装数据库之前,我已经详细讲解了如何在CentOS上一步步安装MySQL,没看过的朋友可以点这里:《Linux环境下安装MySQL步骤详解》配置前提1、需要保证3306端口防火墙开启或关闭,这个在安装MySQL的时候有介绍。2、两台服务器可以互相ping通--在192.168.0.2上输入ping命令ping192.168.0.1--在192.168.0.1上输入ping命令ping192.168.0.23。成功安装一个MySQL后,使用Clone一个虚拟机作为从服务器配置主(Master)数据库1.修改数据库配置文件[root@localhost~]#vi/etc/my.cnf把里面的内容改成[mysqld]#开启二进制日志log-bin=mysql-bin#标识唯一id(必填),一般使用ip的最后一位mysql#指定需要同步的数据库(与slave匹配),可以设置多个binlog-do-db=test添加日志存储方式和规则(可选)#设置存储方式不设置默认binlog_format=MIXED#日志清理时间expire_logs_days=7#日志大小max_binlog_size=100m#缓存大小binlog_cache_size=4m#最大缓存sizemax_binlog_cache_size=521m注:日志存储容量我设置的比较小,当然大家可以根据实际情况修改。2、重启数据库服务mysqldservicemysqldrestart如果你按照上面正确安装了mysql,这里可以正常重启。如果启动不正常,会报如下错误:TheserverquitwithoutupdatingPIDfile...需要使用如下命令查看mysqld进程是否还存在ps-ef|grepmysqld如果是,可以使用命令:kill-9mysqldprocessNo.结束吧,然后重启mysqld上面的情况我也遇到过。当然还有其他原因,这里给出其他可能原因的解决方案供参考:https://javawind.net/p1413,登录MySQL数据库允许从库中获取主库日志[root@localhost~]#mysql-uroot-p注意:第一次登录不需要输入root密码。进入后进行如下配置:#给从库mysql>GRANTFILEON*.*TO'root'@'192.168.0.2'IDENTIFIEDBY'rootpassword';#创建用户mysql>GRANTREPLICATIONSLAVEON*.*TO'root'@'192.168。0.2'IDENTIFIEDBY'rootpassword';#修改用户权限mysql>selecthost,user,passwordfrommysql.user;#查看是否修改成功mysql>FLUSHPRIVILEGES;#刷新权限4.重启MySQL服务,登录MySQL,查看主要数据库信息[root@localhost~]#servicemysqldrestart#重启mysql服务[root@localhost~]#mysql-uroot-p#登录mysqlmysql>showmasterstatus;#查看master状态,显示如下内容+-------------------+------------+------------+-------------------------------+--------------------+|文件|位置|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|+-----------------+----------+------------+------------------------------+------------------+|mysql-bin.000006|120|ufind_db|information_schema,performance_schema,mysql||+----------------+----------+----------------+--------------------------------+------------------+1rowinset(0.00sec)注意:如果这一步的执行一直是Emptyset(0.00sec),那我ans说之前的my.cnf没有配置正确,请回去重试检查配置步骤。配置从(Slave)数据库1.修改从数据库的数据库配置文件[root@localhost~]#vi/etc/my.cnf把里面的内容改成#Openbinaryloglog-bin=mysql-binserver-id=2binlog-ignore-db=information_schemabinlog-ignore-db=performance_schemabinlog-ignore-db=mysql#与主库配置一致replicate-do-db=testreplicate-ignore-db=mysqllog-slave-updatesslave-skip-errors=allslave-net-timeout=602,重启MySQL服务,登录MySQL[root@localhost~]#servicemysqldrestart[root@localhost~]#mysql-uroot-p修改如下:#CloseSlavemysql>stopslave;#Set连接master数据库信息mysql>changemastertomaster_host='192.168.0.1',master_user='root',master_password='rootpassword',master_log_file='mysql-bin.000006',master_log_pos=120;#打开Slavemysql>startslave;注意:上面的master_log_file是配置Master时的File字段,master_log_pos是配置Master的Position字段。一定要一一对应3、查看从库状态信息mysql>showslavestatus\G;如果成功,将显示以下信息:***************************1.row****************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.0.1Master_User:rootMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000006Read_Master_Log_Pos:120Relay_Log_File:localhost-relay-bin.000006Relay_Log_Master_Pos:520:mysql-bin.000006Slave_IO_Running:Yes//显示yes表示成功Slave_SQL_Running:Yes//显示yes表示成功。mysql//上面的都是配置文件中的信息Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno:0Last_Error:Skip_Counter:0Exec_Master_Log_Pos:357Relay_Log_Space:697Until_Condition:NoneUntil_Log_File:Until_Log_Pos:0Master_SSL_Allowed:NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert:NoLast_IO_Errno:0Last_IO_Error://如果不是,这里会显示Last_SQL的错误信息_Errno:0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id:2Master_UUID:be0a41c0-2b40-11e8-b791-000c29267b6aMaster_Info_File:/usr/local/mysql/data/master.infoSQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State:Slavehasreadallrelaylog;waitingfortheslaveI/OthreadtoupdateitMaster_Retry_Count:86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position:01rowinset(0.00sec)ERROR:Noqueryspecified注意:如果Slave_IO_Running:No并且出现以下错误Last_IO_Error:Fatalerror:TheslaveI/OthreadstopsbecausemasterandslaveserverUqualID这些UUID必须是复制工作不同。意思是主服务器的UUID和从服务器的UUID重复了,因为我是安装一个数据库成功后直接克隆的,所以他们的UUID是一样的,会报这个错,可以修改看看从库的UUID。我们先在从库的数据库中生成一个UUIDmysql>selectUUID();复制从数据库中查询到的UUID,然后编辑从库的UUID配置文件。如果你和我安装的一样,那么这个配置文件的路径应该是这里:[root@localhost~]#vi/usr/local/mysql/data/auto.cnf进去后,替换一串32-使用我们刚刚在数据库查询中生成的UUID位UUID。如果Slave_IO_Running:No和下面的错误Gotfatalerror1236frommasterwhenreadingdatafrombinarylog:'Couldnotfindfirstlogfilenameinbinarylogindexfile'解决方法:resetmysql>stopslave;//stopmysql>resetslave;//resetmysql>startslave;//开启至此,整个流程配置完毕。可能有朋友会问,这些配置文件我都配置过了,信息和你的一样,但是还是不确定配置是否成功。然后就可以在主服务器上创建一张表,然后在从服务器上查询新创建的表是否存在。提示1。关于增删改查,主从数据不一致:#select语句,暂时没发现问题#insert语句,暂时没发现问题#update语句,暂时没发现问题#delete语句,主库删除多条数据,发现数据不一致原因:主库logbin中确实有delete语句,但是从库logbin中没有delete语句解决方法:使用usedatabaseto在当前数据库结构中选择需要操作的数据库,然后执行删除,OK,同步成功2.查询binlog主从日志的方法#查看所有binlog文件mysql>showbinarylogs;#查看是否有binlogenabledNO表示enablemysql>showvariableslike'log_bin%';#详细信息mysql>showvariableslike'binlog%';#查看binlog日志mysql>showbinlogeventsin'mysql-bin.000019';#或者使用mysqlbinlog,如果报错,使用--no-defaults(使用完整路径)[root@localhost~]#/usr/local/mysql/bin/mysqlbinlog--no-defaults/usr/local/mysql/data/mysql-bin.0000193,手动清除master日志,最好关闭日志,在/etc/my.cnf#Manuallyrefreshthelogmysql>showmasterstatus;#deleteallmysql>resetslave;或restmaster;#DeleteMySQL-bin.004mysql>PURGEMASTERLOGSTO'MySQL-bin.004';另外,如果修改了最大连接数,可能你在mysql配置文件中把连接数改成了1000以上,但是查询数据库的最大连接数一直是214,可以试试下面的方法:https://www.cnblogs.com/brucetang/p/9733998.html参考https://javawind.net/p141https://www.cnblogs.com/brucetang/p/9733998.html
