Windows下EnterpriseDB備份和恢復攻略
這里介紹的方法適用于Microsoft Windows環境下的Postgres Plus Standard Server或Postgres Plus Advanced Server數據庫。在此,我們假設您已經下載并安裝了Postgres Plus Standard Server或Postgres Plus Advanced Server。通過本文,您將了解下列內容:
- 辨別不同的備份格式;
- 選擇各種的備份和恢復選項;
- 生成純文本式的備份,并用其進行恢復操作;
- 為備份和恢復創建一個定制的歸檔。
實際上,用來備份和恢復Postgres Plus數據庫的方法和選項有很多,但是本文介紹的是使用Postgres Plus實用程序pg_dump和pg_restore來進行數據庫的備份和恢復。這兩個程序用于命令行,所以可以通過腳本的形式使用他們。
一、備份文件格式
pg_dump生成的備份文件共三種格式,如下所示:
- 純文本格式:純文本腳本文件存放的是一些結構化查詢語言語句和命令,可以供psql命令行終端程序用以重建數據庫對象并載入表數據。使用psql程序可以通過純文本備份文件來進行數據庫的恢復操作。
- 定制的歸檔格式:一個二進制文件可以用來從備份文件中恢復全部或者指定的數據庫對象。使用pg_restore程序,可以利用定制的編檔格式備份文件來恢復數據庫。
- Tar歸檔格式:利用tar歸檔文件,我們可以從備份文件中恢復全部數據庫對象或者指定的數據庫對象。使用pg_restore程序,可以利用tar歸檔格式的備份文件來恢復數據庫。
在使用psql程序恢復數據庫對象之前,我們可以使用文字編輯器編輯純文本格式的備份文件。純文本格式通常用于較小的數據庫。定制的歸檔格式的備份文件則無法編輯。不過,我們可以使用pg_restore程序從備份文件中選擇恢復哪些數據庫對象。定制的歸檔格式通常用于中到大型的,希望從備份文件中指定需要選擇性恢復數據庫對象的數據庫。
tar歸檔格式的備份文件可以利用標準Linux工具tar進行操作。就像定制的歸檔格式一樣,使用pg_restore程序我們可以從備份文件中有選擇的恢復數據庫對象。
利用pg_dump程序,我們可以對純文本或者定制的歸檔格式的備份文件進行壓縮處理,這樣能夠有效減小備份文件的尺寸。當生成純文本格式的備份文件時,默認情況下是不進行壓縮的。當生成定制的歸檔格式的備份文件時,默認配置為進行中等水平的壓縮處理。然而,pg_dump程序無法對Tar歸檔格式的備份文件進行壓縮處理。
二、備份和恢復選項
Pg_dump和pg_restore程序為我們提供了許多選項,通過它們可以控制將哪些數據庫對象保存到備份文件,從備份文件中恢復哪些數據庫對象,以及如何進行恢復。下面列出了一些選項:
- 僅轉儲或者恢復模式 (表、視圖和序列定義、約束、觸發器與函數),不轉儲或恢復表中數據(如果您當前使用的是Postgres Plus Advanced Server的話,SPL函數、過程、觸發器和軟件包也是能夠進行備份和恢復的。);
- 僅轉儲或恢復表中數據,而不包括模式;
- 轉儲或恢復屬于選中的模式的數據庫對象;
- 創建備份時,排除選中的方案;
- 轉儲或恢復選中的表;
- 創建備份時,排除選中的表;
- 允許恢復操作使用要備份的數據庫的名稱來新建數據庫,然后從這個新創的數據庫中恢復數據庫對象;
- 將數據庫對象恢復到所有的現有數據庫;
- 令被恢復的數據庫對象的屬主與制作備份時這些對象的屬主同名;
- 將進行恢復操作的用戶的角色指定為所有被恢復的數據庫對象的屬主。
假設我們想要備份一個數據庫的全部內容,并在隨后某個時間從備份文件中重建整個數據庫,這種情況在現實中經常遇到。下面我們就介紹用純文本格式的備份文件和定制的歸檔格式的備份文件來完成上述過程。
三、具體操作步驟
假定您的數據庫環境如下所示:
- 我們的數據庫要恢復到其中的數據庫集群包含的角色名稱(用戶名和組名)就是制作備份時數據庫對象的屬主。也就是說我們要制作備份(當制作備份時沒有刪除任何數據庫對象的屬主的角色)的數據庫集群與恢復的目的地是同一個數據庫集群,或者我們要恢復到一個新的數據庫集群,并且在其中添加的一組角色名稱與制作備份的數據庫集群中的角色名稱完全相同。
- 用來恢復我們的數據庫的數據庫集群中沒有與制作備份的數據庫同名的數據庫。 (如果制作備份文件的數據庫集群正好是用來恢復數據庫的數據庫集群,則數據庫制作備份之后,需要將其刪除或者改名)
讀者需要注意的是,一個數據庫集群就是由同一個Postgres Plus 實例運行的一組數據庫。一個數據庫集群通過它的ip地址和端口號唯一標識。
四、使用純文本格式的備份文件備份數據庫
下面我們詳細介紹如何使用pg_dump程序創建數據庫的純文本格式的備份文件。
***步:登錄到Postgres Plus數據庫服務器所在的計算機。在該計算機上任何有效的帳戶都可以。
第二步:下面的操作需要利用Windows命令行,所以它們都是在命令提示符窗口中鍵入的命令。
為了打開命令提示符窗口,在屏幕底部的Windows任務欄中點擊“開始”按鈕, 然后依次選擇“所有程序”、“附件”子菜單,并單擊“命令提示符”選項即可。這樣就會打開命令提示符窗口了。
▲圖 1
第三步:使用cd命令將當前工作目錄切換至Postgres Plus所在的bin目錄。
- cd C:\Program Files\PostgresPlus\8.4SS\bin
注意:如果您使用的是Postgres Plus Advanced Server的話,請將當前工作目錄通過cd命令切換至dbserver/bin。
第四步:使用具有超級用戶權限(-U選項)的角色運行pg_dump程序,使用–C來包含備份文件中的CREATE DATABASE語句,給備份文件指定的名稱(-f選項),以及用來制作備份文件的數據庫的名稱(命令行的***一個參數)。
- pg_dump -U postgres -C -f C:\Temp\sample_backup sample
上面的命令就會為數據庫sample建立一個備份文件,名為sample_backup。您可以利用Microsoft記事本程序察看sample_backup:
▲圖 2
五、從純文本格式的備份文件恢復數據庫
下面我們詳細介紹如何使用psql程序從一個純文本格式的備份文件恢復數據庫。注意:如果您使用的是Postgres Plus Advanced Server的話,那么可以使用edb-psql程序。
上面,我們為數據庫sample建立了一個純文本格式的備份文件,即sample_backup,之后我們要用它來恢復該示例數據庫。
***步:登錄到Postgres Plus數據庫服務器所在的計算機。在該計算機上任何有效的帳戶都可以。
第二步:下面的操作需要利用Windows命令行,所以它們都是在命令提示符窗口中鍵入的命令。
為了打開命令提示符窗口,在屏幕底部的Windows任務欄中點擊“開始”按鈕, 然后依次選擇“所有程序”、“附件”子菜單,并單擊“命令提示符”選項即可。這樣就會打開命令提示符窗口了。
第三步:如果想把數據庫恢復到建立備份文件的數據庫集群之外的數據庫集群的話,或者從數據庫集群中刪除了角色的話,那么要確保制作備份文件時數據庫對象屬主的所有的角色名稱都存在于用來恢復備份文件的數據庫集群中。
注意:如果制作備份文件時不知道數據庫對象屬于哪些角色,您可以使用文本編輯程序搜索ALTER object OWNER TO role語句,下面是些例子:
- ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO postgres;
- ALTER TYPE public.emp_query_type OWNER TO postgres;
- ALTER FUNCTION public.emp_comp(p_sal numeric, p_comm numeric) OWNER TO postgres;
您可以通過psql程序連接到數據庫集群,然后運行\dg命令列出當前存在于數據庫集群中的角色,如下所示:
- >cd C:\Program Files\PostgresPlus\8.4SS\bin
- >psql -d postgres -U postgres
- Password for user postgres:
- psql (8.4.1)
- WARNING: Console code page (437) differs from Windows code page (1252)
- 8-bit characters might not work correctly. See psql reference
- page "Notes for Windows users" for details.
- Type "help" for help.
- postgres=# \dg
- List of roles
- Role name | Attributes | Member of
- -----------+-------------+-----------
- postgres | Superuser | {}
- : Create role
- : Create DB
如果您需要創建角色的話,可以使用CREATE ROLE語句。注意:如果用來恢復數據庫對象的數據庫集群中沒有該數據庫對象原屬主的角色,那么當ALTER語句無法指定該屬主時,就會顯示一個出錯信息。當執行恢復操作時,該數據庫對象最終將分配給psql程序的-U選項指定的角色。
第四步:保證在用于恢復數據庫的數據庫集群中沒有與制作備份的數據庫同名的數據庫。注意:如果不知道制作備份文件的數據庫的名稱,您可以使用文本編輯程序搜索CREATE DATABASE語句,下面舉例說明:
- CREATE DATABASE sample WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE
- = 'English_United States.1252' LC_CTYPE = 'English_United States.1252';
您可以通過psql程序連接到數據庫集群,然后運行\l命令列出當前存在于數據庫集群中的數據庫,如下所示:
- >cd C:\Program Files\PostgresPlus\8.4SS\bin
- >psql -d postgres -U postgres
- Password for user postgres:
- psql (8.4.1)
- WARNING: Console code page (437) differs from Windows code page (1252)
- 8-bit characters might not work correctly. See psql reference
- page "Notes for Windows users" for details.
- Type "help" for help.
- postgres=# \l
- List of databases
- Name | Owner | Encoding | Collation | Ctype
- -----------+----------+----------+----------------------------+------------------------
- postgres | postgres | UTF8 | English_United States.1252 | English_United States
- template0 | postgres | UTF8 | English_United States.1252 | English_United States
- template1 | postgres | UTF8 | English_United States.1252 | English_United States
- (3 rows)
如果數據庫集群中的一個數據庫與用于建立備份文件的數據庫同名,那么您現在就可以使用ALTER DATABASE語句的RENAME TO選項給現有的數據庫改名,或者使用DROP DATABASE語句刪除它。
注意:在恢復操作期間,如果該數據庫集群含有一個與制作備份文件的數據庫同名的數據庫的話,那么當CREATE DATABASE語句無法用同一名稱新建數據庫時,就會顯示一個出錯信息。這時,psql程序將從現有的數據庫中的備份文件來重新創建各數據庫對象。這很可能導致生成的數據庫中包含不希望有的數據庫對象,并且數據庫設置也不正確。
第五步:使用cd命令將當前工作目錄切換至Postgres Plus所在的bin目錄。
- cd C:\Program Files\PostgresPlus\8.4SS\bin
注意:如果您使用的是Postgres Plus Advanced Server的話,請將當前工作目錄通過cd命令切換至dbserver/bin。
第六步:運行psql程序,并給出要連接(使用-d選項)的數據庫的名稱、具有超級用戶特權的角色(使用-U選項)和備份文件的目錄路徑(使用-f選項)。注意:用-d選項規定的數據庫對恢復操作沒有影響。psql程序需要先通過數據庫連接建立一個會話,然后才能處理備份文件中的SQL語句和psql命令。
- psql -d postgres -U postgres -f C:\Temp\sample_backup
這樣就會從備份文件sample_backup中重新創建數據庫sample。下面給出psql程序處理備份文件中的SQL語句和psql命令時所顯示的部分消息:
- >psql -d postgres -U postgres -f C:\Temp\sample_backup
- Password for user postgres:
- SET
- SET
- SET
- SET
- SET
- SET
- CREATE DATABASE
- ALTER DATABASE
- psql (8.4.1)
- WARNING: Console code page (437) differs from Windows code page (1252)
- 8-bit characters might not work correctly. See psql reference
- page "Notes for Windows users" for details.
- You are now connected to database "sample".
六、使用定制的歸檔格式的備份文件備份數據庫
下面我們詳細介紹如何使用pg_dump程序創建數據庫的定制的歸檔格式的備份文件。
***步:登錄到Postgres Plus數據庫服務器所在的計算機。在該計算機上任何有效的帳戶都可以。
第二步:下面的操作需要利用Windows命令行,所以它們都是在命令提示符窗口中鍵入的命令。
為了打開命令提示符窗口,在屏幕底部的Windows任務欄中點擊“開始”按鈕, 然后依次選擇“所有程序”、“附件”子菜單,并單擊“命令提示符”選項即可。這樣就會打開命令提示符窗口了。
第三步:使用cd命令將當前工作目錄切換至Postgres Plus所在的bin目錄。
- cd C:\Program Files\PostgresPlus\8.4SS\bin
注意:如果您使用的是Postgres Plus Advanced Server的話,請將當前工作目錄通過cd命令切換至dbserver/bin。
第四步:使用具有超級用戶權限(-U選項)的角色運行pg_dump程序,使用–Fc來指定定制的歸檔格式,給備份文件指定的名稱(-f選項),以及用來制作備份文件的數據庫的名稱(命令行的***一個參數)。
- pg_dump -U postgres -Fc -f C:\Temp\sample_backup sample
上面的命令就會為數據庫sample建立一個備份文件,名為sample_backup。我們不能直接觀察定制的歸檔格式的備份文件,不過可以使用pg_restore程序的- l選項來生成該備份文件的目錄:
- >pg_restore -l C:\Temp\sample_backup
- ;
- ; Archive created at Mon Nov 23 13:07:50 2009
- ; dbname: sample
- ; TOC Entries: 44
- ; Compression: -1
- ; Dump Version: 1.11-0
- ; Format: CUSTOM
- ; Integer: 4 bytes
- ; Offset: 8 bytes
- ; Dumped from database version: 8.4.1
- ; Dumped by pg_dump version: 8.4.1
- ;;
- ; Selected TOC Entries:
- ;
- 6; 2615 2200 SCHEMA - public postgres
- 1818; 0 0 COMMENT - SCHEMA public postgres
- 1819; 0 0 ACL - public postgres
- 323; 2612 16767 PROCEDURAL LANGUAGE - plpgsql postgres
- 312; 1247 16770 TYPE public emp_query_type postgres
- 19; 1255 16771 FUNCTION public emp_comp(numeric, numeric) postgres
- 20; 1255 16772 FUNCTION public emp_query(numeric, numeric, character varying) postgres
- 21; 1255 16773 FUNCTION public emp_query_caller() postgres
- 22; 1255 16774 FUNCTION public emp_sal_trig() postgres
七、從定制的歸檔格式的備份文件恢復數據庫
下面我們詳細介紹如何使用pg_restore程序從一個定制的歸檔格式的備份文件恢復數據庫。
上面,我們為數據庫sample建立了一個定制的歸檔格式的備份文件,即sample_backup,之后我們要用它來恢復該示例數據庫。
***步:登錄到Postgres Plus數據庫服務器所在的計算機。在該計算機上任何有效的帳戶都可以。
第二步:下面的操作需要利用Windows命令行,所以它們都是在命令提示符窗口中鍵入的命令。
為了打開命令提示符窗口,在屏幕底部的Windows任務欄中點擊“開始”按鈕, 然后依次選擇“所有程序”、“附件”子菜單,并單擊“命令提示符”選項即可。這樣就會打開命令提示符窗口了。
第三步:如果想把數據庫恢復到建立備份文件的數據庫集群之外的數據庫集群的話,或者從數據庫集群中刪除了角色的話,那么要確保制作備份文件時數據庫對象屬主的所有的角色名稱都存在于用來恢復備份文件的數據庫集群中。
注意,如果建立數據庫對象備份文件的時候不知道數據庫對象屬主的角色的話,可以從定制的歸檔格式的備份文件生成該備份的SQL文字版本。為此目的,可以使用pg_restore程序,唯一的參數就是該備份文件。然后您可以在文本中搜索ALTER object OWNER TO role語句。
具體如下所示:
- >cd C:\Program Files\PostgresPlus\8.4SS\bin
- >pg_restore C:\Temp\sample_backup | find "OWNER TO"
- ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO postgres;
- ALTER TYPE public.emp_query_type OWNER TO postgres;
- ALTER FUNCTION public.emp_comp(p_sal numeric, p_comm numeric) OWNER TO
- postgres;
- .
- .
- .
您可以通過psql程序連接到數據庫集群,然后運行\dg命令列出當前存在于數據庫集群中的角色,如下所示:
- >cd C:\Program Files\PostgresPlus\8.4SS\bin
- >psql -d postgres -U postgres
- Password for user postgres:
- psql (8.4.1)
- WARNING: Console code page (437) differs from Windows code page (1252)
- 8-bit characters might not work correctly. See psql reference
- page "Notes for Windows users" for details.
- Type "help" for help.
- postgres=# \dg
- List of roles
- Role name | Attributes | Member of
- -----------+-------------+-----------
- postgres | Superuser | {}
- : Create role
- : Create DB
如果您需要創建角色的話,可以使用CREATE ROLE語句。
注意:如果用來恢復數據庫對象的數據庫集群中沒有該數據庫對象原屬主的角色,那么當ALTER語句無法指定該屬主時,就會顯示一個出錯信息。當執行恢復操作時,該數據庫對象的屬主最終將由pg_restore程序的-U選項指定的角色決定。
第四步:保證在用于恢復數據庫的數據庫集群中沒有與制作備份的數據庫同名的數據庫。注意:如果不知道制作備份文件的數據庫的名稱,您可以使用pg_restore程序,加上-l選項,以備份文件作為唯一的參數來列出定制的歸檔格式的備份文件的目錄。數據庫名稱位于目錄頂部的dbname字段。
具體如下所示:
- >cd C:\Program Files\PostgresPlus\8.4SS\bin
- >pg_restore -l C:\Temp\sample_backup
- ;
- ; Archive created at Mon Nov 23 13:07:50 2009
- ; dbname: sample
- .
- .
- .
您可以通過psql程序連接到數據庫集群,然后運行\l命令列出當前存在于數據庫集群中的數據庫,如下所示:
- >cd C:\Program Files\PostgresPlus\8.4SS\bin
- >psql -d postgres -U postgres
- Password for user postgres:
- psql (8.4.1)
- WARNING: Console code page (437) differs from Windows code page (1252)
- 8-bit characters might not work correctly. See psql reference
- page "Notes for Windows users" for details.
- Type "help" for help.
- postgres=# \l
- List of databases
- Name | Owner | Encoding | Collation | Ctype
- -----------+----------+----------+----------------------------+------------------------
- postgres | postgres | UTF8 | English_United States.1252 | English_United States
- template0 | postgres | UTF8 | English_United States.1252 | English_United States
- template1 | postgres | UTF8 | English_United States.1252 | English_United States
- (3 rows)
如果數據庫集群中的一個數據庫與用于建立備份文件的數據庫同名,那么您現在就可以使用ALTER DATABASE語句的RENAME TO選項給現有的數據庫改名,或者使用DROP DATABASE語句刪除它。
注意:在恢復操作期間,如果該數據庫集群含有一個與制作備份文件的數據庫同名的數據庫的話,那么當CREATE DATABASE語句無法用同一名稱新建數據庫時,就會顯示一個出錯信息。這時,pg_restore程序將從現有的數據庫中的備份文件來重新創建各數據庫對象。這很可能導致生成的數據庫中包含不希望有的數據庫對象,并且數據庫設置也不正確。
第五步:使用cd命令將當前工作目錄切換至Postgres Plus所在的bin目錄。
- cd C:\Program Files\PostgresPlus\8.4SS\bin
注意:如果您使用的是Postgres Plus Advanced Server的話,請將當前工作目錄通過cd命令切換至dbserver/bin。
第六步:運行pg_restore程序,并給出要連接(使用-d選項)的數據庫的名稱、具有超級用戶特權的角色(使用-U選項),并用-C選項表明該恢復操作時建立一個與生成備份文件的數據庫同名的新數據庫,以及備份文件的目錄路徑。
注意:如果同選項- C一起使用的話,那么用-d選項規定的數據庫對恢復操作沒有影響。pg_restore程序需要通過數據庫連接建立一個會話,然后才能從備份文件中創建新的數據庫并恢復數據庫對象。
- pg_restore -d postgres -U postgres -C C:\Temp\sample_backup
這樣就會從備份文件sample_backup中重新創建數據庫sample。
八、小結
本文為讀者詳細介紹了在Windows系統上備份和恢復EnterpriseDB數據庫的具體操作過程。通過備份和恢復功能,我們能夠在工作的不同階段對數據庫進行備份,并在需要的時候進行相應的恢復操作。希望本文對您有所幫助。
【編輯推薦】
- 如何解決IBatis.net與MySQL連接問題
- 用Myisamchk讓MySQL數據表更健康
- MySQL數據庫的優化(上)單機MySQL數據庫的優化
- MySQL數據庫的優化(下)MySQL數據庫的高可用架構方案
- 教你調整服務器變量 適應企業個性需求