文档章节

Infobright Tips

cwalet
 cwalet
发布于 2015/05/15 15:15
字数 1507
阅读 161
收藏 0

说明

  • 下文对infobright统称IB,brighthouse引擎的表统称IB表,IB Loader指代 Infobright Loader
  • ICE指 IB社区版,IEE指 IB商业版,有钱任性,没钱心塞
  • 本文主要记录 IB使用问题,与前篇 MySQL Tips 2.0不直接相关
  • IB User Guide 及 wikis 中有更多干货。


(1).不要使用SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS * FROM ib_table;
SELECT FOUND_ROWS();

以上结果返回的行数不准确,始终为1或284,但是MY_ISAM及其他引擎可以使用,

原因是对于IB表的查询,IB优化器暂不支持该关键字实现计数。

参考:https://support.infobright.com/forums/showthread.php?6323-SQL_CALC_FOUND_ROWS


(2).查询中不能使用变量

SELECT * FROM ib_table a,(SELECT @i:=1) b


(3).不能使用包含子查询的HAVING子句

SELECT * FROM (SELECT * FROM ib_table) x HAVING COUNT(1)>0


(4).不能使用HAVING COUNT(DISTINCT 多个字段)

SELECT * FROM ib_table HAVING COUNT(DISTINCT a,b)>0
当然,该写法本身可能意义不大。


(5).IB查询优化器不支持的语法

以上类型的语句执行后都会报错:

[Err] 5 - The query includes syntax that is not supported by the Infobright Optimizer. Either restructure the query with supported syntax, or enable the MySQL Query Path in the brighthouse.ini file to execute the query with reduced performance.

解决方法是将infobright的默认查询解析方式更改为MySQL:

SHOW VARIABLES LIKE '%allowmysqlquerypath%';
SET GLOBAL brighthouse_ini_allowmysqlquerypath = 1;

注意了,上面的赋值会出错:

ERROR 1238 (HY000): Variable 'brighthouse_ini_allowmysqlquerypath' is a read only variable

因为该变量是只读变量,必须修改配置文件,但是在my-ib.inimy-ib.cnf中加入下面这行均无效:

brighthouse_ini_allowmysqlquerypath = 1
原因是brighthouse_ini开头的系统变量都必须在 brighthouse.ini(通常位于data目录)中设置:
AllowMySQLQueryPath = 1
重启服务后生效:
SHOW VARIABLES LIKE 'brighthouse_ini%';


(6).ICE不能实现主从复制

原因一是不支持INSERT,二是LOAD DATA使用的不是MySQL Loader,无法生成binlog,错误提示如下:

Binary logging not possible. Message: Statement cannot be logged to the binary log in row-based nor statement-based format

在IEE中可做如下设置(参考:Using the Infobright Loader):

SET @bh_dataformat = 'mysql';

替代方法有NFS实时同步、SCP结合CRON定时全量备份、RSYNC定时增量同步等等。

注意如果使用NFS,配置文件必须分开指定,并且同时启动两个IB很有可能会出现混乱。


(7).SELECT .. INTO OUTFILE 导出时报错:

Brighthouse specific error: Unable to open file or named pipe.

原因是该目录没权限:

chmod 777 dir && chgrp mysql dir


(8).使用lookup

IB内建知识网格索引,因此不需要也不能显式建立字段索引,

但是它提供了一种对于数据重复率比较高的CHAR型字段的优化方式,即lookup。

给字段添加注释为lookup即可:COMMENT 'lookup'

该选项仅在LOAD DATA时生效并自动生成,对于IEE来说,ALTER COLUMN不能添加或者删除lookup。

参考:how-and-when-to-use-lookups


(9).IB 与MySQL 在Load data 时的默认分隔符的区别

如果查询中包含IB表,则使用的是IB导出规则,否则为MySQL规则。

规则分别如下:

CLAUSE
infobright
MySQL
FIELDS TERMINATED BY
';'
'\t'
FIELDS ENCLOSED BY
'"'
''
FIELDS ESCAPED BY
''
'\\'

注意IB中默认字段包围符是双引号,而MySQL中为空字符,

但在IB中对应的是NULL而非空字符,即“ENCLOSED BY "NULL"”;

此外IB中 ENCLOSED BY ESCAPED BY子句一定要同时存在(为了防止导入包含特殊字符的数据出错)

且不为相同字符,否则会报错:ERROR 5 (HY000): An unknown system exception error caught.

在实际使用中发现,ICE版本会自动区分表引擎:

比如使用SELECT .. INTO OUTFILE(不加任何限定符)导出一个MyISAM表数据,导出的文本字段分隔符规则是按MySQL的,

然后使用load data导入到IB表中(同样不加任何FIELDS子句),此时的分隔符规则变为IB Loader的,因此导入出错。

最好的做法是明确指定所有分隔符,即使与默认值相同也要写出。

参考:Infobright_Data_Loading_GuideInfobright数据导入转义TIP


(10).IB Loader数据类型

很遗憾ICE仅支持 IB Loader的txt_variable模式,也即纯文本格式;

IEE额外支持二进制binary模式和标准MySQL Loader,这也是实现写binlog的关键。

在ICE中做如下设置是不可行的:

SET @bh_dataformat = 'mysql';
SET @bh_dataformat = 'binary';

设置的时候不会出错,但是执行load data或者select .. into outfile语句的时候会报错:

ERROR 1149 (42000): Brighthouse specific error: Unknown value of BH_DATAFORMAT parameter


(11).IB查询导出数据不完整

使用中发现,做数据统计时需要将查询IB表的结果导到新的IB表,但在并发较多时,

(线程数20左右,单个查询平均耗时20s,平均查询量在1亿,平均结果量10W)

会小概率出现EXPORT出的文本损坏,如部分行不完整,字段字符断裂,或者行丢失等问题,

目前使用的是最新版本 IB_4.0.7_r16961_17249(ice),暂不知道什么原因。

解决办法是重新执行查询生成文本。


(12).并发Load data时出现大量system lock

SELECT ID,USER,HOST,DB,COMMAND,TIME,STATE,SUBSTR(INFO,1,60) FROM information_schema.processlist;
执行上述查询发现大量load data线程都停止,STATE状态为:system lock
IB has only table-level locks. When doing any write operation to a table an exlusive lock is set on it and any other queries needing this table must wait until the writing transaction commits. And vice versa - if a table is used for reading, loading must wait.

IB只有表级别锁,可以理解并发写入时会锁表,这点与MyISAM有点类似;

另一方面IB目前使用的MySQL是5.1.40,processlist显示的准确性和详细度不如5.5以上版本。

此外,由于ICE对线程数有一定限制,并且单个查询或者loader线程使用的内存也有限制,

具体设置见brighthouse.ini:ServerMainHeapSizeLoaderMainHeapSize

因此尽量减少单表的并发操作,合理采用『分表、分库、分实例』来解决。

参考:关于数据库 System lock 状态的说明和处理方式


(13).to be continued.

© 著作权归作者所有

共有 人打赏支持
cwalet
粉丝 43
博文 110
码字总数 86709
作品 0
其他
infobright简介

infobright,一个基于mysql的数据仓库系统实现,它已经是很多开源或商用BI系统的底层存储引擎。 根据这几天看到的介绍与白皮书,又做了些试验,依据自己的理解先作一个概述性的介绍,下次再描...

小编辑
2010/02/03
4.8K
3
基于Infobright的MySQL数据仓库方案测试

数据仓库之父Bill Inmon在1991年出版的“Building the Data Warehouse”一书中所提出的定义被广泛接受——数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integ...

小编辑
2010/02/03
4.9K
1
[心得] 近期更新&关于Infobright

新的环境,新的机会,喜欢自由的我现在感觉不错,终于可以自在的记录我想记录的东西了,哈哈~关于GoogleApp的企业套件我也给自己弄了一套,感觉挺不错,和Outlook可以直接整合起来,不过只能...

晨曦之光
2012/03/09
0
0
MySQL Infobright 数据仓库快速安装笔记

[文章作者:张宴 本文版本:v1.1 最后修改:2010.05.18 转载请注明原文链接:http://blog.s135.com/infobright/] Infobright是一个与MySQL集成的开源数据仓库(Data Warehouse)软件,可作为...

红薯
2010/06/08
4K
3
infobright实战

之前的简介与架构分析之后,我做了一些实践,验证 infobright用于大量数据存储与查询的可行性。 我是从这里下载的infobright开源版本ICE3.1(据说刚出的ICE3.2查询速度更快)。用DEB包在ubu...

小编辑
2010/02/03
3.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
36分钟前
1
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
0
0
890. Find and Replace Pattern - LeetCode

Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"abc ......

yysue
昨天
0
0
Linux | Redis

写在前面的话 常言道,不作笔记不读书。在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你。 安装 在官网的下载页 Redis Download 直接写了在Linux的安...

冯文议
昨天
1
0
NoSQL-memcached

NoSQL介绍 NoSQL叫非关系型数据库。而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很...

ln97
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部