centos6下mysql的主从复制的配置
2015年9月17日 23:00:36 update
想要好好了解mysql复制,还是去看看《高性能MySQL》(第三版)好了,上面说的比较详细。
===========
在本地用virtualbox安装了两台centos6.7服务器,配置了主从复制。两个服务器都配置了第二块网卡(host-only),master的ip为192.168.56.102
slave的ip为192.168.56.103
安装
centos-6.7-minimal.iso
配置eth0网卡
默认不能上网!因为没开启eth0
vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes #修改! MM_Controlled=no #修改! BOOTPROTO=dhcp #不修改,就用它! ##其他没有列出的行,用默认值,不要动! /etc/init.d/network restart
添加网卡
cd /etc/sysconfig/network-scripts cp ifcfg-eth0 ifcfg-eth1 vi /etc/udev/rules.d/70-persistent-net.rule #查看eth1的mac地址并复制 vi ifcfg-eth1 #修改掉mac地址 #删除UUID 没有这个UUID一样可以玩!因为我并没有找到好用的寻找到uuid的方法
关selinux
我就没见这东西好用过!
vi /etc/selinux/config SELINUX=disabled #!修改! reboot #退出vim后,重启才能生效
mysql安装和简单配置
yum install mysql mysql-devel mysql-server chkconfig --add mysqld chkconfig mysqld on #开机自动启动 service mysqld start mysql_secure_installation #安全安装:设定root密码,移除匿名用户,禁用远程登陆,删除测试数据和访问权限,重新加载用户权限表
master配置
cp /etc/my.cnf /etc/my.cnf.bak #备份 vi /etc/my.cnf #编辑文件内容为: datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-bin=mysql-bin #新增。表示使用二进制日志。前面的datadir则指定了binlog的存放目录 server-id=102 #新增。用本机ip最后一段,比如192.168.56.102那么使用102 /etc/init.d/mysqld restart #重启mysql mysql -uroot -ppipe36# #登陆mysql mysql>grant replication slave, replication client on *.* to 'repl'@'192.168.56.103' identified by 'zjmos123567' # 设定允许slave服务器使用的master帐号,允许其远程登陆(指定了slave的ip地址),同时设定了用户名和密码
接下来,从数据库中导出数据,然后传送给slave服务器,并在slave服务器中导入sql文件。
为了确保没有数据库插入或者修改操作,要设定lock:
mysqldump -uroot -ppipe36# --lock-all-tables testDB > testDB.sql #导出testDB数据库到testDB.sql文件
mysql -u root -p mysql>show master status; #查看状态!重要! File字段和Position字段给slave用的!
slave配置
my.cnf中加入server-id
#[mysqld]下添加两行 log-bin=mysql-bin #非必须 server-id=103 #一般取本及机ip最后一段
重启mysql
service mysqld restart
导入master的sql文件
注意 master导出的文件可能只是一个数据库的(本例),因此可能sql文件中头部缺少两句:
create database xxx if not exists; use xxx;
那么需要slave登陆mysql后手动输入这两句,以指定数据库名。
mysql -u root -p source testDB.sql change master to master_host='192.168.56.102',master_user='repl',master_password='zjmos123567',master_log_file='mysql-bin.000009',master_log_pos=901;
此处,master_user
用户是master上创建的用户,master_password
和前面master中的配置的要保持一致;master_log_file
的值要和master中查询到的master status
结果中的File
保持一致,master_log_pos
则和Position
字段保持一致。
mysql> start slave; #开启slave mysql> show slave status\G #查看slave是否正常工作,主要看`Slave_IO_Running`和`Slave_SQL_Running`
还是不行?
无语了。slave的Slave_IO_Running
项一直显示NO
发现是防火墙iptable在作怪。master和slave都关掉好了:
service iptables stop chkconfig iptables off
然后重启动mysql服务,终于好了。
===
常见错误和solution
Error duplicate entry ....
因为同步出错了。
在slave上执行:
stop slave; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;
然而,counter设置为1也还是很不靠谱的。
有时候因为mysql发生了回滚操作,因此要避开的insert失败(错误代码1062)项,有非常多。
这时候不妨在my.cnf(windows下是my.ini)中进行配置:
slave-skip-errors = 1062
然后重启mysql服务,再看看mysql主从复制的结果。等复制好了,再把上面这条skip的配置项去掉。毕竟一直skip感觉很不安全啊。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端