首先先了解一下MySQL主从复制的原理:
MySQL要做到主从复制,其实依靠的是二进制日志。
举例:假设主服务器叫Master,从服务器叫Slave;主从复制就是Slave跟着Master学,Master做什么,Slave就做什么。那么Slave怎么同步Master的动作呢?现在Master有一个日志功能,把自己所做的增删改(Insert、Delete、Update)的动作,全都记录在日志中,Slave只需要拿到这份日志,照着日志上面的动作施加到自己身上就可以了。这样就实现了主从复制。
1、准备多台服务器,并安装好MySQL数据库,其中一台为主(master),其余为从(slave)。
例如我准备的两台服务器:
IP :192.168.33.10 (master)
IP :192.168.33.11 (slave)
2、配置主MySQL(master)
2.1、修改MySQL配置文件,一般在/etc/my.cnf
# vim /etc/my.cnf
[mysqld]
server-id=10 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
log-bin=mysql-bin //[必须]启用二进制日志
binlog_format=mixed //二进制日志的格式,有三种:statement/row/mixed,具体分别不多做解释,这里使用mixed
2.2、配置完成保存退出,重启MySQL服务:
# service mysqld restart
2.3、在主服务器上为从服务器分配一个账号,从服务器通过这个账号,才能到主服务器上同步主服务器的日志文件:
MySQL [(none)]> GRANT replication slave ON *.* TO 'slave-1'@'%' identified by '123456'; //username:slave-1,pass:123456
2.4、查询主MySQL配置状态(保存File和Position,是下面配置从MySQL时的参数):
MySQL [(none)]> show master status;
3、配置从MySQL(Slave)
3.1、修改MySQL配置文件,也是/etc/my.cnf
# vim /etc/my.cnf
[mysqld]
server-id=11
log-bin=mysql-bin //[不是必须]启用二进制日志
binlog_do_db=test_db //同步的数据库
3.2、配置完成保存退出,重启MySQL服务:
# service mysqld restart
3.3、关闭slave(一定要先关闭) :
MySQL [(none)]> stop slave;
3.4、开始配置
//从MySQL中添加参数
//**参数解释:MASTER_HOST:设置要连接的主服务器的ip地址,MASTER_USER:设置要连接的主服务器的用户名,MASTER_PASSWORD:设置要连接的主服务器的密码,MASTER_LOG_FILE,设置要连接的主服务器的bin日志的日志名称,即查询主MySQL配置状态中的File,MASTER_LOG_POS:设置要连接的主服务器的bin日志的记录位置,即查询主MySQL配置状态中的Position,(这里注意,最后一项不需要加引号。否则配置失败)
MySQL [(none)]> change master to master_host='192.168.33.10',master_user='slave-1',master_password='123456',master_log_file='mysql-bin.000030',master_log_pos=440;
//启动slave同步
MySQL [(none)]> start slave;
//检查从服务器复制功能状态,Slave_IO_Running 和Slave_IO_Running都为Yes表示成功(如果为No,看下面扩展解决方法)
MySQL [(none)]> show slave status\G;
3.5、创建一个只读帐号(保证从MySQL不能修改数据库数据)
MySQL [(none)]> GRANT Select ON *.* TO reader@"%" IDENTIFIED BY "123456"
扩展:
Slave机器上的两个关键进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
1、如果是Slave_SQL_Running为No,解决办法如下:
MySQL [(none)]> stop slave;
MySQL [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
MySQL [(none)]> start slave;
MySQL [(none)]> show slave status\G;
2、如果是slave_io_running为No,解决办法如下:
查看主服务器状态:
MySQL [(none)]> show master status\G;
对照下从服务器里的Master_Log_File是否和主服务器里的File一致,如果不一致,则在从服务器运行:
MySQL [(none)]> slave stop;
MySQL [(none)]> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxxxx', MASTER_LOG_POS=0; //mysql-bin.xxxxx为主服务器查出来的值
MySQL [(none)]> slave start;
MySQL [(none)]> show slave status\G;