MySql日志详解及应用实战

Posted on 2017-09-25 16:47  Magin  阅读(138)  评论(0编辑  收藏  举报

1.mysql主从有主-从、主-主形式

其中主从形式,主负责写入,从负责读取,主数据库如果挂掉则将另一台从数据库提升为主,更换主库速度较慢

主主形式用于搜索引擎,与主从的区别为,当有数据写入时,如果写入数据库A成功则默认A为主库,一旦写入A异常则立即更换B库写入,此时B库就提升为主库,与主从形式相比,因为不存在严格的主从关系,所以更换主库速度快。缺点是因为两台数据库都可以变更数据,容易导致数据紊乱(主要表现在自增主键)。

多台写入导致自增主键紊乱可以通过 修改自增主键自增量(如有2台数据库,可以修改为2,具体修改方法我忘记了,要用了可以百度),

然后不同的数据库给于一个不同的初始主键值,例如2台数据库,则一个由1开始,一个由2开始,那么他们的主键永远都不会重复。

 

2.主从数据库数据复制方法

可以分为异步模式,半同步模式,同步模式。

其实现顾名思义,异步模式是在主库写入完成之后发送写入信息给从库,一旦信息发送完成则继续自己的任务

同步模式是在主库写入完成之后发送写入信息给从库,从库写入完成之后返回信息给主库,只有接收到返回信息主库才会继续自己的任务

半同步模式是在主库写入完成之后发送写入信息给从库,从库接受到该信息之后通知主库,然后再进行自己的写入操作,主库在接收到该通知后就会继续自己的任务。

三者速度自然是  异步 > 半同步 > 同步

三者安全性是  异步 < 半同步 < 同步

 

3.主从数据库复制策略

首先给出两个例子。

(1)通过非主键,例如用户表中的email,查询到单条用户信息,并进行了修改,例如修改了phone。则sql语句为

UPDATE users SET phone=13777777777 WHERE email='11111@qq.com'

(2)管理员批量修改男同学为女同学,则sql语句为

UPDATE users SET sex=1 WHERE sex=0

 为了满足两种不同的操作情况都能有良好的效率,给出两种不同的复制策略

① 按sql语句复制,即主库进行了什么sql语句的操作,就把该语句传递给从库,这种方式对于例子2的效率很高,但是对于例子1的效率很低

② 按row复制,即主库操作了哪几行数据,就把操作的行的数据发送给从库,因此例子1的数据可以使用主键查找,效率很高,但是对于例子2效率低下

理想状态是,当sql语句效率低时则利用row复制,当row复制效率低于sql语句时则使用sql语句复制,那个讲的小哥好像还推荐了一个什么库还是第三方工具,忘记叫什么了。。。

而复制的动作则要依赖主库的binlog,因为主库会把它的sql语句或者row改动信息存放在binlog中。

 

3.数据库数据备份和误操作还原

首先是手动备份,一般每周一次全量备份,每天一次增量备份。手动的备份大多数时候都能满足回滚,还原的需求,但有时候业务要求经不住1天的数据差,于是就要使用mysql自身的日志来进行还原操作。

mysql日志本身有很多种类,innodb下特有的有undo和redo日志,分别用于回滚和前滚。redo日志的应用场景为当事务进行到一半mysql突然挂掉的时候,那么mysql就会读取redo日志,将未进行完的事务操作进行完成。

而备份主要依赖的和上面复制中主要依赖的一样都是binlog。

首先binlog功能是需要手动开启的,mysql默认是不开启的。如主从复制策略中所说的,binlog总共分为3个模式,statement,row,mixed,全都顾名思义,分别为sql语句记录,row记录和混合记录。

binlog是二进制文件,不能直接打开,需要使用mysqlbinlog 工具来查看。

使用binlog来进行数据还原有效增强了时效性,也减少了大库备份还原动则一两天的时间。

 

在这节课上,主要认识了数据库主从结构,mysql中的binlog的作用可以说是受益匪浅。

 

9-22 MySql日志详解及应用实战