数据库服务器 之 Postgresql备份和恢复------SQL转储篇
作者:小P
來自:LinuxSir.Org
摘要: 和任何包含珍貴數據的東西一樣,PostgreSQL 數據庫也應該經常備份。備份PostgreSQL數據庫有三種方法,各種方法有利有弊,本文先講一下SQL轉儲的方法。
+++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++
您是否遇到過因為不小心而刪除了某個數據庫表,或者是存放數據庫的磁盤損壞了的情況呢?如果碰到這種情況,我相信您會覺得非常的沮喪,因為您努力了幾個星期的工作成果可能就付之東流了。和任何包含珍貴數據的東西一樣,PostgreSQL數據庫也應該經常備份。如果您將數據存放在 PostgreSQL 表中,您就可以定時的進行數據庫備份,從而避免發生上面的悲劇。PostgreSQL 自帶有內置工具來執行備份工作,而且在系統出現損壞或是意外時,您可以通過這些工具進行“回滾”,并通過以前保存的快照將系統恢復到其初始的狀態。
1. 綜述;
PostgreSQL數據庫從備份 PostgreSQL 數據有三種完全不同的方法:
SQL 轉儲
文件系統級別備份
在線備份
每種備份都有自己的優點和缺點,下面主要介紹SQl轉儲的方法;
2. 數據備份;
SQL 轉儲的方法是創建一個文本文件,這個文本里面都是 SQL 命令,當把這個文件回饋給服務器時,將重建與轉儲時狀態一樣的數據庫。
2.1 pg_dump;
PostgreSQL 自帶的內置備份工具叫做 pg_dump。這個工具是通過一系列的SQL語句讀取某個指定的數據庫并復制其中的內容,以它作為快照并用于日后的數據恢復??蛻舳说椒掌鞫说倪B接是用于執行備份工作。這些備份文件就是前面所講的快照并可以用于日后的數據恢復。而保證客戶端與服務器端的連接是執行備份所必需的。這條命令的基本用法是:
pg_dump dbname > outfile
注:在進行上述工作之前,首先請確保您具有登錄到服務器并訪問您將要備份的數據庫或表的權限。您可以通過使用PostgreSQL 命令行客戶端——psql,進行服務器登錄。在客戶端中輸入主機名(-h),用戶名(-u)和密碼(-p),以及數據庫名,然后就可以校驗您是否被授權訪問。
使用 pg_dump 非常的簡單——只需要在命令提示符后面輸入將要導出的數據庫名就可以進行備份工作了,如下例所示(根據您自己的安裝路經更改PostgreSQL 路徑):
xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/pg_dump -D -h localhost -U xiaop(用戶名) mydb(數據庫名稱) >? mydb.bak
通過上面的命令就會創建一個名為 mydb.bak的文件,文件中記錄了用于恢復數據庫的SQL命令。
正如您所見,pg_dump 把結果輸出到標準輸出。 我們下面就可以看到這樣做有什么好處。
pg_dump 是一個普通的 PostgreSQL 客戶端應用(盡管是個相當聰明的東西。)這就意味著您可以從任何可以訪問該數據庫的遠端主機上面進行備份工作。 但是請記住 pg_dump 不會以任何特殊權限運行。具體說來, 就是它必須要有您想備份的表的讀權限,因此,實際上您幾乎總是要成為數據庫超級用戶。
要聲明 pg_dump 應該以哪個用戶身份進行聯接,使用命令行選項 -h host 和 -p port。缺省主機是本地主機或您的環境變量PGHOST聲明的值。 類似,缺省端口是環境變量PGPORT或(如果它不存在的話)編譯好了的缺省值。(服務器通常有相同的缺省,所以還算方便。)
和任何其他 PostgreSQL 客戶端應用一樣, pg_dump 缺省時用與當前操作系統用戶名同名的數據庫用戶名進行聯接。要覆蓋這個名字,要么聲明 -U 選項, 要么設置環境變量PGUSER。 請注意 pg_dump 的聯接也和普通客戶應用一樣要通過客戶認證機制。
由 pg_dump 創建的備份在內部是一致的, 也就是說,在pg_dump運行的時候對數據庫的更新將不會被轉儲。 pg_dump 工作的時候并不阻塞其他的對數據庫的操作。 (但是會阻塞那些需要排它鎖的操作,比如 VACUUM FULL。)
注:: 如果您的數據庫結構依賴于 OID (比如說用做外鍵),那么您必須告訴 pg_dump 把 OID 也倒出來。 要倒 OID,可以使用 -o 命令行選項。 缺省時也不會轉儲"大對象"。如果您使用大對象,請參考 pg_dump 的命令手冊頁。
2.2 pg_dumpall;
如果您希望對整個系統中所有的數據庫進行備份的話(而不是只對某一個數據庫進行備份),您可以使用命令pg_dumpall 而不是pg_dump。執行這個命令可以對PostgreSQL 所能識別的所有的數據庫(包括其自身的系統數據庫)備份到一個文件中。下面給出了一個使用實例:
xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/pg_dumpall -D -h localhost -U xiaop(用戶名) >? all.bak???
這樣就會將localhost的所有數據庫備份到all.bak文件中了;
2.3 計劃任務;
為了保證您的備份時刻保持更新,您可以通過往cron table中加入pg_dump或者是pg_dumpall命令來定期執行備份工作。這里給出了兩個cron entries的例子。第一個是在每天凌晨3點對test數據庫進行備份,而第二個是在每個星期五的晚上9點對所有的數據庫進行備份:
xiaop@xiaop-laptop:~$ 0 3 * * * /usr/lib/postgresql/8.2/bin/pg_dump -D -h localhost -U xiaop(用戶名) mydb(數據庫名稱) > /home/xiaop/mydb.bak0 21 * *
xiaop@xiaop-laptop:~$ 5 /usr/lib/postgresql/8.2/bin/pg_dumpall -D -h localhost -U xiaop(用戶名) > /home/xiaop/all.bak
3. 從轉儲中恢復
3.1 用pg_dump恢復;
從備份中恢復數據的工作比執行備份甚至更簡單——您所要做的就是通過執行備份文件中的SQL命令來對數據庫進行恢復。如果您是使用pg_dump對某一個數據庫進行了備份,那么備份中就會有CREATE TABLE 的語句來對源表進行復制。當然,您首先要新創建一個空數據庫來存放這些數據表。您可以使用createdb 這個工具來完成這一步工作,這個工具也是PostgreSQL 套件中的一部分:
現在您就可以執行備份文件中的SQL命令來對數據庫進行恢復了, pg_dump 生成的文本文件可以由 psql 程序讀取。 從轉儲中恢復的常用命令格式是:
psql dbname < infile
如下例所示:
xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/psql -h localhost -U xiaop(用戶名) -d mydb(數據庫名稱) < mydb.bak
3.2 用pg_dumpall恢復;
如果您是使用pg_dumpall對所有的數據庫進行備份的,就沒有必要先新建一個數據庫,因為備份文件中已經包含了完成CREATE DATABASE工作的相關的調用。在這里,只需要在psql命令行客戶端中輸入對應的備份文件就可以了,而不需要指定目標數據庫:
xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/psql -h localhost -U xiaop(用戶名 ) < all.bak
一旦數據恢復完成后,您就可以登錄到服務器并查看到已恢復的數據。
3.3 ANALYZE;
一旦完成恢復,在每個數據庫上運行 ANALYZE 是明智的舉動, 這樣優化器就有有用的統計數據了。您總是可以運行 vacuumdb -a -z 來 VACUUM ANALYZE 所有數據庫;這個等效于手工運行 VACUUM ANALYZE;
4. 處理大數據庫;
4.1 輸出大數據庫;
因為 PostgreSQL 允許表的大小大于您的系統允許的最大文件大小, 可能把表轉儲到一個文件會有問題,因為生成的文件很可能比您的系統允許的最大文件大。 因為 pg_dump 輸出到標準輸出,您可以用標準的 Unix 工具繞開這個問題:
使用壓縮的轉儲. 使用您熟悉的壓縮程序,比如說 gzip。
xiaop@xiaop-laptop:~$ pg_dump mydb(數據庫名) | gzip > mydbBACK.gz
4.2 恢復大數據庫;
用下面命令恢復:
xiaop@xiaop-laptop:~$ gunzip -c mydbBACK.gz | psql mydbNEW
或者
xiaop@xiaop-laptop:~$ cat mydbBACK.gz | gunzip | psql mydbNEW
4.3 使用 split;
4.3.1 分割;
split 命令允許您用下面的方法把輸出分解成操作系統可以接受的大小。 有關split的用法可以在《文件的切分split和結合工具cat 介紹》中查詢。比如,讓每個塊大小為 1 兆字節:
4.3.2 合并;
分割后可以用下面的命令恢復:
xiaop@xiaop-laptop:~$cat filename* | psql dbname
5. 關于本文;
有關PostgreSQl數據庫備份和恢復的另外兩個方法“文件系統級別的備份”和“在線備份”,我們以后再討論,本文大部分資料都是參照中文文檔,目的是讓兄弟們查找方便一些,詳細的東西在中文文檔都有,多謝各位弟兄們指點 :)
6. 更新日志;
7. 參考文檔;
《PostgreSQL 8.1 中文文檔》
8. 相關文檔;
《PostgreSQL安裝和簡單使用》
《PostgreSQL的配置文件及用戶權限》
《PostgreSQL數據庫用戶認證》
《PostgreSQL數據庫的日常維護工作》
轉載于:https://www.cnblogs.com/licheng/archive/2008/01/23/1050116.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的数据库服务器 之 Postgresql备份和恢复------SQL转储篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大众汽车股票代码
- 下一篇: MySQL存储引擎、MyISAM、Inn