主从复制是从数据库根据主数据库的log-bin日志的操作,同步回从数据库并执行,从而达到跟主数据库数据一致。 

原理:

 ① 主数据库将变化的数据写入二进制文件(bin-log文件)中 

② 从数据库监听到主数据库的二进制文件(bin-log文件)发生变化,利用I/O线程,将新写入的二进制文件内容写入到从服务器的中继日志(Relay Log)中 

③ 从数据库读取中继日志发生改变,写入数据库

mysql-master-slave-1.png

1、实验准备,需要2台机器二进制文件

Master : 192.168.220.130 

Slave : 192.168.220.131


2、Master机器配置

1)修改my.cnf配置文件 

#vim /etc/my.cnf 

#在内容追加到[mysqld]下 

#开启bin-log日志 

log-bin=/usr/local/mysql/data/bin-log 

 #设置Master的id,必须唯一 

server-id=1 


 2)重启mysqld,并未Slave添加一个连接账号 

#service mysqld restart 

#mysql -uroot -p123456 

mysql >grant replication slave on *.* to mrslave@192.168.220.131 identified by "123456"; 

mysql > show master status;

+----------------------+------------+----------------------+------------------+-----------------------------------------+

|            File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------- -------+------------+-----------------+------------------+-------------------+

| bin-log.000001 | 1566      |                      |                       |                                                  |

+--------------------+------------+-----------------+------------------+---------------------------------- ----+

1 row in set (0.00 sec)


3) 导出数据库并发送给Slave

 #mysqldump -uroot -p123456 -B --master-data=2 -A | gzip > alldata.sql.gz 

#scp alldata.sql.gz root@192.168.232.131:~


3、Slave机器配置

1)配置my.cnf配置文件 

#vim /etc/my.cnf 

#在内容追加到[mysqld]下 

#设置Slave的id,必须唯一 

server-id=2

 #ignore database要在Slave配置,不然不起作用 

#不使用binlog-ignore-db或者replicate-ignore-db 

#因为在use ignoredb;的状态下更新表会出现无法更新的状态 

replicate-wild-ignore-table= mysql.% 

 #mysql库的所有表都忽略 

skip-slave-start 

#忽略已经存在数据库或者表的错误 

skip-name-resolve slave-skip-errors=1032,1062,1007


2) 重启mysqld服务,并且导入同步的数据

#cd ~ 

#gunzip alldata.sql.gz 

#mysql -uroot -p123456 < alldata.sql

3) 进入mysql ,查看数据是否导入 , 并且设置为从服务器 

#mysql -uroot -p123456 

mysql > show databases; 

//设置为从服务器 

mysql > CHANGE MASTER TO master_host ='192.168.220.130',master_user ='mrslave',master_password ='123456',master_log_file ='bin-log.000001',master_log_pos =1566; 

mysql > START SLAVE; 

mysql > SHOW SLAVE STATUS\G 

 //查看状态 

Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes Slave_SQL_Running: Yes 

//出现以上状态则证明同步成功了

//这个CHANGE MASTER也可以放在my.cnf, Mysql版本从5.1.7以后开始就不支持

/* 

master-host=192.168.220.130 

master-user= mrslave 

master-password=123456 

master-port=3306 

log-bin=mysql-bin

 */


4、测试

1) Master操作

#mysql -uroot -p123456 mrs 

#select * form m1; 

#inert into m1(name)values(‘test’);

2) Slave 操作

#mysql -uroot -p123456 mrs 

#select * form m1; 

// 查看master插入的结果是否存在

版权声明:未经博主允许不得转载。http://smister.com/post-40/mysql-master-slave.html