用例实际上是使用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/

10-16 17:36
查看更多