MySQL之主从复制

主从复制:简称AB复制,在A主机上作create、update、insert、drop、delete等数据库、表、记录的增、删、改操做,B主机上会自动作数据库、表、记录的同步更新。mysql

如图,主从复制的工做过程其实十分简单:sql

  1. A主机作出操做:create  database  tb;  ---->    会将此命令自动写入本机的二进制日志文件(即log-bin)中。shell

  2. 再由B主机的I/O线程对A主机的二进制日志文件实时监控,将A写入二进制日志文件的操做,写入B主机的中继日志中。数据库

  3. 最后被B主机的SQL线程对写入中继日志的操做在B主机上执行,从而创建了tb这个库(create database tb;)。bash

image.png

环境部署:要在两台主机上部署主从复制即“一主一从”。master为:192.168.11.11    slave为:192.168.11.12服务器

部署思路:ssh

1.在A主机(master)上的/etc/my.cnf主配置文件中开启binlog二进制日志文件功能,而且给主机设置server-id惟一标识编号。重启mariadb服务。ide

2.在A主机上建立用于AB主从复制的用户帐号,并查看master状态中的binlog日志文件的position位置数值。spa

3.在B主机上的/etc/my.cnf主配置文件中设置server-id惟一标识编号。。重启mariadb服务。线程

4.在B主机上用help   change  master查命令帮助,并用change  master命令告诉B主机他的master主人的正确信息。

5.在B主机上用start   slave启动mariadb的随从服务,并用show   slave   status查看AB主从复制的数据同步状态,要确认两个线程的yes状态。


具体操做:

1、在“主”主机下作以下操做:

1.在mariadb的主配置文件(/etc/my.cnf)的主标识下加入

server-id=11(服务器id,随便定,通常取主机IP的末位)

log-bin=master-bin(指定二进制日志文件名)

skip_name_resolv=1(跳过域名解析)


2.而后重启服务:systemctl enable mariadb


3.进入mysql,设置功能为应答“随从”,仅容许同网段访问的,用户名和密码都为zc的帐号。更新帐号权限信息,查看数据库当前正在使用的二进制日志文件的位置

grant replication slave on *.* to zc@'%' identified by 'zc';

flush privileges;

show master status;

记下查到的file、position两个状态码,分别写在部署“从”主机的“二进制日志文件名”和“position值”上。



2、接下来开始配置“从”主机:

1.在mariadb的主配置文件(/etc/my.cnf)的主标识下加入

server-id=12(服务器id,随便定,通常取主机IP的末位)


2.而后重启服务:systemctl enable mariadb


3.依次输入经过“help change master to”查询并修改获得的命令,而后开启slave功能,最后查看slave的状态信息,主要查看I/O和SQL线程的状态,yes便可(Slave_IO_Running: Yes       Slave_SQL_Running: Yes)。

  ->   CHANGE MASTER TO

    ->   MASTER_HOST='192.168.11.11', (“主”主机的IP地址)

    ->   MASTER_USER='zc', (功能为应答slave的用户)

    ->   MASTER_PASSWORD='zc', (该用户的密码)

    ->   MASTER_PORT=3306, (工做端口为3306)

    ->   MASTER_LOG_FILE='master-bin.000001', (二进制日志文件名)

    ->   MASTER_LOG_POS=245, (position值)

    ->   MASTER_CONNECT_RETRY=10; (重连时间)

start slave;

show slave status\G;



3、验证方法:在“主”主机上随意建立一个库或表,再到“从”主机上去查询,看可否查到在“主”主机上建立的库和表。


最后这是我总结时写的一个shell脚本虽然比较low,但已调试成功。

#!/bin/bash

maria='mariadb mariadb-server'

rpm -q $maria ||yum -y install $maria > /dev/null

cat >/etc/my.cnf.d/master.cnf <<EOF

[mysqld]

server-id=11

log-bin=master-bin

skip_name_resolv=1

EOF

systemctl restart mariadb && systemctl enable mariadb

mysql -e "grant replication slave on *.* to tian@'%' identified by 'bin';flush privileges;"

File=$(mysql -e "show master status;" |awk -F" " '/master/{print $1}')

Position=$(mysql -e "show master status;" |awk -F" " '/master/{print $2}')

#接下来作“从”的设置

echo "

rpm -q $maria ||yum -y install $maria > /dev/null

echo '[mysqld]

server-id=12

skip_name_resolv=1' >/etc/my.cnf.d/slave.cnf

systemctl restart mariadb

mysql -e 'stop slave;'

mysql -e \"

CHANGE MASTER TO

  MASTER_HOST='192.168.11.11',

  MASTER_USER='tian',

  MASTER_PASSWORD='bin',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='$File',

  MASTER_LOG_POS=$Position,

  MASTER_CONNECT_RETRY=10;\"

mysql -e 'start slave;show slave status\G' " > ~/slave.sh

#接下来用scp将“从”的脚本传到12主机上,并用ssh远程执行脚本。

[ -x /usr/bin/expect ] || yum -y install expect > /dev/null

[ -f ~/.ssh/id_rsa ] || ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' -q

/usr/bin/expect <<EOF

set timeout 10

spawn ssh-copy-id root@192.168.11.12

expect "yes/no"

send "yes\n"

expect "password"

send "0\n"

expect eof

EOF

cd

scp slave.sh root@192.168.11.12:/root/

ssh root@192.168.11.12 "cd;. slave.sh"

相关文章
相关标签/搜索