Chr*_*mer 6 oracle tablespaces
我在 Oracle 数据库上继承了类似 DBA 的基本职责,但在尝试运行包含大量联接和分组的查询时遇到了 ORA-01652 错误。这是我得到的错误:
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
01652. 00000 - "unable to extend temp segment by %s in tablespace %s"
*Cause: Failed to allocate an extent of the required number of blocks for
a temporary segment in the tablespace indicated.
*Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or more
files to the tablespace indicated.
Run Code Online (Sandbox Code Playgroud)
我已经接受了错误消息的建议(或至少尝试过)并创建了一个新的数据文件。这是我用于此的命令:
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/ABCDEFG/temp02.dbf'
SIZE 1024M REUSE AUTOEXTEND ON NEXT 50M MAXSIZE 4096M;
Run Code Online (Sandbox Code Playgroud)
现在,当我查看DBA_TEMP_FILES
与 TEMP 表空间关联的旧文件和新文件时,但是当我尝试重新运行查询时,我收到相同的错误消息。
所以,我的问题是为什么这个错误仍然发生,因为我正在运行的查询很大但不是那么大。我是否正确创建了数据文件?我该如何进一步诊断?
每个表空间都有一个或多个用于存储数据的数据文件。
数据文件的最大大小取决于数据库的块大小。我相信,默认情况下,每个数据文件的最大 GB 数。
运行以下命令以获得实际允许的大小:
select value from v$parameter where name = 'db_block_size';
Run Code Online (Sandbox Code Playgroud)
将您获得的结果与下面的第一列进行比较,这将表明您的最大数据文件大小是多少。
我有 Oracle 个人版 11g r2,默认安装时它的块大小为 8,192(每个数据文件 32GB)。
Block Sz Max Datafile Sz (Gb) Max DB Sz (Tb)
-------- -------------------- --------------
2,048 8,192 524,264
4,096 16,384 1,048,528
8,192 32,768 2,097,056
16,384 65,536 4,194,112
32,768 131,072 8,388,224
Run Code Online (Sandbox Code Playgroud)
您可以运行此查询来查找您拥有哪些数据文件、它们与哪些表空间关联以及您当前设置的最大文件大小(不能超过上述 32GB):
select bytes/1024/1024 as mb_size,
maxbytes/1024/1024 as maxsize_set,
x.*
from dba_data_files x
Run Code Online (Sandbox Code Playgroud)
MAXSIZE_SET 是您设置的数据文件的最大大小。同样相关的是您是否已将 AUTOEXTEND 选项设置为 ON(其名称正如其含义)。
如果您的数据文件的最大大小较低或未启用自动扩展,您可以简单地运行:
alter database datafile 'path_to_your_file\that_file.DBF' autoextend on maxsize unlimited;
Run Code Online (Sandbox Code Playgroud)
但是,如果它的大小为/接近 32GB,并且自动扩展处于打开状态,那么是的,您确实需要表空间的另一个数据文件:
alter tablespace system add datafile 'path_to_your_datafiles_folder\name_of_df_you_want.dbf' size 10m autoextend on maxsize unlimited;
Run Code Online (Sandbox Code Playgroud)
此外,拥有一个专用于索引的表空间通常是一个好的/常见的做法(您似乎没有这样做,因为您没有在创建索引语句中指定表空间,并且它使用默认值系统表空间),因此在创建这样的表空间后,您将运行如下所示的内容(在您的情况下):
CREATE INDEX FTS_INDEX ON FILTERED_TEKLI_IIS_TABLOSU (ilAdi,ilceAdi,caddeAdi)
tablespace name_of_ts_for_indexes
Run Code Online (Sandbox Code Playgroud)
(创建该表空间及其数据文件后),通过:
create tablespace name_of_ts_for_indexes datafile
'c:\app\xyz\oradata\orcl\name_of_ts_for_indexes01.dbf' autoextend on maxsize unlimited nologging;
Run Code Online (Sandbox Code Playgroud)
这样,您的表将位于一个表空间上,而索引则位于另一个表空间上。
感谢 Brian D. 提供更多信息。
归档时间: |
|
查看次数: |
113985 次 |
最近记录: |