oracle数据库行锁问题
问题说明:
今天在执行一个简单的delete删除语句时,一直在执行,也不报错,经过盘查,怀疑是表锁主了,无法修改数据
可以执行一下sql来查看
查看问题
--查找oracle中被锁的行 所谓的行锁
SELECT l.session_id "会话标识符",
s.SERIAL# "会话序列号",
l.locked_mode "锁模式",
l.oracle_username "数据库名",
l.os_user_name "计算机用户名",
s.machine "操作系统机器名称(计算机组/名)",
s.terminal "计算机名",
o.object_name "数据库表名",
s.program "操作系统程序名称",
s.logon_time "时间"
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial#;
解决问题
--杀死 行锁
alter system kill session 'sid,serial#';
或者
alter system kill session '会话标识符,会话序列号';
表字段说明
v$session 表字段说明
More ActionsColumn | Datatype | Description |
---|---|---|
SADDR | RAW(4 | 8) | 会话地址 |
SID | NUMBER | 会话标识符 |
SERIAL# | NUMBER | 会话序列号。 用于唯一标识会话的对象。 如果会话结束且另一个会话以相同的会话ID开始,则保证会话级命令应用于正确的会话对象。 |
AUDSID | NUMBER | 审核会话ID |
PADDR | RAW(4 | 8) | 拥有会话的进程的地址 |
USER# | NUMBER | Oracle用户标识符 |
USERNAME | VARCHAR2(128) | Oracle用户名 |
COMMAND | NUMBER | 正在进行的命令 |
OWNERID | NUMBER | 拥有可迁移会话的用户的标识符; 如果值为2147483644,则列内容无效 对于使用Parallel Slaves的操作,将此值解释为4字节值。 低位2字节表示会话编号,高位字节表示查询协调器的实例ID。 |
TADDR | VARCHAR2(16) | 事务状态对象的地址 |
LOCKWAIT | VARCHAR2(16) | 会话等待的锁的地址; 如果没有则为NULL |
STATUS | VARCHAR2(8) | 会议状况:ACTIVE - 当前正在执行SQL的会话;INACTIVE - 非活动且没有配置限制或尚未超出配置限制的会话;KILLED - 会话标记为已杀死;CACHED - 会话临时缓存以供Oracle * XA使用;SNIPED - 超出某些已配置限制的非活动会话(例如,为资源管理器使用者组指定的资源限制或用户配置文件中指定的idle_time)。 此类会议将不再允许再次活动。 |
SERVER | VARCHAR2(9) | 服务器类型:专用;共享;伪;POOLED; 没有 |
SCHEMA# | NUMBER | 架构用户标识符 |
SCHEMANAME | VARCHAR2(128) | 架构用户名 |
OSUSER | VARCHAR2(128) | 操作系统客户端用户名 |
PROCESS | VARCHAR2(24) | 操作系统客户端进程ID |
MACHINE | VARCHAR2(64) | 操作系统机器名称 |
PORT | NUMBER | 客户端端口号 |
TERMINAL | VARCHAR2(30) | 操作系统终端名称 |
PROGRAM | VARCHAR2(48) | 操作系统程序名称 |
TYPE | VARCHAR2(10) | 会话类型 |
SQL_ADDRESS | RAW(4 | 8) |
SQL_HASH_VALUE | NUMBER | 与SQL_ADDRESS一起使用以标识当前正在执行的SQL语句 |
SQL_ID | VARCHAR2(13) | 当前正在执行的SQL语句的SQL标识符 |
SQL_CHILD_NUMBER | NUMBER | 当前正在执行的SQL语句的子编号 |
SQL_EXEC_START | DATE | 此会话当前执行的SQL执行开始的时间; 如果SQL_ID为NULL,则为NULL |
SQL_EXEC_ID | NUMBER | SQL执行标识符; 如果SQL_ID为NULL或者尚未启动该SQL的执行,则为NULL(请参阅V $ SQL_MONITOR) |
PREV_SQL_ADDR | RAW(4 | 8) |
PREV_HASH_VALUE | NUMBER | 与SQL_HASH_VALUE一起使用以标识最后执行的SQL语句 |
PREV_SQL_ID | VARCHAR2(13) | 执行的最后一个SQL语句的SQL标识符 |
PREV_CHILD_NUMBER | NUMBER | 执行的最后一个SQL语句的子编号 |
PREV_EXEC_START | DATE | SQL执行开始执行最后一次执行的SQL语句 |
PREV_EXEC_ID | NUMBER | 上次执行的SQL语句的SQL执行标识符 |
PLSQL_ENTRY_OBJECT_ID | NUMBER | 堆栈中最顶层PL / SQL子程序的对象ID; 如果堆栈上没有PL / SQL子程序,则为NULL |
PLSQL_ENTRY_SUBPROGRAM_ID | NUMBER | 堆栈中最顶层PL / SQL子程序的子程序ID; 如果堆栈上没有PL / SQL子程序,则为NULL |
PLSQL_OBJECT_ID | NUMBER | 当前正在执行的PL / SQL子程序的对象ID; 执行SQL时为NULL |
PLSQL_SUBPROGRAM_ID | NUMBER | 当前正在执行的PL / SQL对象的子程序ID; 执行SQL时为NULL |
MODULE | VARCHAR2(64) | 通过调用DBMS_APPLICATION_INFO.SET_MODULE过程设置的当前正在执行的模块的名称 |
v$locked_object视图
v$locked_object视图列出当前系统中哪些对象正被锁定,其主要字段说明如下:
字段名称 | 类型 | 说明 |
---|---|---|
XIDUSN | NUMBER | 回滚段号; |
XIDSLOT | NUMBER | 槽号; |
XIDSQN | NUMBER | 序列号; |
OBJECT_ID | NUMBER | 被锁对象标识; |
SESSION_ID | NUMBER | 持有锁的会话(SESSION)标识; |
ORACLE_USERNAME | VARCHAR2(30) | 持有该锁的用户的Oracle用户名; |
OS_USER_NAME | VARCHAR2(15) | 持有该锁的用户的操作系统用户名; |
PROCESS | VARCHAR2(9) | 操作系统的进程号; |
LOCKED_MODE | NUMBER | 锁模式,取值同表三中的LMODE; |
all_objects(dba_objects) 表字段说明
主要用来管理对象。
COLUMN_NAME | DATA_TYPE | 描述 |
---|---|---|
EDITION_NAME | VARCHAR2 | |
NAMESPACE | NUMBER | |
SECONDARY | VARCHAR2 | |
GENERATED | VARCHAR2 | |
TEMPORARY | VARCHAR2 | |
STATUS | VARCHAR2 | 状态,如valid |
TIMESTAMP | VARCHAR2 | 时间 |
LAST_DDL_TIME | DATE | ddl时间 |
CREATED | DATE | 创建时间 |
OBJECT_TYPE | VARCHAR2 | |
DATA_OBJECT_ID | NUMBER | |
OBJECT_ID | NUMBER | 对象id |
SUBOBJECT_NAME | VARCHAR2 | |
OBJECT_NAME | VARCHAR2 | 对象名,如表名t_user,库名等 |
OWNER | VARCHAR2 | 用户名 |
声明:
声明:平时我没事的时候喜欢逛哔哩哔哩,CSDN,微信公众号,这也是我主要的学习来源,如果有需要和您相同的文章,请联系我,谢谢!!!