mysql的复制类型:
1.基于语句的复制:主服务器上面执行的语句在从服务器上面再执行一遍,在mysql-3.23版本以后支持
存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户
2.基于行的复制:把主服务器上面改编后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在mysql-5.0版本以后引入
存在的问题:比如一个工资表中有一万个用户,我们把每个用户的工资+1000,那么基于行的复制则要复制一万行的内容,由此造成的开销比较大,而基于语句的复制仅仅一条语句就可以了
3.混合类型的复制:mysql默认使用基于语句的复制,当基于语句的复制会引发问题的时候就会使用基于行的复制,mysql会自动进行选择

mysql主从复制架构,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行,主从复制架构给读操作提供了扩展,当写操作也比较多,同时多台从服务器还要从主服务器上面同步数据,单主模型的复制中主服务器势必会成为性能瓶颈


mysql主从复制的工作原理:如下图所示
主服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread实际上面就是一个主服务器的客户端进程,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log里面,从服务器上面开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍

 

mysql主从复制的原理及配置实现_mysql

mysql主从复制的配置

这里我使用两台虚拟机192.168.1.1(主)和192.168.1.2(从)
首先安装mysql,我这里使用mysql官方上面下载的解压缩后就能直接运行的版本,当然需要稍微设置一下
1.解压的目录必须放在/usr/local下面,名字叫mysql
2.创建mysql用户和组,把/usr/local/mysql里面的所有文件和目录的属主和属组都设置为mysql
3.mkdir -pv /mydata/data,执行初始化脚本/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data指定数据文件位置
4.初始化执行过之后把/usr/local/mysql目录的属主和属组更改为root:mysql
5.cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
   chkconfig --add mysqld
6.cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf 复制出来一个配置文件
在/usr/local/mysql/support-files目录下面有多个配置文件
my-huge.cnf(大于512M内存),my-large.cnf(512M内存),my-medium.cnf(128-256M内存),my-small.cnf(小于128M内存),这里我的内存是512M的所以使用large
7.编辑/etc/my.cnf找到[mysqld],在下面添加 datadir=/mydata/data
8.export PATH=$PATH:/usr/local/mysql/bin
打开/etc/profile文件找到export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC在这句之前添加export PATH=$PATH:/usr/local/mysql/bin 就会对所有用户有效并且开机自动生效了
9.告知系统mysql库文件的存放位置 编辑/etc/ld.so.conf.d/mysql.conf 添加/usr/local/mysql/lib
ldconfig -v |grep mysql ldconfig会按照系统库文件的搜索路径把系统中所有的库文件重新加载一遍
10.告知系统mysql头文件的位置 ln -sv /usr/local/mysql/include /usr/include/mysql(系统中所有的头文件都放在这个目录中)
11.配置mysql的man手册页 vi /etc/man.config添加 MANPATH=/usr/local/mysql/man

主服务器上面
1.配置server-id,主服务器的server-id一般为1,server-id主要是为了避免在环状架构中出现循环复制
2.启动二进制日志
3.建立一个有复制权限的用户帐号

vi /etc/my.cnf
log-bin=master-bin 二进制文件的名字
log-bin-index=master-bin.index 正在使用的二进制文件的索引目录
binlog-format=maxed
server-id=1

server mysqld restart

GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'192.168.1.%' IDENTIFIED BY 'passwd';
FLUSH PRIVILEGES;

show master status;

 

从服务器上面的配置
1.配置server-id,此server-id不能和主服务器一样,也不能和其他的从服务器一样
2.启用relay log,如果次从服务器后面还有从服务器也就是主从复制的多级架构那么把二进制日志也启用起来
3.使用有复制权限的用户帐号连接到主服务器上面

relay-log=relay-bin
relay-log-index=relay-bin.index
replicate-ignore-db =mysql 设置忽略复制系统数据库
server-id=2

server mysqld restart

SHOW VARIABLES LIKE 'relay%' 查看一下relay相关的信息

CHANGE MASTER TO MASTER_HOST='192.168.1.1',MASTER_USER='repl',MASTER_PASSWORD='passwd';

SET GLOBAL read_only=ON; 设置从服务器为只读的
START SLAVE; 启动复制进程
SHOW SLAVE STATUS\G; 查看从服务器状态
如下所示,这说明已经连接上了主服务器,并且复制操作的两个进程都已经起来了
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

验证:
在主服务器上面创建一个数据库
CREATE DATABASE mydb;
在从服务器上面SHOW DATABASES;可以看到在主服务器上面刚刚创建的数据库mydb,表示成功了!


复制时候忽略某些数据库或者表的操作最好不要在主服务器上面进行,因为主服务器忽略之后就不会再往二进制文件中写了,但是在从服务器上面虽然忽略了某些数据库但是主服务器上面的这些操作信息依然会被复制到从服务器上面的relay log里面,只是不会在从服务器上面执行而已

不管是黑名单还是白名单只写一个就行了,如果同时使用那么只有白名单生效
binlog-do-db=  //这里是白名单,写上要复制的数据库
replication-do-db=mydb1
replication-do-db=mydb2
replication-do-table=
binlog-ignore-db= //这里是黑名单,写上不复制的数据库
replication-ignore-db=
replication-ignore-table=