Parece que todo mundo já postou perguntas em todos os lugares sobre este problema, mas ninguém tem uma resposta que valha a pena.
O caso é o seguinte o Postgres guarda o write ahead log (WAL) em um diretório chamado pg_xlog. Normalmente ele guarda um arquivo de log até pouco tempo depois de gravar as mudanças que estão nele no banco de dados, e renomeia ele para usar depois. Tudo funciona muito bem, e o diretório fica com um tamanho constante e razoavelmente pequeno.
Daí, como você gosta de segurança, você cria uma rotina de backup. A melhor forma de fazer backups do Postgres é arquivando os WALs e copiando de tempos em tempos o conteúdo do banco de dados. Então você muda o arquivo postgres.config para arquivar os wals, e cria um script que faz o arquivamento, além deste você cria um script que copia /var/lib/postgres para um lugar seguro. Por exemplo, neste servidor sempre que o Postgres acaba de usar um WAL ele roda um script que copia o arquivo para um computador na minha casa, e todas as noites o cron roda um script que sincroniza o banco de dados.
Tudo funciona muito bem, e o pg_xlog continua com um tamanho estável. Daí o marceneiro me liga e diz que a mesa o os armários do quarto onde ficam os computadores ficaram prontos, e ele está vindo montar. Meus computadores passam uma semana desligados, e o pg_xlog explode! Como o Postgres não consegue arquivar os WALs, ele não apaga nenhum. (Para ajudar, eu estava rodando uns updates beeem grandes nesta semana...) O espaço em disco acaba, e o administrador do banco fica desesperado...
Como na internet não tem muita coisa que funcione, vai aqui como resolver o problema. Se o seu servidor ainda estiver rodando, tente primeiro fazer o arquivamento voltar a funcionar. Assim que ele voltar o tamanho do diretório vai começar a diminuir. Se você não puder fazer o arquivamento funcionar (seu marceneiro é mais enrolado do que o meu, por exemplo), você pode "trapacear"; coloque /bin/true como o script de arquivamento. Você vai perder os WALs, mais não vai perder o servidor.
Agora, se o servidor não estiver mais funcionando você vai ter que fazer umas coisas bem "feias". No diretório pg_xlog tem um diretório chamado archive_status. Lá dentro tem uns arquivos com o nome dos WALs, acabando em ".ready". Se existir o arquivo XXXX.ready, isso significa que você pode apagar o arquivo XXXX no pg_xlog, então:
for i in $(ls archive_status); do echo "$i" | sed -e 's/.ready$//' | xargs rm; done
Pronto, você já tem espaço para rodar o Postgres de novo. Mude o script de arquivamento para /bin/true e ative o Postgres por algum tempo. Quando ele achar que arquivou todos os WALs, mude o script para o seu script normal, e reinicie o Postgres. Verifique se o arquivamento está funcionando normalmente.
Se o arquivamento não se comportar direito, faça um dump completo do seu banco de dados, porque a coisa vai ser feia mesmo. Encerre o Postgres pelo pg_ctl (verifique se ele encerrou sem erro, NÃO USE SIGINT ou SIGKILL), mova todos os arquivos do pg_xlog e archive_status para outro lugar, e rode pg_resetxlog. Inicie o Postgres, ele deve funcionar normalmente. Se não funcionar, bem você agora tem um backup...