首先先了解一下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;