2014年8月6日星期三

我的MYSQL学习心得(十七) 复制 - 桦仔

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
我的MYSQL学习心得(十七) 复制 - 桦仔  阅读原文»

我的MYSQL学习心得(十七) 复制

我的MYSQL学习心得(一) 简单语法

我的MYSQL学习心得(二) 数据类型宽度

我的MYSQL学习心得(三) 查看字段长度

我的MYSQL学习心得(四) 数据类型

我的MYSQL学习心得(五) 运算符

我的MYSQL学习心得(六) 函数

我的MYSQL学习心得(七) 查询

我的MYSQL学习心得(八) 插入 更新 删除

我的MYSQL学习心得(九) 索引

我的MYSQL学习心得(十) 自定义存储过程和函数

我的MYSQL学习心得(十一) 视图

我的MYSQL学习心得(十二) 触发器

我的MYSQL学习心得(十三) 权限管理

我的MYSQL学习心得(十四) 备份和恢复

我的MYSQL学习心得(十五) 日志

我的MYSQL学习心得(十六) 优化

最近把大学时候的ORACLE教程书本翻出来看,真的是感触良多

以前在学校的时候,每次ORACLE测验和考试都是不合格的,期末的时候靠补考才勉强过关

大家看到下图的封面应该知道大学教我们ORACLE课程的老师,没错,他就是李爱武老师

大家可能对李爱武老师不太熟悉,在ORACLE领域,大家第一时间肯定会想到“盖国强”

还记得前段时间某个媒体说“盖国强”是中国第一DBA,但是我在百度里面搜索“中国第一DBA”并没有出现“盖国强”三个字o(∩_∩)o

李爱武老师可能会有一些人认识,他写了几本数据库方面的书,以SQLSERVERORACLE为主

老师的实力是毋容置疑的,老师上课的风格是比较凶的那种,不过老师他很细心,会把ORACLE里面的知识点讲透

因为比较凶,所以很多时候不是很想上他的课,有时候会选择逃课,但是想不到多年后自己会做了DBA,会研究数据库

虽然未到教师节,但是还是要感谢李爱武老师和大学里教我计算机知识的其他老师,感谢

不扯了,马上开始今天的内容。。。

这一篇主要介绍MYSQL的复制

MYSQL 从3.25.15版本开始提供数据库复制功能(replication)。mysql复制是指从一个mysql主服务器(MASTER)将数据

复制到另一台或多台mysql从服务器(SLAVE)的过程,将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,

然后在从服务器上对这些日志重新执行,从而使从服务器的数据保持同步。

在mysql中,复制操作是异步进行的,slave服务器不需要持续的保持连接接收master服务器的数据

mysql支持一台主服务器同时向多台从服务器进行复制操作,从服务器同时可以作为其他从服务器的主服务器,如果mysql主服务器

访问量大,可以通过复制数据,然后在从服务器上进行查询操作,从而降低主服务器的访问压力(读写分离),同时从服务器作为

主服务器的备份,可以避免主服务器因为故障数据丢失的问题。

mysql数据库复制操作大致可以分为三个步骤

1主服务器将数据的改变记录到二进制日志(binlog)中。

2、从服务器将主服务器的binary log events复制到他的中继日志(relay log)中。

3、从服务器做中继日志中的事件,将数据的改变与从服务器保持同步。

首先,主服务器会记录二进制日志,每个事务更新完毕数据之前,主服务器将这些操作的信息记录在二进制日志里面,在事件写入

二进制日志完成后,主服务器 通知存储引擎提交事务。

SLAVE上面的I/O进程连接上MASTER,并发出日志请求,MASTER接收到来自SLAVE的I/O进程的请求后,通过负责复制的I/O进程

根据请求信息读取指定日志位置之后的日志信息,返回给SLAVE的I/O进程。返回信息中除了日志所包含的信息之外,还包括本次

返回的信息已经到MASTER端的binlog文件的名称以及binlog的位置

SLAVE的I/O进程接收到信息后,将接收到的日志内容依次添加到SLAVE端的relay-log文件的最末端,并将读取到的MASTER端的

binlog文件名和位置记录到master-Info文件中

SLAVE的SQL进程检测到relay-log中新增了内容后,会马上解析relay-log的内容成为在master端真实执行时候的那些可执行内容,

并在自身执行

mysql复制环境,90%以上都是一个master带一个或者多个slave的架构模式。如果master和slave压力不是太大的话,异步复制的延时一般

都很少。尤其是slave端的复制方式改成两个进程处理之后,更是减少了slave端的延时

提示:对于数据实时性要求不是特别严格的应用,只需要通过廉价的电脑服务器来扩展slave的数量,将读压力分散到多台slave的机器上面

即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决

数据库瓶颈问题


Windows环境下的mysql主从复制

复制前的准备工作

在Windows环境下,如果想实现主从复制需要准备的操作环境

角色 ip 端口 操作系统 mysql版本

master 192.168.1.100 3306 Windows7 5.5.20

slave 192.168.1.102 3306 Windows8 5.5.20

Windows环境下实现主从复制

准备好两台安装mysql5.6的计算机,即可实现两台mysql服务器主从复制备份操作。

具体操作步骤如下:

1、在Windows下安装好两台mysql服务器,配置好两台主机的ip地址,实现两台计算机可以网络连通

2、配置master的相关配置信息,在master主机上开启binlog日志,首先,看下datadir的具体路径

show variables LIKE '%datadir%'

3、此时需要打开在D:\Program Files (x86)\MySQL\MySQL Server 5.5路径下的配置文件my.ini,添加如下代码,开启binlog功能

[mysqld]
log-bin="D:/MYSQLDataBase/binlog"
expire_logs_days
=10
max_binlog_size
=100M

提示:此事我们需要在D盘下面创建MYSQLDATABASE文件夹,binlog日志记录在该文件夹里面,该配置文件中的其他参数如下所示

expire_logs_days:表示二进制日志文件删除的天数

max_binlog_size:表示二进制日志文件最大的大小

4、登录mysql后,可以执行show VARIABLES LIKE '%log_bin%'命令来测试下log_bin是否成功开启

show VARIABLES LIKE '%log_bin%';

如果log_bin参数是ON的话,那么表示二进制日志文件已经成功开启,如果为OFF的话,那么表示二进制日志文件开启失败

5、在master上配置复制所需要的账户,这里创建一个repl的用户,%表示任何远程地址的repl用户都可以连接master主机

GRANT replication slave ON *.*如何让SQL按ORDERBY数组顺序排列 - 靖洋  阅读原文»

ids = "1,2,3,4,5,6";

sql="select bookid,bookname from books where bookid in (" + ids + ") order by charindex(bookid,"+ids+")"

CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置

bookid 是要到ids中寻找所在的位置

下面的是网上查的资料

order by常用的使用方式我就不提了

项目的需求千变万化
让我们看看下面几个怪排序需求

--先创建一个表
create table ai(
id int not null,
no varchar(10) not null
)
go

--往表中插入数据
insert into ai
select 105,'2'
union all
select 105,'1'
union all
select 103,'1'
union all
select 105,'4'
go

--查询效果如下:
select * from ai
go
id no
----------- ----------
105 2
105 1
103 1
105 4


i.
--要求的查询结果如下
--即要求no列的数据按'4','1','2'排列
id no
----------- ----------
105 4
105 1
103 1
105 2

--解决方案1
--利用函数CHARINDEX
select * from ai
order by charindex(no,'4,1,2')

--解决方案2,并且每组再按照id降序排列
--利用函数case
select * from ai
order by case when no='4' then 1
when no='1' then 2
when no='2' then 3
end,id desc

--解决方案3
--利用UNION 运算符
select * from ai
where no='4'
union all
select * from ai
where no='1'
union all
select * from ai
where no='2'

ii.
--查询要求指定no='4'排第一行,其他的行随机排序
id no
----------- ----------
105 4
105 2
105 1
103 1

--解决方案
select * from ai
order by case when no='4' then 1
else 1+rand()
end

iii.
--查询要求所有行随机排序

--解决方案
select * from ai
order by newid()


iiii
--有一表ab有列i,其中数据如下:
i varchar(10)
a1
a10
a101
a5
p4
p41
p5


--现在要求列i中数据先按字母排序,再按数字排序
--效果如下:
a1
a5
a10
a101
p4
p5
p41

--解决方案
select * from ab
order by left(i,1),convert(int,substring(i,2,8000))


本文链接:如何让SQL按ORDERBY数组顺序排列,转载请注明。

阅读更多内容

没有评论:

发表评论