6月28日任务

17.1 MySQL主从介绍
17.2 准备工作
17.3 配置主
17.4 配置从

17.5 测试主从同步

6月28日任务

MySQL主从基于binlog,主上开启binlog才能生效

步骤:①主更改数据库操作(如update,insert等等某个表的某条sql语句)记录到binlog中

          ②从将主的binlog事件(sql语句)同步到本机并记录在relaylog(中继日志)中

          ③从根据relaylog中的sql语句按顺序执行

实现过程:主上有一个log dump线程,作用是和从的I/O线程传递binlog

               从上有2个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程把relaylog中的sql语句写入数据库中

6月28日任务

主从应用场景:①数据备份 (同步主做它的backup)

                       ②web客户端从从上面读取数据 (减轻主库的读的压力)

 准备工作:在第二台机器上也安装mysql

①下载mysql压缩包到/usr/local/src

②解压到当前目录

③把当前目录下的mysql文件移到/usr/local/mysql下 (检查是否有该目录,如果有删除,否则报错)

④useradd mysql;mkdir /data/

⑤mysql初始化:cd /usr/local/mysql,./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

报错2次第一次yum install -y autoconf; yum install -y libaio-devel 初始化完成

⑥拷贝配置文件:删除原有的配置文件/etc/my.cnf,cp support-files/my-default.cnf /etc/my.cnf 

 vim /etc/my.cnf并定义basedir, datadir,socket保存

⑦拷贝启动脚本:cp support-files/mysql.server /etc/init.d/mysqld;定义basedir和datadir分别为/user/local/mysql 和/data/mysql

⑧把mysql加到开机启动项:chkconfig mysqld on

配置完成后 /etc/init.d/mysqld start启动成功或者systemctl mysqld start

如下图

6月28日任务

配置主:

 ①增加server_id可自定义,为方便记忆选择IP地址的最后一段 128

      6月28日任务

重启mysql服务,发现datadir所在的/data/mysql新生成了以log_bin定义的前缀liutlinux文件

6月28日任务

②mysqldump -uroot -pliutlinux mysql2 > /tmp/mysql2.sql

  mysqldump  -uroot -pliutlinux zrlog > /tmp/zrlog.sql

 mysql -uroot -pliutlinux -e "create database liut"

mysql -uroot -pliutlinux liut< /tmp/mysql2.sql

6月28日任务

发现日志大小在增加

③创建repl用户用于主从认证,并授予从IP访问权限:grant replication slave on *.* to 'repl'@'从IP' indentified by'password';

锁住table待从同步:flush tables with read lock;

查看主文件名和位置:show master status;

6月28日任务

mysql库不用同步到从上面

6月28日任务

切换到从机器02,打开msyqld配置文件 /etc/my.cnf并加入server_id=129,IP最后一位,便于记忆

6月28日任务

重启mysql,把主上的文件拷贝到从上 scp IP:目录地址  从目录地址 (本例中scp 192.168.242.128:/tmp/*sql /tmp/)

6月28日任务

由于mysql命令不在环境变量PATH中,可以使用命名alias的方式加入

如alias 'mysql=/usr/local/mysql/bin/mysql'   alias 'mysqldump=/usr/local/mysql/bin/mysqldump'

创建数据库mysql2, zrlog, liut

6月28日任务

如下图所示:加入change master to master_host='192.168.242.128',master_user='repl', master_password='liutlinux111', master_log_file='liutlinux1.0003', master_log_pos=6255;

其中参数分别为主IP,主的用户repl, 主机器上定义的密码,主上的bin_log文件名和位置(这两个参数可以在主上配置好后直接mysql中用show master status查看)

6月28日任务

看主从是否配置成功:执行show slave status\G命令查看,检查slave IO Running和 slave MYSQL Running选项是否为yes

6月28日任务

还有一些其他的参数,如下图所示,其中state参数限制relay log已读,等待从I/O更新

6月28日任务

再到主上面unlock tables恢复写操作;

6月28日任务

主从测试同步

配置参数:都在主/从的/etc/my.cnf中配置,如果有多个库,可以用逗号分割

6月28日任务

其中从服务器上如果使用忽略某个表,如replicate_ignore_table= xxx时可能会出现一些数据库完整的问题,如在主服务器上实施联合查询(即在用某个库时,还用select等语句选表,由于选择过滤这部分mysql语句,在从服务器上不会把这部分表记录到中继日志relay log中),为了避免之可以采用最下面的操作

replicate_wild_do_table= 如 liut.%(支持数据库.表的功能和通配符); replicate_wild_ignore_table同理

测试:

如果在从机器上误删除了一个库或者表(在从机器上使用show slave status;发现有一个No,slave_MYSQL_running,这是因为主从关系的问题,系统会认为在主机器上做的删除操作需要在从机器上也要来一遍,而此时从上的表或者库已经被删除了,无法和主一样执行同样的删除操作,此时可以尝试stop slave; start slave;操作是否恢复,如果没有恢复则有两种情况

①如果此时主和从的数据完全保持一致,则只需要执行以下此操作

  1)主机器上执行show master status;查看bin_logfile和位置

  2)stop slave; 从机器上再来一遍change master to master ..........操作; start slave;

  3)从机器上show slave status;发现两个Yes,主从配置又成功

②如果此时主个从的数据不一致,则需要做一个数据备份,并从头到尾重新搭建一个主从