前言
在日常工作中,我們時常會遇到需要將某個大數據量的單表進行遷移的情況。在MySQL中,針對這樣的大表,我們通常會選擇先將原表導出為csv格式,然后利用LOAD DATA語法來導入csv文件,這種方法相較于mysqldump在效率上有一定的提升。OceanBase針對此類需求引入了一項新功能——旁路導入。最新版本的OBdumper/OBloader工具已經能夠支持旁路導入。本文將對LOAD DATA旁路導入進行解讀。
體驗版本
OceanBase 4.2.1.8 MySQL租戶
導入前準備
配置 secure_file_priv
該參數用于控制導入或導出到文件時可以訪問的路徑,MySQL也有此參數,并且MySQL需要通過配置文件修改該參數并且重啟生效,OB中可以通過命令行修改,無需重啟。需要通過本地 Unix Socket 連接,本地 OBServer 節點的 Unix Socket 文件路徑,位于本地 ObServer 安裝目錄下的run/sql.sock,默認 Unix Socket 文件路徑為 /home/admin/oceanbase/run/sql.sock
[root@observer062 csv]# obclient -S /home/admin/oceanbase/run/sql.sock -uroot@obmysql -p'aaAA11__'
Welcome to the OceanBase. Commands end with ; or \g.
Your OceanBase connection id is 3221882263
Server version: OceanBase 4.2.1.8 (r108000052024072217-77f9516419866bc291fc79b950b0865f2f4194e0) (Built Jul 22 2024 17:41:00)Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.obclient [(none)]>
obclient [(none)]>
obclient [(none)]> SET GLOBAL secure_file_priv = "/backup/csv";
Query OK, 0 rows affected (0.190 sec)obclient [(none)]>
obclient [(none)]>
配置 secure_file_priv 目錄屬組
需要配置 ?secure_file_priv 目錄屬組,否則導入導出操作會報權限錯誤
[root@observer062 backup]# chown -R admin.admin csv
[root@observer062 backup]#
注意
具體使用事項參考官網說明
LOAD DATA 旁路導入
旁路導入
旁路導入指的是導入數據時跳過數據庫的SQL引擎,直接向數據文件中寫入文件,由于減少了SQL引擎解析的時間,大大提高了導入效率。OB V4 的版本在語法上已經支持旁路導入,MySQL的 LOAD DATA 語法不支持 旁路導入,PG的旁路導入需要借助?pg_bulkload工具
官方參數解釋
參數 | 描述 |
---|---|
direct | 表示走旁路導入。 |
need_sort | 表示是否需要 OceanBase 數據庫對數據進行排序。 值為? bool ?類型: |
max_error | 表示最大的容忍的錯誤的行數。值為?INT 類型,超過這個數值LOAD DATA ?會報失敗。 |
parallel(N) | 加載數據的并行度,必填項,取值是大于 1 的整數。 |
具體使用方法可以參考官網說明
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000507601
MySQL導入效率
在MySQL5.7中,導入 48021216 數據量的CSV文件,耗時6 min 3.57 sec
mysql> LOAD DATA INFILE '/home/csv/bmsql_order_line.csv' INTO TABLE bmsql_order_line FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Query OK, 48021216 rows affected (6 min 3.57 sec)
Records: 48021216 Deleted: 0 Skipped: 0 Warnings: 0
OB旁路導入效率
使用OB導入的利器(旁路導入)加上并行導入, 導入相同數據量的CSV文件,耗時 1 min 46.812 sec。極大的提高導入效率
obclient [test]> LOAD DATA /*+direct(true,1024) parallel(32) */ INFILE '/backup/csv/bmsql_order_line.csv' INTO TABLE bmsql_order_line FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Query OK, 48021216 rows affected (1 min 46.812 sec)
Records: 48021216 Deleted: 0 Skipped: 0 Warnings: 0obclient [test]>
總結
1.旁路導入時需要設置 secure_file_priv 參數,并且要注意路徑以及文件的權限
2.對于數據量較大的單表遷移,建議使用OB旁路導入功能提升導入效率