我的MYSQL学习心得(十七) 复制
最近把大学时候的ORACLE教程书本翻出来看,真的是感触良多
以前在学校的时候,每次ORACLE测验和考试都是不合格的,期末的时候靠补考才勉强过关
大家看到下图的封面应该知道大学教我们ORACLE课程的老师,没错,他就是李爱武老师
大家可能对李爱武老师不太熟悉,在ORACLE领域,大家第一时间肯定会想到“盖国强”
还记得前段时间某个媒体说“盖国强”是中国第一DBA,但是我在百度里面搜索“中国第一DBA”并没有出现“盖国强”三个字o(∩_∩)o
李爱武老师可能会有一些人认识,他写了几本数据库方面的书,以SQLSERVER和ORACLE为主
老师的实力是毋容置疑的,老师上课的风格是比较凶的那种,不过老师他很细心,会把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的具体路径
3、此时需要打开在D:\Program Files (x86)\MySQL\MySQL Server 5.5路径下的配置文件my.ini,添加如下代码,开启binlog功能
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是否成功开启
如果log_bin参数是ON的话,那么表示二进制日志文件已经成功开启,如果为OFF的话,那么表示二进制日志文件开启失败
5、在master上配置复制所需要的账户,这里创建一个repl的用户,%表示任何远程地址的repl用户都可以连接master主机
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数组顺序排列,转载请注明。
没有评论:
发表评论