MySQL 管理
對(duì)于內(nèi)容驅(qū)動(dòng)的網(wǎng)站,設(shè)計(jì)好壞的關(guān)鍵是關(guān)系型數(shù)據(jù)庫。在這個(gè)教程中,我們已經(jīng)使用了MySQL關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)建立了我們的數(shù)據(jù)庫。對(duì)于網(wǎng)站的開發(fā)者來說,MySQL是一個(gè)較受歡迎的選擇,這不僅是因?yàn)樗鼘?duì)于任何平臺(tái)上的非商業(yè)應(yīng)用都是免費(fèi)的,而且也因?yàn)樗募茉O(shè)和使用非常的簡單。正如我們?cè)诘谝徽轮兴吹降哪菢?,根?jù)正確的指導(dǎo),一個(gè)新的用戶可以在不超過30分鐘的時(shí)間內(nèi)架設(shè)好一個(gè)MySQL服務(wù),并將其運(yùn)行起來(對(duì)于一個(gè)有經(jīng)驗(yàn)的用戶甚至只要10分鐘!)。如果你想做的僅僅是架設(shè)一個(gè)MySQL服務(wù)環(huán)境,以用來做一些例子和練習(xí),那么我們?cè)诘谝徽掳惭b時(shí)所使用的初始化設(shè)置對(duì)你已經(jīng)足夠了。但是,如果你是想建立一個(gè)真正的用于Web站點(diǎn)的數(shù)據(jù)庫--也許這個(gè)站點(diǎn)對(duì)于你的公司很重要--那么你還需要學(xué)習(xí)一些有關(guān)MySQL的知識(shí)。
對(duì)于作為基于Internet的企業(yè)的一部分的商業(yè)事務(wù)來說,數(shù)據(jù)的備份是很重要的。不幸的是,因?yàn)閭浞莸墓ぷ鲗?duì)于一個(gè)管理員來說往往是不太感興趣的,人們總是無法認(rèn)清它的重要性,于是這方面的工作對(duì)于一個(gè)應(yīng)用程序往往不能做得“足夠好”。如果直到現(xiàn)在你還不明白“我們是不是需要備份我們的數(shù)據(jù)庫”,或者是你認(rèn)為“數(shù)據(jù)庫會(huì)和其它東西一起被備份”,那么你得好好看看這一章的內(nèi)容了。我們將會(huì)說明為什么普通的文件備份方案對(duì)于許多MySQL服務(wù)是遠(yuǎn)遠(yuǎn)不夠的,然后我們會(huì)介紹備份和恢復(fù)一個(gè)MySQL數(shù)據(jù)庫的“正確的方法”。
在第一章中,我們?cè)O(shè)置了一個(gè)MySQL服務(wù)并通過一個(gè)有口令的‘root'來連接這個(gè)數(shù)據(jù)庫。MySQL的‘root'用戶(順便提一下,不要與Unix的‘root'用戶混淆)對(duì)于所有的庫和表都有讀/寫的權(quán)限。在許多情況下,我們需要建立其它的只能訪問某些數(shù)據(jù)庫和數(shù)據(jù)表的用戶,我們還需要對(duì)這種訪問進(jìn)行限制(例如,對(duì)指定的表只能直接只讀訪問)。在這一章中,我們將學(xué)習(xí)如果使用兩個(gè)新的MySQL的命令:GRANT和REVOKE來完成這些工作。
在一些情況下,例如由于電源的問題,MySQL數(shù)據(jù)庫可能被損壞。這樣的損壞并不總是意味著必須使用備份來恢復(fù)。我們將會(huì)學(xué)習(xí)到如果利用MySQL數(shù)據(jù)庫的檢查和修復(fù)功能來解決簡單的數(shù)據(jù)庫損壞。
為什么標(biāo)準(zhǔn)的備份是不夠的
和Web服務(wù)器一樣,絕大多數(shù)的MySQL服務(wù)器也必須不間斷地在線。這使得MySQL數(shù)據(jù)庫的備份顯得很重要。因?yàn)镸ySQL服務(wù)使用cache和緩沖區(qū)來提高對(duì)存儲(chǔ)在磁盤上的數(shù)據(jù)庫文件更新的效率,所以文件的內(nèi)容和當(dāng)前數(shù)據(jù)庫的內(nèi)容可能并不完全一致。而標(biāo)準(zhǔn)的備份程序僅僅包括對(duì)系統(tǒng)和數(shù)據(jù)文件的拷貝,這種對(duì)MySQL數(shù)據(jù)文件的備份并不能完全滿足我們的需要,因?yàn)樗鼈儾荒鼙WC拷貝的文件可以在系統(tǒng)崩潰時(shí)的確能夠正常地使用。
此外,因?yàn)樵S多的數(shù)據(jù)庫必須整天地接受信息,標(biāo)準(zhǔn)的備份只能提供數(shù)據(jù)庫數(shù)據(jù)的“瞬間的”映象。如果MySQL數(shù)據(jù)庫文件被損壞,或是變得不可用,在最后一次備份之后添加的信息將會(huì)被丟失。在許多情況下,例如對(duì)于一個(gè)電子商務(wù)網(wǎng)站的處理用戶訂單的數(shù)據(jù)庫,這樣的丟失是不可容忍的。
MySQL中的工具可以對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)的備份,而在備份進(jìn)行時(shí),不會(huì)影響服務(wù)的效率。不幸的是,這需要你 為你的MySQL數(shù)據(jù)配置一個(gè)特殊的備份系統(tǒng)。而完全與你已制定的其它數(shù)據(jù)備份方案無關(guān)。然而,和任何一個(gè)好的備份系統(tǒng)一樣,在你真正用到它的時(shí)候,你會(huì)發(fā)現(xiàn)現(xiàn)在的麻煩是值得的。
在這一章中,我們提供的指導(dǎo)是用于一個(gè)運(yùn)行Linux或其它基于Unix的操作系統(tǒng)的計(jì)算機(jī)上的。如果你使用的是Windows,方法也基本上一樣,只是其中的有些命令必須改動(dòng)。
使用mysqldump進(jìn)行數(shù)據(jù)庫備份
除了mysqld以外,MySQL服務(wù)器以及mysql(MySQL的客戶端),在安裝時(shí)還會(huì)產(chǎn)生很多有用的程序。例如,在前面,我們已經(jīng)看到的mysqladmin,就是負(fù)責(zé)控制和搜集有關(guān)正在運(yùn)行的MySQL服務(wù)的信息的程序。
mysqldump是另一個(gè)這樣的程序。當(dāng)它運(yùn)行時(shí),它會(huì)連接到一個(gè)MySQL服務(wù)(就和mysql程序和PHP語言所做的一樣)并下載指定的數(shù)據(jù)庫的全部內(nèi)容。然后它會(huì)輸出一系列的SQL的CREATE TABLE命令和INSERT命令,在一個(gè)空的MySQL數(shù)據(jù)庫中運(yùn)行這些命令,就可以建立與當(dāng)初的數(shù)據(jù)庫內(nèi)容完全一樣的一個(gè)MySQL數(shù)據(jù)庫。
通過重定向mysqldump的輸出到一個(gè)文件,你可以存儲(chǔ)一個(gè)數(shù)據(jù)庫的“鏡像”以作為備份。下面的命令是用一個(gè)口令為mypass的root用戶連接到一個(gè)運(yùn)行在myhost上的MySQL服務(wù),并將名為dbname的數(shù)據(jù)庫的備份存儲(chǔ)到dbname_backup.sql文件中:
% mysqldump -h myhost -u root -pmypass dbname > dbname_backup.sql
要恢復(fù)這樣的一個(gè)數(shù)據(jù)庫,只需要運(yùn)行下面的命令:
% mysqladmin -h myhost -u root -pmypass create dbname
% mysql -h myhost -u root -pmypass dbname 第一個(gè)命令使用mysqladmin程序建立一個(gè)數(shù)據(jù)庫。第二個(gè)命令連接到MySQL服務(wù)并使用通常的mysql程序,并將剛才得到的備份文件作為其中執(zhí)行的命令。
通過這種方法,我們可以使用mysqldump建立我們數(shù)據(jù)庫的備份。因?yàn)閙ysqldump通過與MySQL服務(wù)的連接產(chǎn)生這個(gè)備份,這肯定要比直接訪問MySQL數(shù)據(jù)目錄下的數(shù)據(jù)庫文件來得更為安全,因?yàn)檫@樣的備份可以確保是數(shù)據(jù)庫的一個(gè)有效的拷貝,而不僅僅是數(shù)據(jù)庫文件的拷貝。
剩下來的問題就是如何解決這個(gè)“鏡像”與一個(gè)不斷更新的數(shù)據(jù)庫之間的同步。要做到這一點(diǎn),你需要命令服務(wù)保持一個(gè)變更日志。
利用變更日志進(jìn)行增量備份
正如我們前面提到的,在很多情況下,我們使用的MySQL數(shù)據(jù)庫會(huì)造成數(shù)據(jù)的丟失--甚至有的時(shí)候會(huì)丟失很重要的數(shù)據(jù)。在這樣的情況下,我們必須找到一種方法保持我們使用上面介紹的方法用mysqldump制作的備份與當(dāng)前數(shù)據(jù)庫之間的同步。而解決方案就是讓MySQL服務(wù)維持一個(gè)更新日志。一個(gè)更新日志是一個(gè)關(guān)于所有數(shù)據(jù)庫接受到的可能改變數(shù)據(jù)庫內(nèi)容的查詢的記錄。這將包括INSERT、UPDATE和CREATE TABLE語句,但是不包括SELECT語句。
通常的想法是維持一個(gè)變更日志,這樣當(dāng)數(shù)據(jù)庫崩潰時(shí),你的恢復(fù)過程應(yīng)該是這樣的:首先使用備份(使用mysqldump命令產(chǎn)生),然后使用備份之后的變量日志。
你也可以使用變更日志撤消錯(cuò)誤操作。例如,如果一個(gè)合作者告訴你他錯(cuò)誤地使用了一個(gè)DROP TABLE命令,你可以對(duì)變更日志進(jìn)行編輯以刪除這個(gè)命令,然后使用備份和修改過的變更日志進(jìn)行恢復(fù)。通過這種方法,你甚至可以保持這次意外事故之后其它表的變化。作為預(yù)防措施,你也許還要收回你的合作者的 DROP權(quán)限(在下一部分你將看到該怎么做)。
告訴MySQL服務(wù)器維持一個(gè)變更日志是非常簡單的,你只需要在服務(wù)的命令行中增加一個(gè)選項(xiàng):
% safe-mysqld --log-update=update
上面的命令啟動(dòng)MySQL服務(wù),并告訴它在服務(wù)器的數(shù)據(jù)目錄下(如果你依照第一章中指導(dǎo)配置你的服務(wù)器的話,這個(gè)目錄將是/usr/local/mysql/var)建立名為update.001、update.002……的文件。一個(gè)新的這樣的文件將在服務(wù)器每一次刷新它的日志文件時(shí)被建立(通常,這是指服務(wù)每一次重啟動(dòng)時(shí))。如果你想將你的變更日志存儲(chǔ)到另一個(gè)地方(通常這是一個(gè)好主意--如果包含你的數(shù)據(jù)目錄的磁盤出了問題,你肯定不能指望它還能好好保存你的備份!),你可以指定變更日志的路徑。
但是,如果你的MySQL服務(wù)器是不間斷地工作的,在啟動(dòng)MySQL服務(wù)時(shí)你也許還需要一些系統(tǒng)配置。在這種情況下,增加一個(gè)命令行選擇可能變得很困難。建立變更日志的另一個(gè)簡單的方法是在MySQL配置文件中增加相應(yīng)的選項(xiàng)。
如果你還不清楚"什么是MySQL配置文件",不要擔(dān)心。事實(shí)上,在此之前,我們一直沒用到過這樣的配置文件。要建立這個(gè)文件,以我們?cè)诘谝徽轮薪⒌腗ySQL用戶(如果你是完全根據(jù)指導(dǎo)做的,這應(yīng)該是mysqlusr)登錄到Linux。使用你習(xí)慣的文本編輯器,在你的MySQL數(shù)據(jù)目錄下(除非你選擇了其它地方安裝MySQL,這應(yīng)該是指/usr/local/mysql/var)建立一個(gè)名為my.cnf的文件。在這個(gè)文件中,輸入下面一行:
[mysqld]log-update=/usr/backups/mysql/update
當(dāng)然,你可以自由地指定你的日志文件所寫入的位置。保存這個(gè)文件并重啟你的MySQL服務(wù)。從現(xiàn)在開始,MySQL服務(wù)運(yùn)行的情況將和你在命令行中使用了--log-update選項(xiàng)一樣。
很明顯,對(duì)于一個(gè)服務(wù)來說,變更日志可能占用大量的空間。因?yàn)檫@個(gè)原因以及MySQL不能自動(dòng)地在建立新的日志文件刪除舊的日志文件,你需要自己管理你的變更日志文件。例如,下面的Unix shell腳本,會(huì)刪除所有一星期以前更改的變更日志文件,然后通知MySQL刷新它的日志文件。
#! /bin/sh
find /usr/backups/mysql/ -name "update.[0-9]*"
-type f -mtime +6 | xargs rm -f
/usr/local/mysql/bin/mysqladmin -u root
-ppassword flush-logs
如果當(dāng)前的日志文件被刪除,最后一步(刷新日志文件)將建立一個(gè)新的變更日志,這意味著MySQL服務(wù)一直在線,而且在過去的一周中,沒有收到任何改變數(shù)據(jù)庫內(nèi)容的查詢。
如果你是一個(gè)有經(jīng)驗(yàn)的用戶,使用“時(shí)鐘守護(hù)程序”設(shè)置一個(gè)腳本來定期(比方說,每周一次)執(zhí)行數(shù)據(jù)庫的備份并刪除舊的變更日志應(yīng)該是相當(dāng)簡單的。如果你還需要一點(diǎn)幫助,請(qǐng)教你當(dāng)?shù)氐腢nix權(quán)威。'MySQL' by Paul DuBois中的MySQL管理一章中對(duì)設(shè)置這樣的一個(gè)系統(tǒng)也有詳細(xì)的指南。
假定你已經(jīng)有了一個(gè)備份以及在此之后的變更日志的一個(gè)拷貝,恢復(fù)你的數(shù)據(jù)庫將是非常簡單的。在建立一個(gè)空數(shù)據(jù)庫后應(yīng)用我們?cè)谏弦还?jié)中討論的方法導(dǎo)入備份,然后使用帶--one-database命令行選項(xiàng)的mysql命令導(dǎo)入變更日志。這會(huì)指示服務(wù)器僅僅運(yùn)行變更日志中與我們想要恢復(fù)的數(shù)據(jù)庫(在這個(gè)例子中是指dbname)相關(guān)的查詢:
% mysql -u root -ppassword --one-database dbname % mysql -u root -ppassword --one-database dbname ...
MySQL訪問控制
在這個(gè)教程的早些時(shí)候,我們?cè)?jīng)提到一個(gè)叫做mysql的數(shù)據(jù)庫,在每一個(gè)MySQL服務(wù)中都包含這個(gè)數(shù)據(jù)庫,它是用來保存用戶的相關(guān)信息、他們的口令以及他們的權(quán)限的。但是,在此之前,我們一直使用root用戶登錄到MySQL服務(wù),這個(gè)用戶可以訪問所有的數(shù)據(jù)庫和數(shù)據(jù)表。
如果你的MySQL服務(wù)僅僅被通過PHP訪問,而用你對(duì)于將root用戶的口令告訴什么人很小心,那么root帳號(hào)可能已經(jīng)足夠了。但是,如果一個(gè)MySQL服務(wù)是被許多人共享的,(例如,一個(gè)Web主機(jī)希望對(duì)它的每一個(gè)用戶提供同一個(gè)MySQL服務(wù)),為不同的用戶設(shè)置相應(yīng)的訪問權(quán)限就顯得很重要了。
在MySQL參考手冊(cè)的第六章中詳細(xì)介紹了MySQL的訪問控制系統(tǒng)。從原理上來說,用戶的訪問是由mysql數(shù)據(jù)庫中的五個(gè)數(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)心它在前面提到的五個(gè)表中的存儲(chǔ)形式。
使用GRANT
GRANT命令用來建立新用戶,指定用戶口令并增加用戶權(quán)限。其格式如下:
mysql> GRANT
-> TO
-> [WITH GRANT OPTION];
正如你看到的,在這個(gè)命令中有許多待填的內(nèi)容。讓我們逐一地對(duì)它們進(jìn)行介紹,并最終給出一些例子以讓你對(duì)它們的協(xié)同工作有一個(gè)了解。
數(shù)據(jù)庫/數(shù)據(jù)表/數(shù)據(jù)列權(quán)限:
ALTER: 修改已存在的數(shù)據(jù)表(例如增加/刪除列)和索引。
CREATE: 建立新的數(shù)據(jù)庫或數(shù)據(jù)表。
DELETE: 刪除表的記錄。
DROP: 刪除數(shù)據(jù)表或數(shù)據(jù)庫。
INDEX: 建立或刪除索引。
INSERT: 增加表的記錄。
SELECT: 顯示/搜索表的記錄。
UPDATE: 修改表中已存在的記錄。
全局管理權(quán)限:
FILE: 在MySQL服務(wù)器上讀寫文件。
PROCESS: 顯示或殺死屬于其它用戶的服務(wù)線程。
RELOAD: 重載訪問控制表,刷新日志等。
SHUTDOWN: 關(guān)閉MySQL服務(wù)。
特別的權(quán)限:
ALL: 允許做任何事(和root一樣)。
USAGE: 只允許登錄--其它什么也不允許做。
這些權(quán)限所涉及到的MySQL的特征,其中的一些我們至今還沒看到,而其中的絕大部分是你所熟悉的。
這個(gè)命令中可選的WITH GRANT OPTION部分指定了用戶可以使用GRANT/REVOKE命令將他擁有的權(quán)限賦予其他用戶。請(qǐng)小心使用這項(xiàng)功能--雖然這個(gè)問題可能不是那么明顯!例如,兩個(gè)都擁有這個(gè)功能的用戶可能會(huì)相互共享他們的權(quán)限,這也許不是你當(dāng)初想看到的。
讓我們來看兩個(gè)例子。建立一個(gè)名為dbmanager的用戶,他可以使用口令managedb從server.host.net連接MySQL,并僅僅可以訪問名為db的數(shù)據(jù)庫的全部內(nèi)容(并可以將此權(quán)限賦予其他用戶),這可以使用下面的GRANT命令:
mysql> GRANT ALL ON db.*
-> TO dbmanager@server.host.net
-> IDENTIFIED BY "managedb"
-> WITH GRANT OPTION;
現(xiàn)在改變這個(gè)用戶的口令為funkychicken,命令格式如下:
mysql> GRANT USAGE ON *.*
-> TO dbmanager@server.host.net
-> IDENTIFIED BY "funkychicken";
請(qǐng)注意我們沒有賦予任何另外的權(quán)限(the USAGE權(quán)限只能允許用戶登錄),但是用戶已經(jīng)存在的權(quán)限不會(huì)被改變。
現(xiàn)在讓我們建立一個(gè)新的名為jessica的用戶,他可以從host.net域的任意機(jī)器連接到MySQL。他可以更新數(shù)據(jù)庫中用戶的姓名和email地址,但是不需要查閱其它數(shù)據(jù)庫的信息。也就是說他對(duì)db數(shù)據(jù)庫具有只讀的權(quán)限(例如,SELECT),但是他可以對(duì)Users表的name列和email列執(zhí)行UPDATE操作。命令如下:
mysql> GRANT SELECT ON db.*
-> TO jessica@%.host.net
-> IDENTIFIED BY "jessrules";
mysql> GRANT UPDATE (name,email) ON db.Users
-> TO jessica@%.host.net;
請(qǐng)注意在第一個(gè)命令中我們?cè)谥付↗essica可以用來連接的主機(jī)名時(shí)使用了%(通配符)符號(hào)。此外,我們也沒有給他向其他用戶傳遞他的權(quán)限的能力,因?yàn)槲覀冊(cè)诿畹淖詈鬀]有帶上WITH GRANT OPTION。第二個(gè)命令示范了如何通過在賦予的權(quán)限后面的圓括號(hào)中用逗號(hào)分隔的列的列表對(duì)特定的數(shù)據(jù)列賦予權(quán)限。
使用REVOKE
正如你所預(yù)期的那樣,REVOKE命令是用來去除一個(gè)用戶以前被賦予的權(quán)限的。命令的語法如下:
mysql> REVOKE
-> ON
這個(gè)命令中各部分的功能和在上面的GRANT命令中時(shí)一樣。要去除Jessica的合作者的DROP權(quán)限(例如,如果他經(jīng)常錯(cuò)誤地刪除數(shù)據(jù)庫和表),你可以使用下面的命令:
mysql> REVOKE DROP ON *.* FROM idiot@%.host.net;
去除一個(gè)用戶的登錄權(quán)限大概是唯一不能使用REVOKE的。REVOKE ALL ON *.*會(huì)去除用戶的所有權(quán)限,但是他還可以登錄,要完全地刪除一個(gè)用戶,你需要在user表中刪除相應(yīng)的記錄:
mysql> DELETE FROM user
-> WHERE User="idiot" AND Host="%.host.net";
訪問控制技巧
由于MySQL中訪問控制系統(tǒng)工作的方法的影響,在建立你的用戶之前你必須知道兩個(gè)特征。
當(dāng)建立的用戶只能從MySQL服務(wù)運(yùn)行的計(jì)算機(jī)上登錄到MySQL服務(wù)(也就是說,你需要他們telnet到服務(wù)器并在那里運(yùn)行MySQL的客戶端程序,或者是使用象PHP這樣的服務(wù)器端腳本語言進(jìn)行通信),你大概會(huì)問自己GRANT命令的
答案是,你不能依賴其中的任何一種來處理任何連接。從理論上來說,如果用戶在連接時(shí)(無論是使用mysql客戶端還是使用PHP的mysql_connect函數(shù))指定了主機(jī)名,這個(gè)主機(jī)名必須與訪問控制系統(tǒng)中的記錄匹配。但是因?yàn)槟阋苍S不想強(qiáng)迫你的用戶指定主機(jī)名(事實(shí)上,mysql客戶端的用戶也許根本不會(huì)指定主機(jī)名),你最好使用下面這種工作環(huán)境。
對(duì)于用戶需要能夠從MySQL服務(wù)在其上運(yùn)行的機(jī)器上連接MySQL的情況,在MySQL訪問控制系統(tǒng)中建立兩個(gè)用戶記錄:一個(gè)使用實(shí)際的主機(jī)名(例如,username@www.host.net),另一個(gè)使用localhost(例如,username@localhost),當(dāng)然,你需要為兩個(gè)用戶分別grant/revoke所有的權(quán)限。
MySQL管理者所要面對(duì)的另一個(gè)帶有普通性的問題是一個(gè)其中的主機(jī)名使用了通配符的用戶記錄(例如,前面提到j(luò)essica@%.host.net)沒起作用。發(fā)生這種情況,一般是由于MySQL訪問控制系統(tǒng)中記錄的優(yōu)先級(jí)的問題。具體地說,越具體的主機(jī)名優(yōu)先級(jí)越高(例如,www.host.net是最具體的,%.host.net是比較具體的,而%是最不具體的)。
在一個(gè)新安裝后,MySQL訪問控制系統(tǒng)包含兩個(gè)匿名用戶記錄(它允許在當(dāng)前主機(jī)上使用任何用戶名進(jìn)行連接--這兩個(gè)記錄分別支持從localhost連接以及從服務(wù)器的實(shí)現(xiàn)的主機(jī)名進(jìn)行連接),以及兩個(gè)root用戶目錄。我們上面討論的情況發(fā)生時(shí)是由于匿名用戶目錄的優(yōu)先級(jí)比我們的新記錄高,因?yàn)樗麄兊闹鳈C(jī)名更具體。
讓我們看看www.host.net上user表的內(nèi)容,我們假定已經(jīng)添加了Jessica的記錄。數(shù)據(jù)行是按照MySQL服務(wù)在確認(rèn)連接時(shí)的優(yōu)先級(jí)排列的:
正如你看到的,因?yàn)镴essica的記錄的主機(jī)名最不具體,它的優(yōu)先級(jí)最低。當(dāng)Jessica試圖從www.host.net連接時(shí),MySQL服務(wù)將他的連接匹配為一個(gè)匿名用戶記錄(空白的User值與任何人匹配)。因?yàn)檫@些匿名記錄不需要口令,而也許Jessica輸入了他的口令,MySQL將拒絕這個(gè)連接。即使Jessica沒有輸入口令,他可能也只被給予了匿名用戶的權(quán)限(非常有限),而不是他原來被賦予的權(quán)限。
解決這個(gè)問題的方法是,要么你刪除匿名用戶的記錄(DELETE FROM user WHERE User=""),要么再為所有的可能從localhost連接的用戶指定兩條記錄(例如,相對(duì)于localhost以及相對(duì)于服務(wù)器的實(shí)際主機(jī)名):
因?yàn)橐獮槊總€(gè)用戶維護(hù)三個(gè)用戶記錄(以及相應(yīng)的三套權(quán)限)會(huì)很麻煩,所以我們推薦你刪除匿名用戶,除非你需要用他們來完成什么特殊的應(yīng)用:
被鎖在外面?
就象把鑰匙丟失在車上一樣,在花費(fèi)了一個(gè)小時(shí)安裝并調(diào)試好一個(gè)新的MySQL服務(wù)器之后忘記了口令的確是件麻煩事。幸運(yùn)的是,如果你有訪問MySQL運(yùn)行的計(jì)算機(jī)的root權(quán)限,或者你能夠使用運(yùn)行MySQL服務(wù)的用戶登錄(如果你按照第一章中的指導(dǎo),這是指mysqlusr),那么不會(huì)出什么問題。按照下面的步驟,你可以獲得服務(wù)的控制權(quán)。
首先,你必須關(guān)閉MySQL服務(wù)。因?yàn)橥ǔJ褂玫膍ysqladmin需要用到你忘了的口令,你只能通過殺掉服務(wù)的進(jìn)程來完成這項(xiàng)工作。使用ps命令或者看看服務(wù)的PID文件(在MySQL數(shù)據(jù)目錄下),確定MySQL服務(wù)的進(jìn)程的ID,然后使用下面的命令終止它:
% kill
這里
關(guān)閉了服務(wù)之后,你可以通過運(yùn)行帶--skip-grant-tables命令行選項(xiàng)的safe-mysqld (在Windows下使用mysqld或mysqld-nt)命令重啟它。這將指示MySQL服務(wù)允許自由的訪問,明顯的,我們應(yīng)該盡可能地短時(shí)間的使用這種模式運(yùn)行服務(wù),以避免固有的安全風(fēng)險(xiǎn)。
連接成功后,改變你的root口令:
mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD("newpassword")
-> WHERE User="root";
最后,斷開連接并指示MySQL服務(wù)重載授權(quán)表以接收新的口令:
% mysqladmin flush-privileges
現(xiàn)在一切都好了--甚至不會(huì)有人知道你干了什么。就象你雖然將鑰匙丟在了車上,而你自己也在車上一樣。
檢查和修復(fù)MySQL數(shù)據(jù)文件
由于臨時(shí)斷電,使用kill -9中止MySQL服務(wù)進(jìn)程,或者是Jessica的朋友idiot@%.host.net又犯了一個(gè)錯(cuò)誤,所有的這些都可能會(huì)毀壞MySQL的數(shù)據(jù)文件。如果在被干擾時(shí),服務(wù)正在改變文件,文件可能會(huì)留下錯(cuò)誤的或不一致的狀態(tài)。因?yàn)檫@樣的毀壞有時(shí)是不容易被發(fā)現(xiàn)的,當(dāng)你發(fā)現(xiàn)這個(gè)錯(cuò)誤時(shí)可能是很久以后的事了。于是,當(dāng)你發(fā)現(xiàn)這個(gè)問題時(shí),也許所有的備份都有同樣的錯(cuò)誤。
MySQL參考手冊(cè)的第十五章講述了MySQL自帶的myisamchk的功能,以及如何使用它檢查和修復(fù)你的MySQL數(shù)據(jù)文件。雖然這一章對(duì)于每個(gè)想要搭建一個(gè)強(qiáng)壯的MySQL服務(wù)的人都是推薦閱讀的,我們還是有必要在這里對(duì)其中的要點(diǎn)進(jìn)行討論。
在我們繼續(xù)之前,你必須意識(shí)到myisamchk程序?qū)τ脕頇z查和修改的MySQL數(shù)據(jù)文件的訪問應(yīng)該是唯一的。如果MySQL服務(wù)正在使用某一文件,并對(duì)myisamchk正在檢查的文件進(jìn)行修改,myisamchk會(huì)誤以為發(fā)生了錯(cuò)誤,并會(huì)試圖進(jìn)行修復(fù)--這將導(dǎo)致MySQL服務(wù)的崩潰!這樣,要避免這種情況的發(fā)生,通常我們需要在工作時(shí)關(guān)閉MySQL服務(wù)。作為選擇,你也可以暫時(shí)關(guān)閉服務(wù)以制作一個(gè)文件的拷貝,然后在這個(gè)拷貝上工作。當(dāng)你做完了以后,重新關(guān)閉服務(wù)并使用新的文件取代原來的文件(也許你還需要使用期間的變更日志)。
MySQL數(shù)據(jù)目錄不是太難理解的。每一個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)子目錄,每個(gè)子目錄中包含了對(duì)應(yīng)于這個(gè)數(shù)據(jù)庫中的數(shù)據(jù)表的文件。每一個(gè)數(shù)據(jù)表對(duì)應(yīng)三個(gè)文件,它們和表名相同,但是具有不同的擴(kuò)展名。tblName.frm文件是表的定義,它保存了表中包含的數(shù)據(jù)列的內(nèi)容和類型。tblName.MYD文件包含了表中的數(shù)據(jù)。tblName.MYI文件包含了表的索引(例如,它可能包含lookup表以幫助提高對(duì)表的主鍵列的查詢)。
要檢查一個(gè)表的錯(cuò)誤,只需要運(yùn)行myisamchk(在MySQL的bin目錄下)并提供文件的位置和表名,或者是表的索引文件名:
% myisamchk /usr/local/mysql/var/dbName/tblName
% myisamchk /usr/local/mysql/var/dbName/tblName.MYI
上面的兩個(gè)命令都可以執(zhí)行對(duì)指定表的檢查。要檢查數(shù)據(jù)庫中所有的表,可以使用通配符:
% myisamchk /usr/local/mysql/var/dbName/*.MYI
要檢查所有數(shù)據(jù)庫中的所有表,可以使用兩個(gè)通配符:
% myisamchk /usr/local/mysql/var/*/*.MYI
如果不帶任何選項(xiàng),myisamchk將對(duì)表文件執(zhí)行普通的檢查。如果你對(duì)一個(gè)表有懷疑,但是普通的檢查不能發(fā)現(xiàn)任何錯(cuò)誤,你可以執(zhí)行更徹底的檢查(但是也更慢!),這需要使用--extend-check選項(xiàng):
% myisamchk --extend-check /path/to/tblName
對(duì)錯(cuò)誤的檢查是沒有破壞性的,這意味著你不必?fù)?dān)心執(zhí)行對(duì)你的數(shù)據(jù)文件的檢查會(huì)使已經(jīng)存在的問題變得更糟。另一方面,修復(fù)選項(xiàng),雖然通常也是安全的,但是它對(duì)你的數(shù)據(jù)文件的更改是無法撤消的。因?yàn)檫@個(gè)原因,我們強(qiáng)烈推薦你試圖修復(fù)一個(gè)被破壞的表文件時(shí)首先做個(gè)備份,并確保在制作這個(gè)備份之前你的MySQL服務(wù)是關(guān)閉的。
當(dāng)你試圖修復(fù)一個(gè)被破壞的表的問題時(shí),有三種修復(fù)類型。如果你得到一個(gè)錯(cuò)誤信息指出一個(gè)臨時(shí)文件不能建立,刪除信息所指出的文件并再試一次--這通常是上一次修復(fù)操作遺留下來的。
這三種修復(fù)方法如下所示:
第一種是最快的,用來修復(fù)最普通的問題;而最后一種是最慢的,用來修復(fù)一些其它方法所不能修復(fù)的問題。
檢查和修復(fù)MySQL數(shù)據(jù)文件
如果上面的方法無法修復(fù)一個(gè)被損壞的表,在你放棄之前,你還可以試試下面這兩個(gè)技巧:
如果你懷疑表的索引文件(*.MYI)發(fā)生了不可修復(fù)的錯(cuò)誤,甚至是丟失了這個(gè)文件,你可以使用數(shù)據(jù)文件(*.MYD)和數(shù)據(jù)格式文件(*.frm)重新生成它。首先制作一個(gè)數(shù)據(jù)文件(tblName.MYD)的拷貝。重啟你的MySQL服務(wù)并連接到這個(gè)服務(wù)上,使用下面的命令刪除表的內(nèi)容:
mysql> DELETE FROM tblName;
在刪除表的內(nèi)容的同時(shí),會(huì)建立一個(gè)新的索引文件。退出登錄并重新關(guān)閉服務(wù),然后用你剛才保存的數(shù)據(jù)文件(tblName.MYD)覆蓋新的(空)數(shù)據(jù)文件。最后,使用myisamchk執(zhí)行標(biāo)準(zhǔn)的修復(fù)(上面的第二種方法),根據(jù)表的數(shù)據(jù)的內(nèi)容和表的格式文件重新生成索引數(shù)據(jù)。
如果你的表的格式文件(tblName.frm)丟失了或者是發(fā)生了不可修復(fù)的錯(cuò)誤,但是你清楚如何使用相應(yīng)的CREATE TABLE語句來重新生成這張表,你可以重新生成一個(gè)新的.frm文件并和你的數(shù)據(jù)文件和索引文件(如果索引文件有問題,使用上面的方法重建一個(gè)新的)一起使用。首先制作一個(gè)數(shù)據(jù)和索引文件的拷貝,然后刪除原來的文件(刪除數(shù)據(jù)目錄下有關(guān)這個(gè)表的所有記錄)。
啟動(dòng)MySQL服務(wù)并使用當(dāng)初的CREATE TABLE文件建立一個(gè)新的表。新的.frm文件應(yīng)該可以正常工作了,但是最好你還是執(zhí)行一下標(biāo)準(zhǔn)的修復(fù)(上面的第二種方法)。
結(jié)語
OK,的確這一章沒有多少我們通常所習(xí)慣的可以具體執(zhí)行某項(xiàng)實(shí)際工作的代碼。但是所有的這些工作--備份和恢復(fù)數(shù)據(jù)庫,管理MySQL的訪問控制系統(tǒng),數(shù)據(jù)表的檢查和修復(fù)--都將有助于我們建立一個(gè)經(jīng)得住時(shí)間考驗(yàn)的MySQL數(shù)據(jù)庫服務(wù)器。
在本教程的倒數(shù)第二章——第九章中,我們會(huì)學(xué)習(xí)一些更復(fù)雜的SQL技術(shù)以使得我們的關(guān)系型數(shù)據(jù)庫服務(wù)器可以完成一些你之前也許從未想到過的工作。

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

1. The first choice for the Laravel MySQL Vue/React combination in the PHP development question and answer community is the first choice for Laravel MySQL Vue/React combination, due to its maturity in the ecosystem and high development efficiency; 2. High performance requires dependence on cache (Redis), database optimization, CDN and asynchronous queues; 3. Security must be done with input filtering, CSRF protection, HTTPS, password encryption and permission control; 4. Money optional advertising, member subscription, rewards, commissions, knowledge payment and other models, the core is to match community tone and user needs.

There are three ways to connect Excel to MySQL database: 1. Use PowerQuery: After installing the MySQLODBC driver, establish connections and import data through Excel's built-in PowerQuery function, and support timed refresh; 2. Use MySQLforExcel plug-in: The official plug-in provides a friendly interface, supports two-way synchronization and table import back to MySQL, and pay attention to version compatibility; 3. Use VBA ADO programming: suitable for advanced users, and achieve flexible connections and queries by writing macro code. Choose the appropriate method according to your needs and technical level. PowerQuery or MySQLforExcel is recommended for daily use, and VBA is better for automated processing.

There are three main ways to set environment variables in PHP: 1. Global configuration through php.ini; 2. Passed through a web server (such as SetEnv of Apache or fastcgi_param of Nginx); 3. Use putenv() function in PHP scripts. Among them, php.ini is suitable for global and infrequently changing configurations, web server configuration is suitable for scenarios that need to be isolated, and putenv() is suitable for temporary variables. Persistence policies include configuration files (such as php.ini or web server configuration), .env files are loaded with dotenv library, and dynamic injection of variables in CI/CD processes. Security management sensitive information should be avoided hard-coded, and it is recommended to use.en

To achieve MySQL deployment automation, the key is to use Terraform to define resources, Ansible management configuration, Git for version control, and strengthen security and permission management. 1. Use Terraform to define MySQL instances, such as the version, type, access control and other resource attributes of AWSRDS; 2. Use AnsiblePlaybook to realize detailed configurations such as database user creation, permission settings, etc.; 3. All configuration files are included in Git management, support change tracking and collaborative development; 4. Avoid hard-coded sensitive information, use Vault or AnsibleVault to manage passwords, and set access control and minimum permission principles.

To collect user behavior data, you need to record browsing, search, purchase and other information into the database through PHP, and clean and analyze it to explore interest preferences; 2. The selection of recommendation algorithms should be determined based on data characteristics: based on content, collaborative filtering, rules or mixed recommendations; 3. Collaborative filtering can be implemented in PHP to calculate user cosine similarity, select K nearest neighbors, weighted prediction scores and recommend high-scoring products; 4. Performance evaluation uses accuracy, recall, F1 value and CTR, conversion rate and verify the effect through A/B tests; 5. Cold start problems can be alleviated through product attributes, user registration information, popular recommendations and expert evaluations; 6. Performance optimization methods include cached recommendation results, asynchronous processing, distributed computing and SQL query optimization, thereby improving recommendation efficiency and user experience.

PHP plays the role of connector and brain center in intelligent customer service, responsible for connecting front-end input, database storage and external AI services; 2. When implementing it, it is necessary to build a multi-layer architecture: the front-end receives user messages, the PHP back-end preprocesses and routes requests, first matches the local knowledge base, and misses, call external AI services such as OpenAI or Dialogflow to obtain intelligent reply; 3. Session management is written to MySQL and other databases by PHP to ensure context continuity; 4. Integrated AI services need to use Guzzle to send HTTP requests, safely store APIKeys, and do a good job of error handling and response analysis; 5. Database design must include sessions, messages, knowledge bases, and user tables, reasonably build indexes, ensure security and performance, and support robot memory

To recycle MySQL user permissions using REVOKE, you need to specify the permission type, database, and user by format. 1. Use REVOKEALLPRIVILEGES, GRANTOPTIONFROM'username'@'hostname'; 2. Use REVOKEALLPRIVILEGESONmydb.FROM'username'@'hostname'; 3. Use REVOKEALLPRIVILEGESONmydb.FROM'username'@'hostname'; 3. Use REVOKE permission type ON.*FROM'username'@'hostname'; Note that after execution, it is recommended to refresh the permissions. The scope of the permissions must be consistent with the authorization time, and non-existent permissions cannot be recycled.

To enable PHP containers to support automatic construction, the core lies in configuring the continuous integration (CI) process. 1. Use Dockerfile to define the PHP environment, including basic image, extension installation, dependency management and permission settings; 2. Configure CI/CD tools such as GitLabCI, and define the build, test and deployment stages through the .gitlab-ci.yml file to achieve automatic construction, testing and deployment; 3. Integrate test frameworks such as PHPUnit to ensure that tests are automatically run after code changes; 4. Use automated deployment strategies such as Kubernetes to define deployment configuration through the deployment.yaml file; 5. Optimize Dockerfile and adopt multi-stage construction
