當前位置:編程學習大全網 - 熱門推薦 - linux 備份的數據庫怎麽恢復

linux 備份的數據庫怎麽恢復

壹、 使用mysql相關命令進行簡單的本地備份

1 mysqlldump命令

mysqldump 是采用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。

使用 mysqldump進行備份非常簡單,如果要備份數據庫” db_backup ”,使用命令:

#mysqldump –u -p phpbb_db_backup > /usr/backups/mysql/db_backup2008-1-6.sql

還可以使用gzip命令對備份文件進行壓縮:

#mysqldump db_backup | gzip > /usr/backups/mysql/ db_backup2008-1-6.sql.gz (備份後生成的sql不含建庫語句!)

只備份壹些頻繁更新的數據庫表:

## mysqldump sample_db articles comments links > /usr/backups/mysql/sample_db.art_comm_lin.2008-1-6.sql

上面的命令會備份articles, comments, 和links 三個表。

恢復數據使用命令:

#mysql –u -p db_backup </usr/backups/mysql/ db_backup2008-1-6.sql

註意使用這個命令時必須保證數據庫正在運行。

2 使用 SOURCE 語法

其實這不是標準的 SQL 語法,而是 mysql 客戶端提供的功能,例如:

# SOURCE /tmp/db_name.sql;

這裏需要指定文件的絕對路徑,並且必須是 mysqld 運行用戶(例如 nobody)有權限讀取的文件。

3 mysqlhotcopy備份

mysqlhotcopy 只能用於備份 MyISAM,並且只能運行在 linux 和Unix 和 NetWare 系統上。mysqlhotcopy 支持壹次性拷貝多個數據庫,同時還支持正則表達。以下是幾個例子:

#mysqlhotcopy -h=localhost -u=goodcjh -p=goodcjh db_name /tmp

(把數據庫目錄 db_name 拷貝到 /tmp 下)

註意,想要使用 mysqlhotcopy,必須要有 SELECT、RELOAD(要執行 FLUSH TABLES) 權限,並且還必須要能夠有讀取 datadir/db_name 目錄的權限。

還原數據庫方法:

mysqlhotcopy 備份出來的是整個數據庫目錄,使用時可以直接拷貝到 mysqld 指定的 目錄 (在這裏是 /usr/local/mysql/data/)目錄下即可,同時要註意權限的問題,另外首先應當刪除數據庫舊副本如下例:

# /bin/rm -rf /mysql-backup/**//*old

關閉mysql 服務器、復制文件、查詢啟動mysql服務器的三個步驟:

# /etc/init.d/mysqld stop

Stopping MySQL: [ OK ]

# cp -af /mysql-backup/**//* /var/lib/mysql /

# /etc/init.d/mysqld start

Starting MySQL: [ OK ]

#chown -R nobody:nobody /usr/local/mysql/data/ (將 db_name 目錄的屬主改成 mysqld 運行用戶)

二、使用網絡備份

將MYSQL數據放在壹臺計算機上是不安全的,所以應當把數據備份到局域網中其他Linux計算機中。假設Mysql服務器IP地址是:192.168.1.3。局域網使用Linux的遠程計算機IP地址是192.168.1.4;類似於windows的網絡***享,UNIX(Linux)系統也有自己的網絡***享,那就是NFS(網絡文件系統),在linux客戶端掛接(mount)NFS磁盤***享之前,必須先配置好NFS服務端。linux系統NFS服務端配置方法如下:

(1)修改 /etc/exports,增加***享目錄

/export/home/sunky 192.168.1.4(rw)

/export/home/sunky1 *(rw)

/export/home/sunky2 linux-client(rw)

註:/export/home/目錄下的sunky、sunky1、sunky2是準備***享的目錄,10.140.133.23、*、linux-client是被允許掛接此***享linux客戶機的IP地址或主機名。如果要使用主機名linux-client必須在服務端主機/etc/hosts文件裏增加linux-client主機ip定義。格式如下:

192.168.1.4 linux-client

若修改/etc/export文件增加新的***享,應先停止NFS服務,再啟動NFS服務方能使新增加的***享起作用。使用命令exportfs -rv也可以達到同樣的效果。linux客戶端掛接(mount)其他linux系統或UNIX系統的NFS***享。這裏我們假設192.168.1.4是NFS服務端的主機IP地址,當然這裏也可以使用主機名,但必須在本機/etc/hosts文件裏增加服務端ip定義。/export/home/sunky為服務端***享的目錄。如此就可以在linux客戶端通過/mnt/nfs來訪問其它linux系統或UNIX系統以NFS方式***享出來的文件了。

把MYSQL數據備份到使用Linux的遠程計算機需要在兩端都安裝NFS協議(Network File System),遠程NFS計算機安裝NFS協議後還要修改配置文件:/etc/exports,加入壹行:

/usr/backups/mysql/ 192.168.1.4 (rw, no_root_squash)

表示將/usr/backups/mysql/目錄***享。這個目錄具有遠程root用戶讀寫權限。保存NFS配置文件,然後使用命令:

#exportfs -a –r

然後重新啟動NFS服務:

#service nfsd start

遠程計算機設定後,在MYSQL服務器/mnt 目錄下建立壹個backup_share目錄:

#mkdir /mnt/backup_share

將遠程的Linux計算機的/usr/backups/mysql/目錄掛載到MYSQL服務器的/mnt/backup_share目錄下:

# mount -t nfs 192.168.1.4:/usr/backups/mysql /mnt/backup_share

將目錄掛載進來後,只要進入/mnt/backup_share 目錄,就等於到了IP地址:192.168.1.4那部NFS 計算機的/usr/backups/mysql 目錄中。下面使用mysqldump把“phpbb_db_backup”備份到遠程計算機:

# mysqldump db_backup > /mnt/backup_share/ db_backup2008-1-6.sql

自動完成網絡備份的方法:

Linux 服務器上的程序每天都在更新 MySQL 數據庫,於是就想起寫壹個 shell 腳本,結合 crontab,定時備份數據庫。建立壹個shell腳本:sample_db_backup.sh

# At the very end the $(date +%F) 自動添加備份日期

mysqldump -u <username> -p <password> -h <hostname> sample_db > /mnt/backup_share/sample_db.$(date +%F)

#un-mount the filesystem

umount /mnt/backup_share

# mount \u2013o soft 192.168.1.4:/archive /mnt/backup_share

說明:mount NFS服務器的壹個重要參數:hard (硬) mount或soft(軟)mount。

硬掛載: NFS客戶機會不斷的嘗試與NFS服務器的連接(在後臺,壹般不會給出任何提示信息),直到掛載上為止。

軟掛載:會在前臺嘗試與NFS服務器的連接,是默認的連接方式。當收到錯誤信息後終止mount嘗試,並給出相關信息。

對於到底是使用硬掛載還是軟掛載的問題,這主要取決於妳訪問什麽信息有關。例如妳是想察看NFS服務器的視頻文件時,妳絕對不會希望由於壹些意外的情況(如網絡速度壹下子變的很慢)而使系統輸出大量的錯誤信息,如果此時妳用的是硬掛載方式的話,系統就會等待,直到能夠重新與NFS 服務器建立連接傳輸信息。另外如果是非關鍵數據的話也可以使用軟掛載方式,如FTP壹些數據等,這樣在遠程機器暫時連接不上或關閉時就不會掛起妳的會話過程。

下面建立腳本文件權限:chmod +x ./sample_db_backup.sh

然後使用將此腳本加到 /etc/crontab 定時任務中:

01 5 * * 0 mysql /home/mysql/ sample_db_backup.sh

好了,每周日淩晨 5:01 系統就會自動運行 sample_db_backup.sh 文件通過網絡備份 MySQL 數據庫了。

三、實時恢復M y S Q L數據方法

在對MySQL數據和表格結構進行備份時,mysqldump是壹個非常有用的工具。然而,通常情況下,壹般壹天只備份壹次,或者在壹個特定的間隔備份壹次。如果在剛備份完成的壹段時間以內數據丟失,那麽這些數據很有可能無法恢復。有什麽方法可以對數據進行實時性地保護呢?事實上,現在有幾種方法都可以實現MySQL數據庫的實時保護。這裏介紹其中壹種,即使用二進制日誌進行數據恢復。

1 設置二進制日誌方法

要想從二進制日誌恢復數據,妳需要知道當前二進制日誌文件的路徑和文件名。壹般可以從選項文件(即my.cnf or my.ini,取決於妳的系統)中找到路徑。如果未包含在選項文件中,當服務器啟動時,可以在命令行中以選項的形式給出。啟用二進制日誌的選項為-- log-bin。要想確定當前的二進制日誌文件的文件名,輸入下面的MySQL語句:

# SHOW BINLOG EVENTS \G

2 最簡單的數據恢復

每天備份和運行二進制日誌的確是壹個在MySQL服務器中恢復數據的不錯方法。比如,可以每天在深夜使用mysqldump對數據進行備份,如果某天在數據備份完成後的壹段時間裏,由於某種原因數據丟失,可以使用以下方法來對其進行恢復。首先,停止MySQL服務器,然後使用以下命令重新啟動MySQL服務器。該命令將保證是惟壹可以訪問該數據庫服務器的人:

# /etc/init.d/mysqld stop

Stopping MySQL: [ OK ]

# mysqld --socket=/tmp/mysql_restore.sock --skip-networking

這裏, 壹socket選項將為U n i x 系統命名壹個不同的Socket文件。壹旦服務器處於獨占控制之下,就可以放心地對數據庫進行操作,而不用擔心在進行數據恢復的過程中有用戶嘗試訪問數據庫而導致更多的麻煩。進行恢復的第壹個步驟是恢復晚上備份好的dump文件:

#mysql -u root -pmypwd --socket=/tmp/mysql_restore.sock < /var/backup/20080120.sql

該命令可以將數據庫的內容恢復至晚上剛剛完成備份的內容。要恢復dump文件創建後的數據庫事務處理, 可以使用mysqlbinlog工具。如果每天晚上進行備份操作時都對日誌進行flush操作,則可以使用以下命令行工具將整個二進制日誌文件進行恢復:

mysqlbinlog /var/log/mysql/bin.123456 \

| mysql -u root -pmypwd --socket=/tmp/mysql_restore.sock

3 針對某壹時問點的恢復

對於MySQL 4.1.4,可以在mysqlbinlog語句中通過--start-date和--stop-date選項指定DATETIME格式的起止時間。假設用戶在2008-1-22上午10點執行的SQL語句刪除了壹個大的數據表,則可以使用以下命令進行恢復:要想恢復表和數據,妳可以恢復前晚上的備份,並輸入:

#mysqlbinlog --stop-date="2008-1-22 9:59:59"

/var/log/mysql/bin.123456 |

mysql -u root -pmypwd \

--socket=/tmp/mysql_restore.sock

#mysql -u root -pmypwd

該語句將恢復所有給定壹stop-date日期之前的數據。如果在執行某SQL語句數小時之後才發現執行了錯誤操作,那麽可能還需要恢復之後輸入的壹些數據。這時, 也可以通過mysqlbinlog來完成該功能:

#mysqlbinlog --start-date="2008-1-22 10:01:00" \

/var/log/mysql/bin.123456 \

| mysql -u root -pmypwd \

--socket=/tmp/mysql_restore.sock

#mysql -u root -pmypwd

在該行中,從上午10:01登錄的SQL語句將運行。組合執行前夜的轉儲文件和mysqlbinlog的兩行可以將所有數據恢復到上午10:00前壹秒鐘。妳應檢查日誌以確保時間確切。

4 使用Position進行恢復

也可以不指定日期和時間,而使用mysqlbinlog的選項--start-position和--stop-position來指定日誌位置。它們的作用與起止日選項相同,不同的是給出了從日誌起的位置號。使用日誌位置是更準確的恢復方法,特別是當由於破壞性SQL語句同時發生許多事務的時候。要想確定位置號,可以運行mysqlbinlog尋找執行了不期望的事務的時間範圍,但應將結果重新指向文本文件以便進行檢查。操作命令為:

mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00"

/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

該命令將在/tmp目錄創建小的文本文件,將顯示執行了錯誤的SQL語句時的SQL語句。妳可以用vi或者gedit文本編輯器打開該文件,尋找妳不要想重復的語句。如果二進制日誌中的位置號用於停止和繼續恢復操作,應進行註釋。用log_pos加壹個數字來標記位置。使用位置號恢復了以前的備份文件後,妳應從命令行輸入下面內容:

mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456

| mysql -u root -pmypwd

mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456

| mysql -u root -pmypwd

上面的第1行將恢復到停止位置為止的所有事務。下壹行將恢復從給定的起始位置直到二進制日誌結束的所有事務。因為mysqlbinlog的輸出包括每個SQL語句記錄之前的SET TIMESTAMP語句,恢復的數據和相關MySQL日誌將反應事務執行的原時間。

  • 上一篇:怎樣給電腦定時關機?
  • 下一篇:韓劇幸福壹星期幾集
  • copyright 2024編程學習大全網