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 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主从复制学习笔记的更多相关文章
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
		[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ... 
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
		[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ... 
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
		[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ... 
- Mysql数据库学习笔记之数据库索引(index)
		什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ... 
- MYSQL数据库学习笔记1
		MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 ... 
- 基于【 MySql 】二 || mysql详细学习笔记
		mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ... 
- Mysql事务学习笔记
		Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ... 
- 尚硅谷MySQL高级学习笔记
		目录 数据库MySQL学习笔记高级篇 写在前面 1. mysql的架构介绍 mysql简介 mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ... 
- MySQL存储过程学习笔记
		MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ... 
随机推荐
- HandlerMethodArgumentResolver 自定义使用
			HandlerMethodArgumentResolver 自定义使用 1.HandlerMethodArgumentResolver 的应用场景  HandlerMethodArgumentRes ... 
- Git分离头指针
			Git头指针 Git中有HEAD头指针的概念.HEAD头指针通常指向某个分支的最近一次提交,但我们也可以改变它的指向,使其指向某个commit,此时处于分离头指针的状态. 如下,改变HEAD的指向,g ... 
- 「VMware校园挑战赛」小V的和式
			Description 给定 \(n,m\) ,求 \[\sum\limits_{x_1=1}^{n}\sum\limits_{x_2=1}^{n}\sum\limits_{y_1=1}^{m}\su ... 
- 关于『HTML5』:第二弹
			关于『HTML5』:第二弹 建议缩放90%食用 咕咕咕咕咕咕咕!!1 (蒟蒻大鸽子终于更新啦) 自开学以来,经过了「一脸蒙圈的 半期考试」.「二脸蒙圈的 体测」的双重洗礼,我终于有空肝 HTML5 辣 ... 
- NPM Error:gyp: No Xcode or CLT version detected!
			问题 最近在macOS Catalina中使用npm安装模块,经常会出现如下错误: > node-gyp rebuild No receipt for 'com.apple.pkg.CLTool ... 
- 总结 到 GDOI 2021 这个阶段
			截止本蒟蒻第一次体验省选(虽然是普及组) 本蒟蒻已经有了许多收获,却也有很多不足 优点 对一些学过的知识掌握还行 没了 缺点 会却做不出来 有一些题不难,却想不到正解 如 Day2 T1 ,就是移一下 ... 
- 百度地图API 地图圈区域并计算坐标点是否在区域内
			<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- 【翻译】驯服野兽:Scylla 如何利用控制理论来控制压实
			教程翻译自Seastar官方文档:https://www.scylladb.com/2018/06/12/scylla-leverages-control-theory/ 转载请注明出处:https: ... 
- Python量化-如何获取实时股票信息
			如何获取实时股票信息 股票信息的接口有很多,之前大家常用的是新浪的,但在年初的时候,新浪的接口突然不能使用,给大家造成了很大的困扰,为此网上也有很多教程教大家如何从新浪获取数据,跟着教程弄了半天也不行 ... 
- 图片管够!用Python做了个图片识别系统(附源码)
			本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Library)是一种免费的图像 ... 
