CentOS7安装MySQL主从复制

参考:http://blog.51cto.com/xiaozhagn/2063693

一、主从复制简介

1、mysql主从复制原理:

    Mysql主从复制的实现,主要依赖于二进制日志来实现,过程主要是根据把主的MySQL 的数据复制到其它主机( Slave )上。在复制过程中,可以理解为一台mysql服充当服务器,而其他的mysql服务器充当从服务器,而这种从服务器可以是一个或者是多个。在主从复制过程,mysql-master会将更新写入二进制日志,并维护文件的一个索引以跟踪日志循环。开启的二进制,mysql主服务器就会安装你配置的二进制文件名生成二进制文件,而这些日志主要是用来记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置,从服务器接收从那时起发生的任何更新。mysql要做到主从复制,其实是把事务都记录到二进制日志上,只需要从服务拿到这份日志,照着日志上面的动作施加到自己身上就可以了。这样就实现了主从复制。

 

2. MySQL二进制复制类型  

     Mysql主从的复制可以有三种复制类型,分别是:语句的复制STATEMEN,行的复制ROW和混合类型的复制MIXED,语句的复制顾名思义就是在主服务器上执行的SQL语句,在从服务器上执行同样的语句,行的复制就是把改变的内容复制过去,而不是把命令在从服务器上执行一遍。默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制,配置,复制类型可以通过binlog_format =在配置文件上配置

 

3. mysql实现主从复制的目的

     Mysql配置主从复制的目的,是为了实现数据的备份,实现数据的高可用性和容错行

4、实现mysql复制要注意的细节

    1)、每台mysql上都要有唯一的server_id,而且主服务器的id要比所有的从服务器的id要小。

  2)、Master可以有很多 Slave,但每个 Slave 只能有一个 Master。

 

二、mysql主从复制实现

1、配置主从,开启二进制:

 1)Master配置:

 #Cat /etc/my.cnf(若是默认安装的,将/usr/local/mysql-5.7.11/support-files/my-default.cnf复制到上面去并修改相关参数)

[mysqld]

 #datadir=/var/lib/mysql

 log-bin=/var/lib/mysql/log-bin

 server-id = 1

 binlog_format = 'MIXED'(决定复制模式)

重启mysql服务:

#systemctl restart mysql

2)Slave配置:

 #Cat /etc/my.cnf

[mysqld]

#datadir=/var/lib/mysql

server-id = 3

#skip-grant-tables

#log_slave_updates = 1

#read_only = 1

只要陪配置server-id就可以了(若服务器为克隆,必将/data/mysql/auto.cnf下的server-uuid修改一点,保存重启mysql,systemctl restart mysqld.service)。

#重启slave服务器

systemctl restart mysql

2、主库查看二进制:

先做一个全备份

# mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > u_selfdbbak.sql

进入master查看是否启用了日志

show variables like 'log_bin';

若为off修改/etc/my.cnf中加入

3、主库创建同步用户

mysql> GRANT  ALL  ON *.* TO 'rsync'@'%' IDENTIFIED BY '123456';(远程登录slave的账号密码及其权限)

mysql> FLUSH PRIVILEGES;(刷新全部权限)

4、主库上查看数据结点

mysql> show master status;

5、在从库上面做下面同步

mysql>CHANGE MASTER TO MASTER_HOST='10.100.10.10',MASTER_USER='rsync',MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000003',MASTER_LOG_POS=718;

mysql> start slave;  ##开启slave模式

6、查看是否实现同步成功

mysql>  show slave status\G

若Slave_IO_Running: Yes和Slave_SQL_Running:Yes都显示yes,则表示安装成功。不然则:

1、 Slave_IO_Running为No

查看日志你会发现有这个错误

[ERROR] Slave I/O: Got fatal error 1236from master when reading data from binary log: 'Could not find first log filename in binary log index file'

错误分析:

出现这个问题一定是,你的MASTER_LOG_FILE的文件名不对。

解决方法:(1)认真核对你的MASTER_LOG_FILE的文件名,看看是否是你在连接的时候多加了个空格。

(2)认真查看Last_IO_Error的日志,错误2003:很可能是主机防火墙、selinux未关闭或者网络不通。

错误1593:master and slavehave equal MySQL server UUIDs;解决:修改/data/mysql/auto.cnf下的server-uuid

2、 Slave_SQL_Running为No

错误分析:一般是slave机器重起后,事务回滚造成的。

解决办法:

mysql> stop slave ;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> start slave ;

 

四、结果

1、验证

MASTER上修改一个表中数据,看SLAVE上是否会修改。

2、添加自动备份脚本,也可做其他脚本参考。

脚本的的作用是周一到周五每天做一个增量备份,一个星期做一个全备

#!/bin/bash 

Mysqldump() {

mysqldump -uroot -p123456 --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /var/lib/mysql/`date +%F"-%H:%M"`.sql

 }$0

Mysql_log (){

mysqladmin -uroot -p123456  flush-logs

}$0

crontab_dump () {

  cat /etc/crontab | grep "bash $0 Mysqldump "  

  if [ $? -eq 0 ]; then

     echo "Task was writen, it will  perform the task at 00:00"

  else

     echo "0 0 * * 6  bash $0 Mysqldump " >> /etc/crontab

  fi

} crontab_dump

crontab_mysqladmin () {

  cat /etc/crontab | grep "bash $0 Mysql_log "  

  if [ $? -eq 0 ]; then

     echo "Task was writen, it will  perform the task at 00:00"

  else

     echo "0 0 * * 1-5   bash $0 Mysql_log " >> /etc/crontab

  fi     

} crontab_mysqladmin

##执行脚本后就基本实现了二进制+增备+全备

你可能感兴趣的:(mysql)