主从复制是从数据库根据主数据库的log-bin日志的操作,同步回从数据库并执行,从而达到跟主数据库数据一致。
原理:
① 主数据库将变化的数据写入二进制文件(bin-log文件)中
② 从数据库监听到主数据库的二进制文件(bin-log文件)发生变化,利用I/O线程,将新写入的二进制文件内容写入到从服务器的中继日志(Relay Log)中
③ 从数据库读取中继日志发生改变,写入数据库
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://www.smister.com/post-40/mysql-master-slave.html