Oracle数据库会话关闭后表数据自动消失,修改未生效是什么原因
问题原因说明
核心原因1:未提交事务导致DML操作回滚
Oracle数据库默认关闭DML(数据操纵语言,对应你执行的INSERT、UPDATE操作)自动提交,你全程没有执行COMMIT;命令提交事务,直接使用Ctrl+C强制终止SQL*Plus会话属于异常中断,Oracle会自动回滚该会话中所有未提交的DML修改,这是你插入、更新的数据丢失的直接原因。
核心原因2:表查询为空的常见场景
你第二次登录查询user_tables返回no rows selected,说明连表结构都查询不到,对应两种常见情况:
- 如果你创建的是会话级临时表,这类表的结构和数据仅在当前会话生效,会话终止后会自动清除,下次登录自然查询不到。
- 如果你创建的是普通永久表,大概率是两次登录的用户/实例不一致:
- 第一次你使用
sqlplus / as sysdba默认登录的是SYS用户,表默认创建在SYS schema下,如果第二次登录没有使用sysdba身份,而是用了其他普通用户登录,user_tables仅会返回当前登录用户名下的表,自然返回空。 - 也有可能你第二次登录前没有正确执行
set ORACLE_SID=orcl;命令,连接到了其他数据库实例。
- 第一次你使用
规避方案
- 所有DML操作执行完成确认无误后,手动执行
COMMIT;提交事务,修改才会持久化到数据库。 - 不建议使用SYS等管理员用户创建业务表、操作业务数据,尽量单独创建业务用户使用,避免schema权限混淆问题。
- 退出SQLPlus时优先使用
EXIT或QUIT命令正常退出,若存在未提交的修改,SQLPlus会主动提示是否提交,避免异常退出导致的数据丢失。
内容的提问来源于stack exchange,提问作者Himanshu Poddar
相关产品推荐
相关产品推荐

