Na versão actual, o postgres vai avisar que isto não se deve fazer. Eu já fiz isto há muito tempo (comecei na 8.4), e não me lembro de aviso nenhum.
Para criar um tablespace novo, temos de criar previamente a directoria onde queremos que o tablespace se localize.
Depois executamos o sql de criação do tablespace, e o postgres vai criar um link (ou junction no Windows) na pasta DATA\pg_tblspc.
Quer isto dizer que não são criadas sub-dirs – são criados apontadores para a pasta de cada tablespace.
Ao criarmos os tablespaces dentro da pasta DATA estão a ver a confusão, certo? Estamos efectivamente a alterar a forma como o postgres gere os tablespaces, criando links/junctions que apontam para a pasta DATA. Quando quiserem usar o pg_upgrade, que vai tentar perceber a estrutura dos tablespaces, e não vai conseguir… resultando em erro de upgrade.
Se está nesta situação terá de a corrigir. Não é difícil mas como temos de alterar a estrutura e localização dos ficheiros de dados da bd é arriscado, e basta um erro para arruinar a bd. Portanto, antes de mais nada faça um snapshot da vm do postgres, ou se não é vm, faça um backup integral da bd. (better paranoid than dead)
Os tablespaces, dizem os docs, devem ser criados numa pasta cujo dono é a conta do sistema operativo que controla o serviço do postgres. No meu caso é “Network Service”.
Assim, optei por criar uma pasta para todos os meus tablespaces na dir de instalação do postgres. Isto porque em Windows, o postgres instala as versões como sub-dirs desta:
Fica à prova de apagar acidentalmente… ou pelo menos parece fazer parte da instalação o que fará pensar 2x…