一、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 status\G
*************************** 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 "\033[31m mysql 已经存在 \033[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 "\033[31m mysql目录已经存在 \033[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 "\033[31m 环境变量添加完成 \033[0m"
#创建mysql用户
if [[ -n $myuser ]];then
echo -e "\033[31m mysql用户已经存在 \033[0m"
else
useradd -s /sbin/nologin mysql
echo -e "\033[31m mysql用户创建完成 \033[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 "\033[31m mysql目录创建完成 \033[0m"
#mysql初始化
mysqld --initialize --user=mysql --basedir=/usr/local/mysql-5.7.25
echo -e "\033[31m mysql初始化完成 \033[0m"
#创建mysql配置文件
echo "[mysqld]
basedir=/usr/local/mysql-5.7.25/
datadir=/usr/local/mysql-5.7.25/data/" > /etc/my.cnf
echo -e "\033[31m my.cnf文件创建完成 \033[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

mysql主从复制学习笔记的更多相关文章

  1. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

  5. MYSQL数据库学习笔记1

      MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 ...

  6. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  7. Mysql事务学习笔记

    Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...

  8. 尚硅谷MySQL高级学习笔记

    目录 数据库MySQL学习笔记高级篇 写在前面 1. mysql的架构介绍 mysql简介 mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ...

  9. MySQL存储过程学习笔记

    MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...

随机推荐

  1. HandlerMethodArgumentResolver 自定义使用

    HandlerMethodArgumentResolver 自定义使用 1.HandlerMethodArgumentResolver 的应用场景 ​ HandlerMethodArgumentRes ...

  2. Git分离头指针

    Git头指针 Git中有HEAD头指针的概念.HEAD头指针通常指向某个分支的最近一次提交,但我们也可以改变它的指向,使其指向某个commit,此时处于分离头指针的状态. 如下,改变HEAD的指向,g ...

  3. 「VMware校园挑战赛」小V的和式

    Description 给定 \(n,m\) ,求 \[\sum\limits_{x_1=1}^{n}\sum\limits_{x_2=1}^{n}\sum\limits_{y_1=1}^{m}\su ...

  4. 关于『HTML5』:第二弹

    关于『HTML5』:第二弹 建议缩放90%食用 咕咕咕咕咕咕咕!!1 (蒟蒻大鸽子终于更新啦) 自开学以来,经过了「一脸蒙圈的 半期考试」.「二脸蒙圈的 体测」的双重洗礼,我终于有空肝 HTML5 辣 ...

  5. NPM Error:gyp: No Xcode or CLT version detected!

    问题 最近在macOS Catalina中使用npm安装模块,经常会出现如下错误: > node-gyp rebuild No receipt for 'com.apple.pkg.CLTool ...

  6. 总结 到 GDOI 2021 这个阶段

    截止本蒟蒻第一次体验省选(虽然是普及组) 本蒟蒻已经有了许多收获,却也有很多不足 优点 对一些学过的知识掌握还行 没了 缺点 会却做不出来 有一些题不难,却想不到正解 如 Day2 T1 ,就是移一下 ...

  7. 百度地图API 地图圈区域并计算坐标点是否在区域内

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【翻译】驯服野兽:Scylla 如何利用控制理论来控制压实

    教程翻译自Seastar官方文档:https://www.scylladb.com/2018/06/12/scylla-leverages-control-theory/ 转载请注明出处:https: ...

  9. Python量化-如何获取实时股票信息

    如何获取实时股票信息 股票信息的接口有很多,之前大家常用的是新浪的,但在年初的时候,新浪的接口突然不能使用,给大家造成了很大的困扰,为此网上也有很多教程教大家如何从新浪获取数据,跟着教程弄了半天也不行 ...

  10. 图片管够!用Python做了个图片识别系统(附源码)

    本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Library)是一种免费的图像 ...