ver - create tablespace postgresql windows
¿Cómo puedo saber qué hay en un tablespace de Postgresql? (5)
¿Estamos hablando de la interfaz PgSQL?
Listar esquemas (espacios de tabla) como este:
/dn
Enumere todas las tablas dentro de un esquema (espacio de tablas) como este:
/dn <table_space>.*
Utilizar
/?
para mas opciones
He creado un nuevo espacio de tabla llamado indexes
, y estoy tratando de eliminar el antiguo espacio de tabla indexes_old
, que solía contener algunas tablas e índices. Cuando intento eliminar el tablespace, obtengo:
=> drop tablespace indexes_old;
ERROR: tablespace "indexes_old" is not empty
Pero cuando intento ver lo que hay allí, parece que no hay tablas en ese espacio de tabla:
=> 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)
Entonces, ¿qué hay en ese espacio de tabla que me impide soltarlo?
En caso de que importe, acabo de migrar de Pg 8.4 a Pg 9.0 usando la herramienta pg_upgrade.
Los espacios de tabla se ven así:
Name | Owner | Location | Access privileges | Description
-------------+----------+-----------------+-------------------+-------------
indexes | nobody | /data/pgindex90 | |
indexes_old | nobody | /data/pgindex84 | |
y el contenido de / data / pgindex84 incluye todos los índices 8.4 antiguos, más este nuevo índice 9.0 que pg_upgrade creó automáticamente
# 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
Compruebe pg_class para ver en qué se encuentra:
SELECT
c.relname,
t.spcname
FROM
pg_class c
JOIN pg_tablespace t ON c.reltablespace = t.oid
WHERE
t.spcname = ''indexes_old'';
Desafortunadamente, hay una vista "global" en todas las bases de datos. Sin embargo, esto se puede hacer usando la extensión dblink junto con la siguiente función:
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;
La función acepta un nombre de espacio de tabla y un nombre de usuario y contraseña que son válidos para todas las bases de datos en el servidor actual.
Si el nombre del espacio de tablas se pasa como null
se enumeran todos los objetos que no están en el espacio de tablas predeterminado (eso sería pg_global
en una instalación predeterminada sin pg_global
de pg_global
adicionales)
Esto se puede utilizar de esta manera:
select *
from show_tablespace_objects(''indexes_old'', ''postgres'', ''verysecretpassword'');
En PostgreSQL, un espacio de tablas puede ser utilizado por cualquier base de datos de PostgreSQL. (Mientras el usuario solicitante tenga suficientes privilegios, es decir). Creo que esta consulta
SELECT spcname, spclocation FROM pg_tablespace;
le mostrará el directorio que index_old está usando en el sistema de archivos en la versión PostgreSQL hasta la versión 9.1. Deambula por ahí para ver si hay algo real en tu camino. Sin embargo, sería realmente cauteloso al tratar de eliminar cualquier cosa que no sea el uso de la interfaz de PostgreSQL.
En 9.2+, prueba
select spcname, pg_tablespace_location(oid) from pg_tablespace;
En la PG 10 y posiblemente un poco antes, esto parece haberse transformado en:
SELECT tablename from pg_tables WHERE tablespace = ''foo'';