安装
直接参考官网吧,上面写的挺详细。下载下来就能直接用,唯一可能要做的就是需要提前配置下 JAVA_HOME,当 java 的安装绝对路径是 /usr/bin/java 时,在 .bashrc 中配置下 export JAVA_HOME=/usr 就好了。
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-4.2.7-RELEASE/bin]
$which java
/usr/bin/java
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-4.2.7-RELEASE/bin]
$echo $JAVA_HOME
/usr
obdumper 导出测试
先简单试用了下导出功能。官网文档上有个实例,参数个数超级多,看的有点儿眼花。
导数工具的研发同学说后面会想办法减少参数个数,例如会支持把现在的 -u'用户' -t'租户' -c'集群' 改写为 -u '用户'@'租户'#'集群',同时原本的写法也支持。这样就可以直接从 OB 的连接串里复制一批内容,然后直接拿到这里当做参数来用了。
./obdumper -h 'IP地址' -P'端口' -u'用户' -t'租户' -c'集群' -p'密码' -D'库名' --table '表名' --csv -f '文件路径' --sys-password '系统租户密码' --skip-check-dir
这里要注意的一点是:加不加 -c 'admin' 这个参数,取决于是直连 Observer 还是通过 ObProxy 访问集群。直连不能加,通过 ObProxy 连才要加(因为一个 proxy 可能会同时管理多个集群,所以需要通过集群名对不同集群的同名租户、同名用户进行区分)。
很多 OB 周边工具,例如 OMS、ODC 等等,可能也都默认大家会通过 ObProxy 连,所以也默认大家都得加集群选项。实际是否需要加这个集群选项需要特别注意下,我已经踩过好几次坑了。如果直连的时候还加了集群选项,就会在各种不同的工具中报各种奇怪的错误。
直连生成 csv 文件:
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-4.2.7-RELEASE/bin]
./obdumper -h 11.124.5.44 -P 2881 -u 'root' -t 'odc_tenant' -p 'AAaa11__' -D test --table 't1' --csv -f /home/xiaofeng.lby/ob-loader-dumper-test --skip-check-dir
csv 文件长这样:
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE]
$cat t1.0.csv
'c1'
123
通过 proxy 连,生成 sql 文件:
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-4.2.7-RELEASE/bin]
./obdumper -h 11.124.5.45 -P 2883 -u 'root' -t 'odc_tenant' -p 'AAaa11__' -c 'admin' -D test --table 't1' --sql -f /home/xiaofeng.lby/ob-loader-dumper-test --skip-check-dir
sql 文件长这样:
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE]
$cat t1.0.sql
INSERT INTO `t1` (`c1`) VALUES (123);
obloader 导入测试
接下来试试导入功能,就直接用刚刚生成的 csv 文件和 sql 文件来测试。
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-4.2.7-RELEASE/bin]
./obloader -h 11.158.31.20 -P 22603 -u root -t mysql -D test --csv --table 't1' -f /home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE
第一次报错 open_cursors 配置的不够大。
[ERROR] Load failed! Error: The system config `open_cursors` value(50) may be not enough. Please set system parameter `open_cursors` to 1000 or larger manually.
根据报错信息把 open_cursors 这个东西调大就好了。
ALTER SYSTEM SET open_cursors = 1000;
然后第二次又报错了,说 Incorrect integer value for column 'c1',插入的数据类型和列类型不匹配。
2023-11-30 10:55:19 [INFO] File: "/home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE/t1.0.csv" has been parsed finished
2023-11-30 10:55:19 [WARN] Retry Table: "t1", Partition: 0. Records: 2. Error: Incorrect integer value for column 'c1' at row 1
[11.158.31.20:22602] [2023-11-30 10:55:19.610847] [Y584A0B9E1F14-00060A8CF05DF19F-0-0]. Retry Mode: SERIAL.
2023-11-30 10:55:19 [WARN] Failed to load 1 records from "/home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE/t1.0.csv" into table `test`.`t1`. Check "ob-loader-dumper.bad" and "ob-loader-dumper.discard" for details
2023-11-30 10:55:21 [ERROR] Error: Failed to load 1 records from "/home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE/t1.0.csv" into table `test`.`t1`. Check "ob-loader-dumper.bad" and "ob-loader-dumper.discard" for details
2023-11-30 10:55:21 [INFO] ---------- Finished Tasks: 1 Running Tasks: 0 Progress: 100.00% ----------
2023-11-30 10:55:21 [INFO]
All Load Tasks Finished:
----------------------------------------------------------------------------------------------------------------------------
No.# | Type | Name | Count | Status
----------------------------------------------------------------------------------------------------------------------------
1 | TABLE | t1 | 2 -> 1 | FAILURE
----------------------------------------------------------------------------------------------------------------------------
Total Count: 1 End Time: 2023-11-30 10:55:21
2023-11-30 10:55:21 [INFO] Load record finished. Total Elapsed: 2.727 s
2023-11-30 10:55:21 [ERROR] System exit 1
不过查了下表里的东西,发现已经导入成功了。
obclient [test]> select * from t1;
+------+
| c1 |
+------+
| 123 |
+------+
1 row in set (0.007 sec)
报错信息说要去看下 ob-loader-dumper.bad 这个文件,这个文件里面写着执行失败的 sql 是: INSERT INTO `t1` (`c1`) VALUES ('c1');
[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE/logs]
$cat ob-loader-dumper.bad
INSERT INTO `t1` (`c1`) VALUES ('c1');
Cause: Incorrect integer value for column 'c1' at row 1
[11.158.31.20:22602] [2023-11-30 10:48:33.160940] [Y584A0B9E1F14-00060A8CD66DF388-0-0]
失败的原因大家看一眼日志基本也都能猜出来,obloader 应该直接是把上面那个 csv 文件的第一行列名 'c1',当做了列值 'c1',尝试往表里的 'c1' 列里插了一下,然后因为 'c1' 是个不能隐式转换成整型的字符串,所以由于数据类型不匹配而失败了。
不过失败之后,它会自动继续插入后面的数据,后面合法的数据都插入成功了。导入 csv 格式的文件,虽然有点儿小毛病,终究还是成功导入了的。
只是担心如果这个列的列类型不是 int 而是 varchar,是不是就可能会成功误导入那行表示列名的数据了?这里偷懒没去试,估计很可能会出问题……
(2023.12.13 更新:今天找玉璁聊了一下上面提到的那个问题,玉璁反馈说因为 csv 是纯文本文件,不能自解释。所以在第一行数据代表列名时,需要在 obloader 导入时增加 --skip-header 选项,跳过 csv 文件的第一行数据,详见官网文档)
看上去刚才生成的那个 sql 格式的文件没有像 csv 格式的文件那样有一行“多余”的内容,所以导入 sql 格式的文件应该是没啥问题的,接下来简单地试一下导入 sql 格式的文件,让 t1 表里再多一行 123。
./obloader -h 11.158.31.20 -P 22603 -u root -t mysql -D test --sql --table 't1' -f /home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE
没报错,成功了。
2023-11-30 11:09:56 [INFO] File: "/home/xiaofeng.lby/ob-loader-dumper-test/data/test/TABLE/t1.0.sql" has been parsed finished
2023-11-30 11:09:58 [INFO] ---------- Finished Tasks: 1 Running Tasks: 0 Progress: 100.00% ----------
2023-11-30 11:09:58 [INFO]
All Load Tasks Finished:
----------------------------------------------------------------------------------------------------------------------------
No.# | Type | Name | Count | Status
----------------------------------------------------------------------------------------------------------------------------
1 | TABLE | t1 | 1 -> 1 | SUCCESS
----------------------------------------------------------------------------------------------------------------------------
Total Count: 1 End Time: 2023-11-30 11:09:58
2023-11-30 11:09:58 [INFO] Load record finished. Total Elapsed: 3.122 s
2023-11-30 11:09:58 [INFO] System exit 0
obclient [test]> select * from t1;
+------+
| c1 |
+------+
| 123 |
| 123 |
+------+
2 rows in set (0.001 sec)
今天只是初步试用了一下 OB 导数工具最最基础的功能,有小的瑕疵,但是并没有太影响正常使用。
这次还没来得及深入去探索导入导出性能调优之类的东西,后面有机会再继续吧~