文档章节

Infobright Tips

cwalet
 cwalet
发布于 2015/05/15 15:15
字数 1507
阅读 178
收藏 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.

© 著作权归作者所有

共有 人打赏支持
上一篇: Python module install
下一篇: MySQL Tips 2.0
cwalet
粉丝 44
博文 111
码字总数 87663
作品 0
其他
私信 提问
infobright简介

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

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

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

小编辑
2010/02/03
5.1K
1
MySQL Infobright 数据仓库快速安装笔记

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

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

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

小编辑
2010/02/03
3.4K
0
infobright: 系统结构

这里深入介绍其结构及工作原理。下图是infobright白皮书中展示的系统架构,灰色部分是mysql原有的模块,白色与蓝色部分则是 infobright自身的。下面说说它的几个主要概念及其相互协作原理。 ...

小编辑
2010/02/03
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
16
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部