上雲連載4:資料庫備份與恢復

本文首發鏈接:上雲連載:資料庫備份與恢復

本文是「上雲連載」第四篇,在開始部署 Flask 應用環境之前,我們先把原先伺服器上的資料庫備份導出,並在騰訊雲 CVM 上完成資料庫恢復工作。

由於我在開發「編程派」網站時使用的是 PostgreSQL,因此本文所說的資料庫備份和恢復操作,均是針對 PostgreSQL 而言的。如果你使用的是其他類型資料庫,請參考相關的文檔。

資料庫備份

PostgreSQL 號稱是世界上最先進的開源資料庫。從我對國外 Python 社區有限的了解來看,國外 Python 開發者對該資料庫非常推崇,PyCon US 上經常請這方面的專家來普及資料庫使用知識。我記得當初選擇 PostgreSQL 也是因為聽了某個演講說 Python 和 PostgreSQL 二者如何契合。

有關 PostgreSQL 的具體介紹,請見官方文檔。我們接下來通過 SSH 登陸到舊伺服器,然後在用戶根目錄下使用 pg_dump 命令備份資料庫:

pg_dump -C -Fp -f dump.sql -U postgres some_database_namen

有關 pg_dump 命令的詳情,請看文檔。我這裡對上述命令做個簡單解釋。

pg_dump 是一個用於備份資料庫的工具命令,即使當前資料庫存在連接的情況下也沒有問題,不會阻塞其他用戶訪問。不過這個命令一次只能備份一個資料庫,如果想備份所有資料庫共有的全局對象,則需要使用 pg_dumpall 命令。

在這裡,pg_dump 命令生成的是一個名為 dump.sql 的腳本文件。

  • -C 選項表示在輸出的腳本中,一開始會是創建並重連到資料庫的命令。
  • -F 選項指定輸出的格式,後面跟著的 p 表示輸出純文本 SQL 腳本文件,也是默認選項。
  • -f 表示將輸出發送至指定的文件。
  • -U 表示以什麼用戶名連接到要備份的資料庫

接下來,我們通過 scp 命令將伺服器上的 dump.sql 文件保存至本地:

scp username@old-server:dump.sql /path/to/save/dump.sqln

資料庫恢復

資料庫的恢復也非常簡單,同樣只需要執行一個命令即可。但是在此之前,我們先安裝並配置好 PostgeSQL 。

scp dump.sql development:(scp username@remote:/file/to/send /where/to/put)

安裝及配置

在 Debian 系統下,請使用如下命令安裝 PostgreSQL:

sudo apt-get install postgresql-9.4n

安裝完成後,默認會新建一個名為 postgres 的系統用戶,用於管理 PostgreSQL 資料庫。我們不打算直接用該賬號,而是創建一個自己常用的。這裡,我按如下操作創建一個名為 earlgrey 的 psotgresql 賬號。

sudo su - postgresncreateuser --interactiven

根據提示輸入用戶名,並選擇合適的賬戶類型。我創建的是一個和 postgres 同級別的賬號。然後創建一個和新賬號同名的資料庫:

createdb earlgreyn

這樣,即使在登陸為 earlgrey 賬戶時,也可以使用 psql 命令進行 PostgreSQL 命令行。

進入命令行後,根據需要修改該賬號的密碼。

ALTER USER "earlgrey" WITH PASSWORD new_password;n

資料庫恢復

資料庫的安裝和配置基本完成了,接下來我們把本文第一步中備份好的 dump.sql 文件上傳至 CVM 上。

scp /path/to/dump.sql qcloud:/path/to/dump.sqln

注意,這裡我使用的是第二篇中配置好的伺服器別名,具體請參考這裡。

最後,執行下面這條命令:

psql -U earlgrey -f dump.sqln

-U 和 -f 選項的功能應該是不言自明的,具體請參考官方文檔。執行該命令後,你應該會在終端看到一系列輸出,實際上是 psql 在執行 dump.sql 文件中的一系列命令,即創建資料庫並寫入數據。

確認恢復

為了確認資料庫恢復成功,我們以 earlgrey 賬戶連接到新創建的資料庫 codingpy。

c codingpyn

然後執行 SQL 查詢語句:

SELECT id, title FROM articles WHERE title LIKE Python%;n

結語

本文中,我們完成了對編程派網站文章數據的備份和恢復。在將要部署的 Flask 應用中,我們可以通過該 URI 訪問並連接到恢復後的資料庫:

postgresql://earlgrey:new_password@localhost/codingpyn

推薦閱讀:

PostgreSQL 在國內公司應用的多嗎?
PG(PostgreSQL)在一捅到底架構中的使用

TAG:数据库备份 | PostgreSQL | Flask |