Как я могу сказать, что находится в табличном пространстве Postgresql?
Я создал новое табличное пространство называется 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 8.4 на Pg 9.0, используя инструмент утилиты pg_upgrade.
таблицы выглядят так:
Name | Owner | Location | Access privileges | Description
-------------+----------+-----------------+-------------------+-------------
indexes | nobody | /data/pgindex90 | |
indexes_old | nobody | /data/pgindex84 | |
и содержимое /data / pgindex84 включает все старые индексы 8.4, плюс этот новый индекс 9.0, который pg_upgrade автоматически создал
# 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
5 ответов
Проверьте 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';
в PostgreSQL табличное пространство может использоваться любой базой данных PostgreSQL. (Если запрашивающий пользователь имеет достаточные привилегии, то есть.) Я думаю, что этот запрос
SELECT spcname, spclocation FROM pg_tablespace;
покажет вам каталог, который index_old использует в файловой системе в версии PostgreSQL через 9.1. Рыскать вокруг, чтобы увидеть, если что-то реальное на вашем пути. Однако я был бы очень осторожен в попытке удалить что-либо там, кроме использования интерфейса PostgreSQL.
In 9.2+, попробовать
select spcname, pg_tablespace_location(oid) from pg_tablespace;
в PG 10 и, возможно, немного раньше это, похоже, превратилось в:
SELECT tablename from pg_tables WHERE tablespace = 'foo';
к сожалению, существует "глобальный" вид во всех базах данных. Однако это можно сделать с помощью dblink успешно расширение вместе со следующей функцией:
create or replace function show_tablespace_objects(p_tablespace text, p_user text, p_password text)
returns table (db_name text, schema_name text, object_name text, object_type text, tablespace_name text)
as
$func$
declare
l_stmt text;
l_con_name text := 'tbs_check_conn';
l_con_string text;
l_rec record;
begin
l_stmt := $query$SELECT current_database(),
n.nspname as schema_name,
c.relname as object_name,
case c.relkind
when 'r' then 'table'
when 'i' then 'index'
when 't' then 'TOAST table'
when 'm' then 'materialized view'
when 'f' then 'foreign table'
when 'p' then 'partitioned table'
else c.relkind::text
end as object_type,
t.spcname as tablespace_name
FROM pg_class c
JOIN pg_namespace n on n.oid = c.relnamespace
JOIN pg_tablespace t ON c.reltablespace = t.oid$query$;
if p_tablespace is not null then
l_stmt := l_stmt || format(' WHERE t.spcname=%L', p_tablespace);
end if;
for l_rec in (select * from pg_database where datallowconn) loop
l_con_string := format('dbname=%L user=%L password=%L',
l_rec.datname, p_user, p_password);
return query
select *
from dblink(l_con_string, l_stmt)
as t(db_name text, schema_name text, object_name text, object_type text, tablespace_name text);
end loop;
end;
$func$
language plpgsql;
функция принимает имя табличного пространства пользователя и пароль, действительные для всех баз данных на текущем сервере.
если имя табличного пространства передается как null
все объекты, которые не находятся в табличном пространстве по умолчанию (что бы pg_global
по умолчанию установка без каких-либо дополнительных табличных пространств)
Это можно использовать так:
select *
from show_tablespace_objects('indexes_old', 'postgres', 'verysecretpassword');
мы говорим об интерфейсе PgSQL?
список схем (табличных пространств), как это:
\dn
перечислите все таблицы внутри схемы (табличное пространство) следующим образом:
\dn <table_space>.*
использовать
\?
дополнительные параметры