Try   HackMD

比较 pg_dump 和 pg_basebackup

tags: chatgpt

試比較 pg_dump 及 pg_basebackup

pg_dump 和 pg_basebackup 是用於將 PostgreSQL 數據庫備份的工具,它們之間有幾個區別:

  • 備份類型
    pg_dump 使用 SQL 語句將數據庫備份到文本文件中,並且僅備份數據和表結構。另一方面,pg_basebackup 將整個數據庫備份為二進制文件集,包括數據、表結構、索引、配置文件等。

  • 備份方法
    pg_dump 是一種邏輯備份,它通過查詢數據庫並生成 SQL 語句來備份數據。pg_basebackup 是物理備份,它通過復制數據文件和日誌文件來備份整個數據庫。

  • 效能
    pg_dump 對於小型數據庫非常有效,因為它使用文本格式進行備份,可以快速生成和還原。但是,對於大型數據庫,備份和還原時間可能會非常長。pg_basebackup 對於大型數據庫非常有效,因為它可以快速備份整個數據庫,但是由於它生成二進制文件,因此對於還原而言比較耗時。

  • 還原
    使用 pg_dump 備份的數據需要通過 SQL 語句進行還原,還原時間取決於數據量大小和數據庫的複雜度。使用 pg_basebackup 備份的數據可以直接通過將文件集還原到新的數據庫中,還原時間取決於文件大小和磁盤 I/O 速度。

總體而言,pg_dump 和 pg_basebackup 都是非常有效的備份工具,選擇哪一種取決於您的需求和環境。如果您需要備份整個數據庫並且對備份和還原時間比較敏感,則使用 pg_basebackup 會更好;如果您只需要備份數據和表結構並且對還原時間沒有太高的要求,那麼使用 pg_dump 可能更適合。

pg_basebackup 較之 pg_dump 有哪些優點

pg_basebackup 和 pg_dump 都是 PostgreSQL 數據庫的備份工具,它們的優點和缺點各不相同。以下是 pg_basebackup 較 pg_dump 的優點:

  • 數據完整性
    使用 pg_basebackup 進行備份可以保證備份數據的完整性,包括表結構、索引、數據和其他元數據。這是因為 pg_basebackup 是物理備份,它直接從磁盤上復制數據文件,不需要經過 SQL 語句的轉換,所以數據完整性更高。

  • 備份效率
    使用 pg_basebackup 進行備份可以提高備份效率,尤其是對於大型數據庫。因為 pg_basebackup 是物理備份,它只需要復制數據文件和日誌文件,所以速度較快。

  • 還原效率
    使用 pg_basebackup 進行還原可以提高還原效率,尤其是對於大型數據庫。因為 pg_basebackup 是物理備份,它只需要復制數據文件和日誌文件,所以還原速度較快。

  • 適用範圍
    使用 pg_basebackup 進行備份適用於復雜的數據庫,包括大型數據庫、高並發數據庫、有復雜關係的數據庫等。因為 pg_basebackup 可以保證數據完整性並且速度較快,所以它更適合這些複雜的數據庫。

總之,pg_basebackup 較 pg_dump 的優點在於數據完整性更高、備份和還原效率更高、適用範圍更廣。但是,使用 pg_basebackup 進行備份也有一些缺點,例如文件大小較大、還原時間較長等。因此,在選擇備份工具時,需要根據具體情況進行選擇。

AWS RDS 上的資料庫能使用 pg_basebackup 嗎

在 AWS RDS 上運行的 PostgreSQL 資料庫實例可以使用 pg_basebackup 進行備份,但是,需要注意以下幾點:

  • AWS RDS 上的資料庫實例是一個托管的服務,您無法直接訪問該實例的操作系統,因此不能直接運行 pg_basebackup 命令。您需要使用 AWS RDS 提供的 API 或控制台來進行備份。

  • AWS RDS 使用 Amazon EBS(Elastic Block Store)作為持久存儲,因此您需要在備份期間停止實例並創建一個快照,以創建一個基於快照的備份。您可以通過 AWS RDS 控制台或 API 來創建快照。

  • 如果您需要定期備份,您可以使用 AWS RDS 提供的自動備份功能,該功能可以自動在指定的時間點創建備份並存儲在 Amazon S3 中。

總之,AWS RDS 上的 PostgreSQL 資料庫實例可以使用 pg_basebackup 進行備份,但需要通過 AWS RDS 提供的 API 或控制台進行操作。另外,建議使用 AWS RDS 提供的自動備份功能進行定期備份。

使用已安裝的 AWS CLI v2 下以 pg_basebackup 對 RDS 進行備份,假設 host 為 dbinstance.ap-south-1.rds.amazonaws.com、user 為 xxx、password 為 yyy、port 為 5432;備份完後將備份檔存儲在 s3://zzz

以下是在已安裝 AWS CLI v2 的情況下使用 pg_basebackup 對 RDS 進行備份的步驟:

  1. 首先,使用以下命令安裝 AWS CLI v2:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

安裝過程中需要輸入 sudo 權限的密碼。

  1. 然後,使用以下命令進行身份驗證,輸入您的 AWS 訪問密鑰 ID 和密鑰密碼。
aws configure

設置完成後,您可以使用 AWS CLI v2 來訪問您的 AWS 賬戶。

  1. 接下來,使用以下命令創建 RDS 快照:
aws rds create-db-snapshot \
--db-instance-identifier dbinstance \
--db-snapshot-identifier my-snapshot

這將創建名為 my-snapshot 的 RDS 快照。

  1. 然後,使用以下命令創建基於快照的備份文件:
pg_basebackup \
-h dbinstance.ap-south-1.rds.amazonaws.com \
-p 5432 \
-U xxx \
-Ft \
-D \
/tmp/mybackup.tar

這將使用 pg_basebackup 命令從 RDS 實例中創建一個基於快照的備份文件。這將創建一個名為 mybackup.tar 的文件,並將其保存在 /tmp 目錄下。

  1. 最後,使用以下命令將備份文件上傳到 Amazon S3:
aws s3 cp /tmp/mybackup.tar s3://zzz/

這將使用 AWS CLI v2 將備份文件上傳到名為 zzz 的 S3 存儲桶中。

總之,以上步驟演示了如何使用 AWS CLI v2 和 pg_basebackup 對 RDS 進行備份,並將備份文件上傳到 Amazon S3 中。請注意,在實際使用中,需要根據您的具體情況修改命令中的參數。

上述創建基於快照備份文件的命令 pg_basebackup... 若在自動化過程中遇到詢問密碼怎麼辦

如果在使用 pg_basebackup 命令時需要輸入密碼,可以使用以下其中一種方式來解決這個問題:

  1. 在 RDS 資料庫上為所使用的用戶名建立一個不需要密碼的 trust 身份驗證,以允許該用戶連接而不需要密碼。這可以在 RDS 控制台中完成,或使用以下 SQL 命令:
ALTER USER username CONNECTION LIMIT 0;

其中, username 為使用 pg_basebackup 命令的用戶名。

  1. 使用 .pgpass 文件來存儲資料庫密碼,以便在 pg_basebackup 命令中自動提供密碼。.pgpass 文件可以包含以下內容:
hostname:port:database:username:password

其中,hostnameportdatabaseusername 以及 password 分別為 RDS 資料庫的相應參數。文件中的每一行都對應一個資料庫,可以存儲多行。然後使用以下命令設置 .pgpass 文件的權限:

chmod 0600 ~/.pgpass

設置完權限後,在使用 pg_basebackup 命令時就不再需要輸入密碼了。

使用以上其中一種方法來處理 pg_basebackup 命令中詢問密碼的問題,可以使自動化過程更加流暢且無需人工干預。

在資安考量下我們不能這樣做,請給我更佳的實踐

在資安考量下,確實不能將明文密碼存儲在 .pgpass 文件中或其他地方,這樣會增加密碼外洩的風險。為了更好地保護資料庫密碼,可以考慮使用以下方法來解決 pg_basebackup 命令中詢問密碼的問題:

  • 使用 IAM 身份驗證:在 AWS RDS 中,可以使用IAM身份驗證來獲取認證,而不需要在本地存儲資料庫的認證信息。具體而言,可以使用 AWS Security Token Service(STS)來創建一個短期IAM角色,並將其與用於運行 pg_basebackup 的IAM用戶帳戶相關聯。然後,在執行 pg_basebackup 命令時,可以使用 aws rds generate-db-auth-token 命令來獲取短期 IAM 角色的認證令牌,並將其用作 pg_basebackup 命令中的密碼。這樣可以在不暴露明文密碼的情況下備份 AWS RDS 資料庫。

  • 使用 TLS/SSL:如果您正在使用加密的連接(例如,使用TLS/SSL),您可以在 pg_basebackup 命令中使用 --sslmode 選項來指定使用加密連接。這樣可以加密所有資料流,包括資料庫密碼,從而減少了外洩的風險。

  • 使用第三方工具:還有一些第三方工具(例如,WAL-G 或 Barman)可以使用與 pg_basebackup 類似的方式來備份 AWS RDS 資料庫。這些工具通常提供更高級的功能,例如增量備份,以及對S3的直接備份支持,從而更好地保護敏感數據。這些工具通常適用於大型的生產環境。

綜上所述,為了更好地保護 AWS RDS 資料庫中的敏感數據,您可以使用 IAM 身份驗證、TLS/SSL,或者第三方工具來備份資料庫,以避免在本地存儲明文密碼。

我見過有人在命令前面設置環境變數,難道這方法在 pg_basebackup 上不可行?

設置環境變數可能是一個可行的解決方案,可以避免在命令行中暴露密碼。在 AWS RDS 上,您可以將資料庫密碼存儲在 Secrets Manager 中,然後使用 aws secretsmanager 命令在命令前設置環境變數,將其作為 PGPASSWORD 環境變數的值。然後,當 pg_basebackup 命令運行時,它將自動使用環境變數中的密碼來驗證對資料庫的訪問,而不需要在命令行中指定密碼。

以下是一個範例命令,使用 aws secretsmanager 命令來獲取資料庫密碼,並將其存儲在 PGPASSWORD 環境變數中:

export PGPASSWORD=$(aws secretsmanager get-secret-value --secret-id MyDatabaseSecret --query SecretString --output text | jq -r '.password')

pg_basebackup -h dbinstance.ap-south-1.rds.amazonaws.com -p 5432 -U xxx -D /path/to/backup/folder -Ft -z

請注意,此命令需要先安裝 jq 命令,以解析 Secrets Manager 中的 JSON 格式密碼。

雖然這種方法可以有效地保護資料庫密碼,但在一些情況下,這種方法也可能存在一些安全風險。例如,如果您的系統中存在其他具有高級權限的用戶帳戶,他們可能會查看環境變數中存儲的密碼。因此,在實現此方法之前,請先考慮您的安全需求,以選擇最合適的方法。

TL;DR

改成

PGPASSWORD=$(aws secretsmanager get-secret-value --secret-id MyDatabaseSecret --query SecretString --output text | jq -r '.password') pg_basebackup -h dbinstance.ap-south-1.rds.amazonaws.com -p 5432 -U xxx -D /path/to/backup/folder -Ft -z

會不會比較簡單,同時兼顧到資安

是的,您所提供的命令可以更簡潔地設置環境變數並運行 pg_basebackup 命令,同時保護資料庫密碼。這種方法避免了在命令行中直接指定密碼,因此更加安全。