|
原著:KevinYank 翻譯:處處 |
對于內(nèi)容驅(qū)動的網(wǎng)站,設(shè)計好壞的關(guān)鍵是關(guān)系型數(shù)據(jù)庫。在這個教程中,我們已經(jīng)使用了MySQL關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)建立了我們的數(shù)據(jù)庫。對于網(wǎng)站的開發(fā)者來說,MySQL是一個較受歡迎的選擇,這不僅是因為它對于任何平臺上的非商業(yè)應(yīng)用都是免費(fèi)的,而且也因為它的架設(shè)和使用非常的簡單。正如我們在第一章中所看到的那樣,根據(jù)正確的指導(dǎo),一個新的用戶可以在不超過30分鐘的時間內(nèi)架設(shè)好一個MySQL服務(wù),并將其運(yùn)行起來(對于一個有經(jīng)驗的用戶甚至只要10分鐘!)。 如果你想做的僅僅是架設(shè)一個MySQL服務(wù)環(huán)境,以用來做一些例子和練習(xí),那么我們在第一章安裝時所使用的初始化設(shè)置對你已經(jīng)足夠了。但是,如果你是想建立一個真正的用于Web站點的數(shù)據(jù)庫--也許這個站點對于你的公司很重要--那么你還需要學(xué)習(xí)一些有關(guān)MySQL的知識。 對于作為基于Internet的企業(yè)的一部分的商業(yè)事務(wù)來說,數(shù)據(jù)的備份是很重要的。不幸的是,因為備份的工作對于一個管理員來說往往是不太感興趣的,人們總是無法認(rèn)清它的重要性,于是這方面的工作對于一個應(yīng)用程序往往不能做得“足夠好”。如果直到現(xiàn)在你還不明白“我們是不是需要備份我們的數(shù)據(jù)庫”,或者是你認(rèn)為“數(shù)據(jù)庫會和其它東西一起被備份”,那么你得好好看看這一章的內(nèi)容了。我們將會說明為什么普通的文件備份方案對于許多MySQL服務(wù)是遠(yuǎn)遠(yuǎn)不夠的,然后我們會介紹備份和恢復(fù)一個MySQL數(shù)據(jù)庫的“正確的方法”。 在第一章中,我們設(shè)置了一個MySQL服務(wù)并通過一個有口令的‘root’來連接這個數(shù)據(jù)庫。MySQL的‘root’用戶(順便提一下,不要與Unix的‘root’用戶混淆)對于所有的庫和表都有讀/寫的權(quán)限。在許多情況下,我們需要建立其它的只能訪問某些數(shù)據(jù)庫和數(shù)據(jù)表的用戶,我們還需要對這種訪問進(jìn)行限制(例如,對指定的表只能直接只讀訪問)。在這一章中,我們將學(xué)習(xí)如果使用兩個新的MySQL的命令:GRANT和REVOKE來完成這些工作。 為什么標(biāo)準(zhǔn)的備份是不夠的 此外,因為許多的數(shù)據(jù)庫必須整天地接受信息,標(biāo)準(zhǔn)的備份只能提供數(shù)據(jù)庫數(shù)據(jù)的“瞬間的”映象。如果MySQL數(shù)據(jù)庫文件被損壞,或是變得不可用,在最后一次備份之后添加的信息將會被丟失。在許多情況下,例如對于一個電子商務(wù)網(wǎng)站的處理用戶訂單的數(shù)據(jù)庫,這樣的丟失是不可容忍的。 MySQL中的工具可以對數(shù)據(jù)進(jìn)行實時的備份,而在備份進(jìn)行時,不會影響服務(wù)的效率。不幸的是,這需要你 為你的MySQL數(shù)據(jù)配置一個特殊的備份系統(tǒng)。而完全與你已制定的其它數(shù)據(jù)備份方案無關(guān)。然而,和任何一個好的備份系統(tǒng)一樣,在你真正用到它的時候,你會發(fā)現(xiàn)現(xiàn)在的麻煩是值得的。 在這一章中,我們提供的指導(dǎo)是用于一個運(yùn)行Linux或其它基于Unix的操作系統(tǒng)的計算機(jī)上的。如果你使用的是Windows,方法也基本上一樣,只是其中的有些命令必須改動。 使用mysqldump進(jìn)行數(shù)據(jù)庫備份 通過重定向mysqldump的輸出到一個文件,你可以存儲一個數(shù)據(jù)庫的“鏡像”以作為備份。下面的命令是用一個口令為mypass的root用戶連接到一個運(yùn)行在myhost上的MySQL服務(wù),并將名為dbname的數(shù)據(jù)庫的備份存儲到dbname_backup.sql文件中: 要恢復(fù)這樣的一個數(shù)據(jù)庫,只需要運(yùn)行下面的命令: 第一個命令使用mysqladmin程序建立一個數(shù)據(jù)庫。第二個命令連接到MySQL服務(wù)并使用通常的mysql程序,并將剛才得到的備份文件作為其中執(zhí)行的命令。 通過這種方法,我們可以使用mysqldump建立我們數(shù)據(jù)庫的備份。因為mysqldump通過與MySQL服務(wù)的連接產(chǎn)生這個備份,這肯定要比直接訪問MySQL數(shù)據(jù)目錄下的數(shù)據(jù)庫文件來得更為安全,因為這樣的備份可以確保是數(shù)據(jù)庫的一個有效的拷貝,而不僅僅是數(shù)據(jù)庫文件的拷貝。 剩下來的問題就是如何解決這個“鏡像”與一個不斷更新的數(shù)據(jù)庫之間的同步。要做到這一點,你需要命令服務(wù)保持一個變更日志。 利用變更日志進(jìn)行增量備份 通常的想法是維持一個變更日志,這樣當(dāng)數(shù)據(jù)庫崩潰時,你的恢復(fù)過程應(yīng)該是這樣的:首先使用備份(使用mysqldump命令產(chǎn)生),然后使用備份之后的變量日志。 你也可以使用變更日志撤消錯誤操作。例如,如果一個合作者告訴你他錯誤地使用了一個DROP TABLE命令,你可以對變更日志進(jìn)行編輯以刪除這個命令,然后使用備份和修改過的變更日志進(jìn)行恢復(fù)。通過這種方法,你甚至可以保持這次意外事故之后其它表的變化。作為預(yù)防措施,你也許還要收回你的合作者的 DROP權(quán)限(在下一部分你將看到該怎么做)。 告訴MySQL服務(wù)器維持一個變更日志是非常簡單的,你只需要在服務(wù)的命令行中增加一個選項: 上面的命令啟動MySQL服務(wù),并告訴它在服務(wù)器的數(shù)據(jù)目錄下(如果你依照第一章中指導(dǎo)配置你的服務(wù)器的話,這個目錄將是 /usr/local/mysql/var)建立名為update.001、update.002……的文件。一個新的這樣的文件將在服務(wù)器每一次刷新它的日志文件時被建立(通常,這是指服務(wù)每一次重啟動時)。如果你想將你的變更日志存儲到另一個地方(通常這是一個好主意--如果包含你的數(shù)據(jù)目錄的磁盤出了問題,你肯定不能指望它還能好好保存你的備份!),你可以指定變更日志的路徑。 但是,如果你的MySQL服務(wù)器是不間斷地工作的,在啟動MySQL服務(wù)時你也許還需要一些系統(tǒng)配置。在這種情況下,增加一個命令行選擇可能變得很困難。建立變更日志的另一個簡單的方法是在MySQL配置文件中增加相應(yīng)的選項。 如果你還不清楚"什么是MySQL配置文件",不要擔(dān)心。事實上,在此之前,我們一直沒用到過這樣的配置文件。要建立這個文件,以我們在第一章中建立的MySQL用戶(如果你是完全根據(jù)指導(dǎo)做的,這應(yīng)該是mysqlusr)登錄到Linux。使用你習(xí)慣的文本編輯器,在你的MySQL數(shù)據(jù)目錄下(除非你選擇了其它地方安裝MySQL,這應(yīng)該是指/usr/local/mysql/var)建立一個名為my.cnf的文件。在這個文件中,輸入下面一行: 當(dāng)然,你可以自由地指定你的日志文件所寫入的位置。保存這個文件并重啟你的MySQL服務(wù)。從現(xiàn)在開始,MySQL服務(wù)運(yùn)行的情況將和你在命令行中使用了--log-update選項一樣。 很明顯,對于一個服務(wù)來說,變更日志可能占用大量的空間。因為這個原因以及MySQL不能自動地在建立新的日志文件刪除舊的日志文件,你需要自己管理你的變更日志文件。例如,下面的Unix shell腳本,會刪除所有一星期以前更改的變更日志文件,然后通知MySQL刷新它的日志文件。 如果當(dāng)前的日志文件被刪除,最后一步(刷新日志文件)將建立一個新的變更日志,這意味著MySQL服務(wù)一直在線,而且在過去的一周中,沒有收到任何改變數(shù)據(jù)庫內(nèi)容的查詢。 如果你是一個有經(jīng)驗的用戶,使用“時鐘守護(hù)程序”設(shè)置一個腳本來定期(比方說,每周一次)執(zhí)行數(shù)據(jù)庫的備份并刪除舊的變更日志應(yīng)該是相當(dāng)簡單的。如果你還需要一點幫助,請教你當(dāng)?shù)氐腢nix權(quán)威。"MySQL" by Paul DuBois中的MySQL管理一章中對設(shè)置這樣的一個系統(tǒng)也有詳細(xì)的指南。 假定你已經(jīng)有了一個備份以及在此之后的變更日志的一個拷貝,恢復(fù)你的數(shù)據(jù)庫將是非常簡單的。在建立一個空數(shù)據(jù)庫后應(yīng)用我們在上一節(jié)中討論的方法導(dǎo)入備份,然后使用帶--one-database命令行選項的mysql命令導(dǎo)入變更日志。這會指示服務(wù)器僅僅運(yùn)行變更日志中與我們想要恢復(fù)的數(shù)據(jù)庫(在這個例子中是指dbname)相關(guān)的查詢: MySQL訪問控制 如果你的MySQL服務(wù)僅僅被通過PHP訪問,而用你對于將root用戶的口令告訴什么人很小心,那么root帳號可能已經(jīng)足夠了。但是,如果一個MySQL服務(wù)是被許多人共享的,(例如,一個Web主機(jī)希望對它的每一個用戶提供同一個MySQL服務(wù)),為不同的用戶設(shè)置相應(yīng)的訪問權(quán)限就顯得很重要了。 在MySQL參考手冊的第六章中詳細(xì)介紹了MySQL的訪問控制系統(tǒng)。從原理上來說,用戶的訪問是由mysql數(shù)據(jù)庫中的五個數(shù)據(jù)表來管理的:user、db、host、tables_priv和columns_priv。如果你想直接使用INSERT、UPDATE和DELETE語句來編輯這些表,我建議你先閱讀一下MySQL指南中的相關(guān)章節(jié)。而從3.22.11版本開始,MySQL提供了簡單的方法來管理用戶的訪問。使用MySQL提供的非標(biāo)準(zhǔn)的命令GRANT和REVOKE,你可以建立用戶并賦予其相應(yīng)的權(quán)限,而不必關(guān)心它在前面提到的五個表中的存儲形式。 使用GRANT 這個命令中可選的WITH GRANT OPTION部分指定了用戶可以使用GRANT/REVOKE命令將他擁有的權(quán)限賦予其他用戶。請小心使用這項功能--雖然這個問題可能不是那么明顯!例如,兩個都擁有這個功能的用戶可能會相互共享他們的權(quán)限,這也許不是你當(dāng)初想看到的。 讓我們來看兩個例子。建立一個名為dbmanager的用戶,他可以使用口令managedb從server.host.net連接MySQL,并僅僅可以訪問名為db的數(shù)據(jù)庫的全部內(nèi)容(并可以將此權(quán)限賦予其他用戶),這可以使用下面的GRANT命令: 現(xiàn)在讓我們建立一個新的名為jessica的用戶,他可以從host.net域的任意機(jī)器連接到MySQL。他可以更新數(shù)據(jù)庫中用戶的姓名和email地址,但是不需要查閱其它數(shù)據(jù)庫的信息。也就是說他對db數(shù)據(jù)庫具有只讀的權(quán)限(例如,SELECT),但是他可以對Users表的name列和email列執(zhí)行UPDATE操作。命令如下: 使用REVOKE 去除一個用戶的登錄權(quán)限大概是唯一不能使用REVOKE的。REVOKE ALL ON *.*會去除用戶的所有權(quán)限,但是他還可以登錄,要完全地刪除一個用戶,你需要在user表中刪除相應(yīng)的記錄:
答案是,你不能依賴其中的任何一種來處理任何連接。從理論上來說,如果用戶在連接時(無論是使用mysql客戶端還是使用PHP的mysql_connect函數(shù))指定了主機(jī)名,這個主機(jī)名必須與訪問控制系統(tǒng)中的記錄匹配。但是因為你也許不想強(qiáng)迫你的用戶指定主機(jī)名(事實上,mysql客戶端的用戶也許根本不會指定主機(jī)名),你最好使用下面這種工作環(huán)境。 對于用戶需要能夠從MySQL服務(wù)在其上運(yùn)行的機(jī)器上連接MySQL的情況,在MySQL訪問控制系統(tǒng)中建立兩個用戶記錄:一個使用實際的主機(jī)名(例如,username@www.host.net),另一個使用localhost(例如,username@localhost),當(dāng)然,你需要為兩個用戶分別grant/revoke所有的權(quán)限。 MySQL管理者所要面對的另一個帶有普通性的問題是一個其中的主機(jī)名使用了通配符的用戶記錄(例如,前面提到jessica@%.host.net)沒起作用。發(fā)生這種情況,一般是由于MySQL訪問控制系統(tǒng)中記錄的優(yōu)先級的問題。具體地說,越具體的主機(jī)名優(yōu)先級越高(例如,www.host.net是最具體的,%.host.net是比較具體的,而%是最不具體的)。 在一個新安裝后,MySQL訪問控制系統(tǒng)包含兩個匿名用戶記錄(它允許在當(dāng)前主機(jī)上使用任何用戶名進(jìn)行連接--這兩個記錄分別支持從localhost連接以及從服務(wù)器的實現(xiàn)的主機(jī)名進(jìn)行連接),以及兩個root用戶目錄。我們上面討論的情況發(fā)生時是由于匿名用戶目錄的優(yōu)先級比我們的新記錄高,因為他們的主機(jī)名更具體。 因為要為每個用戶維護(hù)三個用戶記錄(以及相應(yīng)的三套權(quán)限)會很麻煩,所以我們推薦你刪除匿名用戶,除非你需要用他們來完成什么特殊的應(yīng)用: 被鎖在外面? 首先,你必須關(guān)閉MySQL服務(wù)。因為通常使用的mysqladmin需要用到你忘了的口令,你只能通過殺掉服務(wù)的進(jìn)程來完成這項工作。使用ps命令或者看看服務(wù)的PID文件(在MySQL數(shù)據(jù)目錄下),確定MySQL服務(wù)的進(jìn)程的ID,然后使用下面的命令終止它: 這里<pid>是MySQL服務(wù)的進(jìn)程的ID。這樣將可以終止服務(wù)。除非絕對必要,不要使用kill -9,因為這樣有可能損壞你的表文件。如果你被迫只能這么做,下面將告訴你如何檢查和修復(fù)那些文件。 連接成功后,改變你的root口令: 現(xiàn)在一切都好了--甚至不會有人知道你干了什么。就象你雖然將鑰匙丟在了車上,而你自己也在車上一樣。 檢查和修復(fù)MySQL數(shù)據(jù)文件 MySQL參考手冊的第十五章講述了MySQL自帶的myisamchk的功能,以及如何使用它檢查和修復(fù)你的MySQL數(shù)據(jù)文件。雖然這一章對于每個想要搭建一個強(qiáng)壯的MySQL服務(wù)的人都是推薦閱讀的,我們還是有必要在這里對其中的要點進(jìn)行討論。 在我們繼續(xù)之前,你必須意識到myisamchk程序?qū)τ脕頇z查和修改的MySQL數(shù)據(jù)文件的訪問應(yīng)該是唯一的。如果MySQL服務(wù)正在使用某一文件,并對myisamchk正在檢查的文件進(jìn)行修改,myisamchk會誤以為發(fā)生了錯誤,并會試圖進(jìn)行修復(fù)--這將導(dǎo)致MySQL服務(wù)的崩潰!這樣,要避免這種情況的發(fā)生,通常我們需要在工作時關(guān)閉MySQL服務(wù)。作為選擇,你也可以暫時關(guān)閉服務(wù)以制作一個文件的拷貝,然后在這個拷貝上工作。當(dāng)你做完了以后,重新關(guān)閉服務(wù)并使用新的文件取代原來的文件(也許你還需要使用期間的變更日志)。 要檢查一個表的錯誤,只需要運(yùn)行myisamchk(在MySQL的bin目錄下)并提供文件的位置和表名,或者是表的索引文件名: 要檢查所有數(shù)據(jù)庫中的所有表,可以使用兩個通配符: 如果不帶任何選項,myisamchk將對表文件執(zhí)行普通的檢查。如果你對一個表有懷疑,但是普通的檢查不能發(fā)現(xiàn)任何錯誤,你可以執(zhí)行更徹底的檢查(但是也更慢!),這需要使用--extend-check選項: 對錯誤的檢查是沒有破壞性的,這意味著你不必?fù)?dān)心執(zhí)行對你的數(shù)據(jù)文件的檢查會使已經(jīng)存在的問題變得更糟。另一方面,修復(fù)選項,雖然通常也是安全的,但是它對你的數(shù)據(jù)文件的更改是無法撤消的。因為這個原因,我們強(qiáng)烈推薦你試圖修復(fù)一個被破壞的表文件時首先做個備份,并確保在制作這個備份之前你的MySQL服務(wù)是關(guān)閉的。 當(dāng)你試圖修復(fù)一個被破壞的表的問題時,有三種修復(fù)類型。如果你得到一個錯誤信息指出一個臨時文件不能建立,刪除信息所指出的文件并再試一次--這通常是上一次修復(fù)操作遺留下來的。 檢查和修復(fù)MySQL數(shù)據(jù)文件 如果你的表的格式文件(tblName.frm)丟失了或者是發(fā)生了不可修復(fù)的錯誤,但是你清楚如何使用相應(yīng)的CREATE TABLE語句來重新生成這張表,你可以重新生成一個新的.frm文件并和你的數(shù)據(jù)文件和索引文件(如果索引文件有問題,使用上面的方法重建一個新的)一起使用。首先制作一個數(shù)據(jù)和索引文件的拷貝,然后刪除原來的文件(刪除數(shù)據(jù)目錄下有關(guān)這個表的所有記錄)。 啟動MySQL服務(wù)并使用當(dāng)初的CREATE TABLE文件建立一個新的表。新的.frm文件應(yīng)該可以正常工作了,但是最好你還是執(zhí)行一下標(biāo)準(zhǔn)的修復(fù)(上面的第二種方法)。 結(jié)語 在本教程的倒數(shù)第二章——第九章中,我們會學(xué)習(xí)一些更復(fù)雜的SQL技術(shù)以使得我們的關(guān)系型數(shù)據(jù)庫服務(wù)器可以完成一些你之前也許從未想到過的工作。 |
煤炭網(wǎng)版權(quán)與免責(zé)聲明:
凡本網(wǎng)注明"來源:煤炭網(wǎng)m.jingweixianlan.com "的所有文字、圖片和音視頻稿件,版權(quán)均為"煤炭網(wǎng)m.jingweixianlan.com "獨(dú)家所有,任何媒體、網(wǎng)站或個人在轉(zhuǎn)載使用時必須注明"來源:煤炭網(wǎng)m.jingweixianlan.com ",違反者本網(wǎng)將依法追究責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,是本著為讀者傳遞更多信息的目的,并不意味著本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載使用時,必須保留本網(wǎng)注明的稿件來源,禁止擅自篡改稿件來源,并自負(fù)版權(quán)等法律責(zé)任。違反者本網(wǎng)也將依法追究責(zé)任。 如本網(wǎng)轉(zhuǎn)載稿件涉及版權(quán)等問題,請作者在兩周內(nèi)盡快來電或來函聯(lián)系。
網(wǎng)站技術(shù)運(yùn)營:北京真石數(shù)字科技股份有限公司、喀什中煤遠(yuǎn)大供應(yīng)鏈管理有限公司、喀什煤網(wǎng)數(shù)字科技有限公司
總部地址:北京市豐臺區(qū)總部基地航豐路中航榮豐1層
京ICP備18023690號-1 京公網(wǎng)安備 11010602010109號