1. MySQL主从原理以及应用场景MySQL的Replication原理非常简单,总结一下:

每个从仅可以设置一个主。

主在执行sql之后,记录二进制log文件(bin-log)。

从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行


sql,一旦遇到错误则停止同步。

从这几条Replication原理来看,可以有这些推论:

主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致


如果主从的网络断开,从会在网络正常后,批量同步。

如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步


,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。

一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。

如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有


节点。


可以应用在读写分离的场景中,用以降低单台MySQL服务器的I/O 

可以实现MySQL服务的HA集群

可以是1主多从,也可以是相互主从(主主)



2. 安装、配置MySQL 

参考之前步骤搭建MySQL服务

为了做实验方便,我们在同一台机器上配置两个MySQL服务(跑两个端口)

cd /usr/local/; cp -r mysql mysql_2; cd mysql_2; 

初始化mysql2: ./scripts/mysql_install_db --user=mysql --


datadir=/data/mysql2   

拷贝配置文件:cp /etc/my.cnf ./my.cnf 

修改配置文件相关参数:vim my.cnf  #更改port 以及 socket

启动:/usr/local/mysql_2/bin/mysqld_safe --defaults-


file=/usr/local/mysql_2/my.cnf --user=mysql & 

若开机启动它,需加入到 /etc/rc.local中


3. 配置主从准备工作

设定mysql_2 为主端口3307,mysql为从端口为3306

在主上创建测试库: create database db1; 

然后导出主的mysql库数据然后导入给db1

mysqldump -uroot -S /tmp/mysql2.sock mysql > 123.sql ;

mysql -uroot -S /tmp/mysql2.sock db1 < 123.sql 


4. 配置主(master)

vim /usr/local/mysql_2/my.cnf   #修改或添加:

server-id=1

log-bin=mysql-bin  

两个可选参数(2选1):

binlog-do-db=db1,db2 #需要同步的库

binlog-ignore-db=db1,db2 #忽略不同步的库

修改配置文件后,重启mysql_2

pid=`ps uax |grep mysql2.sock |grep -v grep |awk '{print $2}'` ; kill 


$pid; cd /usr/local/mysql_2/bin/; ./mysqld_safe --defaults-


file=../my.cnf --user=mysql & 

设置root密码:mysqladmin -u root -S /tmp/mysql2.sock password '123456' 

mysql -u root -S /tmp/mysql2.sock -p'123456' 

grant replication slave on *.* to 'repl'@'127.0.0.1' identified by 


'123123'; 

flush tables with read lock; 

show master status; #一定要记住前两列的内容,一会会用到 


5. 设置从(slave)

vim /etc/my.cnf  #修改或增加

server-id = 2 #这个数值不能和主一样

可选参数:replicate-do-db=db1,db2 和 replicate-ignore-db=db1,db2 #意义同


主的那两个可选参数

service mysqld restart 

拷贝主的db1库数据到从:mysqldump -uroot -S /tmp/mysql2.sock -p123456 db1 


> db1.sql; mysql -uroot -p -e "create database db1"; mysql -uroot -p  


db1 < db1.sql

mysql -uroot -p  #登陆从的mysql

slave stop; 

change master to master_host='127.0.0.1', master_port=3307, 


master_user='repl', master_password='123123', master_log_file='mysql-


bin.000006', master_log_pos=474952; 

slave start;

主上: mysql -uroot -S /tmp/mysql2.sock -p123456 -e "unlock tables" 

从上查看从的状态: show slave status\G;


6. 测试主从

主上清空db1库的db表 :use db1; select count(*) from db"; truncate table 


db;  

进入slave,查看db1库db表: use db1; select count(*) from db";  

主上删除表db: drop table db;

从上看db表不存在了

建议: MySQL主从机制比较脆弱,谨慎操作。如果重启master,务必要先把slave停


掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的


mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 


slave start.