OceanBase V4.x应用实践:如何排查表被锁问题
DBA在日常工作中常常会面临以下两种常见情况:
- 业务人员会提出问题:“表被锁了,导致业务受阻,请帮忙解决。”
- 业务人员还会反馈:“某个程序通常几秒内就能执行完毕,但现在却运行了好几分钟,不清楚是什么原因?”
针对第二种情况,当我们排除了执行计划突然变化或数据量异常增加的可能性后,很大概率也是由锁造成的。
锁查询思路:区分锁类别
根本思路还是排查锁,只是区分排查当前的锁还是排查历史的锁。
下文以实验场景展示上述两个的分析过程。我使用的环境为:
observer (OceanBase 4.3.0.1)
REVISION: 101000062024032200-b59432e535c48e8b8828190c803b6c7736413ff9
BUILD_BRANCH: HEAD
BUILD_TIME: Mar 22 2024 00:52:21
BUILD_FLAGS: RelWithDebInfo
BUILD_INFO:
实验场景演示排查过程
第一个场景:排查当前正在锁的表。
第一步,我们开启一个事务,然后更新一行数据,但是不提交。
第二步,我们模仿程序,通过java代码调用sql,更新同一条数据。
可以看到,现在程序现在卡死的状态。这时我们就可以去库里排查,代码如下。
MySQL [oceanbase]> select * from __all_virtual_processlist where TENANT='htap' and user_client_ip<>'127.0.0.1'; +------------+------+--------+--------------------+------+---------+--------+------+-------+------+--------------+----------+----------+---------------------+---------------+----------------+-----------+----------+-----------+------------+----------+-------------+------------+-----------+------------+--------+--------+-------------+-----------+---------+-----------+---------------------+-------+-------------------+-----------------------+--------+--------+----------+----------+-----------+------------------+------------+--------------+ | id | user | tenant | host | db | command | sql_id | time | state | info | svr_ip | svr_port | sql_port | proxy_sessid | master_sessid | user_client_ip | user_host | trans_id | thread_id | ssl_cipher | trace_id | trans_state | total_time | retry_cnt | retry_info | action | module | client_info | sql_trace | plan_id | tenant_id | effective_tenant_id | level | sample_percentage | record_policy | lb_vid | lb_vip | lb_vport | in_bytes | out_bytes | user_client_port | proxy_user | service_name | +------------+------+--------+--------------------+------+---------+--------+------+-------+------+--------------+----------+----------+---------------------+---------------+----------------+-----------+----------+-----------+------------+----------+-------------+------------+-----------+------------+--------+--------+-------------+-----------+---------+-----------+---------------------+-------+-------------------+-----------------------+--------+--------+----------+----------+-----------+------------------+------------+--------------+ | 3221643380 | SYS | htap | 134.90.8.212:39832 | SYS | Sleep | | 24 | SLEEP | NULL | 134.90.8.212 | 2882 | 2881 | 9681060055801331737 | NULL | 134.90.8.212 | % | 3917058 | 0 | NULL | NULL | ACTIVE | 24 | 0 | 0 | | | | 1 | 3036 | 1002 | 1002 | 1 | 10 | SAMPLE_AND_SLOW_QUERY | NULL | NULL | NULL | 663 | 13527 | 59424 | NULL | NULL | | 3221704604 | SYS | htap | 134.90.8.212:43442 | SYS | Sleep | | 5 | SLEEP | NULL | 134.90.8.212 | 2882 | 2881 | 9681060055801331738 | NULL | 134.84.16.9 | % | 0 | 0 | NULL | NULL | | 5 | 6 | -6005 | | | | 1 | 3037 | 1002 | 1002 | 1 | 10 | SAMPLE_AND_SLOW_QUERY | NULL | NULL | NULL | 1078 | 11179 | 42302 | NULL | NULL | | 3222051655 | SYS | htap | 134.90.8.212:38844 | SYS | Sleep | | 969 | SLEEP | NULL | 134.90.8.216 | 2882 | 2881 | 9681060055801331737 | NULL | 134.90.8.212 | % | 0 | 0 | NULL | NULL | | 969 | 0 | 0 | | | | 1 | 322 | 1002 | 1002 | 1 | 10 | SAMPLE_AND_SLOW_QUERY | NULL | NULL | NULL | 638 | 8569 | 59424 | NULL | NULL | +------------+------+--------+--------------------+------+---------+--------+------+-------+------+--------------+----------+----------+---------------------+---------------+----------------+-----------+----------+-----------+------------+----------+-------------+------------+-----------+------------+--------+--------+-------------+-----------+---------+-----------+---------------------+-------+-------------------+-----------------------+--------+--------+----------+----------+-----------+------------------+------------+--------------+ 3 rows in set (0.02 sec) |
通过__all_virtual_processlist,我们可以看到持有锁的会话,以及被锁的会话,可以看到第二个session的retry_info有6005获取锁失败的报错,即被阻塞的会话。第一个active是持有锁,阻塞别人的会话,只要第一个会话回滚或提交,释放锁,第二个会话就可以获取到锁。
由于此次测试环境会话较少,能够清晰地看到我们需要的信息,在生产环境中这需要耗费点时间。因此,下面介绍其他方式供参考。
(1)业务反馈有积压,程序卡住,但不确定卡在哪些表上了。
针对这个问题,可以通过以下命令sql查询持有锁的所有会话及表名,并与业务确认卡顿程序涉及的表以定位锁,如果涉及杀会话,需要确认杀掉持有锁的会话会不会影响业务。
MySQL [oceanbase]> select a.tenant_id,a.svr_ip,a.ls_id,a.table_id,c.table_id table_actual_id,c.table_name,a.tablet_id,a.session_id,a.ctx_create_time -> from __all_virtual_trans_lock_stat a -> left join __all_virtual_tablet_to_ls b on b.tablet_id=a.tablet_id -> left join __all_virtual_table c on b.table_id=c.table_id; +-----------+--------------+-------+----------+-----------------+------------+-----------+------------+----------------------------+ | tenant_id | svr_ip | ls_id | table_id | table_actual_id | table_name | tablet_id | session_id | ctx_create_time | +-----------+--------------+-------+----------+-----------------+------------+-----------+------------+----------------------------+ | 1002 | 169.78.3.112 | 1001 | 0 | 500008 | ZRY2 | 200010 | 3221643380 | 2024-04-12 10:32:52.880125 | +-----------+--------------+-------+----------+-----------------+------------+-----------+------------+----------------------------+ 1 row in set (0.09 sec) |
(2)业务反馈涉及某个表的程序卡住
针对这个问题,我们只需要查询该表是否有锁,查询语句如下,该sql是根据表名查询持有锁的会话。
MySQL [oceanbase]> select * from (select a.tenant_id,a.svr_ip,a.ls_id,a.table_id,c.table_id table_actual_id,c.table_name,a.tablet_id,a.session_id,a.ctx_create_time -> from __all_virtual_trans_lock_stat a -> left join __all_virtual_tablet_to_ls b on b.tablet_id=a.tablet_id -> left join __all_virtual_table c on b.table_id=c.table_id) t where t.table_name like '%ZRY2%'; +-----------+--------------+-------+----------+-----------------+------------+-----------+------------+----------------------------+ | tenant_id | svr_ip | ls_id | table_id | table_actual_id | table_name | tablet_id | session_id | ctx_create_time | +-----------+--------------+-------+----------+-----------------+------------+-----------+------------+----------------------------+ | 1002 | 169.78.3.112 | 1001 | 0 | 500008 | ZRY2 | 200010 | 3221643380 | 2024-04-12 10:32:52.880125 | +-----------+--------------+-------+----------+-----------------+------------+-----------+------------+----------------------------+ 1 row in set (0.05 sec) |
(3)程序冲突导致卡顿
有时多个程序逻辑可能相互冲突,导致某个业务的程序被卡住,但是该业务逻辑可以手动调整,此时可能想终止该会话优先运行其他流程。这时,如下sql可以查询到被锁,或者说等待持有锁的会话。
MySQL [oceanbase]> select a.tenant_id,a.svr_ip,c.table_id table_actual_id,c.table_name,a.tablet_id,a.session_id,a.block_session_id,a.trans_id,a.holder_trans_id,a.lock_mode,a.`type` -> from __all_virtual_lock_wait_stat a -> left join __all_virtual_tablet_to_ls b on b.tablet_id=a.tablet_id -> left join __all_virtual_table c on b.table_id=c.table_id; +-----------+--------------+-----------------+------------+-----------+------------+------------------+----------+-----------------+-----------+------+ | tenant_id | svr_ip | table_actual_id | table_name | tablet_id | session_id | block_session_id | trans_id | holder_trans_id | lock_mode | type | +-----------+--------------+-----------------+------------+-----------+------------+------------------+----------+-----------------+-----------+------+ | 1002 | 169.78.3.112 | 500008 | ZRY2 | 200010 | 3221704604 | 3221704604 | 3917301 | 3917058 | X | 1 | +-----------+--------------+-----------------+------------+-----------+------------+------------------+----------+-----------------+-----------+------+ 1 row in set (0.02 sec) |
第二个场景:排查历史被锁的表。
该场景中的问题是DBA经常遇到的,一个程序一反常态运行变慢通常是锁冲突导致的,建议业务人员修改业务逻辑,可是业务人员无法确定是哪些业务冲突,DBA就需要找到被锁住的业务模型,便于业务定位和修改业务逻辑。
第一步,提交update。
可以看到java程序获取到锁,执行结束了,此处需要说明的事,该java程序是我从社区官网的客户案例中复制出来并改了sql,getString报错不影响此次实验的目的。
可以确认数据,java程序修改成功了。
首先,在生产等环境sqlaudit刷新较快,我们需要保留相应的aqlaudit便于分析,在场景复现时关闭audit,保留信息。
MySQL [oceanbase]> alter system set enable_sql_audit='False';
Query OK, 0 rows affected (0.07 sec)
然后,DBA通过业务日志或业务人员提供的sql语句查询sql_audit信息。
MySQL [oceanbase]> select * from gv$ob_sql_audit where query_sql='update zry2 set b=\'javacs\' where a=985 and c=164;' \G *************************** 1. row *************************** SVR_IP: 169.78.3.112 SVR_PORT: 2882 REQUEST_ID: 12119440 SQL_EXEC_ID: 52294148 TRACE_ID: YB42865A08D4-0006157C0336EBEA-0-0 SID: 3221704604 CLIENT_IP: 169.78.3.112 CLIENT_PORT: 43442 TENANT_ID: 1002 TENANT_NAME: htap EFFECTIVE_TENANT_ID: 1002 USER_ID: 200003 USER_NAME: SYS USER_GROUP: 0 USER_CLIENT_IP: 169.78.16.6 DB_ID: 201006 DB_NAME: SYS SQL_ID: 3E393CA2244E2C49F354EA1DE7874597 QUERY_SQL: update zry2 set b='javacs' where a=985 and c=164; PLAN_ID: 3037 AFFECTED_ROWS: 1 RETURN_ROWS: 0 PARTITION_CNT: 1 RET_CODE: 0 QC_ID: 0 DFO_ID: 0 SQC_ID: 0 WORKER_ID: 0 EVENT: P1TEXT: P1: 0 P2TEXT: P2: 0 P3TEXT: P3: 0 LEVEL: 0 WAIT_CLASS_ID: 100 WAIT_CLASS#: 0 WAIT_CLASS: OTHER STATE: MAX_WAIT TIME ZERO WAIT_TIME_MICRO: 0 TOTAL_WAIT_TIME_MICRO: 0 TOTAL_WAITS: 0 RPC_COUNT: 2 PLAN_TYPE: 1 IS_INNER_SQL: 0 IS_EXECUTOR_RPC: 0 IS_HIT_PLAN: 1 REQUEST_TIME: 1712889179734177 ELAPSED_TIME: 94830642 NET_TIME: 0 NET_WAIT_TIME: 4 QUEUE_TIME: 2467 DECODE_TIME: 3 GET_PLAN_TIME: 1698 EXECUTE_TIME: 160381 APPLICATION_WAIT_TIME: 0 CONCURRENCY_WAIT_TIME: 0 USER_IO_WAIT_TIME: 0 SCHEDULE_TIME: 0 ROW_CACHE_HIT: 0 BLOOM_FILTER_CACHE_HIT: 0 BLOCK_CACHE_HIT: 243 DISK_READS: 0 RETRY_CNT: 30 TABLE_SCAN: 1 CONSISTENCY_LEVEL: 3 MEMSTORE_READ_ROW_COUNT: 2 SSSTORE_READ_ROW_COUNT: 3 DATA_BLOCK_READ_CNT: 0 DATA_BLOCK_CACHE_HIT: 212 INDEX_BLOCK_READ_CNT: 0 INDEX_BLOCK_CACHE_HIT: 31 BLOCKSCAN_BLOCK_CNT: 422 BLOCKSCAN_ROW_CNT: 999999 PUSHDOWN_STORAGE_FILTER_ROW_CNT: 0 REQUEST_MEMORY_USED: 1614992 EXPECTED_WORKER_COUNT: 0 USED_WORKER_COUNT: 0 SCHED_INFO: NULL FUSE_ROW_CACHE_HIT: 0 PS_CLIENT_STMT_ID: -1 PS_INNER_STMT_ID: -1 TX_ID: 3917415 SNAPSHOT_VERSION: 1712889274559945492 REQUEST_TYPE: 2 IS_BATCHED_MULTI_STMT: 0 OB_TRACE_INFO: NULL PLAN_HASH: 5849233527757913110 LOCK_FOR_READ_TIME: 0 PARAMS_VALUE: RULE_NAME: PARTITION_HIT: 1 TX_INTERNAL_ROUTING: 0 TX_STATE_VERSION: 0 FLT_TRACE_ID: PL_TRACE_ID: NULL PLSQL_EXEC_TIME: 0 TOTAL_MEMSTORE_READ_ROW_COUNT: 0 TOTAL_SSSTORE_READ_ROW_COUNT: 0 1 row in set (0.82 sec) |
可以看到 ELAPSED_TIME: 94830642,总响应时间超过90s,但其实EXECUTE_TIME: 160381,执行时间才160ms,其他的时间消耗也比较低,RETRY_CNT: 30,重试了30次,基本可以判定是锁冲突导致,我们通过TRACE_ID: YB42865A08D4-0006157C0336EBEA-0-0 在SVR_IP: 169.78.3.112节点的日志中搜索。
xxxxxxxxxroot:/home/admin/oceanbase/log # grep YB42865A08D4-0006157C0336EBEA-0-0 observer.log|more [2024-04-12 10:32:59.739289] WDIAG [STORAGE.TRANS] mvcc_write (ob_mvcc_row.cpp:1023) [9181][T1002_L0_G0][T1002][YB42865A08D4-0006157C0336EBEA-0-0] [lt=21][e rrcode=-6005] mvcc write conflict(ret=-6005, ctx={ObIMvccCtx={alloc_type=0 ctx_descriptor=0 min_table_version=1712482298355992 max_table_version=17124822983 55992 trans_version={val:4611686018427387903, v:0} commit_version={val:0, v:0} lock_wait_start_ts=0 replay_compact_version={val:0, v:0}} end_code=0 tx_statu s=0 is_readonly=false ref=1 trans_id={txid:3917083} ls_id=1001 row_callback[alloc:0, free:0, unsubmit:0] redo[fill:0,sync_succ:0, sync_fail:0] main_list_len =1 pending_log_size=0 callback_list:{cnt=1 need_merge=0 stat:[tx_end=0, rollback_to=0, fast_commit=0, remove_memtable=0] detail:[(log_epoch,length,logged,sy nced,appended,removed,unlog_removed,branch_removed)|0:(1,1,0,0,1,0,0,0)|]}}, node=this=0x7fe662a11a10 trans_version={val:4611686018427387903, v:0} scn={val: 4611686018427387903, v:0} tx_id={txid:3917083} prev=(nil) next=(nil) modify_count=4294967295 acc_checksum=0 version=1712887388091454 type=0 flag=0 snapshot_ barrier=0 snapshot_barrier_flag=0 mtd={dml_flag:2, buf_len:49} seq_no={branch:0, seq:3}, res={can_insert:false, need_insert:false, is_new_locked:false, is_m vcc_undo:false, lock_state:{is_locked:true, trans_version:{val:0, v:0}, lock_trans_id:{txid:3917058}, lock_data_sequence:{branch:0, seq:15984}, lock_dml_fla g:2, is_delayed_cleanout:false, mvcc_row:0x7fe662a040a8, trans_scn:{val:4611686018427387903, v:0}}, is_checked:false, tx_node:NULL}, *this={this=0x7fe662a04 0a8 latch_=unlocked flag=11 first_dml=UPDATE last_dml=UPDATE update_since_compact=2 list_head=0x7fe662a11978 latest_compact_node=(nil) max_trans_version={va l:1712887883522203616, v:0} max_trans_id=3912943 max_elr_trans_version={val:1712887883522203616, v:0} max_elr_trans_id=3912943 latest_compact_ts=0 last_comp act_cnt=0 total_trans_node_cnt=3 max_modify_scn={val:1712887883522203616, v:0} min_modify_scn={val:1712887883518676835, v:0}}) [2024-04-12 10:32:59.739372] INFO [STORAGE.TRANS] on_wlock_retry (ob_memtable_context.cpp:300) [9181][T1002_L0_G0][T1002][YB42865A08D4-0006157C0336EBEA-0-0 ] [lt=78] mvcc_write conflict(key={"BIGINT UNSIGNED":33}, tx_id={txid:3917083}, conflict_tx_id={txid:3917058}, this={ObIMvccCtx={alloc_type=0 ctx_descriptor =0 min_table_version=1712482298355992 max_table_version=1712482298355992 trans_version={val:4611686018427387903, v:0} commit_version={val:0, v:0} lock_wait_ start_ts=0 replay_compact_version={val:0, v:0}} end_code=0 tx_status=0 is_readonly=false ref=1 trans_id={txid:3917083} ls_id=1001 row_callback[alloc:0, free :0, unsubmit:0] redo[fill:0,sync_succ:0, sync_fail:0] main_list_len=1 pending_log_size=0 callback_list:{cnt=1 need_merge=0 stat:[tx_end=0, rollback_to=0, fa st_commit=0, remove_memtable=0] detail:[(log_epoch,length,logged,synced,appended,removed,unlog_removed,branch_removed)|0:(1,1,0,0,1,0,0,0)|]}}) [2024-04-12 10:32:59.739404] WDIAG [STORAGE] update_row (ob_tablet.cpp:3796) [9181][T1002_L0_G0][T1002][YB42865A08D4-0006157C0336EBEA-0-0] [lt=24][errcode=- 6005] failed to set memtable, (ret=-6005) |
在日志中能够明显看到6005获取锁失败的信息,以及持有锁的lock_trans_id:{txid:3917058},根据这个txid就可以找到当时锁住该业务的业务模型。当然,在OceanBase3.2.4版本中可以从日志中获取持有锁的trans_hash的值,通过该值也可以获取该事务的业务模型。
MySQL [oceanbase]> select * from gv$ob_sql_audit where tx_id=3917058 \G *************************** 1. row *************************** SVR_IP: 169.78.3.112 SVR_PORT: 2882 REQUEST_ID: 12116788 SQL_EXEC_ID: 52281688 TRACE_ID: YB42865A08D4-0006157C0336EBE3-0-0 SID: 3221643380 CLIENT_IP: 169.78.3.112 CLIENT_PORT: 39832 TENANT_ID: 1002 TENANT_NAME: htap EFFECTIVE_TENANT_ID: 1002 USER_ID: 200003 USER_NAME: SYS USER_GROUP: 0 USER_CLIENT_IP: 169.78.3.112 DB_ID: 201006 DB_NAME: SYS SQL_ID: 8D589AFA4DFAEEED85FFF5AA78E5FF6A QUERY_SQL: begin PLAN_ID: 0 AFFECTED_ROWS: 0 RETURN_ROWS: 0 PARTITION_CNT: 0 RET_CODE: 0 QC_ID: 0 DFO_ID: 0 SQC_ID: 0 WORKER_ID: 0 EVENT: P1TEXT: P1: 0 P2TEXT: P2: 0 P3TEXT: P3: 0 LEVEL: 0 WAIT_CLASS_ID: 100 WAIT_CLASS#: 0 WAIT_CLASS: OTHER STATE: MAX_WAIT TIME ZERO WAIT_TIME_MICRO: 0 TOTAL_WAIT_TIME_MICRO: 0 TOTAL_WAITS: 0 RPC_COUNT: 0 PLAN_TYPE: 0 IS_INNER_SQL: 0 IS_EXECUTOR_RPC: 0 IS_HIT_PLAN: 0 REQUEST_TIME: 1712889172875953 ELAPSED_TIME: 200 NET_TIME: 0 NET_WAIT_TIME: 8 QUEUE_TIME: 37 DECODE_TIME: 1 GET_PLAN_TIME: 66 EXECUTE_TIME: 53 APPLICATION_WAIT_TIME: 0 CONCURRENCY_WAIT_TIME: 0 USER_IO_WAIT_TIME: 0 SCHEDULE_TIME: 0 ROW_CACHE_HIT: 0 BLOOM_FILTER_CACHE_HIT: 0 BLOCK_CACHE_HIT: 0 DISK_READS: 0 RETRY_CNT: 0 TABLE_SCAN: 0 CONSISTENCY_LEVEL: -1 MEMSTORE_READ_ROW_COUNT: 0 SSSTORE_READ_ROW_COUNT: 0 DATA_BLOCK_READ_CNT: 0 DATA_BLOCK_CACHE_HIT: 0 INDEX_BLOCK_READ_CNT: 0 INDEX_BLOCK_CACHE_HIT: 0 BLOCKSCAN_BLOCK_CNT: 0 BLOCKSCAN_ROW_CNT: 0 PUSHDOWN_STORAGE_FILTER_ROW_CNT: 0 REQUEST_MEMORY_USED: 65536 EXPECTED_WORKER_COUNT: 0 USED_WORKER_COUNT: 0 SCHED_INFO: NULL FUSE_ROW_CACHE_HIT: 0 PS_CLIENT_STMT_ID: -1 PS_INNER_STMT_ID: -1 TX_ID: 3917058 SNAPSHOT_VERSION: 0 REQUEST_TYPE: 2 IS_BATCHED_MULTI_STMT: 0 OB_TRACE_INFO: NULL PLAN_HASH: 0 LOCK_FOR_READ_TIME: 0 PARAMS_VALUE: RULE_NAME: PARTITION_HIT: 1 TX_INTERNAL_ROUTING: 1 TX_STATE_VERSION: 1 FLT_TRACE_ID: 000615dd-16b0-59f2-f7a7-1215e6062770 PL_TRACE_ID: NULL PLSQL_EXEC_TIME: 0 TOTAL_MEMSTORE_READ_ROW_COUNT: 0 TOTAL_SSSTORE_READ_ROW_COUNT: 0 *************************** 2. row *************************** SVR_IP: 169.78.3.112 SVR_PORT: 2882 REQUEST_ID: 12116789 SQL_EXEC_ID: 52281689 TRACE_ID: YB42865A08D4-0006157C0336EBE4-0-0 SID: 3221643380 CLIENT_IP: 169.78.3.112 CLIENT_PORT: 39832 TENANT_ID: 1002 TENANT_NAME: htap EFFECTIVE_TENANT_ID: 1002 USER_ID: 200003 USER_NAME: SYS USER_GROUP: 0 USER_CLIENT_IP: 169.78.3.112 DB_ID: 201006 DB_NAME: SYS SQL_ID: 328A68949A9F6E066CEA786B79D83BE9 QUERY_SQL: update zry2 set b='cs' where a=985 and c=164 PLAN_ID: 3036 AFFECTED_ROWS: 1 RETURN_ROWS: 0 PARTITION_CNT: 1 RET_CODE: 0 QC_ID: 0 DFO_ID: 0 SQC_ID: 0 WORKER_ID: 0 EVENT: P1TEXT: P1: 0 P2TEXT: P2: 0 P3TEXT: P3: 0 LEVEL: 0 WAIT_CLASS_ID: 100 WAIT_CLASS#: 0 WAIT_CLASS: OTHER STATE: MAX_WAIT TIME ZERO WAIT_TIME_MICRO: 0 TOTAL_WAIT_TIME_MICRO: 0 TOTAL_WAITS: 0 RPC_COUNT: 0 PLAN_TYPE: 1 IS_INNER_SQL: 0 IS_EXECUTOR_RPC: 0 IS_HIT_PLAN: 1 REQUEST_TIME: 1712889172876387 ELAPSED_TIME: 4429 NET_TIME: 0 NET_WAIT_TIME: 3 QUEUE_TIME: 145 DECODE_TIME: 0 GET_PLAN_TIME: 71 EXECUTE_TIME: 4196 APPLICATION_WAIT_TIME: 0 CONCURRENCY_WAIT_TIME: 0 USER_IO_WAIT_TIME: 0 SCHEDULE_TIME: 0 ROW_CACHE_HIT: 0 BLOOM_FILTER_CACHE_HIT: 0 BLOCK_CACHE_HIT: 243 DISK_READS: 0 RETRY_CNT: 0 TABLE_SCAN: 1 CONSISTENCY_LEVEL: 3 MEMSTORE_READ_ROW_COUNT: 2 SSSTORE_READ_ROW_COUNT: 3 DATA_BLOCK_READ_CNT: 0 DATA_BLOCK_CACHE_HIT: 212 INDEX_BLOCK_READ_CNT: 0 INDEX_BLOCK_CACHE_HIT: 31 BLOCKSCAN_BLOCK_CNT: 422 BLOCKSCAN_ROW_CNT: 999999 PUSHDOWN_STORAGE_FILTER_ROW_CNT: 0 REQUEST_MEMORY_USED: 1369040 EXPECTED_WORKER_COUNT: 0 USED_WORKER_COUNT: 0 SCHED_INFO: NULL FUSE_ROW_CACHE_HIT: 0 PS_CLIENT_STMT_ID: -1 PS_INNER_STMT_ID: -1 TX_ID: 3917058 SNAPSHOT_VERSION: 1712889172484169270 REQUEST_TYPE: 2 IS_BATCHED_MULTI_STMT: 0 OB_TRACE_INFO: NULL PLAN_HASH: 5849233527757913110 LOCK_FOR_READ_TIME: 0 PARAMS_VALUE: RULE_NAME: PARTITION_HIT: 1 TX_INTERNAL_ROUTING: 1 TX_STATE_VERSION: 2 FLT_TRACE_ID: 000615dd-16b0-59f2-f7a7-1215e6062770 PL_TRACE_ID: NULL PLSQL_EXEC_TIME: 0 TOTAL_MEMSTORE_READ_ROW_COUNT: 0 TOTAL_SSSTORE_READ_ROW_COUNT: 0 *************************** 3. row *************************** SVR_IP: 169.78.3.112 SVR_PORT: 2882 REQUEST_ID: 12119439 SQL_EXEC_ID: 52294147 TRACE_ID: YB42865A08D4-0006157C0336EBEB-0-0 SID: 3221643380 CLIENT_IP: 169.78.3.112 CLIENT_PORT: 39832 TENANT_ID: 1002 TENANT_NAME: htap EFFECTIVE_TENANT_ID: 1002 USER_ID: 200003 USER_NAME: SYS USER_GROUP: 0 USER_CLIENT_IP: 169.78.3.112 DB_ID: 201006 DB_NAME: SYS SQL_ID: FFFCA4D67EA0A788813031B8BBC3B329 QUERY_SQL: commit PLAN_ID: 0 AFFECTED_ROWS: 0 RETURN_ROWS: 0 PARTITION_CNT: 0 RET_CODE: 0 QC_ID: 0 DFO_ID: 0 SQC_ID: 0 WORKER_ID: 0 EVENT: P1TEXT: P1: 0 P2TEXT: P2: 0 P3TEXT: P3: 0 LEVEL: 0 WAIT_CLASS_ID: 100 WAIT_CLASS#: 0 WAIT_CLASS: OTHER STATE: MAX_WAIT TIME ZERO WAIT_TIME_MICRO: 0 TOTAL_WAIT_TIME_MICRO: 0 TOTAL_WAITS: 0 RPC_COUNT: 4 PLAN_TYPE: 0 IS_INNER_SQL: 0 IS_EXECUTOR_RPC: 0 IS_HIT_PLAN: 0 REQUEST_TIME: 1712889274559727 ELAPSED_TIME: 546 NET_TIME: 0 NET_WAIT_TIME: 5 QUEUE_TIME: 75 DECODE_TIME: 1 GET_PLAN_TIME: 94 EXECUTE_TIME: 344 APPLICATION_WAIT_TIME: 0 CONCURRENCY_WAIT_TIME: 0 USER_IO_WAIT_TIME: 0 SCHEDULE_TIME: 0 ROW_CACHE_HIT: 0 BLOOM_FILTER_CACHE_HIT: 0 BLOCK_CACHE_HIT: 0 DISK_READS: 0 RETRY_CNT: 0 TABLE_SCAN: 0 CONSISTENCY_LEVEL: -1 MEMSTORE_READ_ROW_COUNT: 0 SSSTORE_READ_ROW_COUNT: 0 DATA_BLOCK_READ_CNT: 0 DATA_BLOCK_CACHE_HIT: 0 INDEX_BLOCK_READ_CNT: 0 INDEX_BLOCK_CACHE_HIT: 0 BLOCKSCAN_BLOCK_CNT: 0 BLOCKSCAN_ROW_CNT: 0 PUSHDOWN_STORAGE_FILTER_ROW_CNT: 0 REQUEST_MEMORY_USED: 65536 EXPECTED_WORKER_COUNT: 0 USED_WORKER_COUNT: 0 SCHED_INFO: NULL FUSE_ROW_CACHE_HIT: 0 PS_CLIENT_STMT_ID: -1 PS_INNER_STMT_ID: -1 TX_ID: 3917058 SNAPSHOT_VERSION: 0 REQUEST_TYPE: 2 IS_BATCHED_MULTI_STMT: 0 OB_TRACE_INFO: NULL PLAN_HASH: 0 LOCK_FOR_READ_TIME: 0 PARAMS_VALUE: RULE_NAME: PARTITION_HIT: 1 TX_INTERNAL_ROUTING: 0 TX_STATE_VERSION: 2 FLT_TRACE_ID: 000615dd-16b0-59f2-f7a7-1215e6062770 PL_TRACE_ID: NULL PLSQL_EXEC_TIME: 0 TOTAL_MEMSTORE_READ_ROW_COUNT: 0 TOTAL_SSSTORE_READ_ROW_COUNT: 0 3 rows in set (0.58 sec) |
上述实验的模型比较简单,就是开启事务执行update然后commit,生产中的业务模型可能会涉及成百上千条sql,可以根据表名和时间缩小查询的范围,为业务人员提供关键的信息和证据。
总结
因为OceanBase 4.x版本采用了日志流,所以在确认表锁的时候要多关联一张表,但和旧版本的排查思路都是一样的。希望这个分析可以帮助大家学习与理解。
相关文章:
OceanBase V4.x应用实践:如何排查表被锁问题
DBA在日常工作中常常会面临以下两种常见情况: 业务人员会提出问题:“表被锁了,导致业务受阻,请帮忙解决。” 业务人员还会反馈:“某个程序通常几秒内就能执行完毕,但现在却运行了好几分钟,不清楚…...
ctfshow-web入门-SSRF(web351-web360)
目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数,很典型的 SSRF 尝试使用 file 协议读文件: urlfile:///etc/passwd 成功读取到 /etc/passwd 同…...
【日常记录-Git】如何为post-checkout脚本传递参数
1. 简介 在Git中,post-checkout 钩子是一个在git checkout 或git switch命令成功执行后自动调用的脚本。该脚本不接受任何来自Git命令的直接参数,因为Git设计该钩子是为了在特定的版本控制操作后执行一些预定义的任务,而不是作为一个通用的脚…...
《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期
消除误解,课程资料逐步公开。 复习资料: Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷: 开卷考试,时间: 2024年11月16日 001 002 003 004 005 ……………………装………………………...
后台管理系统(开箱即用)
很久没有更新博客了,给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理,部门管理&#…...
5G CPE与4G CPE的主要区别有哪些
什么是CPE? CPE是Customer Premise Equipment(客户前置设备)的缩写,也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备,用于连接用户…...
量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...
tcp的网络惊群问题
1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…...
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…...
软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…...
机器学习——期末复习 重点题归纳
第一题 问题描述 现有如下数据样本: 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 (1)根据上表,给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”,…...
MYSQL——数据更新
一、插入数据 1.插入完整的数据记录 在MYSQL中,使用SQL语句INSERT插入一条完整的记录,语法如下: INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…...
Vite 基础理解及应用
文章目录 概要Vite基础知识点1. 快速启动和热更新热更新原理 2. 基于ES模块的构建3. 对不同前端框架的支持 vite.config.js配置实例1. 基本结构2. 服务器相关配置3. 输入输出路径配置4. 打包优化配置 项目构建一、项目初始化二、项目结构理解三、CSS处理四、静态资源处理五、构…...
[JAVA]用MyBatis框架实现一个简单的数据查询操作
基于在前面几章我们已经学习了对MyBatis进行环境配置,并利用SqlSessionFactory核心接口生成了sqlSession对象对数据库进行交互,执行增删改查操作。这里我们就先来学习如何对数据进行查询的操作,具体查询操作有以下几个步骤 创建实体类创建Ma…...
CSS 样式的优先级?
在CSS中,样式的优先级决定了当多个样式规则应用于同一个元素时,哪个样式会被最终使用。以下是一些决定CSS样式优先级的规则: 就近原则: 最后应用在元素上的样式具有最高优先级。这意味着如果两个选择器都应用了相同的样式…...
Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)
Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…...
数据结构《栈和队列》
文章目录 一、什么是栈?1.1 栈的模拟实现1.2 关于栈的例题 二、什么是队列?2.2 队列的模拟实现2.2 关于队列的例题 总结 提示:关于栈和队列的实现其实很简单,基本上是对之前的顺序表和链表的一种应用,代码部分也不难。…...
C# 超链接控件LinkLabel无法触发Alt快捷键
在C#中,为控件添加快捷键的方式有两种,其中一种就是Windows中较为常见的Alt快捷键,比如运行对话框,记事本菜单等。只需要按下 Alt 框号中带下划线的字母即可触发该控件的点击操作。如图所示 在C#开发中,实现类似的操作…...
JVM类加载过程-Loading
一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…...
2024年11月19日Github流行趋势
项目名称:build-your-own-x 项目维护者:danistefanovic, rohitpaulk, sarupbanskota 等项目介绍:通过从零开始重新创建你最喜欢的技术来掌握编程。项目star数:312,081项目fork数:29,004 项目名称:freqtrad…...
详细描述一下Elasticsearch索引文档的过程?
大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch索引文档的过程? Elasticsearch的索引文档过程是其核心功能之一,涉及将数据存储到…...
基于css的Grid布局和vue实现点击左移右移轮播过渡动画效果
直接上代码,以下代码基于vue2,需要Vue3或者react可以使用国内直连GPT/Claude来帮你转换下 代码如下: // ScrollCardsGrid.vue <template><div class"scroll-cards-container"><!-- 左箭头 --><div v-show"showLef…...
HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述
一、习惯推荐是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。 1.开发者将用户在应用/元服务内的使用行为向HarmonyOS共享,使得HarmonyOS可以基于共享的数据学习用户的行为习惯。 2.在HarmonyOS学习到用户的行为习惯后,会给用户推荐相应功能&#x…...
【AtCoder】Beginner Contest 380-F.Exchange Game
题目链接 Problem Statement Takahashi and Aoki will play a game using cards with numbers written on them. Initially, Takahashi has N N N cards with numbers A 1 , … , A N A_1, \ldots, A_N A1,…,AN in his hand, Aoki has M M M cards with numbers B …...
30. 并发编程
一、什么是多任务 如果一个操作系统上同时运行了多个程序,那么称这个操作系统就是 多任务的操作系统,例如:Windows、Mac、Android、IOS、Harmony 等。如果是一个程序,它可以同时执行多个事情,那么就称为 多任务的程序。…...
【包教包会】CocosCreator3.x框架——带翻页特效的场景切换
一、效果演示 二、如何获取 1、https://gitee.com/szrpf/TurnPage 2、解压,导入cocos creator(版本3.8.2),可以直接运行Demo演示 三、算法思路 1、单场景 页面预制体 通过loadScene来切换页面,无法实现页面特效。…...
k8s上面的Redis集群链接不上master的解决办法
问题描述 之前在k8s上面部署了一台node,然后创建了6个redis的pod,构建了一个redis的集群,正常运行。 最近添加了一台slave node,然后把其中的几个redis的pod调度到了slave node上面,结果集群就起不来了,…...
<项目代码>YOLOv8 瞳孔识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...
网络编程-002-UDP通信
1.UDP通信的简单介绍 1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高 1.2 包大小有限制,不发大于路径MTU的数据包 1.3容易丢包 1.4 可以实现一对多,多对多 2.客户端与服务端=发送端与接收端 代码框架 收数据方一般都是客户端/接收端 3.头文件 #i…...
MySQL更换瀚高语法更换
MySQL更换瀚高语法更换 一、前言二、语句 一、前言 水一篇,mysql更换瀚高之后,一些需要更换的语法介绍 > 二、语句 MySQL瀚高MySQL用法瀚高用法说明ifnull(x,y)coalesce(x,y)相同相同用于检查两个表达式并返回第一个非空表达式。如果第一个表达式不是 NULL&…...
太原做网站公司哪家好/企业网络营销策略分析
第一种是遍历 map中键所对应的值public static void work(Map map) {Collection c map.values();Iterator it c.iterator();for (; it.hasNext();) {System.out.println(it.next());}}第二种是遍历 map中的 键 和 值public static void workByKeySet(Map map) {Set key map.…...
微信网站后台/宁波核心关键词seo收费
APP扫码登录流程(借鉴微信扫码登录流程,注意区分:WEB客户端和WEB服务端;APP客户端和APP服务端;) 1、【WEB端】WEB端请求登录二维码:用户打开WEB系统网页,用户触发浏览器向WEB服…...
青州市建设局网站/上海网站建设
原文http://realtcg.com/2018/03/17/react-source-code-analysis-2-initial-render/ 上一篇文章讲到了React 调用ReactDOM.render首次渲染组件的前几个过程的源码, 包括创建元素、根据元素实例化对应组件, 利用事务来进行批量更新. 我们还穿插介绍了React 事务的实现以及如何利…...
=> wordpress 翻译 不显示/网络培训课程
仅作为记录,大佬请跳过。 原因是命名重复 展示: 参考: 感谢大佬博主文章传送门...
网站建设需要精通什么知识/苏州seo服务
如何制作gif图?如何上传你项目的动态效果图到你的csdn? 这只是笔者用的方法,有其他方法的欢迎分享。 一张或几张展示了你的项目的功能及效果的动态图放在博客文章开头会为你的文章润色不少。 相信很多写博客的伙伴都会遇到这样一个问题&…...
常德网站优化公司/磁力最好用的搜索引擎
端口转发程序已经介绍过rinetd了,但是rinetd不支持域名动态解析功能,如果域名对应的ip发生改变,需要重新才能重新加载新的地址。这里自然找到了端口转发工具socat,它完美的解决了动态dns的问题。且由于工作模式的不同,…...