25

という新しい表領域を作成しました。いくつかの表と索引を含んでいindexesた古い表領域を削除しようとしています。indexes_oldテーブルスペースを削除しようとすると、次のようになります。

=> drop tablespace indexes_old;
ERROR:  tablespace "indexes_old" is not empty

しかし、そこにあるものを確認しようとすると、そのテーブルスペースにテーブルが存在しないようです:

=> select * from pg_tables where tablespace = 'indexes_old';
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers
------------+-----------+------------+------------+------------+----------+-------------
(0 rows)

=> select * from pg_indexes where tablespace = 'indexes_old';
schemaname | tablename | indexname | tablespace | indexdef
------------+-----------+-----------+------------+----------
(0 rows)

では、ドロップを妨げているテーブルスペースには何がありますか?

念のため、pg_upgrade ツールを使用して Pg 8.4 から Pg 9.0 に移行しました。

テーブルスペースは次のようになります。

    Name     |  Owner   |    Location     | Access privileges | Description 
-------------+----------+-----------------+-------------------+-------------
 indexes     | nobody   | /data/pgindex90 |                   | 
 indexes_old | nobody   | /data/pgindex84 |                   | 

/data/pgindex84 の内容には、すべての古い 8.4 インデックスに加えて、pg_upgrade が自動的に作成したこの新しい 9.0 インデックスが含まれます

# sudo ls -al /data/pgindex84/PG_9.0_201008051/11874
total 8280
drwx------ 2 postgres postgres    4096 Feb  9 14:58 .
drwx------ 3 postgres postgres    4096 Feb 11 09:28 ..
-rw------- 1 postgres postgres   40960 Feb  9 14:58 10462602
-rw------- 1 postgres postgres   40960 Feb  9 14:58 10462604
-rw------- 1 postgres postgres 4644864 Feb  9 14:58 10462614
-rw------- 1 postgres postgres 3727360 Feb  9 14:58 10462616
4

6 に答える 6

18

pg_class をチェックして、何がどこにあるかを確認します。

SELECT 
  c.relname, 
  t.spcname 
FROM 
  pg_class c 
    JOIN pg_tablespace t ON c.reltablespace = t.oid 
WHERE 
  t.spcname = 'indexes_old';
于 2011-02-11T15:59:10.590 に答える
11

PostgreSQL では、任意の PostgreSQL データベースでテーブルスペースを使用できます。(要求しているユーザーが十分な権限を持っている限り、つまり。)このクエリだと思います

SELECT spcname, spclocation FROM pg_tablespace;

PostgreSQL バージョン 9.1 までのファイルシステムで index_old が使用しているディレクトリが表示されます。そこをうろついて、何か本物が邪魔をしていないか確認してください。ただし、PostgreSQL のインターフェイスを使用する以外に、そこにあるものを削除しようとすることには非常に注意を払っています。

9.2以降で試してください

select spcname, pg_tablespace_location(oid) from pg_tablespace;
于 2011-02-11T15:53:58.053 に答える
1

10 年後、私はこの問題を抱えていましたが、上記の小さなコメントの 1 つが解決策を見つけるのに役立ちました。テーブルスペースを使用する現在のデータベース内のselect * from pg_tables where tablespace = 'my_tablespace';テーブルのみを一覧表示します。そのコマンドを試行している各データベースを循環して、そのテーブルスペースを使用するデータベースを見つける必要があります。

于 2020-05-16T01:23:00.343 に答える
-6

PgSQL インターフェイスについて話しているのですか?

次のようにスキーマ (テーブルスペース) を一覧表示します。

\dn

次のように、スキーマ (テーブルスペース) 内のすべてのテーブルを一覧表示します。

\dn <table_space>.*

使用する

\?

より多くのオプション

于 2011-10-17T10:23:49.470 に答える