一、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. WSL与Windows环境共享

    Reference 更多cmd.exe帮助参考 cmd_helps WSL备份及windows Docker安装 WSL安装维护 在使用wsl时,总是需要执行windows的cmd,但是windows ...

  2. 一文彻底搞懂JavaScript中的prototype

    prototype初步认识 在学习JavaScript中,遇到了prototype,经过一番了解,知道它是可以进行动态扩展的 function Func(){}; var func1 = new Fu ...

  3. 【java并发编程】Lock & Condition 协调同步生产消费

    一.协调生产/消费的需求 本文内容主要想向大家介绍一下Lock结合Condition的使用方法,为了更好的理解Lock锁与Condition锁信号,我们来手写一个ArrayBlockingQueue. ...

  4. 关于Spring中的useSuffixPatternMatch

    背景 spring-boot的版本是2.1.4.RELEASE,spring的版本是5.1.6.RELEASE 一个例子如下: @Configuration @Import(WebMvcAutoCon ...

  5. CentOS下Python管理

    一.升级Python 查看系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 查看Python版本 python -V ...

  6. CentOS 7.9 安装 zookeeper-3.7.0

    1. 下载 Zookeeper Zookeeper 官网 使用 wget 下载: wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper ...

  7. 【Java面试】简述一下你对线程池的理解?

    到底是什么面试题, 让一个工作了4年的精神小伙,只是去参加了一场技术面试, 就被搞得精神萎靡.郁郁寡欢! 这一切的背后到底是道德的沦丧,还是人性的扭曲. 让我们一起揭秘一下这道面试题. 关于, &qu ...

  8. 开发工具-Unix时间戳转换

    更新日志 2022年6月10日 初始化链接. https://toolb.cn/timestamp

  9. JS:typeof

    想要弄明白某一个变量中保存的数据到底是什么数据类型,我们可以使用到typeof操作符. typeof操作符:检测变量的数据类型. 看例子! var a = "abc"; var b ...

  10. go程序添加远程调用tcpdump功能

    最近开发的telemetry采集系统上线了.听起来高大上,简单来说就是一个grpc/udp服务端,用户的机器(路由器.交换机)将它们的各种统计数据上报采集.整理后交后端的各类AI分析系统分析.目前华为 ...