Índice
Listagem de bancos de dados
Descarregar um banco de dados
Descarregar todos os bancos de dados
Descarregar subsídios
Excluir ou descartar um banco de dados
Excluir um Grant
Restaurar um banco de dados
Restaurar Grant
PostgreSQL é um excelente mecanismo de banco de dados alternativo ao MySQL ou MariaDB, mas gerenciar esses bancos de dados é muito diferente, especialmente para os administradores de sistema que estão acostumados a usar o MySQL a partir da linha de comando ou PHPMyAdmin. Muitos CMS e aplicativos já sabem como interagir com bancos de dados PostgreSQL, mas, como o MySQL, ainda dependem de você para manter esses bancos de dados.
Para este artigo, vamos supor que você está conectado com SSH em seu servidor como o usuário 'root' e instalou o servidor PostgreSQL com a configuração padrão, que requer conexão como o usuário 'postgres'. Portanto, a maioria dos comandos também terá a opção -U postgres. Esses comandos serão geralmente idênticos entre o CentOS e o Ubuntu na maioria das versões modernas, mas foram testados principalmente em um servidor CentOS 7 VPS e um servidor Ubuntu 16.04 executando o PostgreSQL 9.2.
A criação de bancos de dados e concessões é bastante complexa, mas se você usa cPanel, Plesk ou outro painel de controle que suporte integração com PostgreSQL, a configuração é simples. Fazer esses bancos de dados e concessões a partir da linha de comando está fora do escopo deste artigo específico, portanto, também vamos supor que você já tenha seus bancos de dados em execução e em uso.
Listar bancos de dados no PostgreSQL
Isso ajuda a saber os nomes exatos dos bancos de dados nos quais você trabalhará, além de fazer uma verificação dupla para garantir que você esteja trabalhando no servidor certo. Vamos listar os bancos de dados PostgreSQL em nossa máquina primeiro:
psql -l -U postgres
A saída para este comando é uma tabela de nomes de banco de dados, proprietários e privilégios de acesso. Usaremos dados da primeira coluna ao descrever nomes de banco de dados para comandos futuros. Para este artigo, usaremos um banco de dados chamado “database_name ”.
Se você precisar apenas de nomes de banco de dados e nenhuma outra informação, você pode eliminar o excesso de informações realizando uma consulta exata para nomes de banco de dados:
psql -U postgres -tA -c 'select datname from pg_database;'
Este comando executa um comando (descrito pelo -c flag) de selecionar o datname coluna do pg_database tabela global. O -t sinalizador lista apenas tuplas (linhas de resultado) e oculta descritores em excesso, como o cabeçalho e a contagem de resultados, e o -A sinalizador removerá o alinhamento, imprimindo um banco de dados por linha sem caracteres na frente ou atrás dos nomes. A saída desse comando é particularmente útil para criar loops para dumps de banco de dados.
Descarregar um banco de dados
O comando dump fará uma cópia completa de um banco de dados, incluindo todas as tabelas, esquemas e dados, e o armazenará em um único arquivo compactado:
pg_dump -c -Fc -U postgres database_name > database_name.psql
Existem alguns sinalizadores importantes para este comando. -c , ou –limpar , informa pg_dump para adicionar instruções DROP à saída e -Fc , ou –format=custom , compacta e organiza a saída a ser usada com pg_restore mais tarde. O formato personalizado tem a maior flexibilidade e também armazena com vantagem o backup em um único arquivo.
Descarregar todos os bancos de dados
Provavelmente seria melhor trazer cada um dos bancos de dados para seu próprio arquivo executando o comando acima várias vezes. Faremos referência ao nosso segundo comando de listagem, retirando alguns bancos de dados desnecessários, para fazer nossos dumps individuais.
for db in $(psql -U postgres -tA -c 'select datname from pg_database;' | grep -E -v “^(template1|template0|postgres)$”); do
echo $db
pg_dump -c -Fc -U postgres $db > $db.psql
done
Este loop for passará uma lista de todos os bancos de dados, exceto os templates padrão e o banco de dados postgres, para o pg_dump comando para fazer um .psql arquivo para cada um no diretório atual.
Nota:Também é possível realizar um dump de todos os bancos de dados em um único arquivo, embora com grandes conjuntos de dados, isso pode ser complicado e difícil de restaurar. Portanto, não recomendo esse método, embora seja menos complexo e possa funcionar em algumas situações.
pg_dumpall --clean -U postgres > pg.all.psql
Despejar Subsídios
As concessões são armazenadas no esquema PostgreSQL. Você pode despejar o esquema, obtendo assim todas as concessões disponíveis para o sistema, usando o comando pg_dump:
pg_dumpall -U postgres -s > pg.schema.psql
Isso despejará não apenas concessões, mas também o restante do esquema do servidor, incluindo instruções de criação de banco de dados e tabela, propriedade e associação de função e alocação de ACL – basicamente, tudo, exceto os dados.
Se você precisa apenas de usuários (funções) e concessões, você pode coletá-los usando este comando:
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' -e '^(CREATE|ALTER)\ ROLE' > pg.grants.psql
Isso aproveita o dump de esquema completo, mas usa apenas as instruções de criação de função e as instruções de concessão/revogação para reunir usuários e concessões.
Excluir ou descartar um banco de dados
Para destruir um banco de dados, a sintaxe é muito direta. Por favor, tome cuidado ao digitar este comando, pois ele não pede para você confirmar!
psql -U postgres -c ‘drop database database_name’
Se o banco de dados existir, não existirá mais. Há também um wrapper de linha de comando para esta mesma tarefa:
dropdb -U postgres database_name
Excluir uma concessão
As concessões são removidas dos usuários ao revogá-las. É importante primeiro saber quais concessões um usuário específico possui, então vamos procurá-las descartando o esquema e encontrando linhas relacionadas ao nosso usuário.
pg_dumpall -U postgres -s | egrep -e '^(REVOKE|GRANT)' | grep database_user
No meu caso, há uma concessão que se parece com isso:
GRANT ALL ON DATABASE database_name TO database_user;
Para combater isso, revogaremos o mesmo descritor:
psql -U postgres -c ‘revoke all on database database_name from database_user;’
Nota:Observe as pequenas alterações, GRANT foi alterado para REVOKE e TO foi alterado para FROM. Este comando é colocado entre aspas simples e passado para o psql com o sinalizador -c para executar o comando no PostgreSQL.
Isso substituirá a instrução GRANT original por um REVOKE no esquema. Executar o primeiro comando nesta seção novamente agora mostra apenas a linha que acabamos de passar:
REVOKE ALL ON DATABASE database_name FROM database_user;
Restaurar um banco de dados
Para bancos de dados que foram despejados usando o método pg_dump usado neste artigo, podemos restaurar esse banco de dados inteiro usando este comando:
pg_restore -U postgres -c -C -O -d database_name database_name.psql
Bastante mais bandeiras necessárias aqui! -c ou –limpar , como antes, descarta objetos de banco de dados antes de gravar do arquivo no PostgreSQL. Adicionamos isso caso não tenha sido usado para o comando dump. -C , ou –criar , fará com que o banco de dados database_name durante a restauração se ele não existir. Se o banco de dados já existir, o -c sinalizador irá destruí-lo antes de -C o recria. Em seguida, há -O , ou –sem proprietário , que remove o proprietário do banco de dados. Isso permite que um backup de qualquer fonte seja alterado para o proprietário do usuário que está fazendo a restauração, que no nosso caso é o postgres. -d database_name descreve o nome do banco de dados no qual você restaurará. Este pode ser um nome diferente daquele a partir do qual o backup foi criado, se necessário. O argumento final é o nome do nosso arquivo de backup, database_name.psql .
Restaurar uma concessão
Como todas as concessões são armazenadas em nosso arquivo pg.grants.psql, precisamos selecionar apenas o usuário que precisamos restaurar. No nosso caso, vamos restaurar database_user:
grep database_user pg.grants.psql | psql -U postgres
Como o arquivo pg.grants.psql possui funções e concessões, este comando recriará o usuário com seus privilégios e senha originais e, em seguida, concederá seu acesso aos bancos de dados e esquemas necessários.