目次
4.1 テーブルスペースがいっぱいであるという問題を解決するにはどうすればよいですか?
1. テーブルスペースの概要
- 表領域は、論理オブジェクトを格納するための Oracle の独立した記憶域単位です。複数の連続したデータ ブロックに分割されており、テーブル スペースを作成するときに各データ ブロックのサイズを 2KB、4KB、8KB などに指定できます。ブロックは、Oracle の最小のストレージ単位です。ブロック サイズはテーブルスペースの作成時に指定でき、一度指定すると変更できません。ブロック サイズの選択は、データベースのパフォーマンスとストレージ領域の使用効率に影響します。
- 表スペースは複数のデータファイルで構成され、各データファイルは 1 つ以上の表スペースを格納でき、これらのデータファイルは同じディスク上に配置することも、異なるディスク上に配置することもできます。
- 各表スペースには独自の名前と属性があり、表スペースは表スペース名、データファイル名、データファイルのサイズ、およびデータファイルのパスで構成されます。
- 表スペースには自動拡張プロパティを設定することもでき、表スペース内のスペースが不十分な場合、データ ファイルのサイズを自動的に増やすことができます。さらに、表スペースには、表スペースの初期サイズ、最大サイズ、増分サイズなどの記憶域パラメーターも設定できます。
Oracle テーブルスペースに関する詳細な説明は次のとおりです。
- 各テーブルスペースにはデータファイルのセットがあり、このデータファイルのセットは異なるディスク、ファイルシステム、またはオペレーティングシステム上に存在できるため、物理的な独立性が実現されます。
- テーブルスペースは、データベース内のテーブル、インデックス、ビュー、およびその他のオブジェクトを管理するために使用できます。したがって、DBA はデータとリソースをより柔軟に管理し、ディスク領域の使用率とバックアップのリカバリを最適化できます。
- 各テーブルスペースには名前があり、サイズを指定する必要があります (デフォルトでは無制限)。テーブルスペースは動的に拡張できますが、その後のアプリケーションのニーズに備えてスペースを確保しておくことをお勧めします。
- テーブルまたはインデックスは、特定のテーブルスペースに作成できます。大規模なデータベースの場合、記憶域スペースとパフォーマンスをより適切に制御するために、通常、さまざまなタイプのテーブルとインデックスがさまざまなテーブルスペースに割り当てられます。
- Oracle 11g 以前のバージョンでは、通常、SYSTEM、SYSAUX、TEMP、USER の 4 種類の表スペースがあり、各データベースにはデフォルトでこれら 4 つの表スペースが含まれます。Oracle 12c 以降では、UNDO テーブルスペースも追加されました。
- SYSTEM 表領域には、システム テーブル (sys テーブルやシステム テーブルなど) およびその他の Oracle システム オブジェクトが含まれており、通常はユーザー データの保存には使用しないでください。
- SYSAUX テーブルスペースには、Oracle データベースの主要なコンポーネントの多くが含まれており、データベースがアップグレードされ、新機能が追加されると変更されます。したがって、SYSAUX 表領域に十分な領域を確保することが非常に重要です。
- TEMP 表領域は、一時表とソート操作の中間結果を保管するために使用されます。TEMP テーブルスペース内のデータは、トランザクションのコミット後に自動的に削除されます。
- USER テーブルスペースは、データベース テーブル、インデックス、ビューなど、一般ユーザーが作成したデータベース オブジェクトを格納するために使用されます。
- UNDO テーブルスペースは、Oracle データベース トランザクションの元に戻す機能を実装するために使用されます。これにより、トランザクションをロールバックする必要があるときに、行われたすべての変更を元に戻すことができます。UNDO テーブルスペースのサイズは、トランザクションの取り消しとロールバックのパフォーマンスに影響を与えないように、十分な大きさに設定する必要があります。
要約すると、テーブルスペースはデータを管理するための論理ユニットであり、優れた柔軟性、より優れたディスクスペース使用量、およびフォールトトレランスを提供します。
2、表スペースの分類
2.1 管理権限による区分
管理者権限に応じて分けると、システムテーブルスペースとユーザーテーブルスペースの2種類に分かれます。
2.1.1 システムテーブルスペース
システム表領域は、Oracle 管理者が使用する特別な表領域であり、データベース自体の操作に必要なデータとオブジェクト、およびシステム メタデータが保存されます。システム表スペースには、SYSTEM 表スペースと SYSAUX 表スペースの 2 つのタイプが含まれており、主に次のデータベース・オブジェクトが含まれます。
- データベース メタデータ: これらのメタデータには、システム テーブル、システム ビュー、および Oracle データベース自体の基本機能を実現するために使用されるその他のメタデータ定義が含まれます。
- システム テーブル: Oracle に付属する一部の一般的なテーブルには、通常、Oracle インスタンス、ユーザー、セキュリティ、スタンバイ デバイスに関する情報が保存されます。
- システム インデックス: 実際には、システム テーブル クエリを高速化し、システム効率を向上させるために使用される特別なタイプのテーブルです。
- 制御ファイル: Oracle データベース制御ファイル。データベース名、作成日、ログ シーケンス番号、現在のデータベース ログ グループ番号などの重要な情報が保存されます。
2.1.2 ユーザーテーブルスペース
ユーザー表領域は、ユーザーデータと、テーブル、インデックス、ビューなどのオブジェクトを保存するためにユーザーによって作成されます。ユーザー表領域は、ユーザー定義の表、インデックス、ストアド プロシージャ、およびその他のデータベース オブジェクトを格納するために一般ユーザーが使用する表領域です。一般に、Oracle データベースには複数のユーザー表領域が存在する可能性があり、これらのユーザー表領域はユーザーまたはユーザーに代わって管理者によって作成されます。同時に、ユーザー表領域には次のデータベース オブジェクトも含まれます。
- データ テーブル: データベース オブジェクトの最も一般的なタイプの 1 つです。ユーザーは独自のデータテーブルを作成し、そこにデータを保存できます。
- インデックス: データ テーブル内のデータの取得を高速化し、システム パフォーマンスを向上させるために使用されます。
- ビュー: データ テーブルに似ていますが、新しい行を直接挿入したり、行を削除したりすることはできません。
- シーケンス: 一意の識別子を生成するために使用され、主キーまたは他のデータ列でよく使用されます。
- ストアド プロシージャとストアド ファンクション: PL/SQL で記述され、実行可能コードにコンパイルされたプログラム単位。
- パッケージ: PL/SQLのストアド・プロシージャとファンクションの組み合わせ。データベース内に別個のオブジェクトとして存在します。
- ユーザー定義型: 基本型と同様に使用できるユーザー定義のデータ型です。
2.2 パーティション戦略による
Oracle の表スペースは、パーティション戦略を考慮して SYSTEM 表スペース、SYSAUX 表スペース、TEMP 表スペース、UNDO 表スペースなどの 4 種類に分類できます。
2.2.1 SYSTEM テーブルスペース
システム テーブル スペースの重要な部分は、データベース メタデータや制御情報などを格納することであり、データベース構造全体の重要な部分です。システム データ ディクショナリ、Oracle カーネル コードなど、すべてのシステム メタデータが含まれます。これらの要素は Oracle システムによって維持され、ユーザーが変更したりアクセスしたりできるようには提供されません。
2.2.2 SYSAUX テーブルスペース
2 番目に重要なシステム テーブル スペースは、主にシステム管理データ、アドバンスト キュー、ログ情報、データ マイニング モデルなどを格納するために使用されます。また、Oracle Enterprise Manager のパフォーマンス監視データやログ情報など、Oracle データベースのいくつかの補助システム オブジェクトも格納されます。Oracle がより多くのコンポーネントをインストールするか、より多くのアプリケーションをインストールするときは、SYSAUX 表領域を使用してシステム表領域を拡張し、Oracle 11g 以降の新しい Oracle 機能をサポートします。
2.2.3 TEMP テーブルスペース
一時テーブルスペースは、クエリ操作中に生成された一時テーブルやソートテーブルなどの中間結果を格納するために使用され、実行が完了すると自動的にクリアされます。ソート操作や結合操作のマージによって生成された一時ファイルとテーブルを保存するために使用されます。クエリが非常に複雑で、大量の一時領域のサポートが必要な場合は、TEMP テーブル スペースの読み取りと書き込みが必要になります。したがって、主に並べ替え操作や接続操作などの一時データを保存するために使用されます。
2.2.4 UNDO表スペース
UNDO テーブルスペースは、トランザクションの実行中に変更または削除される古いバージョンのデータを保存するために使用され、ロールバック操作中に以前の状態を復元するために使用できます。データベースのロールバックセグメント管理によく使用され、トランザクションがロールバックされると、以前に完了した作業が必要に応じてロールバックされ、UNDOに必要な情報がUNDO表領域に入れられます。この情報は UNDO テーブルスペースに保存されるため、必要なときにドキュメントを復元できます。したがって、主にロールバック セグメント データを保存し、トランザクション ロールバック操作をサポートするために使用されます。
2.3 機能別の分類
表領域は、データの永続性と機能タイプに応じて分割されます。Oracle では、さまざまな機能要件とデータ処理方法に応じて、表領域を永続表領域、UNDO 表領域、一時表領域の 3 つのタイプに分割します。
2.3.1 永続表領域(永続表領域)
データテーブル、インデックス、ビューなどのユーザー定義のデータベースオブジェクトを保存するために使用されます。これらのデータは、日常業務で使用するためにハードディスクに長期保存され、セッションまたはトランザクションの終了によって消えることはありません。つまり、永続テーブルスペース内のデータは送信後もディスクに永続化されます。多くの場合、テーブル、インデックスなど、データベースが閉じられた後も存在する永続データを保存するために使用されます。
2.3.2 UNDO表領域(UNDO表領域)
UNDO テーブルスペースは、トランザクションのロールバックおよびリカバリ機能を実装するために使用されます。トランザクション処理中にトランザクションを元に戻す必要がある場合、Oracle データベースは UNDO 表領域から対応するデータを取得し、これらのデータを使用して UNDO 操作をロールバックします。したがって、実行中のトランザクションによってデータに加えられた変更に関する詳細情報を保存するためによく使用されます。トランザクションをロールバックする必要がある場合、Oracle はこの表領域に戻って UNDO データを検索し、これらのデータを使用して前の状態に復元します。これはセッションに関連付けられたテーブルスペースであり、すべてのアクティブなセッションで使用されます。
2.3.3 一時テーブルスペース
一時表スペースは、SQL クエリー操作のソートや処理などの一時的な要件によって作成されたオブジェクトを保管するために使用されます。これらのオブジェクトは、クエリの終了後に自動的に削除されます。一時テーブルスペースは主に、ソート中に保存される一時ファイルやハッシュ結合操作中の一時テーブルなどの一時データベース オブジェクトを保存し、OLAP や大規模で複雑なクエリなどの高度な操作をサポートするために使用されます。一時テーブルスペースは、ステートメントがソートやディスクへのダンプなどのために大量のメモリを必要とする場合に自動的に使用されます。操作が完了すると、その中のデータはそれに応じて解放されます。つまり、一時表スペース内のデータはセッション終了後に自動的に削除されます。
通常、完全な Oracle データベースには少なくとも 1 つの永続表領域と 1 つの UNDO 表領域が含まれている必要があり、デフォルトでは一時表領域も含まれます。さらに、永続テーブルスペースと一時テーブルスペースは、データベースアプリケーションのニーズをより適切に満たすために、ディスクの場所、サイズ、パフォーマンス、その他の要因に応じて細分化することもできます。
知らせ:
一部の操作 (大規模な操作など) によって UNDO 表スペースが枯渇する状況を避けるために、永続表スペースと UNDO 表スペースを同時に同じ表スペースに保管するのではなく、別々に使用することをお勧めします。データ削除)。
テーブルスペースのタイプは、次の SQL ステートメントでクエリできます。
SELECT tablespace_name, contents FROM dba_tablespaces;
このうち、contents 列の値は、PERMANENT、UNDO、または TEMPORARY にすることができ、それぞれ永続表スペース、UNDO 表スペース、および一時表スペースに対応します。
3、表スペースの操作
3.1 テーブルスペースの作成
構文形式は次のとおりです。
CREATE TABLESPACE tablespace_name
DATAFILE 'path/to/datafile' SIZE file_size [ REUSE ]
[ EXTENT MANAGEMENT <LOCAL | DICTIONARY> ]
[ AUTOEXTEND ON NEXT auto_extend_size MAXSIZE max_size ]
[ DEFAULT STORAGE (storage_clause)]
[ LOGGING | NOLOGGING]
[ ONLINE | OFFLINE]
[ PERMANENT | TEMPORARY]
[ SEGMENT SPACE MANAGEMENT { MANUAL | AUTO } ];
各パラメータの意味は次のとおりです。
tablespace_name
: 作成されたテーブルスペースの名前、つまり新しいテーブルスペースの名前。DATAFILE
: 物理ファイルのパスと名前。このファイルは表スペースのデータ コンテナとして使用され (複数存在する場合があります)、データ ファイルのパスとファイル名を指定するために使用されます。SIZE
: 新しく作成されるデータ ファイルの初期サイズを指定します。デフォルトの単位は M です。。REUSE
: データ ファイルがすでに存在する場合、REUSE パラメータを使用すると、名前を変更せずにデータ ファイルを再利用できます。EXTENT MANAGEMENT
: テーブルスペースの割り当て方法を指定します。DICTIONARY はデータ ディクショナリ管理を使用することを意味し、LOCAL はローカル管理を使用することを意味し、DEFAULT データベース設定を継承できます。AUTOEXTEND
:自動展開が必要なデータファイルについては、自動展開機能を有効にしてください。NEXT
: 自動拡張の次の増分サイズを指定します。デフォルトの単位は M です。MAXSIZE
: データ ファイルの最大許容サイズ制限。デフォルトは単位として M です。- DEFAULT STORAGE (storage_clause) : 表領域のデフォルトのストレージ属性を指定します。
LOGGING
: Oracle の REDO ログ ファイル内のデータ変更によって引き起こされたトランザクションを記録するためのロギングを設定およびアクティブ化します。NOLOGGING
: ログを有効にせず、トランザクション ログを書き込まず、パフォーマンスを向上させます。ONLINE
: テーブルスペース内のオブジェクトへの同時接続を許可し、テーブルスペースの作成時にオンライン状態に設定します。OFFLINE
: テーブルスペースのすべてのアクティビティを禁止し、テーブルスペースの作成時にオフラインに設定します。- PERMANENT : 永続テーブルスペースを作成します。
- TEMPORARY : 一時テーブルスペースを作成します。
SEGMENT SPACE MANAGEMENT
: テーブルスペース内のセグメント管理方法を指定します。MANUAL は手動管理、AUTO は自動管理を意味します。
テーブルスペースの作成例をいくつか示します。
例 1. USERS という名前のユーザー表スペースを作成し/u01/app/oracle/oradata/db1/
、users01.dbf
ディレクトリーの下のファイルに保管します。初期サイズは 100MB です。自動拡張機能を有効にし、ファイル容量は毎回 10MB ずつ自動的に増加します。最大値は 2GB を超えることはできません。構文は次のとおりです。次のように:
CREATE TABLESPACE users
DATAFILE '/u01/app/oracle/oradata/db1/users01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL
AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
私はローカル拡張管理を有効にするためにここにいます。これにより、データベース管理がより効率的になり、読み取りと書き込みが高速化されます。
例 2. 自動拡張機能を使用してデータ ファイルを作成する 初期サイズは 100 MB で、パス "my_datafile.dbf" のテーブル スペース "my_tablespace" を最大値 500 MB で 10 MB ずつ増加します。構文は次のとおりです。
CREATE TABLESPACE my_tablespace
DATAFILE 'C:\oracle\product\12.2.0\dbhome_1\database\my_datafile.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
例 3. `my_tablespace` という名前の永続テーブルスペースを作成します。データ ファイル パスは `/u01/app/oracle/oradata/mydb/my_tablespace.dbf`、サイズは 100M、自動拡張機能は有効です。 50M ごとに自動的に拡張します。最大サイズは 500M です。デフォルトのストレージ属性を使用し、オンラインステータスに設定します。構文は次のとおりです。
CREATE TABLESPACE my_tablespace
DATAFILE '/u01/app/oracle/oradata/mydb/my_tablespace.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 500M
DEFAULT STORAGE (INITIAL 64K NEXT 64K)
ONLINE
PERMANENT;
例 4. UNDO表領域を作成する基本手順
1). UNDO表領域作成時に使用する一時表領域(一時表領域)を作成します。一時表スペースは、デフォルトの「TEMP」表スペースを選択することも、既存の他の適切な一時表スペースを使用することもできます。
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
2). UNDO テーブルスペースを作成し、テーブルスペースの名前、ファイルパスとサイズなどの属性構成を指定します。
CREATE UNDO TABLESPACE undo_tbs
DATAFILE '/u01/app/oracle/oradata/XE/undo_tbs01.dbf' SIZE 50M;
作成プロセス中に、実際のニーズに応じてテーブルスペースのサイズと格納場所を調整できます。
3). 新しく作成した UNDO テーブルスペースをシステム レベルのデフォルト UNDO テーブルスペースとして設定します。
ALTER SYSTEM SET UNDO_TABLESPACE=undo_tbs SCOPE=BOTH;
このようにして、後続のすべてのロールバック操作は、この UNDO 表スペースを使用して、対応するロールバック データを格納します。デフォルトの UNDO テーブルスペースを変更する必要がある場合は、同様の SQL コマンドを使用して変更できます。
知らせ:
UNDO 表スペースを使用する場合は、データベースが自動ロールバック モードになるようにする必要があります。そうしないと、UNDO 表領域が作成されても、トランザクションがロールバックされたときにデータを自動的にリストアできません。
例 5.一時表スペースを作成する基本手順:
1). 表スペースのデータを格納する新しいデータファイル(Datafile)を作成します。作成は次の SQL コマンドを使用して実行できます。
ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/XE/temp02.dbf' SIZE 50M;
2). 新しい一時テーブルスペースを作成し、ファイルとそのサイズを指定します。
CREATE TEMPORARY TABLESPACE temp02
TEMPFILE '/u01/app/oracle/oradata/XE/temp02.dbf' SIZE 50M;
3). 新しく作成した一時表領域をデフォルトの一時表領域として設定すると、デフォルトの一時表領域が一時表領域を使用する必要があるすべてのセッションで使用されます。次の SQL コマンドを使用して変更できます。
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp02;
知らせ:
一時表領域は一時データのみを保持できます。データベースを再起動するとクリアされます。したがって、実際のアプリケーションでは、一時表領域のサイズと数をビジネス特性に応じて調整し、データベースが正常に動作するように定期的に保守およびクリーンアップする必要があります。
3.2 テーブルスペースを変更する
既存の表領域は、ALTER TABLESPACE ステートメントを使用して変更できます。ALTER TABLESPACE ステートメントの基本構文は次のとおりです。
ALTER TABLESPACE tablespace_name {
[ ADD DATAFILE 'path/to/new_datafile' SIZE file_size ]
[ RESIZE DATAFILE 'path/to/datafile' SIZE file_size ]
[ AUTOEXTEND ON NEXT auto_extend_size integer[K|M|G|T] MAXSIZE max_size
integer[K|M|G|T] ]
[ RENAME TO new_tablespace_name ]--RENAME DATAFILE 'old_file_name' TO 'new_file_name'
[ RESIZE integer[K|M|G|T]
[ OFFLINE| OFFLINE | READ ONLY | READ WRITE NORMAL/IMMEDIATE ]
{BEGIN BACKUP | END BACKUP} |
{BEGIN/END} {BACKUP | COPY | RECOVER} [DATAFILE 'file_spec'] |
{BEGIN/END} {BACKUP | COPY | RECOVER} [TEMPFILE 'file_spec'] |
{BEGIN/END} {BACKUP | COPY | RECOVER} TABLESPACE tablespace_name |
{BEGIN/END} {BACKUP | COPY | RECOVER} DATABASE |
{BEGIN/END} {BACKUP | COPY | RECOVER} CONTROLFILE |
{BEGIN/END} {BACKUP | COPY | RECOVER} ARCHIVELOG |
{BEGIN/END} {BACKUP | COPY | RECOVER} LOGFILE 'file_spec' |
{BEGIN/END} {BACKUP | COPY | RECOVER} REDOLOG group integer |
{BEGIN/END} {BACKUP | COPY | RECOVER} ALL}};
各パラメータの意味は次のとおりです。
tablespace_name
: 変更するテーブルスペースの名前。ADD DATAFILE
: 新しいデータ ファイルをテーブルスペースに追加するために使用されます。RESIZE DATAFILE
: 既存のデータ ファイルのサイズを調整するために使用されます。AUTOEXTEND
:自動展開が必要なデータファイルについては、自動展開機能を有効にしてください。NEXT
: 自動拡張の次の増分サイズを指定します。MAXSIZE
: データ ファイルの最大許容サイズ制限。RENAME TO
処置: 表領域の名前を変更します。OFFLINE
: テーブルスペースをオフラインにして、新しいトランザクションを受け入れなくなり、DBA レベルの操作ができるようにすることができます。- ONLINE : オンライン表領域。
- READ ONLY/READ WRITE : 読み取り専用/読み取り/書き込みテーブルスペース。
- RENAME DATAFILE : データファイルの名前を変更します。
- RESIZE : テーブルスペースのサイズを調整します。
- BEGIN/END BACKUP : バックアップを開始/終了します。
- BEGIN/END BACKUP/COPY/RECOVER : バックアップ/コピー/リカバリ操作を開始/終了します。
表領域を変更する例をいくつか示します。
例 1. users02.dbf という名前の新しいデータ ファイルを USERS 表領域に追加するには、次のサンプル コードを使用できます。
ALTER TABLESPACE users
ADD DATAFILE '/u01/app/oracle/oradata/db1/users02.dbf' SIZE 100M;
my_tablespace
という名前のテーブルスペースの容量を増やしたい場合は、次のサンプル コードを使用できます。
ALTER TABLESPACE my_tablespace ADD DATAFILE '/u01/app/oracle/oradata/db1/users02.dbf' SIZE 200M;
例 2. USERS 表領域内の既存のデータ ファイルのサイズを 200M に調整する場合は、次のサンプル コードを使用できます。
ALTER TABLESPACE users
RESIZE DATAFILE '/u01/app/oracle/oradata/db1/users01.dbf' SIZE 200M;
例 3. USERS 表領域の名前を USERS_NEW に変更する場合は、次のサンプル コードを使用できます。
ALTER TABLESPACE users
RENAME TO users_new;
例 4. 自動拡張を有効にするには、次のサンプル コードを使用できます。
ALTER TABLESPACE users AUTOEXTEND ON NEXT 100M MAXSIZE 500M;
例 5. バックアップを開始するには、次のサンプル コードを使用できます。
ALTER TABLESPACE users BEGIN BACKUP;
例 6. テーブルスペースを増やす 2 つの方法。次のサンプルコードを使用できます。
1.)追加のデータ ファイルをテーブルスペースに追加します。
alter tablespace users add datafile '/u01/oradata/orcl/users02.dbf' size 25m;
2.) 表スペースの現在のデータファイルを変更します。たとえば、
alter database datafile '/u01/oradata/orcl/users01.dbf' resize 50m;
知らせ:
一部のデータベース オブジェクト (テーブルやインデックスなど) では、特定のテーブル スペース内でのみ作成または変更できる場合があります。したがって、表領域を変更する前に、ドキュメントを注意深く読んで制限事項を理解することをお勧めします。
3.3 テーブルスペースの削除
既存の表領域は、DROP TABLESPACE ステートメントを使用して削除できます。DROP TABLESPACE ステートメントの基本構文は次のとおりです。
DROP TABLESPACE tablespace_name
[ INCLUDING CONTENTS ]
[ AND DATAFILES [CASCADE|KEEP]];
各パラメータの意味は次のとおりです。
tablespace_name
: 削除するテーブルスペースの名前。INCLUDING CONTENTS(可选)
: このオプションが含まれている場合、テーブルスペース内のすべてのオブジェクトが削除されます。つまり、テーブルスペース内のすべてのオブジェクトとデータが削除されます。AND DATAFILES
CASCADE (オプション) : このオプションが含まれる場合、表スペースに関連付けられたデータファイルも削除されます。つまり、表スペースで使用されるすべてのデータファイルがカスケードされます。AND DATAFILES KEEP(
オプション) : この表領域で使用されるすべてのデータファイルを保持します。
述べる:
[CASCADE|KEEP] 状況に応じて追加するかどうかを選択できます。
テーブルスペースを削除する例をいくつか示します。
例 1. USERS 表領域 (表領域にデータベース オブジェクトがあるかどうかに関係なく) とそれに関連するデータ ファイル users01.dbf を削除します。
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
USERS 表領域を削除するだけで、その中のデータベース オブジェクトとデータ ファイルは変更しないままにする場合は、次のように、上記のステートメントの INCLUDING CONTENTS パラメータと AND DATAFILES パラメータを省略できます。
DROP TABLESPACE users;
例 2.my_tablespace
という名前の、次のようにします。
DROP TABLESPACE my_tablespace INCLUDING CONTENTS;
表領域を削除し、その表領域で使用されているすべてのデータファイルをカスケード・ドロップする場合は、
DROP TABLESPACE my_tablespace INCLUDING CONTENTS AND DATAFILES CASCADE;
表領域で使用されるデータファイルを保持し、表領域自体のみを削除する場合は、
DROP TABLESPACE my_tablespace AND DATAFILES KEEP;
3.4 クエリテーブルスペース
1). 関連するシステム ビューをクエリして、指定されたテーブル スペースの使用状況を確認します。一般的に使用される 2 つのクエリ ステートメントは次のとおりです。
① テーブルスペースの使用状況情報を問い合わせる
SELECT tablespace_name,
ROUND((total_space - free_space) / total_space * 100, 2) "Used%",
ROUND(total_space / 1024 / 1024, 2) "Total(MB)",
ROUND(free_space / 1024 / 1024, 2) "Free(MB)",
ROUND((total_space - free_space) / 1024 / 1024, 2) "Used(MB)"
FROM (SELECT tablespace_name,
SUM(bytes) / 1024 / 1024 total_space,
SUM(DECODE(autoextensible, 'YES', maxbytes, bytes)) / 1024 / 1024 free_space
FROM dba_data_files
GROUP BY tablespace_name);
--或者使用下面语句
--使用外连接(等价于隐式内连接),以及 SELECT 子句中的运算符和函数(例如 ROUND、/)
select a.tablespace_name,
a.total/1024 total,
round(100-b.free/a.total*100,2) "%Used"
from
(select tablespace_name,sum(bytes) total
from dba_data_files
group by tablespace_name
) a,
(select tablespace_name,sum(bytes) free
from dba_free_space
group by tablespace_name
) b
where a.tablespace_name=b.tablespace_name;
2 番目のクエリ ステートメントを解析します。
-
まず、各表スペースが占める合計スペースが
dba_data_files
table、その結果がa
という名前のネストされたサブクエリに保存されます。 -
次に、各表スペースの現在使用可能なスペースの合計サイズが
dba_free_space
table、b
という名前のネストされたサブクエリに保管されます。 -
最後に、2 つのネストされたサブクエリを結合して、メイン クエリで使用されている各テーブルスペースの現在の割合を計算します。具体的には、計算式は 100 - (現在の表領域の使用可能な領域 / 現在の表領域の合計領域) * 100 となり、結果には小数点以下 2 桁が含まれます。同時に、クエリ結果には、表領域名 (
tablespace_name
)、表領域の合計サイズ (total
)、および表領域の現在使用されている割合 (%Used
) が含まれます。
②指定したテーブルスペース内の各データファイルの使用状況を問い合わせる
SELECT file_id,
file_name,
tablespace_name,
autoextensible,
ceil(bytes / 1024 / 1024) "Size(MB)",
ceil(maxbytes / 1024 / 1024) "MaxSize(MB)",
ceil(((maxbytes - bytes) / allocate_extent) + 1) "Free Extents"
FROM dba_data_files
WHERE tablespace_name = '<tablespace_name>';
2).現在のユーザースペース割り当てを確認します。
SELECT *
FROM dba_segments
WHERE owner = '<username>'
<username>
の部分は実際のユーザー名に置き換える必要があります。この SQL ステートメントは、dba_segments
ビュー、名前、タイプ、サイズ、スペース制限などの詳細情報を表示します。dba_segments
などのシステム ビューにアクセスできない場合は、関連情報をクエリできないことに注意してください。
または、次のステートメントを使用して、現在のユーザー スペースの使用状況をクエリします。
SELECT segment_type, sum(bytes)/1024/1024 MB_used
FROM user_segments
GROUP BY segment_type;
user_segments
現在のユーザーに属するすべてのセグメント情報をtableからクエリし、セグメント タイプ (テーブル、インデックスなど) に従って分類および集計し、各タイプのセグメントが占有するスペース (MB 単位) を計算します。
ヒント:
Oracle データベースでは、一般に、表スペースは 1 人のユーザーが表スペースを占有するのではなく、複数のユーザーのデータを保管するために使用されます。したがって、あるユーザーが占有する表領域のサイズを知るには、そのユーザーが使用する表やインデックスなどのオブジェクトが占有する領域を合計する必要があります。
または、次のステートメントを使用して、現在のユーザー スペースの使用状況をクエリします。
SELECT tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)
FROM user_segments
GROUP BY tablespace_name
user_segments
tableから現在のユーザーに属するすべてのセグメント (テーブル、インデックスなど) を照会し、それらが配置されているテーブルスペースに従って分類および要約し、拡張子の合計数、ブロックの合計数、およびブロックの合計数を計算します。各表スペース内のユーザーのすべてのセグメントが占有するブロックの数(合計バイト数)。最後に、表示は表領域名 ( ) ごとにグループ化され、合計エクステント ( ) 、合計ブロック ( )、および合計バイト数 ( )tablespace_name
の 3 つの要約値が表示されます。
SUM(extents)
SUM(blocks)
SUM(bytes)
知らせ:
上記の 2 つのクエリは、現在のユーザーのテーブル領域の使用量をカウントするためにのみ使用でき、他のユーザーやデータベース全体に関する情報を取得することはできません。また、
user_segments
テーブル さらに、クエリ結果によって反映される表スペースの使用量には、ユーザーが所有するオブジェクト (つまり、user_segments
table他の表スペースにすでに存在するオブジェクトへのユーザーのアクセスは含まれません。よりグローバルな表スペースの使用状況を理解する必要がある場合は、他のシステム・ビューまたは動的パフォーマンス・ビューを参照する必要があります。
3). 各ユーザーのスペース割り当てを確認します。
SELECT username, default_tablespace, temporary_tablespace, profile FROM dba_users;
ユーザー名 ( )、デフォルトのテーブルスペース ( )、一時テーブルスペース ( )、構成ファイル ( ) などを含む、現在のデータベース内のすべてのユーザーに関する情報をdba_users
ビュー から取得します。ここで、デフォルト表スペースとは、ユーザーがオブジェクトを作成するときに使用されるデフォルト表スペースを意味し、一時表スペースとは、ユーザーの一時表スペースを意味します。username
default_tablespace
temporary_tablespace
profile
または、次のステートメントを使用して、各ユーザーのスペース割り当てをクエリします。
SELECT owner,tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)
FROM dba_segments
GROUP BY owner,tablespace_name;
dba_segments
ビューからすべてのテーブルスペースで各ユーザーが所有するオブジェクトをクエリし、ユーザーとその属するテーブルスペースに従って分類して集計し、拡張子の総数、ブロックの総数、各ユーザーが占有しているブロックの総数を計算します。テーブルスペースの合計バイト数。最後に、表示はユーザー名 ( owner
) とテーブルスペース名 ( ) によってtablespace_name
グループ化され
、合計拡張子 ( ) SUM(extents)
、合計ブロック数 ( SUM(blocks)
)、および合計バイト数 ( SUM(bytes)
) の 3 つの集計値が表示されます。
知らせ:
クエリには
dba_segments
ビューため、アクセス権のある特権ユーザーとして実行する必要があります。さらに、複数のユーザーの統計を実行する場合は、統計の範囲を狭めるために、最初に一部の不要なユーザーをフィルターで除外するWHERE
句 。
次のコマンドを使用して、特定のユーザーが占有しているスペースを確認します。
SELECT segment_name, segment_type, tablespace_name, bytes, extents FROM user_segments;
user_segments
現在のユーザーが所有するすべてのセグメント (テーブル、インデックスなど) が占有しているスペース情報をビュー から取得します。これには、セグメント名 ( segment_name
)、セグメント タイプ ( segment_type
)、テーブルスペース名 ( tablespace_name
)、合計バイト数 ( bytes
)、および合計が含まれます。拡張子(extents
)など この情報を使用して、指定したユーザーが占有しているスペースと各テーブルスペースの負荷を確認できます。
4. テーブルスペースに関するよくある質問
4.1 テーブルスペースがいっぱいであるという問題を解決するにはどうすればよいですか?
Oracle データベースのテーブルスペースがいっぱいになった場合は、通常、次の措置を講じる必要があります。
1). 拡張データ ファイル: データ ファイルのサイズを増やすことで、テーブル スペースを拡張できます。具体的な手順は、「ALTER TABLESPACE」コマンドとキーワード「ADD DATAFILE」を使用して 1 つ以上のデータ ファイルを追加することです。詳細については、3.2 の例 6 を参照してください。
例えば:
ALTER TABLESPACE tablespace_name ADD DATAFILE '/path/to/datafile.dbf' SIZE 50M;
このコマンドは、指定されたテーブルスペースにサイズ 50MB の新しいデータ ファイルを追加します。なお、この操作を行う前に十分なディスク容量を確保する必要があります。
2). データテーブルを圧縮する: テーブルスペースに不要なデータがある場合は、データテーブルを圧縮してスペースを解放することを検討できます。一般的な方法は、履歴データやバックアップ データなど、使用されなくなった一部のデータ行を削除することです。
3). データ オブジェクトの移動: 一般的に使用されない一部のデータ オブジェクトは、他の表スペースに移動できます。たとえば、一部の履歴データ オブジェクトやほとんど使用されない補助テーブル (ログ テーブルなど) を、ディスク速度は遅いが容量が大きいテーブルスペースに移動することで、より多くのストレージ領域を解放できます。
4). インデックスの圧縮再構築: インデックスを再構築すると、分割ブロックが削除され、記憶域の断片化が縮小され、スペースが解放されます。通常の状況では、インデックスの再構築後、表スペースのサイズは自動的に縮小されます。
知らせ:
上記の操作を行う際は、不慮の紛失を防ぐため、必ずデータのバックアップを行ってください。同時に、実際の状況に応じて対応する措置を選択し、起こり得るリスクと影響を十分に評価する必要があります。
4.2 テーブルスペースのクォータ
ユーザーを作成し、400M の表スペースを割り当てます。その結果、13.3M が使用されると、「ORA-01536: 表スペース '***' のスペース制限を超えています」というエラーが報告されます。
この場合、「ORA-01536: 表領域 '***' のスペース クォータを超過しました」エラーは、次のことが原因で発生する可能性があります。
①. 割り当てられた表スペースのサイズが十分ではありません: 特定のエラー メッセージ ORA-01536 から、表スペース '***' が割り当てられた制限を超えていることがわかります。したがって、ユーザーの作成時にデータの増加に必要なスペースが割り当てに考慮されていない可能性があります。
②. データが特定のテーブル/パーティションに集中的に保存されている場合: データ量が予想よりはるかに多い、またはデータ集約型のテーブルがあり、テーブルが占有するストレージ領域がテーブル領域の上限に達する可能性があります。 。これは、最も多くのスペースを使用しているオブジェクトを見ることで確認できます。例えば:
SELECT owner, segment_name, segment_type, bytes/1024/1024 MB
FROM dba_segments
WHERE tablespace_name = '***'
ORDER BY bytes DESC;
ここで、「***」は実際のテーブルスペース名に置き換えられます。
ORR-01536 エラーを解決するには、次の手順を実行します。
①. 表スペースの容量を増やす: 実際のニーズに応じて、表スペース内のデータ ファイルの数またはサイズを増やします。
②. テーブルスペースの使用状況を確認する: テーブルスペースとテーブルスペースに含まれるオブジェクトを徹底的に確認し、どのオブジェクトが多くのスペースを占有しているかを特定し、スペースを解放するか記憶場所を再割り当てするための効果的な措置を講じます。
知らせ:
いずれの方法を使用する場合でも、不慮の損失を防ぐために、実行前に十分なリスク評価を行い、関連するデータがバックアップされていることを確認する必要があります。
クエリを実行したところ、テーブルスペースとテーブルスペースクォータの2つの値が異なることがわかりました。Oracleはデフォルトで各ユーザーにデフォルトのテーブルスペースクォータを割り当てる必要があると推測されます。具体的な比率は確認する必要がありますが、この比率は 100.% よりもはるかに小さい必要があるため、割り当てられた 400M のテーブルスペースには 400M データを格納できない可能性があります。
解決:
ユーザー表スペースのクォータを確認します。
select * from user_ts_quotas;
max_bytes フィールドは十分であり、-1 は制限がないことを意味し、他の値は同じだけです。
ユーザーに対するテーブルスペースクォータ制御なし:
GRANT UNLIMITED TABLESPACE TO ***(用户);
この方法はグローバルです。
また
alter user ***(用户名) quota unlimited on ***(表空间);
この方法は特定の表スペース用であり、自然に割り当てまたはリサイクルできます。
revoke unlimited tablespace from ***(用户)
また
alter user *** quota 0 on ***
5、テーブルスペースの役割
主に次のような側面があります。
-
柔軟性の提供:データベースオブジェクトを異なるテーブルスペースに分散することで、各オブジェクトの位置関係を容易に調整でき、ストレージ構造を変更してより柔軟な管理方法を実現します。
-
簡素化されたバックアップとリカバリのプロセス: データベース管理者は、さまざまな表スペースに対してバックアップとリカバリの操作を実行できるため、バックアップとリカバリの手順が簡素化されます。たとえば、データベースをバックアップする場合、最初に頻繁に更新される表スペースをバックアップし、次に比較的静的な表スペースをバックアップすることができます。これにより、バックアップ プロセス中のデータの重複を減らすことができます。
-
ストレージ リソースの管理: 異なるテーブル スペースに異なるストレージ パラメータを設定することで、管理者はストレージ リソースの使用を細かく制御できるため、ストレージ リソースを効果的に管理できます。
-
パフォーマンスの最適化: さまざまなアプリケーション シナリオに従って、関連するデータベース オブジェクトをさまざまな表スペースに配置し、さまざまなアクセス ルールとストレージ特性を与えます。たとえば、読み取り頻度が高いテーブルをより高速なディスク速度のテーブルスペースに配置して、データベースのクエリ効率を向上させることができます。
つまり、Oracle のテーブルスペースは非常に重要な概念であり、データベースのパフォーマンスと管理に重要な影響を与えます。