用例实际上是使用ansible
来自动化的。当数据库完全为空(内部没有表)时,我只想导入来导出数据库转储。当然,总会有执行sql语句的方法,但这是不得已的方法,我相信应该为此提供更优雅的解决方案。
据我所知, pg_restore
手册未提供此选项。
这是我计划使用ansible进行的操作:
- name: db_restore | Receive latest DB backup
shell: s3cmd --skip-existing get `s3cmd ls s3://{{ aws_bucket }}/ | grep sentry | tail -1 | awk '{print $4}'` sql.latest.tgz
args:
chdir: /root/
creates: sql.latest.tgz
- name: db_restore | Check if file exists
stat: path=/root/sql.latest.tgz
register: sql_latest
- name: db_restore | Restore latest DB backup if backup file found
shell: PGPASSWORD={{ dbpassword }} tar -xzOf /root/sentry*.tgz db.sql | psql -U{{ dbuser }} -h{{ pgsql_server }} --set ON_ERROR_STOP=on {{ dbname }}
when: sql_latest.stat.exists
ignore_errors: True
理想情况下,这应该检查数据库是否为空。没有用于此目的的ansible模块。 Google也保持沉默。当前的解决方案实际上也可以使用,当导入失败时,它将给出错误信息,而我可以忽略错误,但是看到一个错误的警报有些痛苦。
最佳答案
要将数据库视为空数据库,我们必须知道从创建时就没有添加任何内容。由于postgres不会跟踪此问题(如@Craig Ringer所述),因此我建议使用与ansible不同的方法。
因此,只需使用如下处理程序机制:
- name: Create zabbbix postgres DB
postgresql_db: name="{{zabbix_db_name}}"
notify:
- Init zabbix database
关于postgresql - PGSQL-仅在数据库完全为空时如何导入数据库转储?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29337686/