mysql5.6主从复制(读写分离)方案_MySQL5.6主从复制(读写分离)方案

MySQL5.6主从复制(读写分离)方案

一、前言:为什么MySQL要做主从复制(读写分离)?

通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。

为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。

而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。

二、MySQL主从复制(读写分离)和集群的区别:

我对MySQL也是刚开始研究,不是很专业。我的理解是:

1、主从复制(读写分离):一般需要两台及以上数据库服务器即可(一台用于写入数据,一台用于同步主的数据并用于数据查询操作)。

局限性:

(1)配置好主从复制之后,同一张表,只能对一个服务器写操作。如果在从上执行了写操作,而之后主也操作了这张表,或导致主从不同步;据说可以配置成主主方式,但我还没有研究到。

(2)主数据库服务器宕机,需要手动将业务系统切换到从数据库服务器。无法做到高可用性(除非再通过部署keepalive做成高可用方案)。

2、集群是由N台数据库服务器组成,数据的写入和查询是随机到任意一台数据库服务器的,其他数据库服务器会自动同步数据库的操作。

任何一台数据库宕机,不会对整个集群造成大的影响。

局限性:我经过测试才知道目前mysql集群版本(MySQL Cluster)只能对NDB存储引擎的数据进行集群同步,如果是INNODB或其他的MySQL存储引擎是不行的。这个也导致了我放弃了在业务系统中应用这种方案。

三、回归正题,接下来开始MySQL5.6.12的主从复制教程:

1、MySQL5.6开始主从复制有两种方式:基于日志(binlog);基于GTID(全局事务标示符)。

需要注意的是:GTID方式不支持临时表!所以如果你的业务系统要用到临时表的话就不要考虑这种方式了,至少目前最新版本MySQL5.6.12的GTID复制还是不支持临时表的。

所以此篇教程主要是告诉大家如何通过日志(binlog)方式做主从复制!

2、MySQL官方提供的MySQL Replication教程:

http://dev.mysql.com/doc/refman/5.6/en/replication.html

这个官方教程强烈建议大家阅读(需要一定的英语阅读能力哦!不行就google翻译后再阅读吧~)。

3、准备工作:

(1)配置MySQL主从复制(读写分离)之前,需要在主从两台服务器先安装好MySQL5.6。

(2)目前最新的MySQL5.6 GA版本是MySQL5.6.12(点此下载MySQL5.6.12源码包)。

个人推荐Linux(RedHat/CentOS 6.4)源码编译安装,具体可以看本站这篇教程:RedHat/CentOS源码编译安装MySQL5.6.12

(3)注意:

(a)如果你需要用于生产环境,安教程安装MySQL时不要急着做mysql启动操作。建议把mysql初始化生成的/usr/local/mysql/mysql.cnf删除,然后把你优化好的mysql配置文件my.cnf放到/etc下。

(b)建议主备两台服务器在同一局域网,主备两台数据库网络需要互通。

(4)我的环境:

主数据库IP:192.168.100.2

从数据库IP:192.168.100.3

4、修改主数据库的的配置文件:

1     [mysqld]

2     server-id=1

3     log-bin=mysqlmaster-bin.log

4     sync_binlog=1

5     #注意:下面这个参数需要修改为服务器内存的70%左右

6     innodb_buffer_pool_size = 512M

7     innodb_flush_log_at_trx_commit=1

8     sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO

9     lower_case_table_names=1

10     log_bin_trust_function_creators=1

修改之后要重启mysql:

# /etc/init.d/mysql restart

附一个我已优化过的主数据库配置文件:点此下载

5、修改从数据库的的配置文件(server-id配置为大于1的数字即可):

1     [mysqld]

2     server-id=2

3     log-bin=mysqlslave-bin.log

4     sync_binlog=1

5     #注意:下面这个参数需要修改为服务器内存的70%左右

6     innodb_buffer_pool_size = 512M

7     innodb_flush_log_at_trx_commit=1

8     sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO

9     lower_case_table_names=1

10     log_bin_trust_function_creators=1

修改之后要重启mysql:

# /etc/init.d/mysql restart

附一个我已优化过的从数据库配置文件:点此下载

6、SSH登录到主数据库:

(1)在主数据库上创建用于主从复制的账户(192.168.100.3换成你的从数据库IP):

1     # mysql -uroot -p

2     mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.3' IDENTIFIED BY 'repl';

(2)主数据库锁表(禁止再插入数据以获取主数据库的的二进制日志坐标):

mysql> FLUSH TABLES WITH READ LOCK;

(3)然后克隆一个SSH会话窗口,在这个窗口打开MySQL命令行:

1     # mysql -uroot -p

2     mysql> SHOW MASTER STATUS;

3     +------------------------+----------+--------------+------------------+-------------------+

4     | File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

5     +------------------------+----------+--------------+------------------+-------------------+

6     | mysqlmaster-bin.000001 |      332 |              |                  |                   |

7     +------------------------+----------+--------------+------------------+-------------------+

8     1 row in set (0.00 sec)

9     mysql> exit;

在这个例子中,二进制日志文件是mysqlmaster-bin.000001,位置是332,记录下这两个值,稍后要用到。

(4)在主数据库上使用mysqldump命令创建一个数据快照:

#mysqldump -uroot -p -h127.0.0.1 -P3306 --all-databases  --triggers --routines --events >all.sql

# 接下来会提示你输入mysql数据库的root密码,输入完成后,如果当前数据库不大,很快就能导出完成。

(5)解锁第(2)步主数据的锁表操作:

mysql> UNLOCK TABLES;

7、SSH登录到从数据库:

(1)通过FTP、SFTP或其他方式,将上一步备份的主数据库快照all.sql上传到从数据库某个路径,例如我放在了/home/yimiju/目录下;

(2)从导入主的快照:

# cd /home/yimiju

# mysql -uroot -p -h127.0.0.1 -P3306 

# 接下来会提示你输入mysql数据库的root密码,输入完成后,如果当前数据库不大,很快就能导入完成。

(3)给从数据库设置复制的主数据库信息(注意修改MASTER_LOG_FILE和MASTER_LOG_POS的值):

# mysql -uroot -p

mysql> CHANGE MASTER TO MASTER_HOST='192.168.100.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysqlmaster-bin.000001',MASTER_LOG_POS=332;

# 然后启动从数据库的复制线程:

mysql> START slave;

# 接着查询数据库的slave状态:

mysql>  SHOW slave STATUS \G

# 如果下面两个参数都是Yes,则说明主从配置成功!

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

(4)接下来你可以在主数据库上创建数据库、表、插入数据,然后看从数据库是否同步了这些操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在实践中使用延迟队列

通常,在某些情况下,当您有某种工作或作业队列时,有必要不立即处理每个工作项或作业,而是要延迟一些时间。 例如,如果用户单击一个按钮来触发要完成的某项工作,而一秒钟后,用户意识到他/她错了&a…

PCL学习八叉树

建立空间索引在点云数据处理中有着广泛的应用,常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树,KD树,KDB树,R树,四叉树,八叉树等索引结构,而…

Android实现自定义带文字和图片的Button

在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawableLeft,这个 属性可以…

mysql语句中的注释方法_MySQL语句注释方式简介

MySQL支持三种注释方式:1.从‘#字符从行尾。2.从‘-- 序列到行尾。请注意‘-- (双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。3.从/*序列到后面的*/序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。…

aqlserver实用程序_sqlserver命令提示实用工具的介绍

除上述的图形化管理工具外,SQL Server2008还提供了大量的命令行实用工具,包括bcp、dtexec、dtutil、osql、reconfig、sqlcmd、sqlwb和tablediff等,下面进行简要说明。dtexec实用工具用于配置和执行SQL Server2008 Intgration Services包。用户…

使用Java和Scala将Play Framework 2应用程序部署到Openshift

几个星期, 马克阿特伍德 ( Mark Atwood) , 豪尔赫阿里斯 ( Jorge Aliss )和我塞巴斯蒂安 斯卡塔诺 ( SebastinScarano)参加了红帽网络研讨会LETS PLAY! 在云端&#xff1…

LintCode 387: Smallest Difference

LintCode 387: Smallest Difference 题目描述 给定两个整数数组(第一个是数组A,第二个是数组B),在数组A中取A[i],数组B中取B[j],A[i]和B[j]两者的差越小越好(|A[i] - B[j]|)。返回最小差。 样例 给定数组A …

android框架----下沉文字Titanic的使用

Titanic is a simple illusion obtained by applying an animated translation on the TextView TextPaint Shaders matrix. Titanic的使用 Titanic的使用,项目结构如下: 一、下载Titanic并且部署到项目中 Titanic的项目地址: https://github…

linux 自动安装mysql_Linux安装mysql

一、下载这里我创建了一目录software用于存放我们待会要下载的mysql包,先去到该目录命令:cd /software命令:wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar下载完成后,你会在software这个…

Quartz Scheduler插件–隐藏的宝藏

尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用。 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册。 您可以自由编写自己的插件,但我们将专注于Quartz随附的现有插件…

mysql查询表名匹配只有字母的_MySQL按某些匹配字母查询表

MySQL查询是MySQL的核心功能,有时候我们需要查找带有某些匹配字母的表。下文对该MySQL查询方式作了详细的介绍,供您参考。在MySQL中我们可以使用LIKE或者NOT LIKE操作符进行比较。在MySQL中模式默认是不区分大小写的。查询示例,student表----…

hdu 1181(Floyed)

变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 20748 Accepted Submission(s): 7494 Problem Description呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的…

读书笔记-你不知道的JS上-混入与原型

继承 mixin混合继承 function mixin(obj1, obj2) {for (var key in obj2) {//重复不复制if (!(key in obj1)) {obj1[key] obj2[key];}}return obj1;} 这种复制是浅复制,对象或者数组函数等都是同一个引用,改变obj1的会同时影响obj2。 寄生继承 ... 隐式…

JUnit和Hamcrest:在assertEquals上进行改进

在我的博客文章中,Java越来越接受静态导入吗? ,我讨论了在Java中越来越多地使用静态导入来使代码在某些情况下更流畅。 Java 单元测试特别受静态导入的影响,在此博客文章中,我提供了一个简单的示例,说明如何…

mysql delete temporary denied_这些错误是什么意思?djang中的mysql

我试着运行一个程序,我被给予了一个例子,它就像一个购物网站,使用MySQL数据库而不是Django提供的原始数据库!我只是想看看有没有人理解这些错误的含义?任何信息都将不胜感激!我本可以提供网页的代码&#x…

C语言 · 芯片测试

基础练习 芯片测试 时间限制:1.0s 内存限制:512.0MB问题描述有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试…

Animation用法

测试代码及说明&#xff1a; <!DOCTYPE html> <html lang"en-US"> <head><meta charset"UTF-8"><title>Simple CSS3 Animation</title><style type"text/css">#demo {position: absolute;left: 30%;t…

mysql dese_MySQL 5.6-类似于DENSE_RANK的功能,无需订购

小编典典对于 MySQL版本<8.0(OP的版本是5.6)&#xff1a;问题陈述看起来需要DENSE_RANK功能groupVarian; 但是事实并非如此。正如 GordonLinoff解释的那样 &#xff1a;您似乎希望按它们在数据中出现的顺序来枚举它们。假设您的表名是t(请为您的代码相应地更改表名和字段名)…

Spring和JSF集成:动态导航

通常&#xff0c;您的JSF应用程序将需要超越基本的静态导航并开始做出动态导航决策。 例如&#xff0c;您可能想根据用户的年龄重定向他们。 大多数JSF教程建议通过将命令的action属性绑定到支持bean来实现动态导航&#xff1a; <h:commandButton action"#{bean.action…

通过富文本改变UITextFieldPlaceholder颜色

1、通过属性 a、 //文字属性(一般) NSMutableDictionary *attrs [NSMutableDictionary dictionary]; attrs[NSForegroundColorAttributeName] [UIColor blueColor]; NSAttributedString *placeholderStr [[NSAttributedString alloc] initWithString:"手机号" a…