pg_dump 是 PostgreSQL 提供的 command line 工具,可以把資料庫匯出成備份檔。這個檔案可以只包含資料庫結構、資料,或是兩者都有。
pg_dump 最大的好處就是可以讓你在不同伺服器間搬資料、當資料庫掛掉時還原,或是單純做長期存檔。要注意,這工具比較適合做邏輯備份(用 SQL 查詢),不是直接複製資料庫檔案那種物理備份。
pg_dump 指令的基本語法
要用 pg_dump 備份,只要在 terminal 下這行指令:
pg_dump -U username -d database_name -f backup_file.sql
來拆解一下這個指令的組成:
-U username— 指定你要用哪個 PostgreSQL 使用者連線資料庫。-d database_name— 指定你要備份哪個資料庫。-f backup_file.sql— 指定備份檔要存在哪裡,可以是完整路徑或相對路徑。
舉例:假設你有個資料庫叫 university,想把它備份成 university_backup.sql,指令會像這樣:
pg_dump -U postgres -d university -f university_backup.sql
這時 PostgreSQL 會問你 postgres 這個使用者的密碼,才會讓你存取資料。
小撇步: 如果你是在本機伺服器操作,不想每次都輸入密碼,可以設定 .pgpass 檔。去看一下 PostgreSQL 官方文件,有更詳細的說明。
參數與用法
pg_dump 這工具超彈性,可以用很多不同設定來備份:
- 只備份資料庫結構
如果你只想存結構(比如要在新伺服器重建),用 --schema-only 這個 flag。範例:
pg_dump -U postgres -d university --schema-only -f university_schema.sql
這樣會產生一個 SQL script,裡面只有 CREATE TABLE、CREATE INDEX 等等,沒有資料。
- 只備份資料
有時你只想存資料,不要結構,就用 --data-only:
pg_dump -U postgres -d university --data-only -f university_data.sql
這個檔案會有 INSERT INTO 指令,可以還原你的資料。
- 壓縮備份檔
如果你的資料庫很大,備份檔可能會很肥。想省空間就用 --compress 參數:
pg_dump -U postgres -d university -f university_backup.sql --compress=6
壓縮等級可以設 0(不壓縮)到 9(最強壓縮)。但壓越多,備份會花比較久。
- 匯出成 binary 格式
如果你想要還原速度快一點,可以把備份存成 binary 格式,不要 SQL script:
pg_dump -U postgres -d university -Fc -f university_backup.dump
-Fc 這個 key 代表 Custom 格式,可以用 pg_restore 來還原。
備份範例
完整備份資料庫
假設你有個資料庫叫 company,想要備份結構跟資料:
pg_dump -U postgres -d company -f company_backup.sql
只備份一張表
如果你只想存某一張表,用 -t 參數:
pg_dump -U postgres -d company -t employees -f employees_backup.sql
這個檔案只會有 employees 這張表的結構跟資料。
備份多張表
要備份多張表,就多加幾個 -t:
pg_dump -U postgres -d company -t employees -t departments -f selected_tables_backup.sql
壓縮備份
想省空間就用 --compress,或直接存成壓縮格式:
pg_dump -U postgres -d company -Fc -f company_backup_compressed.dump
實用建議
檢查備份檔大小。 如果備份檔太小,可能有問題。加上 --verbose 參數,可以看到更多備份過程細節。
自動化流程。 用 cron 或 pg_cron 來定期自動備份。記得要做好舊備份的輪替,不然硬碟會爆。
檢查備份正不正確。 把備份還原到測試伺服器,確認沒問題。
你可能會遇到的錯誤
認證錯誤。 如果你沒填對使用者或忘記密碼,pg_dump 會報錯。記得設好 .pgpass 讓它自動登入。
連線錯誤。 如果 PostgreSQL server 沒開,或資料庫名字打錯,工具就備不了份。檢查一下資料庫名稱跟 server 狀態。
權限問題。 你執行 pg_dump 的使用者要有讀取結構和資料的權限。能用 admin 角色就用 admin。
GO TO FULL VERSION