Estou tentando criar um cronjob para fazer backup do meu banco de dados todas as noites antes que algo catastrófico aconteça. Parece que este comando deve atender às minhas necessidades:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
Exceto depois de executar isso, ele espera que eu digite uma senha. Eu não posso fazer isso se o executar no cron. Como posso passar um automaticamente?
bash
postgresql
shell
crontab
mpen
fonte
fonte
Respostas:
Crie um
.pgpass
arquivo no diretório inicial da conta quepg_dump
será executada como. Veja a documentação do Postgresql libpq-pgpass para detalhes do formato (incluindo o último parágrafo onde explica que será ignorado se você não definir o modo0600
).fonte
sudo su postgres
: esse usuário Unix não existe necessariamente. Não precisa. Mas o usuário do banco de dados deve.Ou você pode configurar o crontab para executar um script. Dentro desse script, você pode definir uma variável de ambiente como esta:
export PGPASSWORD="$put_here_the_password"
Dessa forma, se você tiver vários comandos que exigiriam senha, poderá colocá-los todos no script. Se a senha mudar, você precisará alterá-la apenas em um lugar (o script).
E eu concordo com Joshua, usando
pg_dump -Fc
gera o formato de exportação mais flexível e já está compactado. Para mais informações, consulte: documentação pg_dumpPor exemplo
fonte
.pgpass
também manterá tudo em um só lugar, sem adicionar uma camada extra de indireção. além disso, se tudo o que eu queria fazer com a exportação de uma variável, eu faria isso no meu.bashrc
arquivo, ou seja o que for..pgpass
arquivo seria uma solução melhor. Eu estava apenas dando uma alternativa, não tenho certeza se ele merece uma downvote embora :)Se você quiser fazer isso em um comando:
fonte
postgres://
sintaxe. Não tentei o.pgpass
porque meu usuário do postgress não tem diretório inicial.Para um one-liner, como migrar um banco de dados, você pode usar
--dbname
seguido por uma cadeia de conexão (incluindo a senha), conforme indicado no manual pg_dumpEm essência.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Nota: Certifique-se de usar a opção em
--dbname
vez da mais curta-d
e use um prefixo de URI válidopostgresql://
oupostgres://
.O formulário URI geral é:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
A melhor prática no seu caso (tarefa repetitiva no cron) não deve ser feita devido a problemas de segurança. Se não fosse o
.pgpass
arquivo, eu salvaria a cadeia de conexão como uma variável de ambiente.export MYDB=postgresql://username:[email protected]:5432/mydatabase
então tenha no seu crontab
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
fonte
fonte
Esse liner me ajuda a criar o despejo de um único banco de dados.
fonte
A resposta de Joseph Alexander Ibarra funciona no centos 7 e na versão 9.5 se --dbname não for passado.
fonte
--dbname
Observe que, no Windows, o
pgpass.conf
arquivo deve estar na seguinte pasta:se não houver
postgresql
pasta dentro da%APPDATA%
pasta, crie-a.o
pgpass.conf
conteúdo do arquivo é algo como:Felicidades
fonte
Corrija-me se eu estiver errado, mas se o usuário do sistema for o mesmo que o usuário do banco de dados, o PostgreSQL não solicitará a senha - ele depende do sistema para autenticação. Isso pode ser uma questão de configuração.
Assim, quando eu queria o proprietário do banco de dados
postgres
para backup de seus bancos de dados todas as noites, eu poderia criar um crontab para ele:crontab -e -u postgres
. Obviamente,postgres
seria necessário executar tarefas cron; portanto, ele deve estar listado/etc/cron.allow
ou/etc/cron.deny
estar vazio.fonte
Faça backup do ssh com senha usando credenciais temporárias .pgpass e envie para o S3:
Apenas substitua o primeiro par de linhas de configuração pelo que você precisar - obviamente. Para aqueles que não estão interessados na parte de backup do S3, retire-o - obviamente.
Esse script exclui as credenciais
.pgpass
posteriormente porque, em alguns ambientes, o usuário SSH padrão pode executar o sudo sem uma senha, por exemplo, uma instância do EC2 com oubuntu
usuário, portanto, o uso.pgpass
com uma conta de host diferente para proteger essas credenciais pode ser inútil.fonte
history
dessa maneira, não?history -c
. Ao utilizar com Jenkins, use aInject passwords to the build as environment variables
opção para que a senha é mascaradoConforme detalhado nesta publicação , existem duas maneiras de fornecer uma senha de maneira não interativa aos utilitários do PostgreSQL, como o comando "pg_dump": usando o arquivo ".pgpass" ou a variável de ambiente "PGPASSWORD" .
fonte
Outra maneira (provavelmente não segura) de passar a senha é usar o redirecionamento de entrada, ou seja, chamar
pg_dump [params] < [path to file containing password]
fonte
Você pode passar uma senha diretamente para o pg_dump usando o seguinte:
fonte
da maneira mais fácil na minha opinião, isso: você edita seu arquivo de configuração principal do postgres: pg_hba.conf, você deve adicionar a seguinte linha:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
e depois disso, você precisa iniciar o cron assim:
pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz
e funcionou sem senha
fonte