主从复制原理:复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。
1)主服务器将所有数据和结构更改记录到二进制日志中。
2)从属服务器从主服务器请求该二进制日志并在本地应用其内容。
3)IO:请求主库,获取上一次执行过的新的事件,并存放到relaylog
4)SQL:从relaylog中将sql语句翻译给从库执行
本次搭建在同一台机器上搭建,用不同用户和不同端口以及不同程序路径。安装过程比较简单,采用二进制的方式来做的。

主库搭建:

加入环境变量:

export  MYSQL_HOME=/opt/mysql
export PATH=$PATH:$MYSQL_HOME/bin
主库的配置文件:
[mysql]
no-auto-rehash
port = 3306
socket = /opt/data/mysqld.sock
[mysqld]
user = mysql
port = 3306
basedir = /opt/mysql
datadir = /opt/data
socket = /opt/data/mysqld.sock
pid-file = mysql.pid
character-set-server = utf8
skip_name_resolve = 1
lower_case_table_names=1
max_connections = 1000
max_connect_errors = 1000000
table_open_cache = 4000
table_definition_cache = 4000
table_open_cache_instances = 64
max_allowed_packet = 32M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 450
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 96M
max_heap_table_size = 96M
general_log=1
general_log_file=general.log
slow_query_log = 1
slow_query_log_file = /opt/log/slow.log
log_error = /opt/log/error.log
long_query_time =1
server-id = 170
log_bin = mysql-bin
log_slave_updates=on
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_format = row
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 16M
lock_wait_timeout = 3600
innodb_thread_concurrency = 0
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3 当时启动主库的时候会有个错误:

查看error.log后:

原因是配置参数的问题,自动扩展配置参数设置的太大导致。

主库初始化:mysqld --initialize --user=mysql --datadir=/opt/data --basedir=/opt/mysql --socket=/opt/data/mysqld.sock

bin/mysql_install_db --user=mysql  --basedir=/usr/local/mysql  --datadir=/mydata/data        # Before MySQL 5.6

 bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql  --datadir=/mydata/data      # MySQL 5.7 and up

update mysql.user set authentication_string=password('L*Rb0!gtigergao!@#') where user='root' and Host = 'localhost'

初始化主库后启动mysql服务进行登录,必须要先修改密码:
ALTER USER "root"@"localhost" IDENTIFIED BY "shsnc!@#";
flush privileges;

登录主库创建主从同步用户:
create user 'tigergao' identified by 'tigergao';

赋权:grant replication slave on *.* to tigergao@'10.131.156.%' identified by 'tigergao';

记录binlog位置:

主库配置完毕,需要进行配置从库。
注意:由于我是在同一台机子上做的主从,主库采用的做了软链后用service mysql start的方式启动的,由于担心同时做软链会发生冲突,所以从库用命令的方式启动的。

从库配置:

 加入环境变量

export  MYSQL_HOME=/data/mysql
export PATH=$PATH:$MYSQL_HOME/bin 从库的配置:
[mysql]
no-auto-rehash
port = 3309
socket = /data/data/mysqldbs.sock
[mysqld]
user = mysql01
port = 3309
basedir = /data/mysql
datadir = /data/data
socket = /data/data/mysqldbs.sock
pid-file = mysqldbs.pid
character-set-server = utf8
skip_name_resolve = 1
lower_case_table_names=1
max_connections = 1000
max_connect_errors = 1000000
table_open_cache = 4000
table_definition_cache = 4000
table_open_cache_instances = 64
max_allowed_packet = 32M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 450
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 96M
max_heap_table_size = 96M
general_log=1
general_log_file=general.log
slow_query_log = 1
slow_query_log_file = /data/log/slow.log
log_error = /data/log/error.log
long_query_time =1
server-id = 175
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log_slave_updates=on
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_format = row
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 16M
lock_wait_timeout = 3600
innodb_thread_concurrency = 0
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3 从库采用命令启动指定配置文件:
/usr/local/mysql/bin/mysqld_safe --defaults-extra-file=/etc/my3306.cnf --datadir=/mysql3306 --user=mysql &
从库初始化:
mysqld --initialize --user=mysql01 --datadir=/data/data --basedir=/data/mysql --socket=/data/data/mysqldbs.sock
从库启动:指定配置文件的方式启动
/data/mysql/bin/mysqld_safe --defaults-extra-file=/data/mysql/conf/my.cnf --datadir=/data/data --basedir=/data/mysql --user=mysql01 &

ps -ef | grep -i mysql |grep -v grep 查看进程,3306和3309都已经起来了。

设置主从:

设置主从:需要在从库上执行
change master to master_host='主库ip';
change master to master_port=3306;
change master to msater_user='tigergao';
change master to master_password='tigergao';
change master to master_log_file='mysql-bin.000001';
change master to master_log_pos=1097;
开启主从:startslave

在从库上查看sql线程和io线程是否成功应用,如果已应用代表就是成功了。show slave status \G;

验证主从,在主库上创建数据库:tigergao;在数据库tigergao中创建一张学生表并插入数据。

然后在从库上查看:

可以看到从库已经把数据库和表以及数据都同步过来了。分别去查看主库和从库的数据目录下的数据。
主从已经搭建成功。
主从复制基本故障处理
IO线程
++ 连接主库 ++
1)user password ip port
2)网络:不通,延时高,防火墙
++ 请求binlog ++
1)binlog不存在或者损坏
++ 更新relay-log和master.info ++
SQL线程
1)relay-log出现问题
2)从库做写入了
操作对象已存在(create)
操作对象不存在(insert update delete drop truncate alter)
约束问题、数据类型、列属性
处理方法一:
#临时停止同步
mysql> stop slave;
#将同步指针向下移动一个(可重复操作)
mysql> set global sql_slave_skip_counter=1;
#开启同步
mysql> start slave;
处理方法二:
#编辑配置文件
vim /etc/my.cnf
#在[mysqld]标签下添加以下参数
slave-skip-errors=1032,1062,1007
但是以上操作都是有风险存在的
处理方法三:
1)重新备份数据库,恢复到从库
2)给从库设置为只读
#在命令行临时设置
mysql> set global read_only=1;
#在配置文件中永久生效/etc/my.cnf
read_only=1
6.延时从库
企业中一般会延时3-6小时
延时从库配置方法
从库操作
#停止主从
mysql>stop slave;
#设置延时为180秒
mysql>change master to master_delay = 180;
#开启主从
mysql>start slave;
#查看状态
mysql> show slave status \G
SQL_Delay: 60
3.延时从库停止方法
#停止主从
mysql> stop slave;
#设置延时为0
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
#开启主从
mysql> start slave;
关闭半同步:
主库执行
SET GLOBAL rpl_semi_sync_master_enabled = 0;
SET GLOBAL rpl_semi_sync_master_wait_no_slave = 0; 从库执行:
SET GLOBAL rpl_semi_sync_slave_enabled = 0;

建议大家有资源的话尽量在两台机器上实验,一台机器上容易有坑。

MySQL 5.7主从搭建(同一台机器)的更多相关文章

  1. 解决mysql跟php不在同一台机器上,编译安装php服务报错问题:configure: error: Cannot find MySQL header files under /application/mysql.

    在编译安装php服务时报错: configure: error: Cannot find MySQL header files under /application/mysql. Note that ...

  2. Mysql 5.6主从搭建

    mysql设置主从的重要性和必要性不必多说,下面开始详细说明如何搭建主从. 1.主服务器上创建一个用于复制的账户. mysql'; mysql> flush privileges; 2.主服务器 ...

  3. MySQL集群系列1:2台机器搭建双主集群

    先配置静态IP 2台机器mysql密码一样,最好在同一局域网内,最好在mysql刚安装时就配置好,后面有数据了不好同步. 本文实现了2台机器mysql数据同步成功: 配置my.cnf 先关闭防火墙 s ...

  4. MySql主从搭建详细步骤

    环境: linux64位,一台机器两个实例,主库3306端口,从库3307端口 步骤: 一.下载安装 先下载安装mysql,这里使用了5.7.21版本,具体过程不做详细说明,可自行查资料如何下载 二. ...

  5. 如何在同一台机器上安装多个MySQL的实例

    转自:'http://www.cnblogs.com/shangzekai/p/4375271.html 最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的 ...

  6. 如何在同一台机器上安装多个MySQL的实例 转

    https://www.cnblogs.com/shangzekai/p/4375271.html 最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的MyS ...

  7. 如何在同一台机器上安装多个MySQL的实例(转)

    最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的MySQL的实例). 先说下,什么是mysql的多实例,简单的来说就是一台机器上安装了多个mysql的服务 ...

  8. ### MySQL主从搭建Position

    一.MySQL主从搭建 搭建主从架构的MySQL常用的有两种实现方式: 基于binlog的fileName + postion模式完成主从同步. 基于gtid完成主从同步搭建. 本篇就介绍如何使用第一 ...

  9. 关于mysql集群主从服务器搭建

    在高并发流量下,数据库往往是服务端的瓶颈,由于数据库数据需要确保落地,同时保证数据同步,数据即时性,有效性的问题,导致数据库不能像平常后端程序一样负载均衡. 那么在大并发下,该如何缓解数据库的压力呢? ...

随机推荐

  1. 【LeetCode】461. Hamming Distance 解题报告(java & python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 方法一:异或 + 字符串分割 方法二: ...

  2. 【LeetCode】875. Koko Eating Bananas 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetc ...

  3. 1266 - Points in Rectangle

    1266 - Points in Rectangle    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...

  4. Mysterious For(hdu4373)

    Mysterious For Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. Codeforces 567D:One-Dimensional Battle Ships(二分)

    time limit per test : 1 second memory limit per test : 256 megabytes input : standard input output : ...

  6. 【C++】leetcode竞赛笔记

    *注--代码非博主本人所写,仅供学习参考,侵删 20200516双周赛: 1 to_string(int a) 将a转换成字符串形式 2 gcd(int a,int  b) 返回a,b的最大公约数,若 ...

  7. Causal Intervention for Weakly-Supervised Semantic Segmentation

    目录 概 主要内容 普通的弱监督语义分割 因果模型 训练流程 代码 Zhang D., Zhang H., Tang J., Hua X. and Sun Q. Causal Intervention ...

  8. 编写Java程序,用套接字编程模拟实现银行认证过程

    需求说明: 某银行一核心服务器部署了一个资金交易来往的系统,为了防止黑客入侵窃取数据,该银行专门开发了一款负责安全认证的智能机器人守护服务器,对外来访问做多重身份认证.现在要求你用套接字编程模拟实现这 ...

  9. Java二、八、十、十六进制介绍

    1.说明 在Java中整数有四种表示方式, 分别为十进制,二进制,八进制,十六进制, 其中十进制就是平常最熟悉,使用最多的进制: 二进制是在计算机中使用最多的进制, 八进制和十六进制都是基于二进制的, ...

  10. tcpdump统计http请求并导出URL文本

    tcpdump统计http请求并导出URL文本 tcpdump tcpdump是一个用于截取网络分组,并输出分组内容的工具.凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排 ...