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的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...
随机推荐
- jQuery前端第三方框架
计时器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- Linux下使用ssh测试端口是否开启
当服务器上不允许使用telnet时,可以使用ssh测试远程服务器端口是否开启 具体命令如下 -v 显示连接debug信息 -p port 指定端口 ssh -v -p 80 root@192.168. ...
- 107_Power Pivot员工效率监控
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 在劳动密集型行业中,员工效率是一个永恒的话题. 今天把零时用工的效率提升展示及效率监控建一个PP模型并输出. 达 ...
- 使用虚拟机在3台centos7系统安装docker和k8s集群
一.安装docker 环境:准备3台centos7系统,都安装上docker环境,具体安装步骤和流程如下 参考: https://docs.docker.com/install/linux/docke ...
- [漏洞复现] [Vulhub靶机] Struts2-045 Remote Code Execution Vulnerablity(CVE-2017-5638)
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 Apache Struts 2是美国Apache软件基金会的一个开源项目,是一套用于创建企业级Java W ...
- webpack及其配置
Webpack 1.webpack主要用来模块和打包 2.webpack和gulp对比: 什么时候用gulp a.如果你的工程模块依赖非常简单,甚至是没有用到模块化的概念 b.只需要进行简单的合并.压 ...
- Docker安装Mycat和Mysql进行水平分库分表实战【图文教学】
一.前言 小编最近公司有个新的需求,数据量比较大,要涉及到分库分表.大概了解了一些主流的中间件,使用和网上资料比较多的是Mycat和sharding-jdbc,小编比较倾向于Mycat.原因很简单就是 ...
- python自动将新生成的报告作为附件发送并进行封装
发送报告作为自动化部署来讲是一个重要的环节,废话不多说直接上代码吧,如果想更细致的了解内容查阅本博主上篇基本发送文章 特别叮嘱一下:SMTP协议默认端口25,qq邮箱SMTP服务器端口是465 别出丑 ...
- 验证cuda和cudnn是否安装成功(转载)
本人cuda安装目录: 当然cuda安装目录也可默认:此处为方便安装不同cuda版本,所以单独建了文件夹. 转载自:https://zhuanlan.zhihu.com/p/139668028 安装完 ...
- 关键路径 p3 清华复试上机题
关键路径 p3 清华复试上机题 题目描述 小H为了完成一篇论文,一共要完成n个实验.其中第i个实验需要a[i]的时问去完成.小H可以同时进行若干实验,但存在一些实验,只有当它的若干前置实验完成时,才能 ...