程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 備份數據庫

備份數據庫

編輯:關於MYSQL數據庫

定期的備份可使我們數據庫崩潰造成的損失大大降低。

在MySQL中進行數據備份的方法有兩種,一種是使用mysqldump程序,一種是使用mysqlhotcopy、cp、tar或cpio等打包程序直接拷貝數據庫文件。mysqldump程序備份數據庫較慢,但它生成的文本文件便於移植。使用MySQLhotcopy等程序備份速度快,因為它直接對系統文件進行操作,需人為協調數據庫數據的備份前後一致性。

本文由網頁教學網(http://www.webjx.com)整理發布!轉載請注明出處,謝謝!

使用MySQLdump備份數據庫其實就是把數據庫轉儲成一系列CREATE TABLE和INSERT語句,通過這些語句我們就可重新生成數據庫。使用MySQLdump的方法如下:

% MySQLdump --opt testdb | gzip > /data/backup/testdb.bak
#--opt選項會對轉儲過程進行優化,生成的備份文件會小一點,後的管道操作會進行數據壓縮
% MySQLdump --opt testdb mytable1,mytable2 | gzip > /data/backup/testdb_mytable.bak
#可在數據庫後接數據表名,只導出指定的數據表,多個數據表可用逗號分隔
   
--opt選項還可激活--add-drop-table選項,它將會在備份文件的每條CREATE TABLE前加上一條DROP TABLE IF EXISTS語句。這可方便進行數據表的更新,而不會發生“數據表已存在”的錯誤。

用MySQLdump命令還可直接把數據庫轉移到另外一台服務器上,不用生成備份文件。重復執行可定期更新遠程數據庫。

% MySQLadmin -h remote_host create testdb
% mysqldump --opt testdb | MySQL -h remote_host testdb
另外還可通過ssh遠程調用服務器上的程序,如:
% ssh remote_host MySQLadmin create testdb
% mysqldump --opt testdb | ssh remote_host MySQL testdb
通過直接拷貝系統文件的方式備份數據庫,在備份時,要確保沒有人對數據庫進行修改操作。要做到這點,最好關閉服務器。如果不能關閉的,要以只讀方試鎖定有關數據表。下面是一些示例:

% cp -r db /backup/db                 #備份db數據庫到/backup/db目錄
% cp table_name.* /backup/db          #只備份table_name數據表
% scp -r db remotehot:/usr/local/MySQL/data      #用scp把數據庫直接拷貝到遠程服務器
   
在把數據庫直接拷貝到遠程主機時,應注意兩台機器必須有同樣的硬件結構,或者將拷貝的數據表全部是可移植數據表類型。

使用MySQLhotcopy工具,它是一個Perl DBI腳本,可在不關閉服務器的情況下備份數據庫,它主要的優點是:

它直接拷貝文件,所以它比MySQLdump快。

可自動完成數據鎖定工作,備份時不用關閉服務器。

能刷新日志,使備份文件和日志文件的檢查點能保持同步。

下面是該工具的使用示例:

% MySQLhotcopy db  /bakcup/                 #把db數據庫備份到backup/db目錄裡,會自動創建一個db目錄
使用BACKUP TABLE語句進行備份,該語句最早出現在MySQL 3.23.25版本中,僅適用於MyISAM數據表。用法如下:

MySQL> BACKUP TABLE mytable TO '/backup/db';         #把mytable數據表備份到/backup/db目錄下
為了執行該語句,你必須擁有那些表的FILE權限和SELECT權限,備份目錄還必須是服務器可寫的。該語句執行時,會先把內存中的數據寫入磁盤,再把各個數據表的.frm(表結構定義文件)、.MYD(數據)文件從數據目錄拷貝到備份目錄。它不拷貝.MYI(索引)文件,因為它能用另外兩個文件重建。BACKUP TABLE語句備份時,依次鎖定數據表,當同時備份多個數據表時,數據表可能會被修改,所以備份0完成時,備份文件中的數據和現時數據表中的數據可能會有差異,為了消除該差異,我們可用只讀方式鎖定數據表,在備份完成後再解鎖。如:

MySQL> LOCK TABLES tb1 READ,tb2 READ;
MySQL> BACKUP TABLE tb1,tb2 TO 'backup/db';
MySQL> UNLOCK TABLES;
使用BACKUP TABLE語句備份的數據表可用RESTORE TABLE重新加載到服務器。

InnoDB和BDB數據庫也可用MySQLdump和直接拷貝法進行備份。使用直接拷貝法時應注意需把組成InnoDB和BDB數據庫的所有文件都拷貝下來,如InnoDB的.frm文件、日志文件和表空間配置文件;BDB的數據文件、日志文件等。

使用鏡像機制進行備份,我們可用SLAVE STOP語句掛起從服務器的鏡像,在從服務器上通過直接拷貝法或其它工具制作備份。備份完成,用SLAVE START重新啟動鏡像,從服務器重新與主服務器同步,接收備份時主服務器所做的修改。

在MySQL中沒有為數據庫重命名的命令,但我們可用MySQLdump轉儲數據庫,再創建一個新的空數據庫,把轉儲文件加載到該新數據庫,這樣就完成數據庫重命名的工作。如:

% MySQLdump old_db >db.sql          #轉儲db數據庫數據
% MySQLadmin create new_db          #新建一個空的數據庫
% MySQL new_db < db.sql             #把db數據庫的數據加載到新的數據庫中
% MySQLadmin drop old_db            #刪除舊的數據庫
一個更簡單的重命名數據庫的方法是直接修改數據庫目錄名,但該方法不適用於InnoDB和BDB數據庫。注意,在更名後,需在權限表中更新相關數據表信息,需執行以下語句:

MySQL> UPDATE db SET db='new_db' WHERE db='old_db';
MySQL> UPDATE tables_priv SET db='new_db' WHERE db='old_db';
MySQL> UPDATE columns_priv SET db='new_db' WHERE db='old_db';
MySQL> UPDATE host SET db='new_db' WHERE db='old_db';

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved