部里討論新網(wǎng)站的數據庫平臺時(shí),同事提及了mysql常用的備份策略(導出sql腳本)可能在恢復的時(shí)候出現問(wèn)題,需要再仔細考察一下mysql的備份與恢復功能。上午抽空看了一下mysql手冊,做一下筆記。
1、MyISAM 表類(lèi)型的數據庫以文件的形式保存,所以直接拷貝備份與恢復即可。需要注意的是,如果要保證備份的一致性,要先對相關(guān)表執行LOCK TABLES操作(只需讀鎖定即可),然后對表執行FLUSH TABLES操作(用于確保在備份之前所有內存中的數據被寫(xiě)入硬盤(pán))。這種方式通過(guò)shell比較容易實(shí)現定期備份。
2、導出文本文件備份(sql級腳本):
這樣會(huì )在服務(wù)器上生成備份文件,需要注意的是它不能覆蓋已有文件,所以輸出的’file_name’要確保不重名?;謴蛡浞菘梢允褂?LOAD DATA INFILE 操作或 mysqlimport 工具。
3、使用 mysqldump 進(jìn)行sql級別的備份:
mysqldump 的一些主要參數(全部參數):
* –compatible=name
導出的數據將和哪種數據庫或哪個(gè)舊版本的 MySQL 服務(wù)器相兼容,值可以為 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用幾個(gè)值,用逗號將它們隔開(kāi)。
* –complete-insert,-c
導出的數據采用包含字段名的完整 INSERT 方式,也就是把所有的值都寫(xiě)在一行。這么做能提高插入效率,但是可能會(huì )受到 max_allowed_packet 參數的影響而導致插入失敗。需要謹慎使用該參數。
* –default-character-set=charset
指定導出數據時(shí)采用何種字符集,如果數據表不是采用默認的 latin1 字符集的話(huà),那么導出時(shí)必須指定該選項,否則再次導入數據后將產(chǎn)生亂碼問(wèn)題。
* –disable-keys
告訴 mysqldump 在 INSERT 語(yǔ)句的開(kāi)頭和結尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 語(yǔ)句,這能大大提高插入語(yǔ)句的速度,因為它是在插入完所有數據后才重建索引的。該選項只適合 MyISAM 表。
* –extended-insert = true|false
默認情況下,mysqldump 開(kāi)啟 –complete-insert 模式,因此不想用它的的話(huà),就使用本選項,設定它的值為 false 即可。
* –hex-blob
使用十六進(jìn)制格式導出二進(jìn)制字符串字段。如果有二進(jìn)制數據就必須使用本選項。影響到的字段類(lèi)型有 BINARY、VARBINARY、BLOB。
* –lock-all-tables,-x
在開(kāi)始導出之前,提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個(gè)全局讀鎖,并且自動(dòng)關(guān)閉 –single-transaction 和 –lock-tables 選項。
* –lock-tables
它和 –lock-all-tables 類(lèi)似,不過(guò)是鎖定當前導出的數據表,而不是一下子鎖定全部庫下的表。本選項只適用于 MyISAM 表,如果是 Innodb 表可以用 –single-transaction 選項。
* –no-create-info,-t
只導出數據,而不添加 CREATE TABLE 語(yǔ)句。
* –no-data,-d
不導出任何數據,只導出數據庫表結構。
* –opt
這只是一個(gè)快捷選項,等同于同時(shí)添加 –add-drop-tables –add-locking –create-option –disable-keys –extended-insert –lock-tables –quick –set-charset 選項。本選項能讓 mysqldump 很快的導出數據,并且導出的數據能很快導回。該選項默認開(kāi)啟,但可以用 –skip-opt 禁用。注意,如果運行 mysqldump 沒(méi)有指定 –quick 或 –opt 選項,則會(huì )將整個(gè)結果集放在內存中。如果導出大數據庫的話(huà)可能會(huì )出現問(wèn)題。
* –quick,-q
該選項在導出大表時(shí)很有用,它強制 mysqldump 從服務(wù)器查詢(xún)取得記錄直接輸出而不是取得所有記錄后將它們緩存到內存中。
* –routines,-R
導出存儲過(guò)程以及自定義函數。
* –single-transaction
該選項在導出數據之前提交一個(gè) BEGIN SQL語(yǔ)句,BEGIN 不會(huì )阻塞任何應用程序且能保證導出時(shí)數據庫的一致性狀態(tài)。它只適用于事務(wù)表,例如 InnoDB 和 BDB。本選項和 –lock-tables 選項是互斥的,因為 LOCK TABLES 會(huì )使任何掛起的事務(wù)隱含提交。要想導出大表的話(huà),應結合使用 –quick 選項。
* –triggers
同時(shí)導出觸發(fā)器。該選項默認啟用,用 –skip-triggers 禁用它。
例:
恢復的話(huà)通過(guò)mysql客戶(hù)端導入sql腳本即可:
4、使用 mysqlhotcopy 對MyISAM 表類(lèi)型的數據庫進(jìn)行備份:
mysqlhotcopy是一個(gè) PERL 程序,通過(guò) LOCK TABLES、FLUSH TABLES 和 cp 或 scp 來(lái)快速備份數據庫,是備份數據庫或單個(gè)表的最快的途徑,支持一次性拷貝多個(gè)數據庫,同時(shí)還支持正則表達,但只能用于備份 MyISAM類(lèi)型數據庫。
例:
恢復直接將備份文件拷貝到 mysqld 指定的 datadir 即可。
例:
5、啟用二進(jìn)制日志(The Binary Log)實(shí)現增量備份
二進(jìn)制日志包含了更新日志中的所有可用信息,包括了所有更新了數據或者已經(jīng)潛在更新了數據(如沒(méi)有匹配任何行的一個(gè)DELETE)的所有語(yǔ)句。語(yǔ)句以“事件”的形式保存,它描述數據更改,記錄更新數據的語(yǔ)句的執行時(shí)間信息,但不包含沒(méi)有修改任何數據的語(yǔ)句(查詢(xún)日志)。這應該是要采用的備份方法,比較靈活方便,同時(shí)它還支持主從服務(wù)器備份。手冊上說(shuō)啟用二進(jìn)制日志會(huì )使得性能有1%的下降,對我們的小應用來(lái)說(shuō),實(shí)在算不上什么,呵呵。
不過(guò),這個(gè)方式涉及到的方面有點(diǎn)多,我還在啃文檔,可能還需要做一下實(shí)驗,才能把它摸透,暫時(shí)不做筆記了。
本文除了參考mysql官方網(wǎng)站外,還參考并引用了葉金榮先生的《MySQL 備份和恢復》一文中許多內容。
(注:本筆記討論的是mysql 5.1)
聯(lián)系客服