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主从复制的配置
这里我使用两台虚拟机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 |