mysql主从复制
Mysql主从复制
MySQL内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
复制的原理:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将更改应用到自己的数据上。
看到了吧. 一台主的. n个从的. 一主多从,而不能一从多主.注意了哈. 那咱们就以 1从1主为例. 下面先配主机
复制配置:
有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
步骤
1:俩台机器都关闭防火墙
service iptables stop
2、修改主服务器
先查找my.cnf的位置 whereis my.cnf
#vi /etc/my.cnf
[mysqld]
#log-bin是指开启二进制操作日志
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 (不能一样) //[必须]服务器唯一ID,默认是1,可以理解为IP.所以说以ip的最后三位为id比较合适
#需要同步的库. 不写同步所有
binlog-do-db = 需要同步的数据库,多个用逗号隔开
3.修改从服务器
#vi /etc/my.cnf
[mysqld]
server-id=222
relay_log=mysql-relay-bin //## 开启中继日志
log_slave_updates=1 //开启中继日志的复制事件
4、重启两台服务器的mysql
service mysqld restart
5、在主服务器上给从服务器建立帐户
GRANT ALL PRIVILEGES ON *.* TO zhangsan@"%" IDENTIFIED BY "lisi";
6、登录主服务器的mysql,查询master的状态
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave:
首先先找到从服务器的位置然后:
mysql -uroot -p
mysql>change master to master_host='101.201.239.158',(linux的ip)
master_user='zhangsan',(新建的用户名)
master_password='lisi',(新建的列表)
master_log_file='mysql-bin.000011',(此数为:上边的mysql-bin.000004)
master_log_pos=319; //注意不要断开,308数字前
8、开启主从
Mysql>start slave;
9、检查从服务器复制功能状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 //主服务器地址
Master_User: mysync //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
......
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
面试题
1主从mysql版本不一致的时候应该怎么办?
答:在高版本的mysql配置文件加
binlog-checksum = none
2 主从延迟的问题
答
1 提高从数据库配置的处理能力
2 mysql-proxy代理中间件
3 修改配置文件 sync-binlog = 1