Linux下MysqlDatabase Backup和恢複全攻略

來源:互聯網
上載者:User

標籤:

很多使用者都有過丟失寶貴資料的經曆,隨著大量的資料被存入到MySQL資料庫中,再加上錯誤地使用DROP DATABASE命令、系統崩潰或對錶結構進行編輯等操作,都可能釀成災難性的損失。所以對MySQL資料庫進行備份,以備在出現意外時及時進行恢複是非常必要的。

一、 使用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日誌將反應事務執行的原時間。

    5 其他方法

    對於一個標準安裝的MySQL,通過二進位日誌完全恢複任何時刻丟失的資料是一件非常簡單、快捷的事情。當然,如果無法忍受使用該方法的要求,比如在進行恢複操作時要鎖住其他使用者等,也可以使用其他方法來保護資料:

    使用Mysql複製技術
    http://dev.mysql.com/doc/mysql/en/replication.html
    使用mysql叢集技術
    http://dev.mysql.com/doc/mysql/en/ndbcluster.html

    參考文獻:
    Backing up your MySQL data (作者: Mayank Sharma)
    http://www.linux.com/articles/41313
    Point-in-Time Data Recovery (Russell Dyer)
    http://dev.mysql.com/tech-resources/articles/point_in_time_recovery.html

Linux下MysqlDatabase Backup和恢複全攻略

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.