Oceanbase的变量参数ob_query_timeout不适用于obdumper?

ob_query_timeout 是 OceanBase 数据库服务器的一个系统变量(System Variable)。它设置在数据库服务端,用于控制在该数据库连接上执行的所有 SQL 查询的最大执行时间。obdumper 是一个独立的客户端工具,它通过 OBDC 或 Java 驱动与数据库建立连接。理论来说也是一个客户端,应该是继承DB的变量设置,但是近期一客户obdumper一提示query timeou超时,且值并非DB级的参数,这是怎么回事?

obdumper导出报错如下:

$ tail data_par/logs/ob-loader-dumper.error
2025-10-24 05:02:26 [ERROR] Error: SQLTransientConnectionException: Timeout, query has reached the maximum query timeout: 300000000(us), maybe you can adjust the session variable ob_query_timeout or query_timeout hint, and try again.

数据库的变量参数查询

obclient(root@sys)[oceanbase]> show variables like 'ob_%_timeout%';
+---------------------+------------------+
| Variable_name       | Value            |
+---------------------+------------------+
| ob_pl_block_timeout | 3216672000000000 |
| ob_query_timeout    | 10000000         |
| ob_trx_idle_timeout | 86400000000      |
| ob_trx_lock_timeout | -1               |
| ob_trx_timeout      | 86400000000      |
+---------------------+------------------+
5 rows in set (0.007 sec)

调整DB的变量参数,发现并没有在obdumper中生效

obclient配置
set global ob_query_timeout=36000000000;

obdumper 在设计上是一个自包含的JAVA应用程序,它拥有自己的一套参数体系来应对各种运维场景,特别是处理可能耗时很长的大数据量导出任务。直接依赖数据库端的 ob_query_timeout 是不可靠且不灵活的,如果因为数据库负载高导致某个复杂查询稍慢,就被服务端的 ob_query_timeout 断掉,会导致整个导出任务失败,这不符合导出工具的职责。obdumper 有自己专门的参数来控制超时行为,在{obdumper}/conf下的配置文件中。

查看obdumper的命令行参数

[admin@observer1 bin]$ ./obdumper -h
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined (Oracle JDK 1.8.0_3xx+)
At least one of these environment variable is needed to run this program

[admin@observer1 ~]$ which java
/bin/java
[admin@observer1 ~]$ ls -l /bin/java
lrwxrwxrwx 1 root root 22 Oct 20 10:47 /bin/java -> /etc/alternatives/java

[admin@observer1 ~]$ cd /etc/alternatives
[admin@observer1 alternatives]$ ls
alt-java       jjs.1.gz           jre_1.8.0_openjdk_exports  keytool.1.gz          mta-mailq          mta-rmail        orbd          policytool.1.gz   servertool       unpack200.1.gz
alt-java.1.gz  jre                jre_exports                ld                    mta-mailqman       mta-sendmail     orbd.1.gz     rmid              servertool.1.gz
java           jre_1.8.0          jre_openjdk                libnssckbi.so.x86_64  mta-newaliases     mta-sendmailman  pack200       rmid.1.gz         tnameserv
java.1.gz      jre_1.8.0_exports  jre_openjdk_exports        mta                   mta-newaliasesman  ncman            pack200.1.gz  rmiregistry       tnameserv.1.gz
jjs            jre_1.8.0_openjdk  keytool                    mta-aliasesman        mta-pam            nmap             policytool    rmiregistry.1.gz  unpack200

[admin@observer1 alternatives]$ pwd
/etc/alternatives

[admin@observer1 alternatives]$ export JRE_HOME=/etc/alternatives

[admin@observer1 alternatives]$ cd /home/admin/oceanbase/ob-loader-dumper-4.2.8.2-RELEASE
[admin@observer1 ob-loader-dumper-4.2.8.2-RELEASE]$ cd bin


[admin@observer1 bin]$ ./obdumper -h
The JRE_HOME environment variable is NOT defined correctly as the "/etc/alternatives/bin/java" is not found

[admin@observer1 bin]$ ./obdumper -h
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined (Oracle JDK 1.8.0_3xx+)
At least one of these environment variable is needed to run this program

[admin@observer1 ~]$ which java
/bin/java
[admin@observer1 ~]$ ls -l /bin/java
lrwxrwxrwx 1 root root 22 Oct 20 10:47 /bin/java -> /etc/alternatives/java

[admin@observer1 ~]$ cd /etc/alternatives
[admin@observer1 alternatives]$ ls
alt-java       jjs.1.gz           jre_1.8.0_openjdk_exports  keytool.1.gz          mta-mailq          mta-rmail        orbd          policytool.1.gz   servertool       unpack200.1.gz
alt-java.1.gz  jre                jre_exports                ld                    mta-mailqman       mta-sendmail     orbd.1.gz     rmid              servertool.1.gz
java           jre_1.8.0          jre_openjdk                libnssckbi.so.x86_64  mta-newaliases     mta-sendmailman  pack200       rmid.1.gz         tnameserv
java.1.gz      jre_1.8.0_exports  jre_openjdk_exports        mta                   mta-newaliasesman  ncman            pack200.1.gz  rmiregistry       tnameserv.1.gz
jjs            jre_1.8.0_openjdk  keytool                    mta-aliasesman        mta-pam            nmap             policytool    rmiregistry.1.gz  unpack200

[admin@observer1 alternatives]$ pwd
/etc/alternatives

[admin@observer1 alternatives]$ export JRE_HOME=/etc/alternatives

[admin@observer1 alternatives]$ cd /home/admin/oceanbase/ob-loader-dumper-4.2.8.2-RELEASE
[admin@observer1 ob-loader-dumper-4.2.8.2-RELEASE]$ cd bin


[admin@observer1 bin]$ ./obdumper -h
The JRE_HOME environment variable is NOT defined correctly as the "/etc/alternatives/bin/java" is not found

[admin@observer1 bin]$ java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

没有找到oracle java的安装,目标结构不同,本机有套openjdk ,临时投机取巧一下。

[root@observer1 ~]# cd /etc/alternatives
[root@observer1 alternatives]# mkdir bin
[root@observer1 alternatives]# cd bin
[root@observer1 bin]# pwd
/etc/alternatives/bin
[root@observer1 bin]# ln -s ../java ./java
[root@observer1 bin]# ll
total 0
lrwxrwxrwx 1 root root 7 Oct 24 11:34 java -> ../java


[admin@observer1 bin]$ export JRE_HOME=/etc/alternatives

[admin@observer1 bin]$ ./obdumper --help
   ____                                  ____
  / __ \  _____  ___   ____ _   ____    / __ )  ____ _   _____  ___
 / / / / / ___/ / _ \ / __ `/  / __ \  / __  | / __ `/  / ___/ / _ \
/ /_/ / / /__  /  __// /_/ /  / / / / / /_/ / / /_/ /  (__  ) /  __/
\____/  \___/  \___/ \__,_/  /_/ /_/ /_____/  \__,_/  /____/  \___/

Note: 篇幅原因不再展示,obdumper是独立的应用,可以单独下载,建议使用更新的版本, 里面会有一些优化参数,如在4.3.2中有–mem 4g 选项可以指定内存,防止JVM内存不足,可以-Denable.parallel.write=true 开启并行写功能,导出后会将文件合并成单文件, 同时新版本还有可能带来读取文件性能优化的提升。

obdump的配置文件

[admin@observer1 ob-loader-dumper-4.2.8.2-RELEASE]$ cd conf
[admin@observer1 conf]$ ls
cli.properties  decrypt.properties  log4j2.xml  log4j.properties  session.config.json
[admin@observer1 conf]$ pwd
/home/admin/oceanbase/ob-loader-dumper-4.2.8.2-RELEASE/conf
[admin@observer1 conf]$ cat session.config.json
{
  "init_sql": {
    "oracle": [
      "set names utf8",
      "set autocommit=1",
      "set session ob_query_timeout=300000000",
      "set session ob_trx_timeout=180000000",
      "set session net_read_timeout=86400",
      "set session net_write_timeout=86400",
      "set session sql_select_limit=9223372036854775807",
      "alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'",
      "alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS:FF9'",
      "alter session set nls_timestamp_tz_format='YYYY-MM-DD HH24:MI:SS.FF TZR TZD'"
    ],
    "mysql": [
      "set names utf8",
      "set autocommit=1",
      "set session ob_query_timeout=300000000",
      "set session ob_trx_timeout=180000000",
      "set session net_read_timeout=86400",
      "set session net_write_timeout=86400",
      "set session sql_select_limit=9223372036854775807"
    ]
  },
  "jdbc_url_options": {
    "characterEncoding": "utf8",
    "socketTimeout": 1800000,
    "connectTimeout": 1800000,
    "zeroDateTimeBehavior": "convertToNull",
    "useServerPrepStmts": true,
    "noDatetimeStringSync": true,
    "useCompression": true,
    "log": false,
    "allowMultiQueries": true,
    "useLocalSessionState": true,
    "cachePrepStmts": true,
    "useSqlStringCache": true,
    "extendOracleResultSetClass": true,
    "useLobLocatorV2": false
  },
  "jdbc_hamode": null,
  "direct_path_load": {
    "rpc_connect_timeout": "15000",
    "rpc_execute_timeout": "20000",
    "runtime_retry_times": "5",
    "runtime_retry_intervals": "50",
    "task_timeout": "2592000000000",
    "heartbeat_timeout": "60000000"
  }
}

Note: 这里就有我们obdumper默认带的参数,里面有session级变量的修改ob_query_timeout

本案例增加该参数即可。

— over —

Leave a Comment