“ERROR 4012 (HY000): Timeout”在oceanbase使用中,出现频率较高,进行参数设置后,该问题会得到有效解决,下面以停止服务报错处理过程进行展示。

0. ENV

CentOS7.6;
OceanBase 2.2.75
1. 现象

执行停止服务报错:"ERROR 4012 (HY000): Timeout"
obclient> alter system stop server "192.168.80.20:5882" zone "zone1";ERROR 4012 (HY000): Timeoutobclient> select svr_ip,svr_port, id,zone,inner_port,status,usec_to_time(stop_time),usec_to_time(start_service_time),usec_to_time(last_offline_time) from __all_server;+---------------+----------+----+-------+------------+--------+----------------------------+----------------------------------+---------------------------------+| svr_ip | svr_port | id | zone | inner_port | status | usec_to_time(stop_time) | usec_to_time(start_service_time) | usec_to_time(last_offline_time) |+---------------+----------+----+-------+------------+--------+----------------------------+----------------------------------+---------------------------------+| 192.168.80.20 | 2882 | 1 | zone1 | 2881 | active | 1970-01-01 08:00:00.000000 | 2021-07-13 15:50:00.398462 | 1970-01-01 08:00:00.000000 || 192.168.80.20 | 3882 | 2 | zone2 | 3881 | active | 1970-01-01 08:00:00.000000 | 2021-07-13 15:49:58.450628 | 1970-01-01 08:00:00.000000 || 192.168.80.20 | 4882 | 3 | zone3 | 4881 | active | 1970-01-01 08:00:00.000000 | 2021-07-13 15:49:59.927852 | 1970-01-01 08:00:00.000000 || 192.168.80.20 | 5882 | 7 | zone1 | 5881 | active | 2021-07-15 16:52:11.684498 | 2021-07-15 08:53:26.672946 | 1970-01-01 08:00:00.000000 || 192.168.80.20 | 6882 | 8 | zone2 | 6881 | active | 1970-01-01 08:00:00.000000 | 2021-07-15 08:53:51.181616 | 1970-01-01 08:00:00.000000 || 192.168.80.20 | 7882 | 9 | zone3 | 7881 | active | 1970-01-01 08:00:00.000000 | 2021-07-15 08:53:58.629463 | 1970-01-01 08:00:00.000000 |+---------------+----------+----+-------+------------+--------+----------------------------+----------------------------------+---------------------------------+6 rows in set (0.00 sec)
当前已经执行,usec_to_time(stop_time)中时间已经更新,只是timeout设置时间较短。
2. 原因

sql响应超时时间设置太短了,所以当sql执行需要一定时间时就会报错4012
查看参数:
obclient> show variables like '%timeout%';+---------------------+---------------------+| Variable_name | Value |+---------------------+---------------------+| connect_timeout | 10 || interactive_timeout | 28800 || lock_wait_timeout | 31536000 || net_read_timeout | 30 || net_write_timeout | 60 || ob_pl_block_timeout | 9223372036854775807 || ob_query_timeout | 10000000 || ob_trx_idle_timeout | 120000000 || ob_trx_lock_timeout | -1 || ob_trx_timeout | 100000000 || wait_timeout | 28800 |+---------------------+---------------------+11 rows in set (0.00 sec)
3. 解决方法

1) 租户下设置全局变量
# 租户下设置,防止超时
obclient> set global ob_query_timeout=36000000000;obclient> set global ob_trx_timeout=36000000000;
ob_query_timeout用于设置查询超时时间,单位是微秒;
ob_trx_timeout用于设置事务超时时间,单位为微秒。
两个参数有GLOBAL和SESSION两种级别:
global参数的话是对全局session生效,但是不包括本次链接,重新登录生效;
如果不加global,就是仅对本次session生效,退出登录还是原来的值。
2) 退出重新登录
[admin@ob6 ~]$ mysql -h127.1 -uroot@sys -P2881 oceanbase -A
3) 再次执行其它stop server正常
obclient> alter system stop server "192.168.80.20:6882" zone "zone2";
4. 小结

执行stop server操作时,当前已经执行,usec_to_time(stop_time)中时间已经更新,只是timeout设置时间较短,通过设置全局超时参数ob_query_timeout、ob_trx_timeout,重新登录会话后,再次执行语句不会再报错。
不足之处,还望抛砖。
作者:王坤,微信公众号:rundba,欢迎转载,转载请注明出处。
如需公众号转发,请联系wx: landnow。
文章转载自rundba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




