您好,登錄后才能下訂單哦!
這篇“PostgreSQL備份和恢復自動化的方法”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“PostgreSQL備份和恢復自動化的方法”文章吧。
這種轉儲方法背后的想法是使用 SQL 命令從 DataCenter1 生成一個文本文件,當反饋到 DataCenter2 服務器時,將重新創建與轉儲時相同狀態的數據庫。在這種情況下,如果客戶端無法訪問主服務器,他們可以訪問 BCP 服務器。PostgreSQL 為此提供了實用程序 pg_dump。該命令的基本用法是: pg_dump dbname >backupoutputfile.db。
如您所見,pg_dump 將其結果寫入標準輸出。下面,我們將看到這如何有用。
pg_dump 是一個常規的 PostgreSQL 客戶端應用程序。這意味著您可以從任何有權訪問數據庫的遠程主機執行此備份過程。pg_dump 不以特殊權限運行。特別是,它必須對您要備份的所有表具有讀訪問權限,因此在實踐中,您幾乎總是必須以數據庫超級用戶身份運行它。
pg_dump 創建的轉儲在內部是一致的,也就是說,轉儲代表 pg_dump 開始運行時數據庫的快照。pg_dump 在工作時不會阻止對數據庫的其他操作。(具有排他鎖的例外,例如大多數形式的 ALTER TABLE。)
重要提示:如果您的數據庫模式依賴于 OID(例如作為外鍵),您必須指示 pg_dump 也轉儲 OID。為此,請使用 -o 命令行選項。
首先,創建劇本 pgbackup.yml
創建角色 pgbackup,它將從 pgbackup.yml 中調用
Pgbackup.yml
---
- hosts: database_prim:database_replica
gather_facts: true
vars_files:
- mysecret_vars/{{ environ }}.yml
# This is to Identify if DB is Primary and replicating data to secondary
tasks:
- name: select pg status
command: psql -c "SELECT pg_is_in_recovery();"
register: IsPromoted
changed_when: False
environment:
PGDATABASE: "{{ pg_database }}"
PGUSER : "{{ pg_username }}"
PGPASSWORD : "{{ pg_password }}"
#Get the DB parameter from run time on Client application, Not required if you have parameters
- block:
- name: Get client database settings
shell: "awx-manage print_settings | grep '^DATABASES'"
register: results
changed_when: False
delegate_to: "{{ groups['client’][0] }}"
- name: Ingest client database settings
set_fact:
client_db_settings: "{{ results.stdout | regex_replace('DATABASES\\s+= ', '') }}"
delegate_to: "{{ groups['client'][0] }}"
- include_role:
name: pgbackup
when: "'f' in IsPromoted.stdout"
tags: pgbackup
pgbackup 角色
---
- name: Determine the timestamp for the backup.
set_fact:
now: '{{ lookup("pipe", "date +%F-%T") }}'
- name: Create a directory for a backup to live.
file:
path: '{{ backup_dir.rstrip("/") }}/{{ now }}/'
mode: 0775
owner: root
state: directory
- name: Create a directory for non-instance specific backups
file:
path: '{{ backup_dir.rstrip("/") }}/common/'
mode: 0775
owner: root
state: directory
# create dump, Here adding runtime param. You can add param whatever ways
- name: Perform a PostgreSQL dump.
shell: "pg_dump --clean --create --host='{{ client_db_settings.default.HOST }}' --port={{ client_db_settings.default.PORT }} --username='{{ tower_db_settings.default.USER }}' --dbname='{{ tower_db_settings.default.NAME }}' > pgbackup.db"
args:
chdir: '{{ backup_dir.rstrip("/") }}/common/'
environment:
PGPASSWORD: "{{ client_db_settings.default.PASSWORD }}"
- name: Copy file with owner and permissions
copy:
src: '{{ backup_dir.rstrip("/") }}/common/pgbackup.db'
dest: '{{ backup_dir.rstrip("/") }}/{{ now }}/'
remote_src: yes
庫存文件
[all:vars]
# database settings
.linux.us.ams1907.com
[client]
linuxclient.us.com
[database_prim]
linuxmas.us.com
[database_replica]
linuxreplica.us.com
秘密變量存儲:如果要存儲任何加密數據,請創建此文件
mysecret_vars/{{ environ }}.yml
ansible-vault encrypt mysecretvar.yml
存儲此類參數:pg_password、pg_username 和 pg_database
pg_dump 創建的文本文件旨在由 psql 程序讀取。恢復轉儲的一般命令形式是 psql dbname < infile
在數據中心 2 中恢復
Infile 是您用作 pg_dump 命令的備份輸出文件的文件。該命令不會創建數據庫 dbname,因此您必須在執行 psql 之前從 template0 自己創建它(例如,使用 createdb -T template0 dbname)。psql 支持類似于 pg_dump 的選項,用于指定要連接的數據庫服務器和要使用的用戶名。有關更多信息,請參閱 psql 參考頁。
在還原 SQL 轉儲之前,擁有對象或被授予轉儲數據庫中對象權限的所有用戶必須已經存在。如果不這樣做,則還原將無法重新創建具有原始所有權和/或權限的對象。
無論哪種方式,您都將擁有一個僅部分恢復的數據庫。或者,您可以指定整個轉儲應作為單個事務恢復,以便完全完成或完全回滾恢復。這種模式可以通過將 -1 或 --single-transaction 命令行選項傳遞給 psql 來指定。使用此模式時,請注意,即使是最小的錯誤也可能回滾已運行數小時的還原。但是,這可能仍然比在部分還原轉儲后手動清理復雜數據庫更可取。
創建 pgrecover.yml
為 pgrecover 創建角色
pgrecover.yml
- hosts: database_prim[0]
tasks:
- name: Get client database settings
shell: "awx-manage print_settings | grep '^DATABASES'"
register: results
changed_when: False
delegate_to: "{{ groups['client'][0] }}"
- name: Ingest client database settings
set_fact:
tower_db_settings: "{{ results.stdout | regex_replace('DATABASES\\s+= ', '') }}"
delegate_to: "{{ groups['client'][0] }}"
# Create User
- name: PostgreSQL | Create test user if its not there
postgresql_user:
name: "test"
password: "{{ client_db_settings.default.PASSWORD }}"
port: "5432"
state: present
login_user: "postgres"
no_password_changes: no
become: yes
become_user: "postgres"
become_method: su
# Create Database
- name: PostgreSQL | Create test Database if its not there
postgresql_db:
name: "test"
owner: "test"
encoding: "UTF-8"
lc_collate: "en_US.UTF-8"
lc_ctype: "en_US.UTF-8"
port: "5432"
template: "template0"
state: present
login_user: "postgres"
become: yes
become_user: "postgres"
become_method: su
- include_role:
name: pgrecover
現在 pgreceover 角色
---
- name: Create a directory for non-instance specific backups
file:
path: '{{ backup_dir.rstrip("/") }}/restore/'
mode: 0775
owner: root
state: directory
- name: Copy file for restore
copy:
src: '{{ backup_dir.rstrip("/") }}/common/client.db'
dest: '{{ backup_dir.rstrip("/") }}/restore/'
remote_src: yes
- name: Perform a PostgreSQL restore
shell: "psql --host='{{ client_db_settings.default.HOST }}' --port={{ client_db_settings.default.PORT }} --username='{{ client_db_settings.default.USER }}' --dbname='test' < ./client.db"
args:
chdir: '{{ backup_dir.rstrip("/") }}/restore/'
environment:
PGPASSWORD: "{{ client_db_settings.default.PASSWORD }}"
庫存和秘密變量文件將與我們在 pgbackup 流程中的相同。
pg_dump 一次只轉儲一個數據庫,它不會轉儲有關角色或表空間的信息(因為它們是集群范圍的而不是每個數據庫的)。為了支持方便地轉儲數據庫集群的全部內容,提供了 pg_dumpall 程序。pg_dumpall 備份給定集群中的每個數據庫,還保留集群范圍的數據,例如角色和表空間定義。該命令的基本用法是:
pg_dumpall > 輸出文件
可以使用 psql 恢復生成的轉儲: psql -f infile Postgres。
(實際上,您可以指定任何現有的數據庫名稱作為開始,但是如果您要重新加載到一個空集群中,那么通常應該使用 Postgres。)在恢復 pg_dumpall 轉儲時始終需要具有數據庫超級用戶訪問權限,因為那是需要恢復角色和表空間信息。如果您使用表空間,請注意轉儲中的表空間路徑是否適合新安裝。
pg_dumpall 通過發出命令來重新創建角色、表空間和空數據庫,然后為每個數據庫調用 pg_dump。這意味著雖然每個數據庫將在內部保持一致,但不同數據庫的快照可能不會完全同步。
通過在自動化腳本中實現微小的更改,您可以將其更改為 pg_dumpall。
以上就是關于“PostgreSQL備份和恢復自動化的方法”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。