14、mysql主从复制实战
14. 1、服务器准备:
一台服务器,多实例,客户端编码是utf8,服务端编码是utf8;
[root@backup 3308]#netstat -tunlp | grep 330
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4664/mysqld
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 5511/mysqld
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 10571/mysqld
1、主库(mysql master):[ip为172.16.1.41 port为3306]
2、从库1(mysql slave):[ip为172.16.1.41 port为3307]
3、从库2(mysql slave):[ip为172.16.1.41 port为3308]
4、mysql的登录用户和密码分别是root,123456
14.2、说明:
1、一般常规做主从复制,主从服务器多数在不同的机器上,并且监听的端口号均为默认的3306;
2、本文主要是针对以单数据库多实例的环境来讲解的;
3、第1点虽然不在一个机器上,但是步骤和过程和第2点是一样的;
14.3、配置说明:
1、打开主库的binlog,一般从库不开启binlog功能,除非从库做备份或为下面的从库做主库(级联);
2、确保每个实例的id不同;
3、在主库上配置用于从库复制的账号:
[root@backup ~]#mysql -uroot -p123456 -S /data/3306/mysql.sock
mysql> grant replication slave on *.* to 'lc'@'172.16.1.%' identified by '123456';
mysql> flush privileges;
4、锁主库拿到binlog文件名和binlog的pos点:
mysql> flush table with read lock; #5.5的数据库;
#5.1的是flush table with read lock;
#注意:关闭mysql登录窗口或锁表参数超时,锁表失效;
#锁表的时候要申请停机时间;
mysql> show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 331 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
5、备份主库的数据库(切换一个连接窗口):
[root@backup ~]#mysqldump -uroot -p123456 -A -B -R --events -S /data/3306/mysql.sock >/tmp/mysql_bak.sql
提示:如果在备份的时候加了-F会刷新binglog日志,只是变了文件而已,中间没有数据,可以使用新的pos点;
6、再次查看主库的binlog文件和对应的pos点:
pos点没有发生改变,说明备份的时候主库锁定成功;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 331 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
7、解主库操作:
mysql> unlock tables;
8、将备份的主库还原到从库上:
[root@backup ~]#mysql -uroot -p123456 -S /data/3307/mysql.sock </tmp/mysql_bak.sql
9、在从库上配置参数:
(1)配置参数:
[root@backup ~]#mysql -uroot -p123456 -S /data/3307/mysql.sock
CHANGE MASTER TO
MASTER_HOST='172.16.1.41',
MASTER_PORT=3306,
MASTER_USER='lc',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=331;
(2)查看参数:
[root@backup ~]#cat /data/3307/data/master.info
18
mysql-bin.000001
331
172.16.1.41
lc
123456
3306
60 #重试连接间隔为60s
0
0
1800.000
0
(3)开启从库:
mysql> start slave; #停止使用stop slave;
(4)查看从库启动是否成功:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.41
Master_User: lc
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 331
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes #slave的IO线程,负责和主库进行通讯取主库的binlog;
Slave_SQL_Running: Yes #slave的SQL线程,负责读取主库的binlog;
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: 331
Relay_Log_Space: 410
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 #从库落后主库的秒数为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
1 row in set (0.00 sec)
(5)[root@backup 3307]#ls data/
master.info #IO线程使用,记录主库binlog文件名和binlog的pos点,然后从主库拉binlog日志;
mysqld-relay-bin.000001 #IO线程从主库拉来的binlog日志;
mysqld-relay-bin.000002
mysqld-relay-bin.index #记录mysqld-relay-bin的列表;
relay-log.info #SQL线程使用,读取mysqld-relay-bin日志的文件名和pos点;
1)[root@backup data]#cat master.info
18
mysql-bin.000002
107
#上面两个参数表示从库的io线程读取主库的binlog的pos点;
172.16.1.41
lc
123456
3306
60
0
0
1800.000
0
2)[root@backup data]#cat mysqld-relay-bin.index
./mysqld-relay-bin.000001
./mysqld-relay-bin.000002
3)[root@backup data]#cat relay-log.info
./mysqld-relay-bin.000002
253
#上面的两个参数表示从库sql线程读取relay-log文件的pos点;
mysql-bin.000002
107
#上面的两个参数表示从库的io线程读取主库的binlog的pos点;
14.4、登录数据库查看mysql线程同步状态:
1、主库线程状态:
mysql> show processlist\G;
*************************** 2. row ***************************
Id: 11
User: lc
Host: 172.16.1.41:56330
db: NULL
Command: Binlog Dump
Time: 726
State: Master has sent all binlog to slave; waiting for binlog to be updated #IO线程;
Info: NULL
2 rows in set (0.00 sec)
(1)IO线程:
2、从库线程状态:
mysql> show processlist\G;
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 789
State: Slave has read all relay log; waiting for the slave I/O thread to update it #sql线程;
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 789
State: Waiting for master to send event #IO线程;
Info: NULL
(1)IO线程:
(2)sql线程:
14.5、总结:
1、master-data=1或2使用的场合主要用于mysql的主从复制,使用'1'代表的是标记的位置点;
不会被注释掉,在slave上导入数据时就会执,使用'2'时代表标记的位置点会被注释掉,导入从库时不会被执行;
此参数在mysql的InnoDB引擎上使用
2、mysql主从同常规步骤(需要停库):
3、备份时使用的是--master-data=1参数快速配置mysql主从复制的方案(不需要停库):
(1)安装配置好主从数据库,主从数据库的server-id不同,打开主库的log-bin日志功能,从库
一般不打开log-bin的功能,除非从库做备份或为下面的从库做主库使用;
(2)在主库上为从库设置从库连接的账号grant replication slave on *.* to 'lc'@'172.16.1.%' identified by '123456'; ;
(3)使用mysqldump -uroot -p123456 -A -B --single-transaction -R -F --master-data=1 -S /data/3306/mysql.sock | gzip >/tmp/mysql_bak.sql;
#事先备份的数据库或者时现场备也可以;
(4)在从库上还原备份的主库:
gzip -d /tmp/mysql_bak.sql
mysql -uroot -p123456 -S /data/3307/mysql.sock </tmp/mysql_bak.sql
(5)在从库上执行CHANG MASTER语句:
不需要MASTER_LOG_FILE文件和MASTER_LOG_POS配置位置点;
CHANGE MASTER TO
MASTER_HOST='172.16.1.41',
MASTER_PORT=3306,
MASTER_USER='lc',
MASTER_PASSWORD='123456',
(6)在从库上开启同步开关:
mysql> start slave;
(7)在从库上检查同步的状态:
mysql> show slave status\G;
说明:该方法只要有主库的备份和主库的binlog随时可以制作mysql主从同步;
4、锁库的时间说明:
这个锁表命令的时间,在不同的引擎的情况下,会受到下面参数的控制,锁表时,如果
超过设置时间不操作会自动解锁;
interactive_timeout
wait_timeout
(1)默认的锁库时间为8小时:
mysql> show variables like '%timeout%';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 120 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+----------------------------+----------+
10 rows in set (0.00 sec)
(2)设置锁库的时间:
退出当前mysql登录窗口后重新登录mysql生效;
重启mysql后失效,因为没有配置mysql的my.cnf配置文件;
mysql> set global interactive_timeout=28800;
mysql> set global wait_timeout=28800;
5、使用脚本的方法实现批量创建mysql主从同步:
关键脚本如下,其它脚本根据步骤写即即可;
cat | mysql -uroot -p123456 -S /data/3307/mysql.sock <<EOF
CHANGE MASTER TO
MASTER_HOST='172.16.1.41',
MASTER_PORT=3306,
MASTER_USER='lc',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=331;
EOF
说明:注意该cat的写法,cat加管道符指的是执行管道符后面的到EOF结尾的内容,最后一行
要留空行,不然执行完后跳不出来;也可用yes代替cat,yes命令在命令行中输出指定的字符
串,直到yes进程被杀死,不带任何参数输入yes命令默认的字符串就是y;
6、说明:主从同步通过CHANG命令后就确定了从,以后启动mysql实例后会自动开启start slave,即有master.info的就是从库,不然从库开不起,关闭从库的方法 stop slave reset master 删除master info
重启mysql;
14、mysql主从复制实战的更多相关文章
- mySQL主从复制实战
随着访问量的不断增加,单台MySQL数据库服务器压力不断增加,需要对MYSQL进行优化和架构改造,MYQSL优化如果不能明显改善压力情况,可以使用高可用.主从复制.读写分离来.拆分库.拆分表来进行优化 ...
- MySQL 主从复制实战解析
前言:前面几篇文章讲解了在应用层读写分离的配置和使用,这篇文章将来个主从复制的实战解析. 说明:主从复制,读写分离结构图 原理图 主库生成一个线程: Binlog Dump线程 1.此线程运行在主库, ...
- 详解MySQL主从复制实战 - 基于GTID的复制
基于GTID的复制 简介 基于GTID的复制是MySQL 5.6后新增的复制方式. GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交 ...
- 14.MySQL主从复制
1.复制的基本原理 三步骤 + 原理图 1.1 master将改变记录到二进制文件(binary log),这些记录过程叫做二进制日志事件, binary log events 1.2 slave 将 ...
- 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...
- MySQL(13)---MYSQL主从复制原理
MYSQL主从复制原理 最近在做项目的时候,因为部署了 MYSQL主从复制 所以在这里记录下整个过程.这里一共会分两篇博客来写: 1.Mysql主从复制原理 2.docker部署Mysql主从复制实战 ...
- 九、linux-msyql下的mysql主从复制深度实战
1.上节基本诉说了mysql主从同步,这里想说明的是,其一从库在请求主库进行同步的时候,是主库的主线程进行用户名.密码的验证,在验证通过后,将请求转交给I/O线程负责同步:其二从库sql线程在读取中继 ...
- 实战-Mysql主从复制
前言: Mysql内建的复制功能是构建大型高性能应用程序的基础.由于目前mysql的高可用性架构MMM和MHA均建立在复制的基础之上,本文就mysql主从复制进行实战描述,希望对读者提供帮助.之前 服 ...
- MySQL 5.7主从复制实战篇
MySQL 5.7主从复制实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装MySQL数据库并启动 1>.在MySQL官方下载相应的安装包(https://dev ...
随机推荐
- [刷题] 437 Paths Sum III
要求 给出一棵二叉树及一个数字sum,判断这棵二叉树上存在多少条路径,其路径上的所有节点和为sum 路径不一定始于根节点,终止于叶子节点 路径要一直向下 思路 分情况讨论:根节点在路径上(8) / 根 ...
- 《我常用的股票投资工具与网站》v2.0
<我常用的股票投资工具与网站>v2.0 王大海 职业投资,抽空做一点分享. 661 人赞同了该文章 "少年你好,想不到你竟有如此因缘际会看到这里.我看你骨骼精奇,定是万中无一的交 ...
- (全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系?
(全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? 产品经理马忠信关注 22015.08.30 13:59:20字数 2,660阅读 52,661 今天我给大家来讲讲这几个咱们经常打交道的词到 ...
- 把采集到的数据发送到一个Google Docs或者Google Form上 这个网站提供了参考和例子
把采集到的数据发送到一个Google Docs或者Google Form上这个网站提供了参考和例子 http://www.instructables.com/id/Post-to-Google-Doc ...
- STM32的VDD与VDDA
http://bbs.21ic.com/icview-1651072-1-1.html VDD VSS 就是平常的电源与地.后面带A的都是模拟量的电源.
- sklearn中,数据集划分函数 StratifiedShuffleSplit.split() 使用踩坑
在SKLearn中,StratifiedShuffleSplit 类实现了对数据集进行洗牌.分割的功能.但在今晚的实际使用中,发现该类及其方法split()仅能够对二分类样本有效. 一个简单的例子如下 ...
- 在gin框架中使用JWT
在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...
- Go语言的函数04---变量作用域
package main import "fmt" /* 变量的作用域 全局变量:写在函数外,当前包下的所有函数都可以访问的变量(整个包),生命周期与程序相同(程序结束时,全局变量 ...
- 永远的Ace 实验五 团队作业2:XXX企业设施设备云上资料室
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/ 这个作业要求链接 https://www.cnblogs.com/nwnu-da ...
- 摄像头PVD和CVD薄膜
摄像头PVD和CVD薄膜 在FDP 的生产中,在制作无机薄膜时,可以采用的方法有两种:PVD 和CVD (将VE 和VS 归于PVD ,而ALD 归于CVD). Physical Vapor Depo ...