主从复制原理:复制是 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】415. Add Strings 解题报告(Python)

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

  2. 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)

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

  3. 【LeetCode】394. Decode String 解题报告(Python)

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

  4. 【LeetCode】659. Split Array into Consecutive Subsequences 解题报告(Python)

    [LeetCode]659. Split Array into Consecutive Subsequences 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...

  5. Codeforces 777B:Game of Credit Cards(贪心)

    After the fourth season Sherlock and Moriary have realized the whole foolishness of the battle betwe ...

  6. .NET+Sqlite如何支持加密

    .NET+Sqlite如何支持加密 Sqlite SQLite 来源于公共领域 SQLite Is Public Domain. 确保代码不会受到任何专有或许可内容的污染,没有任何来自互联网上的未知来 ...

  7. Java+HTML5 试题 云南农业职业技术学院 - 互联网技术学院

    摸底测试 100题_共100.00分_及格60.00分  第1题 [单选题][1.00分][概念理解] 执行完下面程序片段后, ( )的结论是正确的. int a, b, c; a = 1; b = ...

  8. DES对称加密算法实现:Java,C#,Golang,Python

    数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ...

  9. LCA/在线(倍增)离线(Tarjan)

    概念 祖先 公共祖先 最近公共祖先 方法1:暴力爬山法 方法2:倍增 求公共祖先 求俩点的距离 Tarjan 概念 祖先 有根树中,一个节点到根的路径上的所有节点被视为这个点的祖先,包括根和它本身 公 ...

  10. Linux shc 命令手册

    shc Generic shell script compiler. https://www.linux-man.cn/command/shc/ #Compile a shell script: sh ...