PL/SQL: 在创建table之前检查schema中是否有足够的space
PL/SQL: Check if there is sufficient space in schema before creating table
我正在使用一个使用大量查询(运行 ~1 小时)创建 table 的过程。查询类似于 'select * from table',table 中的列可以更改。
很多时候结果是 schema 中没有空闲的 space 来创建 table,所以我得到一个异常,时间白费了,我需要再次做同样的计算。
我得到的错误:
ORA-01536: space quota exceeded for tablespace
ORA-06512: at "UPDATE_REPORT", line 37
我想做的事情:
- 将查询的结果存储在游标的临时段中;
- 尝试使用光标创建 table。在异常的情况下(space 不够),删除一个特殊的 space-holding table 以释放模式中的 table space;
- 尝试从光标再次创建 table。
我尝试使用动态 SQL 来解决这个问题,但它会导致过于复杂,而这个问题似乎有一个简单的解决方案。我面临的主要问题是没有明显的方法可以使用游标创建 table。
是否有任何我不知何故错过的简单解决方案?也许光标是解决这个问题的错误方法?
我能想到的两件事:
- 让数据库来做脏活
- a.k.a。 享受您的 DBA 工作,只需看看 Oracle 自我管理
- 怎么样?让表空间自动扩展
- 向用户
授予该表空间的无限配额
方法如下(以特权用户身份连接):
SQL> select file_name, tablespace_name From dba_data_files;
FILE_NAME TABLESPACE_NAME
------------------------------------------------ -----------------------------
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF USERS
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF SYSAUX
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF UNDOTBS1
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSTEM.DBF SYSTEM
SQL> alter database datafile 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF'
2 autoextend on
3 maxsize unlimited;
Database altered.
SQL> alter user scott quota unlimited on users;
User altered.
SQL>
我同意@OldProgrammer - 这是一个设计问题。删除并重新创建 tables 是一种反模式。
不清楚您要解决的具体问题是什么,但更明智的方法可能是:
- 创建 table 一次。使用 INITIAL EXTENT 参数确保 table 具有它需要的所有 space(您可能需要 运行 一些查询来确定该数字应该是什么)。
- 请与您的 DBA 确认 tablespace 设置为 AUTOEXTEND,以防出现超出您的计算的恶意结果集。也许为架构所有者协商更多 tablespace 配额。
- 填充 table 一次。
- 在随后的 运行 之前,使用 REUSE STORAGE 子句截断 table 以保留分配的 space。
What I would want to do: - Store query's results in temporary segment in a cursor; - Try to create table using cursor. In case of exception (not enough space), drop a special space-holding table to free table space in schema; - Try to create the table again from cursor.
不要自寻烦恼。只是告诉 Oracle 不要因为 space 个问题而死。
您可以使您的会话 "resumable" 这样,当您 运行 超出 space 时,Oracle 将暂停您的会话,而不是给您一个错误,直到问题得到纠正(然后自动继续)。
假设您拥有所需的所有权限(特别是 GRANT RESUMABLE TO yourschema
),您可以像这样启用它:
alter session enable resumable timeout 1800 name 'your process name, can be anything';
1800
数字以秒为单位,让您的 DBA 在会话超时之前有 30 分钟的时间来解决问题。 "my process" 将显示在 V$RESUMABLE
中,用于查询和自动提醒。
您的 DBA 可以监控 V$RESUMABLE
and/or 您可以在 AFTER SUSPEND
事件上创建模式级数据库触发器,以便在他们需要跳转时向他们发送电子邮件英寸
我正在使用一个使用大量查询(运行 ~1 小时)创建 table 的过程。查询类似于 'select * from table',table 中的列可以更改。 很多时候结果是 schema 中没有空闲的 space 来创建 table,所以我得到一个异常,时间白费了,我需要再次做同样的计算。
我得到的错误:
ORA-01536: space quota exceeded for tablespace ORA-06512: at "UPDATE_REPORT", line 37
我想做的事情: - 将查询的结果存储在游标的临时段中; - 尝试使用光标创建 table。在异常的情况下(space 不够),删除一个特殊的 space-holding table 以释放模式中的 table space; - 尝试从光标再次创建 table。
我尝试使用动态 SQL 来解决这个问题,但它会导致过于复杂,而这个问题似乎有一个简单的解决方案。我面临的主要问题是没有明显的方法可以使用游标创建 table。
是否有任何我不知何故错过的简单解决方案?也许光标是解决这个问题的错误方法?
我能想到的两件事:
- 让数据库来做脏活
- a.k.a。 享受您的 DBA 工作,只需看看 Oracle 自我管理
- 怎么样?让表空间自动扩展
- 向用户 授予该表空间的无限配额
方法如下(以特权用户身份连接):
SQL> select file_name, tablespace_name From dba_data_files;
FILE_NAME TABLESPACE_NAME
------------------------------------------------ -----------------------------
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF USERS
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF SYSAUX
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF UNDOTBS1
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSTEM.DBF SYSTEM
SQL> alter database datafile 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF'
2 autoextend on
3 maxsize unlimited;
Database altered.
SQL> alter user scott quota unlimited on users;
User altered.
SQL>
我同意@OldProgrammer - 这是一个设计问题。删除并重新创建 tables 是一种反模式。
不清楚您要解决的具体问题是什么,但更明智的方法可能是:
- 创建 table 一次。使用 INITIAL EXTENT 参数确保 table 具有它需要的所有 space(您可能需要 运行 一些查询来确定该数字应该是什么)。
- 请与您的 DBA 确认 tablespace 设置为 AUTOEXTEND,以防出现超出您的计算的恶意结果集。也许为架构所有者协商更多 tablespace 配额。
- 填充 table 一次。
- 在随后的 运行 之前,使用 REUSE STORAGE 子句截断 table 以保留分配的 space。
What I would want to do: - Store query's results in temporary segment in a cursor; - Try to create table using cursor. In case of exception (not enough space), drop a special space-holding table to free table space in schema; - Try to create the table again from cursor.
不要自寻烦恼。只是告诉 Oracle 不要因为 space 个问题而死。
您可以使您的会话 "resumable" 这样,当您 运行 超出 space 时,Oracle 将暂停您的会话,而不是给您一个错误,直到问题得到纠正(然后自动继续)。
假设您拥有所需的所有权限(特别是 GRANT RESUMABLE TO yourschema
),您可以像这样启用它:
alter session enable resumable timeout 1800 name 'your process name, can be anything';
1800
数字以秒为单位,让您的 DBA 在会话超时之前有 30 分钟的时间来解决问题。 "my process" 将显示在 V$RESUMABLE
中,用于查询和自动提醒。
您的 DBA 可以监控 V$RESUMABLE
and/or 您可以在 AFTER SUSPEND
事件上创建模式级数据库触发器,以便在他们需要跳转时向他们发送电子邮件英寸