mysql主从复制学习笔记

一、musql主从复制原理

        MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制;

二、环境准备

1、主从mysql版本要一致;实验使用mysql-5.7.25;
2、主从设备时间一定要同步,关闭selinux,iptables要么关闭要么放开3306端口;
3、主数据库:192.168.0.83
从数据库:192.168.0.91
4、系统版本:CentOS7.6

三、实验过程

1、master主库配置

  1.1、配置my.cnf开启二进制日志,设置server-id;

[mysqld]
log-bin=mysql-bin  #开启二进制日志
server-id=1  #设置server-id
basedir=/usr/local/mysql-5.7.25/
datadir=/usr/local/mysql-5.7.25/data/

  1.2、重启mysql服务,创建用于同步的用户账号

    /etc/init.d/mysql.server restart    重启mysql服务使其my.cnf生效;

    创建用户同步数据的账号,并授权;

create user 'syn'@'192.168.0.91' identified by '123.com';  #创建用户
grant replication slave on *.* to 'syn'@'192.168.0.91';    #分配权限
flush privileges;  #刷新权限

   1.3、查看master状态,记录二进制文件名和位置;

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     767  |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

2、slave从库配置

  2.1、配置my.cnf,设置server-id;

[mysqld]
server-id=2   #该id号可以自定义,但是必须唯一;
basedir=/usr/local/mysql-5.7.25/
datadir=/usr/local/mysql-5.7.25/data/

  2.2、重启mysql,执行同步SQL语句;

    /etc/init.d/mysql.server restart    重启mysql服务使其my.cnf生效;

    执行同步sql语句:

change master to master_host='192.168.0.183',master_user='syn',master_password='123.com',master_log_file='mysql-bin.000001',master_log_pos=767;

  2.3、启动slave同步进程

mysql > start slave;

  2.4、查看slave状态

mysql> show slave statusG
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.183
                  Master_User: syn
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 3185
               Relay_Log_File: node1-relay-bin.000003
                Relay_Log_Pos: 2738
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3185
              Relay_Log_Space: 2945
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: 13e78600-7bc1-11eb-b961-000c291cbfa8
             Master_Info_File: /usr/local/mysql-5.7.25/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.01 sec)
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了;

3、验证

  3.1、在主库创建库和表并插入数据;

mysql > create database test;
mysql > use test;
mysql > INSERT INTO `search_controller` (`s_Controller_id`, `LightPole_id`, `Controller_id`, `Read_time`, `Concentrator_name`, `Concentrator_address`, `Electric_quantity`, `Electric_voltage`, `Electric_current`, `Power`, `Power_factor`, `OneSwitch_status`, `TwoSwitch_status`, `Fault_status`, `LightOn_duration`, `brightness`) VALUES (1,1,2,3,"d","e","f","g","h","i","j","k","l","m","n","o");

  3.2、查看从库是否同步

mysql> use test;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_test    |
+-------------------+
| search_controller |
+-------------------+
1 row in set (0.00 sec)

mysql> select * from search_controller;
+-----------------+--------------+---------------+-----------+-------------------+----------------------+-------------------+------------------+------------------+-------+--------------+------------------+------------------+--------------+------------------+------------+
| s_Controller_id | LightPole_id | Controller_id | Read_time | Concentrator_name | Concentrator_address | Electric_quantity | Electric_voltage | Electric_current | Power | Power_factor | OneSwitch_status | TwoSwitch_status | Fault_status | LightOn_duration | brightness |
+-----------------+--------------+---------------+-----------+-------------------+----------------------+-------------------+------------------+------------------+-------+--------------+------------------+------------------+--------------+------------------+------------+
|               1 |            1 |             2 | 3         | d                 | e                    | f                 | g                | h                | i     | j            | k         | l                | m            | n                | o          |
|               2 |            1 |             2 | 3         | d                 | e                    | f                 | g                | h                | i     | j            | k         | l                | m            | n                | o          |
+-----------------+--------------+---------------+-----------+-------------------+----------------------+-------------------+------------------+------------------+-------+--------------+------------------+------------------+--------------+------------------+------------+
2 rows in set (0.00 sec)

四、一主多从 

1、原理图

  一主多从基本原理跟一主一从的原理是一样的;只是又多了一个slave;

2、使用场景

    场景一
  如果在架构设计之初就是一主多从的架构,就不涉及数据迁移的问题,没什么好说的,具体配置也不做赘述;
    场景二
        如果在架构设计之初是一主一从的架构,那么在后期业务量变大,一主一从的负载均衡和高可用性不能满足现在的要求的时候,就需要扩容,具体操作如下:
    1、首先要挑一天业务量最小的时间段对master做一次全量备份;
    2、将全量备份恢复到新加的一台slave设备中;
    3、对新的slave做主从同步的配置;
    4、测试一主多从;

五、其他

        master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

 # 不同步哪些数据库

binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema

# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game

##########mysql安装脚本############

#!/bin/bash

mypid=`pgrep mysql`
myuser=`cat /etc/passwd |awk -F":" '{print $1}'|grep -w mysql`
#判断mysql是否安装
if [[ -n $mypid ]];then
echo -e "33[31m mysql 已经存在 33[0m"
exit
else

if [ ! -d /usr/local/mysql-5.7.25 ];then
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
tar xvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.25-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.25
else
echo -e "33[31m mysql目录已经存在 33[0m"
exit
fi

#添加环境变量
echo "export MYSQL_HOME=/usr/local/mysql-5.7.25
export PATH=$PATH:$MYSQL_HOME/bin" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
echo -e "33[31m 环境变量添加完成 33[0m"
#创建mysql用户
if [[ -n $myuser ]];then
echo -e "33[31m mysql用户已经存在 33[0m"
else
useradd -s /sbin/nologin mysql
echo -e "33[31m mysql用户创建完成 33[0m"
fi
#创建mysql目录
chown mysql:mysql -R /usr/local/mysql-5.7.25
mkdir /usr/local/mysql-5.7.25/data
chown mysql:mysql /usr/local/mysql-5.7.25/data
echo -e "33[31m mysql目录创建完成 33[0m"
#mysql初始化
mysqld --initialize --user=mysql --basedir=/usr/local/mysql-5.7.25
echo -e "33[31m mysql初始化完成 33[0m"
#创建mysql配置文件
echo "[mysqld]
basedir=/usr/local/mysql-5.7.25/
datadir=/usr/local/mysql-5.7.25/data/" > /etc/my.cnf
echo -e "33[31m my.cnf文件创建完成 33[0m"
#创建mysql服务
cp /usr/local/mysql-5.7.25/support-files/mysql.server /etc/init.d/
## sed -i 's/--datadir="$datadir"/--user=root --datadir="$datadir"/g' /etc/init.d/mysql.server
#启动mysql服务
/etc/init.d/mysql.server start
fi

原文地址:https://www.cnblogs.com/zhangzhide/p/14479470.html