目前在用的是社區版的infobright,不支持DML功能,只能用LOAD DATA方式導入數據。
如果元數據中有特殊控制字符,導入過程中經常會報錯,很是惱火。應對策略有兩種方法:
1.設置Reject File導入之前,設定 @BH_REJECT_FILE_PATH 和 @BH_ABORT_ON_COUNT 就可以忽略多少條導入失敗的記錄,並且將這些記錄保存在指定文件
復制代碼 代碼如下:/** when the number of rows rejected reaches 10, abort process **/
set @BH_REJECT_FILE_PATH = '/tmp/reject_file';
set @BH_ABORT_ON_COUNT = 10;
BH_ABORT_ON_COUNT 設定為 -1 的話,表示永不忽略。
也可以設置 BH_ABORT_ON_THRESHOLD 選項,該選項表示有最多多少百分比的數據允許被忽略,因此該選項的值是小數格式,例如 BH_ABORT_ON_THRESHOLD = 0.03(表示3%)
2.導出時指定結束符此外,還可以在導出數據時制定結束符,並且設定忽略哪些轉義字符(\、”、' 等字符),例如:
復制代碼 代碼如下:select fields_list... into outfile '/tmp/outfile.csv' fields terminated by '||' ESCAPED BY '\\' lines terminated by '\r\n' from mytable;
3.或者,將行間隔符設定為其他特殊標識,例如:select fields_list… into outfile ‘/tmp/outfile.csv' fields terminated by ‘||' ESCAPED BY ‘\\' lines terminated by ‘$$$$$\r\n' from mytable;當然了,這種情況下,實際數據行中就不能存在 “$$$$$\r\n” 這個值了,否則會被當成換行標識。
對於DW系統而言,龐大數據的遷移成本很高;所以導入和導出的速率及容忍性也是考量數據倉庫產品的重要標准。Infobright基於MySQL所以在數據格式上有比較成型的解決辦法,IB原廠對速率進行了優化。在4.0企業版中推出了DLP分布式導入選件,極大的減少了遷移時間,目前世界最大的光通信提供商JDSU也選用了IB產品,並以DLP為主要選件進行配置。不過本文主要針對IB基本的導入導出進行介紹,加上在項目中遇到的特殊問題和解決辦法。(在結尾處哦,呵呵)
1,簡介
IB提供了專用的高性能loader,不同於傳統的mysql。IB loader是為了提高導入速度而設計的,所以僅支持特有的mysqlloader語法,而且只支持導入格式化的變量和文本源文件
IEE也支持mysqlloader和insert語句
2,默認Loader
ICE僅支持IB lorder
IEE默認使用的是是mysql loader,它能更多的容錯,但速度稍慢。為了最快的導入,使用IB loader,做以下環境的設置
Mysql>
set @bh_dataformat = ‘txt_variable’;
–使用IB loader來導入CSV格式的變量定長文本
set @bh_dataformat = ‘binary’;
–二進制文件
set @bh_dataformat = ‘mysql’;
–使用mysql loader
3,IB loader語法
IB僅支持load data infile,其他的mysql導入方式不支持
LOAD DATA INFILE ‘/full_path/file_name’
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'char']
[ENCLOSED BY 'char']
[ESCAPED BY 'char']
];
導入前關閉
set AUTOCOMMIT=0;
完成後
COMMIT;
set AUTOCOMMIT=1;
4,區域分隔符
.區域分隔符是可選的,默認設置為
CLAUSE DEFAULT VALUE
FIELDS TERMINATED BY ‘;’ (semicolon)
FIELDS ENCLOSED BY ‘”‘ (double quote)
FIELDS ESCAPED BY ” (none)
5,導入經驗
a.當導入表格列數很多時,修改brighthouse.ini中LoaderMainHeapSize
b使用並發導入
c容忍性排序為txt_variables<binary<mysql
d bh_loader不支持多分隔符
e 大量數據時,DLP是必要選擇
這時候,如果需要brighthouse引擎支持utf8字符集,需要:1. 數據庫對象創建時務必使用utf8字符集,這點尤為關鍵,否則不可支持utf8;2. 數據表對象創建時也使用utf8字符集;3. 導入文件提前轉換成utf8字符集;4. 連接infobright時,執行set names utf8;5. 導入文件,查看字符集是否正確;另一種場景下,可能myisam表也需要支持utf8,這個相對比較麻煩:1. 數據庫對象創建時無所謂,不強制必須是utf8;2. 數據表對象創建時務必使用utf8字符集;