基于语句复制(STATEMENT)
基于行复制(ROW)
混合类型的复制(MIXED)
常见event如下:
我们也可以通过binlog 看到这些事件,通过mysql提供的工具查看binlog日志,如下:
主从复制流程
MySQL的复制(replication)功能配置简单,深受开发人员的喜欢,基于复制的读写分离方案也非常流行。而MySQL数据库高可用大多也是基于复制技术,但是MySQL复制本身依然存在部分缺陷,最为主要的问题如下:数据丢失问题(consistency)
从MySQL 5.7的lossless semi-sync replication已经解决了主从数据丢失的问题,MySQL 5.7的multi-thread slave也很大程度地解决了数据同步延迟的问题,MySQL 5.7的Group replication也很大程度地解决了扩展性问题。另外,MySQL 5.7.22 backlog了MySQL 8.0中的基于WriteSet的并行复制,可以说完全解决了主从数据延迟的问题。可以看出,MySQL正在朝着一个非常好的方向发展
准备3台服务器分别为:
Master 192.168.1.234
Slave 192.168.1.235
Slave 192.168.1.236
下载MySQL安装包
下载地址:cdn.mysql.com//Downloads/…
解压安装文件:
[root@localhost ~]# cd /software[root@localhost software]# tar -zxzf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
拷贝安装文件到指定文件夹:[root@localhost ~]# cp /software/mysql-5.7.17-linux-glibc2.5-x86_64/* /usr/local/mysql -r
添加系统mysql组和mysql用户[root@localhost ~]# groupadd mysql[root@localhost ~]# useradd -r -g mysql mysql
进入安装mysql软件目录:执行命令 cd /usr/local/mysql
修改当前目录拥有者为mysql用户:执行命令 chown -R mysql:mysql ./
安装数据库:
5.6以及之前版本安装数据库
/usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
5.7版本安装数据库:
/usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --initialize
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d996ae4732a040cdbc58e5729e2b571b~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
拷贝配置文件到指定文件夹
[root@localhost mysql]# cp -a ./support-files/my-default.cnf /etc/my.cnf
[root@localhost mysql]# cp -a ./support-files/mysql.server /etc/init.d/mysqld
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bd3666642e34476a86f54854e2a92f16~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
后台启动mysql
[root@localhost mysql]# ./bin/mysqld_safe --user=mysql &
重启mysql
执行命令: /etc/init.d/mysqld restart
设置为开机启动:
执行命令:chkconfig --level 35 mysqld on
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0971e5ee94e545299a2b109092bc9821~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
初始化密码:
依据官方说明5.6以后版本,第一次启动时会在root目录下生产一个随机密码文件名.mysql_secret。
cat /root/.mysql_secret
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/65c0252782d3474bb324c402de59accd~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
修改root密码:
/usr/local/mysql/bin/mysqladmin -u root -h localhost password '123456' -p
Enter password处输入输入.mysql_secret里第二行内容
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7f5893db568f40cc85964bc9e49dd531~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
遇上-bash: mysql: command not found(未找到命令)的情况别着急,这个是因为/usr/local/bin目录下缺失mysql导致,只需要一下方法建立软链接,即可以解决
ln -s /usr/local/mysql/bin/mysql /usr/bin
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/22ab3a50fe94458a943fa84ae3e1d44b~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
![](data:;base64,<?xml version=)" alt="image.png" data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f5a2c76b8ac94856bbea3f9f697548b0~tplv-k3u1fbpfcp-zoom-1.image" data-width="800" data-height="600" />
下载MySQL安装包
Master服务器my.cnf增加配置:
#GTID:server_id=234 #服务器id,一般为IP末位gtid_mode=on #开启gtid模式enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持 #binloglog_bin=/usr/local/mysql/binlogs/master-binloglog-slave-updates=1 binlog_format=row #强烈建议,其他格式可能造成数据不一致 #relay logskip_slave_start=1
Slave服务器my.cnf****增加配置:#GTID:gtid_mode=onenforce_gtid_consistency=onserver_id=235 #binloglog-bin=/usr/local/mysql/binlogs/slave-binloglog-slave-updates=1binlog_format=row #强烈建议,其他格式可能造成数据不一致 #relay logskip_slave_start=1read-only = ON #这项功能只对非管理员组以为的用户有效
在Master服务器上创建用于同步的账号:
create user 'cspmslave'@'192.168.1.%' identified by 'cspm-slave';
对账号进行Slave授权:
grant replication slave on . to cspmslave@'192.168.1.%';
从库连接主库
mysql> change master to master_host='192.168.1.234', master_port=3306, master_user='cspmslave', master_password='cspm-slave', master_auto_position=1;
mysql> start slave;
查看从服务器连接状态(下图所示,两个Yes表示连接成功):
mysql> show slave status \G;