基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OBClient 使用技巧和问题排查
更新时间:2026-06-30 18:11:26
本文档介绍 OBClient 的使用技巧、常见问题和平台特定说明。
使用技巧
垂直显示查询结果
某些查询结果在垂直显示时比通常的水平表格格式更具可读性。通过以 \G 而不是分号(;)终止查询,可以垂直显示查询。例如,包含换行符的较长文本值通常更容易用垂直输出阅读:
obclient> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I´ll put this on my
Thimble> TODO list and see what happens.
Yes, please do that.
Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)
使用 --safe-updates 选项
对于初学者,一个有用的启动选项是 --safe-updates(或 --i-am-a-dummy,具有相同的效果)。当您可能发出了 DELETE FROM tbl_name 语句但忘记了 WHERE 子句时,这很有帮助。通常,这样的语句会从表中删除所有行。使用 --safe-updates,您只能通过指定标识它们的键值来删除行。这有助于防止事故。
当您使用 --safe-updates 选项时,OBClient 在连接到 OceanBase 服务器时发出以下语句:
SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;
SET 语句具有以下效果:
- 除非您在
WHERE子句中指定键约束或提供LIMIT子句(或两者),否则不允许执行UPDATE或DELETE语句。例如:
UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
UPDATE tbl_name SET not_key_column=val LIMIT 1;
- 服务器将所有大型
SELECT结果限制为 1,000 行,除非语句包含LIMIT子句。 - 服务器中止可能需要检查超过 1,000,000 行组合的多表
SELECT语句。
要指定不同于 1,000 和 1,000,000 的限制,您可以使用 --select_limit 和 --max_join_size 选项覆盖默认值:
obclient --safe-updates --select_limit=500 --max_join_size=10000
禁用 OBClient 自动重连
如果 OBClient 客户端在发送语句时失去与服务器的连接,它会立即自动尝试重新连接到服务器并再次发送语句。但是,即使 OBClient 成功重新连接,您的第一个连接也已结束,并且您之前的所有会话对象和设置都丢失了:临时表、自动提交模式和用户定义和会话变量。此外,任何当前事务都会回滚。这可能对您很危险,如下例所示,服务器在第一个和第二个语句之间关闭并重新启动,而您不知道:
obclient> SET @a=1;
Query OK, 0 rows affected (0.05 sec)
obclient> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 1
Current database: test
Query OK, 1 row affected (1.30 sec)
obclient> SELECT * FROM t;
+------+
| a |
+------+
| NULL |
+------+
@a 用户变量已随连接丢失,重新连接后未定义。如果连接丢失时让 OBClient 终止并报错很重要,您可以使用 --skip-reconnect 选项启动 OBClient 客户端。
使用分隔符创建存储程序
从命令行创建存储程序时,您可能需要区分常规分隔符和 BEGIN END 块内的分隔符。考虑以下示例:
CREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC
BEGIN
DECLARE x TINYINT;
SET x = 42;
RETURN x;
END;
如果您逐行输入上述内容,OBClient 会将第一个分号(在 DECLARE x TINYINT 行的末尾)视为语句的结束。由于这只是一个部分定义,它将抛出语法错误。
解决方案是在过程持续时间内指定一个不同的分隔符,使用 DELIMITER。分隔符可以是您选择的任何字符集,但它需要是一个不会造成进一步混淆的独特字符集。// 是一个常见的选择:
DELIMITER //
CREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC
BEGIN
DECLARE x TINYINT;
SET x = 42;
RETURN x;
END
//
DELIMITER ;
最后,分隔符恢复为默认分号。\g 和 \G 分隔符始终可以使用,即使指定了自定义分隔符。
Mac 系统支持
OBClient 支持在 macOS 系统上运行。以下介绍 Mac 系统使用时的注意事项。
权限问题
在 Mac 系统上首次运行时,可能会遇到权限提示。需要在"系统设置" > "隐私与安全性"中允许使用。
常见问题
连接问题
问题:无法连接到服务器
可能原因:
- 主机地址或端口号错误
- 网络连接问题
- 防火墙阻止连接
- 服务器未启动
解决方法:
- 检查主机地址和端口号是否正确
- 使用
ping命令测试网络连通性 - 检查防火墙设置
- 确认服务器状态
问题:localhost 和 127.0.0.1 连接行为不同
在 Unix 系统上,localhost 和 127.0.0.1 的连接行为不同:
- 使用
localhost时,OBClient 会尝试使用 Unix 套接字连接 - 使用
127.0.0.1时,OBClient 会使用 TCP/IP 连接
如果您的服务器只监听 TCP/IP 端口,请使用 127.0.0.1 或实际的 IP 地址。
字符集问题
问题:输出格式不正确
当操作系统使用 utf8 或其他多字节字符集时,可能会出现 OBClient 的输出格式不正确的问题,这是因为 OBClient 客户端默认使用 latin1 字符集。
解决方法:
使用 --default-character-set 选项强制客户端使用系统字符集:
obclient --default-character-set=utf8
或者设置为 auto,从客户端环境获取字符集:
obclient --default-character-set=auto
历史文件问题
问题:历史文件包含敏感信息
.mysql_history 文件可能包含敏感信息(例如包含密码的 SQL 语句)。
解决方法:
- 使用限制性访问模式保护该文件:
chmod 600 ~/.mysql_history
- 如果不想维护历史文件,可以将
MYSQL_HISTFILE环境变量设置为/dev/null:
export MYSQL_HISTFILE=/dev/null
TNS 配置问题
问题:tnsnames.ora 文件无效
在使用多IP连接时,如果 TNS 配置文件格式不正确,会出现"tnsnames.ora文件无效"的错误。
解决方法:
- 检查
TNS_ADMIN环境变量是否正确设置 - 检查
tnsnames.ora文件格式是否正确 - 确保文件路径和权限正确