Canal记录mysql的binlog日志监听

缘起

公司有一个app客户端,在调取某些数据时,需要从不同的项目中获得数据,并处理这些数据,导致显示到客户端非常慢,现需要对这个问题进行优化。数据库大都是mysql服务器,所以选用了适合它的开源框架canal来处理数据。

在使用canal监听mysql的二进制日志的过程中,发现可用性还是比较强的,优点如下
  • 能够针对不同的表进行监听(订阅)
  • Canal客户端出现异常时,服务器可以将产品记录,重启客户端时可以将未消费的数据继续消费,做到不丢失数据(服务端记录未消费的产品)
  • Canal服务端出现异常,导致客户端无法消费数据时, 重启Canal服务器可以从出现异常时产生的数据,也可以做到不丢失数据。(服务端可以从上次无法生产的地方继续生产数据)

mysql按条件输出不同字段的情况

mysql中遇到输入不同字段的情况。
项目中遇到一个情况,如果original_account字段的值不为0,则选择该值original_account,如果为0,则选择account这个字段
可以使用mysql自带的IF函数,非常方便。
IF(expr1,expr2,expr3)
果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
那么这个sql语句就是:
SELECT sum(if(original_account =0, account, original_account)) as account
from dw_borrow  
类似的还有
select *,if(sva=1,"男","女") as ssva from user where sva != ""

 

SQL实现分页技术

一直在用Oracle进行开发,用到了分页,好奇心了解了一下其他 sql 数据库的分页技术,还是有一些差别的。

Mysql分页

mysql的分页比较简单,它用到了limit这个重要的关键字,有了它之后只用一条语句就能实现。

select * from table limit m,n

其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4

即取出第3条至第6条,4条记录

Oracle

Oracle稍微复杂一点,可以通过建立内表的形式实现,如下:

## 用来检索从第11到第20条数据

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 11 AND 20

 

 

定时备份mysql数据库总结

定时备份mysql数据库总结


刚买的vps无缘无故崩溃了一次,导致当天添加的很多内容付之一炬,幸好阿里云有个快照功能,可以恢复到前天的数据,但如果经常出现这样的问题,是非常让人恼火的,所以,实时地备份数据变得势在必行。我一连研究了两个晚上,终于成功实现了定时备份功能,先把遇到的问题和解决方案分享出来。