当前位置: 首页 > 编程日记 > 正文

mysql 主从复制 和基于gtid的mysql主从复制

主从复制

原理:
mysql 无需借助第三方工具,而是其自带的同步复制功能,另外一点,mysql 的主从
复制并不是从硬盘给上文件直接同步,而是逻辑的 binlog 日志同步到本地的应用执行的过
程。 数据从一个 mysql 数据库(master)复制到另一个 mysql 数据库(slave),在
master 与 slave 之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程
(SQL 线程和 IO 线程)在 slave 端,另一个线程(I/O 线程)在 master 端。要实现 mysql
的主从复制,首先必须打开 master 端的 binlog 记录功能,否则将无法实现。因为整个复
制过程实际上就是 slave 从 master 端获取 binlog 日志,然后再在 slave 上以相同顺序执
行获取的 binlog 日志中的记录的各种 SQL 操作。


原理图:

主从复制用途:

  1. 实时灾难备份,故障切换
  2. 读写分离,分担master的负载
  3. 备份,防止业务受影响

主从复制条件:

  1. master开启binlog日志
  2. master和slave的server-id不同
  3. slave主动连接master

主从复制存在的问题:

  1. master宕机后数据库的数据可能丢失
  2. 主库写压力时会出现复制延时的可能,导致数据不能完全备份

解决方法:

  1. 半同步复制-克服数据丢失
  2. 并行复制-克服复制延

环境:
master(主数据库): test3(172.25.1.3)
slave   (从数据库): test4(172.25.1.4)
主从数据库版本最好一致
主从数据库内的数据需保持一致

master---slave 配置相同如下
Master(test3):
[root@test3 ~]# ls

mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

[root@test3 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

[root@test3 ~]# rm -rf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

[root@test3 ~]# yum install * -y
[root@test3 ~]# vim /etc/my.cnf


[root@test3 ~]# /etc/init.d/mysqld start


//打开数据库
[root@test3 ~]# grep "temporary password" /var/log/mysqld.log


[root@test3 ~]# mysql_secure_installation

[root@test3 ~]# mysql -p                //登陆数据库

slaver(test4)

[root@test4 ~]# ls

mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

[root@test4 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

[root@test4 ~]# rm -rf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

[root@test4 ~]# ls


[root@test4 ~]# yum install * -y
[root@test4 ~]# vim /etc/my.cnf


[root@test4 ~]# /etc/init.d/mysqld start            //打开数据库,可能出现报错
Initializing MySQL database:
2018-10-18T06:10:52.204846Z 0
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option (see
documentation for more details).
2018-10-18T06:10:52.206242Z 0 [ERROR] --initialize specified but
the data directory has files in it. Aborting.
2018-10-18T06:10:52.206268Z 0 [ERROR] Aborting
[FAILED]
//报错原因是已经有了 data 数据
解决方案:

[root@test4 ~]# vim /etc/my.cnf


[root@test4 ~]# cd /var/lib/mysql
[root@test4 mysql]# ls
ib_buffer_pool ibdata1 ib_logfile0
[root@test4 mysql]# ll              //确实有数据
total 110596
-rw-r----- 1 mysql  mysql    215 Oct 18 13:18 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Oct 18 13:18 ibdata1
-rw-r----- 1 mysql mysql 50331648 Oct 18 13:18 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Oct 18 13:18 ib_logfile1


[root@test4 mysql]# cd ..
[root@test4 lib]# mv mysql mysql.back             //备份数据
解释:由于这里是练习,故便于实验将原本数据删除
[root@test4 mysql]# rm -rf *
[root@test4 mysql]# /etc/init.d/mysqld start
Initializing MySQL database:                                [ OK ]
Installing validate password plugin:                     [ OK ]
Starting mysqld:                                                    [ OK ]
[root@test4 mysql]# grep password /var/log/mysqld.log
2018-10-18T06:21:22.660701Z 1 [Note] A temporary password is
generated for root@localhost: a,NqiGtfZ7D&
[root@test4 mysql]# mysql_secure_installation

test3 给用户名和可链接网段及授权密码(创建用户并授权)
[root@test3 ~]# mysql -p
Enter password:
mysql> grant replication slave on *.* to repl@'172.25.1.%' identified by '@Caoxingxing123';       //master给slave做授权,让slave连接
Query OK, 0 rows affected, 1 warning (0.39 sec)
mysql> quit
Bye


其中,master_user 为 repl
test4(从库)尝试连接
[root@test4 mysql]# mysql -u repl -p -h 172.25.1.3
Enter password:                    //输入 master 的数据库内中设置的验证密码
ERROR 2003 (HY000): Can't connect to MySQL server on '172.25.1.3' (113)
//此时可能会有报错
//报错原因有可能是没关防火墙。分别将防火墙关闭,再次尝试连接。
[root@test3 ~]# /etc/init.d/iptables stop
[root@test4 ~]# /etc/init.d/iptables stop
[root@test4 ~]# mysql -u repl -p -h 172.25.1.3            //连接成功。

从库连接主库
登陆slave数据库 mysql 会话,执行同步 SQL 语句(需要主服务器主机名,登陆凭
据,二进制文件的名称和位置),其中 master_log_file 和 master_log_pos 参
数不固定,其根据主库参数写。
master:          //查看master的二进制日志

slave:
[root@test4 ~]# mysql -p


mysql>change master to master_host='172.25.1.3',master_user='repl',master_password='@ Caoxingxing123',master_log_file='mysql-bin.000005',master_log_pos=738;                                //slave进行change
Query OK, 0 rows affected, 2 warnings (1.25 sec)
mysql> start slave;               //启动 slave 同步进程
Query OK, 0 rows affected (0.16 sec)mysql> show slave status\G                //查看 slave 状态


接下来通过验证,证明是否可以实现主从复制的功能,证明方式有两种,分别如下:
         1.在 master 数据库的 westos 数据库的一张数据表中插入数据,slave 的
westos 数据库的相同数据表中查看是否有新增的相同数据,从而来验证能否实
现主从复制功能。
         2.关闭 slave,然后再修改 master 内容,看 slave 内容是否也相应修改。
验证 1:
未插入时:
master:


salve:

现在给主数据库创建数据库westos,并插入数据

主 mysql:
mysql> create database westos;


mysql> use westos                 //切换到 westos 数据库
Database changed
mysql> create table userlist(
-> username varchar(10) not null,
-> password varchar(20) not null);                     //创建表userlist 及插入数据

此时slave:

可见,列表 userlist 中的数据已经由master同步到 slave,实现主从复制功能。

验证 2:
slave:
mysql> stop slave;            //停掉slave


master:
mysql> insert into userlist values ('lib',678);
mysql> insert into userlist values ('lily',789);

mysql> select * from userlist;          //查看列表的数据内容

slave:

mysql> select * from userlist;


此时,slave 并未将数据同步过来,同样也可以说明其实现了主从复制功能。


基于 GTID 的主从复制


优点:
      因为不用手工设置日志偏移量, 可以很方便地进行故障转移,如果启用
log_slave_updates 那么从库不会丢失主库上的任何修改。
缺点:
     对执行的 SQL 有一定限制,仅支持 MySQL 5.6 之后的版本, 而且不建议使用早期 5.6 版本。

配置master和slave:

在两边的配置文件/etc/my.cnf 都加上:
gtid_mode=ON
enforce-gtid-consistency=true
并重启数据库

master:
[root@test3 ~]# vim /etc/my.cnf


[root@test3 ~]# /etc/init.d/mysqld restart


slave:
[root@test4 ~]# vim /etc/my.cnf


[root@test4 ~]# /etc/init.d/mysqld restart
[root@test4 ~]# mysql -p            //关掉 slave


mysql> change master to master_host='172.25.1.3' master_user='repl', master_password='@Caoxingxing123',

MASTER_AUTO_POSITION=1;


mysql> start slave;                    //开启 slave
mysql> show slave status\G;          //查看slave 的状态,状态正常



master:
            给 master 数据库插入内容进行测试。
mysql> use westos
Database changed
mysql> create table gtidlist(
-> username varchar(10) not null,
-> password varchar(20) not null);
mysql> insert into gtidlist values ('gtid1',111);
mysql> insert into gtidlist values ('gtid2',222);

mysql> select * from gtidlist;

slave:


由上可见,数据可以同步过来,实现了主从复制。

相关文章:

使用read write 读写socket

一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用。 由此网络程序里最基本的函数就是read和write函数了。 写函数: ssize_t write(int fd, const void*buf,size_t nbytes); write函数将buf中的nbytes字节内容写入文件…

iOS从通讯录中选择联系人

有时候APP需要用户输入一位联系人的姓名和电话&#xff0c;除了用户手动输入&#xff0c;一般也允许用户从通讯录中选择一位联系人&#xff08;图1&#xff09;&#xff0c;下面的代码就是使用系统的<AddressBookUI/AddressBookUI.h>库实现这一需求。 图1 完整代码&…

document.readystate

http://www.cnblogs.com/lhb25/archive/2009/07/30/1535420.html http://www.cnblogs.com/haogj/archive/2013/01/15/2861950.html http://jincuodao.baijia.baidu.com/article/2896 电视转载于:https://www.cnblogs.com/daishuguang/p/3523783.html

Openstack安装部署

系统版本 rhel7.4 关闭 iptables 关闭 selinux foundation1: 172.25.254.1 server1: 172.25.254.11 server2: 172.25.254.12 可参考&#xff1a;https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/ //选择的mitaka 虚拟机上网 首先物理机必须可…

在Xcode中使用Git进行源码版本控制

本文翻译自Understanding Git Source Control in Xcode &#xff08;译者myShire&#xff09;欢迎您加入我们的翻译小组。 在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本…

敏捷开发之道(二)极限编程XP

上次的博文敏捷开发之道&#xff08;一&#xff09;敏捷开发宣言中&#xff0c;我们介绍了一下敏捷开发宣言&#xff0c;在其中&#xff0c;我们了解到了关于敏捷开发的几个重要的价值观。今天我们来了解一个敏捷开发的方法——极限编程XP 1、介绍 极限编程&#xff08;eXtreme…

spring 3.X与jdk 1.8不兼容

1、报错&#xff08;部分&#xff09; 2、解决 虽然Spring的jdk要求如下&#xff0c;但是spring 3与jdk1.8不兼容&#xff08;使用的是spring 3.2&#xff09; 在eclipse将jdk版本下调。这里将JDK调到1.7&#xff08;在eclipse如下设置&#xff09; 同时&#xff0c;需要设置服…

rhel-server-7.5-x86_64-dvd.iso镜像下载及rar压缩包的解压

主机名为server1 [rootserver1 ~]# ls rhel-server-7.5-x86_64-dvd.part1.rar rarlinux-5.6.1.tar.gz rhel-server-7.5-x86_64-dvd.part2.rar 1、如果没有rarlinux-5.6.1.tar.gz包可以去 https://www.rarlab.com/download.htm 这个网站下载RAR 5.61 for Linux 或者RAR 5.…

Expandable Table的Demo

在网上看到一个可点击cell展开的TableView的demo&#xff0c;原文是swift语言&#xff0c;我写了个oc版&#xff0c;有兴趣的朋友可以看下&#xff1a; 效果&#xff1a; oc源码&#xff08;带中文注释&#xff09;&#xff1a;http://download.csdn.net/detail/dolacmeng/941…

Java对多线程的支持

Java运行时系统实现了一个用于调度线程执行的线程调度器&#xff0c;用于确定某一时刻由哪一个线程在CPU上运行。在Java技术中&#xff0c;线程通常是抢占式的而不需要时间片分配进程&#xff08;分配给每个线程相等的CPU时间的进程&#xff09;。抢占式调度模型就是许多线程处…

ESP8266-iot-2

1.SDK概述 复制相关的工程文件到HelloWorld里面 要在版本esp8266_nonos_sdk_v2.0.0_16_07_19上面开发&#xff0c;那么就要复制相应文件 然后打开IDE 导入HelloWorld到工程里面 创建3个文件&#xff0c;如下图 再从lib里面添加文件 复制到我的下面 复制app里面的内容 打算从IoT…

iptables防火墙策略

环境&#xff1a; foundation1 172.25.1.250 172.25.254.1 server1 172.25.1.1 server2 172.25.1.2 server3 172.25.1.3 四个主机都做解析 iptables简介&#xff1a; netfilter/iptables&#xff08;简称为iptables&#xf…

ubuntu(16.04.01)学习-day1

1.修改root用户密码 sudo passwd root 按提示进行设置。 2.从Ubuntu 16.04开始&#xff0c;用户可以实现改变启动器的位置&#xff0c;可以将启动器移到屏幕底部&#xff0c;但是无法移到右边或顶部。打开终端&#xff0c;然后输入下面这个命令&#xff0c;即可将启动器移到屏幕…

HDU 1090 A+B for Input-Output Practice (II)

#include <cstdio> int main() {int n,a,b;scanf("%d",&n);for (int i1; i<n; i){ scanf("%d%d",&a,&b);printf("%d\n",ab);}return 0; } 转载于:https://www.cnblogs.com/forever97/p/3539605.html

监听UIWebView点击视频播放的事件

最近项目需要统计在跳转UIWebView后&#xff0c;用户点击网页上的视频进行播放的概率。找了很多监听进入视频播放的方法&#xff0c;最后在stackoverflow找到下面这个使用Notification的可行方法(如果是弹出)&#xff1a; #pragma mark Notification - (void)addNotification {…

linux系统下redhat7之虚拟机控制

基础操作&#xff1a; [kioskfoundation0 Desktop]$ rht-vmctl start desktop ###开启desktop虚拟机 Error: desktop not started (is already running) ###报错&#xff0c;desktop已经运行 [kioskfoundation0 Desktop]$ rht-vmctl view desktop …

如何设计一个 iOS 控件?(iOS 控件完全解析)

前言 一个控件从外在特征来说&#xff0c;主要是封装这几点&#xff1a; 交互方式显示样式数据使用 对外在特征的封装&#xff0c;能让我们在多种环境下达到 PM 对产品的要求&#xff0c;并且提到代码复用率&#xff0c;使维护工作保持在一个相对较小的范围内&#xff1b;而一个…

Chapter12:动态内存

智能指针——shared_ptr为了更容易地使用动态内存&#xff0c;新的标准提供了智能指针来管理动态对象。智能指针的行为类似常规指针&#xff0c;重要的区别是它负责自动释放指向的对象。 智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。 1 if (p1 &am…

判断JS对象是否拥有某属性两种方式

方式&#xff0c;但稍有区别 1&#xff0c;in 运算符 1 2 3 var obj {name:jack}; alert(name in obj); // --> true alert(toString in obj); // --> true 可看到无论是name&#xff0c;还是原形链上的toString&#xff0c;都能检测到返回true。 2&#xff0c;hasOwnP…

Linux之redhat7系统结构

一.linux系统结构 linux是一个倒树结构 linux中所有的东西都是文件 这些文件都在系统顶级目录“/” /就是根目录 /目录以下为二级目录这些目录都是系统装机时系统自动建立的 二级目录的作用 /bin ##二进制可执行文件也就是系统命令 /sbin ##系统管理命令存放位置 /boot …

ASP.NET优化

源地址&#xff1a;http://www.cnblogs.com/wangjingblogs/archive/2013/02/27/2934706.html http://jingyan.baidu.com/article/2d5afd69bfd0ff85a3e28e6d.html转载于:https://www.cnblogs.com/haizine/p/5841771.html

3D Touch介绍: 一个数字压力器App和Quick Actions

随着iPhone 6s and 6s Plus的发布&#xff0c;苹果介绍了全新的手机交互方式&#xff1a;重按手势。你应该知道&#xff0c;这个特性其实早已应用在苹果手表和MacBook产品中&#xff0c;名字叫Force Touch。它给用户交互添加了全新的维度&#xff01; 或许你对Force Touch为什么…

一些LUA函数(转载)

转自http://hi.baidu.com/chevallet/item/9a3a6410c20d929198ce3363 一些LUA函数 1、assert (v [, message])  功能&#xff1a;相当于C的断言&#xff0c;当表达式v为nil或false将触发错误,  message&#xff1a;发生错误时返回的信息&#xff0c;默认为"assertion f…

cifs------网络文件系统(1)

SMB文件共享 SMB&#xff08;Server Message Block&#xff09;通信协议是微软&#xff08;Microsoft&#xff09;和英特尔(Intel)在1987年制定的协议&#xff0c;主要是作为Microsoft网络的通讯协议。SMB 是在会话层&#xff08;session layer&#xff09;和表示层&#xff0…

Swift 教學:如何使用iOS Charts API 製作漂亮的圖表

在應付許多的資料時&#xff0c;比起只在表格中呈現&#xff0c;使用圖表來顯示資料&#xff0c;可以幫助使用者容易地了解資訊。有了圖表&#xff0c;相對於讀取整個資料表&#xff08;或幾個資料表&#xff09;你可以輕鬆地一眼便見到以圖形表示的資料&#xff0c;取得所需的…

在Proteus中添加标号

1.Proteus中添加组件后双击引脚可以快速生成一个最近的端口。 2.按A调出设置界面 3.在String中写&#xff1a;netH#,"H"可以换成自定义前缀。count为起始值&#xff0c;increment为增量。 4.依次点击想要编号的引脚。转载于:https://www.cnblogs.com/viaduct/p/58424…

九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目

题目地址&#xff1a;http://ac.jobdu.com/problem.php?pid1525 题目描述&#xff1a; 小明手中有很多字符串卡片&#xff0c;每个字符串中都包含有多个连续的空格&#xff0c;而且这些卡片在印刷的过程中将字符串的每个子串都打印反了&#xff0c;现在麻烦你帮小明将这些字符…

cifs------网络文件系统(2)

接着上篇博客继续&#xff1a; Samba 基本配置 [rootserver2 ~]# rpm -qc samba-common //查看smb的配置文件 1、黑、白名单的设定 默认白名单&#xff0c;设置的ip是黑名单用户&#xff1a;hosts deny ip 默认黑名单&#xff0c;设置的ip是白名单用户&#xff…

iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

原文地址&#xff1a;https://github.com/ChenYilong/ParseSourceCodeStudy/blob/master/02_Parse的网络缓存与离线存储/iOS网络缓存扫盲篇.md 目录 当我们在谈论缓存的时候&#xff0c;我们在谈论什么&#xff1f;GET网络请求缓存 80%的缓存需求&#xff1a;两行代码就可满足…

YARN集群维护部分问题汇总

云梯开发人员在云梯Yarn集群的搭建和维护过程中做了许多工作&#xff0c;本文选择这期间部分较为典型的问题&#xff0c;通过对这些问题的分析和解决方案&#xff0c;为大家分享分布式系统问题调查的经验。 调查的问题 1. 2013年初引入社区0.23时&#xff0c;调查ResourceManag…