一级一区免费黄色,人人弄人人摸人人擦,亚洲黄色网站第二,欧美一区黄色网站

當(dāng)前位置:首頁(yè) -> 焦點(diǎn)新聞

MySQL管理

2005/1/7 11:41:01       

原著:KevinYank 翻譯:處處
  

    對(duì)于內(nèi)容驅(qū)動(dòng)的網(wǎng)站,設(shè)計(jì)好壞的關(guān)鍵是關(guān)系型數(shù)據(jù)庫(kù)。在這個(gè)教程中,我們已經(jīng)使用了MySQL關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)建立了我們的數(shù)據(jù)庫(kù)。對(duì)于網(wǎng)站的開(kāi)發(fā)者來(lái)說(shuō),MySQL是一個(gè)較受歡迎的選擇,這不僅是因?yàn)樗鼘?duì)于任何平臺(tái)上的非商業(yè)應(yīng)用都是免費(fèi)的,而且也因?yàn)樗募茉O(shè)和使用非常的簡(jiǎn)單。正如我們?cè)诘谝徽轮兴吹降哪菢,根?jù)正確的指導(dǎo),一個(gè)新的用戶可以在不超過(guò)30分鐘的時(shí)間內(nèi)架設(shè)好一個(gè)MySQL服務(wù),并將其運(yùn)行起來(lái)(對(duì)于一個(gè)有經(jīng)驗(yàn)的用戶甚至只要10分鐘!)。

    如果你想做的僅僅是架設(shè)一個(gè)MySQL服務(wù)環(huán)境,以用來(lái)做一些例子和練習(xí),那么我們?cè)诘谝徽掳惭b時(shí)所使用的初始化設(shè)置對(duì)你已經(jīng)足夠了。但是,如果你是想建立一個(gè)真正的用于Web站點(diǎn)的數(shù)據(jù)庫(kù)--也許這個(gè)站點(diǎn)對(duì)于你的公司很重要--那么你還需要學(xué)習(xí)一些有關(guān)MySQL的知識(shí)。

    對(duì)于作為基于Internet的企業(yè)的一部分的商業(yè)事務(wù)來(lái)說(shuō),數(shù)據(jù)的備份是很重要的。不幸的是,因?yàn)閭浞莸墓ぷ鲗?duì)于一個(gè)管理員來(lái)說(shuō)往往是不太感興趣的,人們總是無(wú)法認(rèn)清它的重要性,于是這方面的工作對(duì)于一個(gè)應(yīng)用程序往往不能做得“足夠好”。如果直到現(xiàn)在你還不明白“我們是不是需要備份我們的數(shù)據(jù)庫(kù)”,或者是你認(rèn)為“數(shù)據(jù)庫(kù)會(huì)和其它東西一起被備份”,那么你得好好看看這一章的內(nèi)容了。我們將會(huì)說(shuō)明為什么普通的文件備份方案對(duì)于許多MySQL服務(wù)是遠(yuǎn)遠(yuǎn)不夠的,然后我們會(huì)介紹備份和恢復(fù)一個(gè)MySQL數(shù)據(jù)庫(kù)的“正確的方法”。

    在第一章中,我們?cè)O(shè)置了一個(gè)MySQL服務(wù)并通過(guò)一個(gè)有口令的‘root’來(lái)連接這個(gè)數(shù)據(jù)庫(kù)。MySQL的‘root’用戶(順便提一下,不要與Unix的‘root’用戶混淆)對(duì)于所有的庫(kù)和表都有讀/寫(xiě)的權(quán)限。在許多情況下,我們需要建立其它的只能訪問(wèn)某些數(shù)據(jù)庫(kù)和數(shù)據(jù)表的用戶,我們還需要對(duì)這種訪問(wèn)進(jìn)行限制(例如,對(duì)指定的表只能直接只讀訪問(wèn))。在這一章中,我們將學(xué)習(xí)如果使用兩個(gè)新的MySQL的命令:GRANT和REVOKE來(lái)完成這些工作。
    在一些情況下,例如由于電源的問(wèn)題,MySQL數(shù)據(jù)庫(kù)可能被損壞。這樣的損壞并不總是意味著必須使用備份來(lái)恢復(fù)。我們將會(huì)學(xué)習(xí)到如果利用MySQL數(shù)據(jù)庫(kù)的檢查和修復(fù)功能來(lái)解決簡(jiǎn)單的數(shù)據(jù)庫(kù)損壞。

    為什么標(biāo)準(zhǔn)的備份是不夠的
    和Web服務(wù)器一樣,絕大多數(shù)的MySQL服務(wù)器也必須不間斷地在線。這使得MySQL數(shù)據(jù)庫(kù)的備份顯得很重要。因?yàn)镸ySQL服務(wù)使用cache和緩沖區(qū)來(lái)提高對(duì)存儲(chǔ)在磁盤(pán)上的數(shù)據(jù)庫(kù)文件更新的效率,所以文件的內(nèi)容和當(dāng)前數(shù)據(jù)庫(kù)的內(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ù)庫(kù)必須整天地接受信息,標(biāo)準(zhǔn)的備份只能提供數(shù)據(jù)庫(kù)數(shù)據(jù)的“瞬間的”映象。如果MySQL數(shù)據(jù)庫(kù)文件被損壞,或是變得不可用,在最后一次備份之后添加的信息將會(huì)被丟失。在許多情況下,例如對(duì)于一個(gè)電子商務(wù)網(wǎng)站的處理用戶訂單的數(shù)據(jù)庫(kù),這樣的丟失是不可容忍的。

    MySQL中的工具可以對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)的備份,而在備份進(jìn)行時(shí),不會(huì)影響服務(wù)的效率。不幸的是,這需要你 為你的MySQL數(shù)據(jù)配置一個(gè)特殊的備份系統(tǒng)。而完全與你已制定的其它數(shù)據(jù)備份方案無(wú)關(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ù)庫(kù)備份
    除了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語(yǔ)言所做的一樣)并下載指定的數(shù)據(jù)庫(kù)的全部?jī)?nèi)容。然后它會(huì)輸出一系列的SQL的CREATE TABLE命令和INSERT命令,在一個(gè)空的MySQL數(shù)據(jù)庫(kù)中運(yùn)行這些命令,就可以建立與當(dāng)初的數(shù)據(jù)庫(kù)內(nèi)容完全一樣的一個(gè)MySQL數(shù)據(jù)庫(kù)。

    通過(guò)重定向mysqldump的輸出到一個(gè)文件,你可以存儲(chǔ)一個(gè)數(shù)據(jù)庫(kù)的“鏡像”以作為備份。下面的命令是用一個(gè)口令為mypass的root用戶連接到一個(gè)運(yùn)行在myhost上的MySQL服務(wù),并將名為dbname的數(shù)據(jù)庫(kù)的備份存儲(chǔ)到dbname_backup.sql文件中:
    % mysqldump -h myhost -u root -pmypass dbname > dbname_backup.sql

    要恢復(fù)這樣的一個(gè)數(shù)據(jù)庫(kù),只需要運(yùn)行下面的命令:
    % mysqladmin -h myhost -u root -pmypass create dbname
    % mysql -h myhost -u root -pmypass dbname < dbname_backup.sql

    第一個(gè)命令使用mysqladmin程序建立一個(gè)數(shù)據(jù)庫(kù)。第二個(gè)命令連接到MySQL服務(wù)并使用通常的mysql程序,并將剛才得到的備份文件作為其中執(zhí)行的命令。

    通過(guò)這種方法,我們可以使用mysqldump建立我們數(shù)據(jù)庫(kù)的備份。因?yàn)閙ysqldump通過(guò)與MySQL服務(wù)的連接產(chǎn)生這個(gè)備份,這肯定要比直接訪問(wèn)MySQL數(shù)據(jù)目錄下的數(shù)據(jù)庫(kù)文件來(lái)得更為安全,因?yàn)檫@樣的備份可以確保是數(shù)據(jù)庫(kù)的一個(gè)有效的拷貝,而不僅僅是數(shù)據(jù)庫(kù)文件的拷貝。

    剩下來(lái)的問(wèn)題就是如何解決這個(gè)“鏡像”與一個(gè)不斷更新的數(shù)據(jù)庫(kù)之間的同步。要做到這一點(diǎn),你需要命令服務(wù)保持一個(gè)變更日志。

    利用變更日志進(jìn)行增量備份
    正如我們前面提到的,在很多情況下,我們使用的MySQL數(shù)據(jù)庫(kù)會(huì)造成數(shù)據(jù)的丟失--甚至有的時(shí)候會(huì)丟失很重要的數(shù)據(jù)。在這樣的情況下,我們必須找到一種方法保持我們使用上面介紹的方法用mysqldump制作的備份與當(dāng)前數(shù)據(jù)庫(kù)之間的同步。而解決方案就是讓MySQL服務(wù)維持一個(gè)更新日志。一個(gè)更新日志是一個(gè)關(guān)于所有數(shù)據(jù)庫(kù)接受到的可能改變數(shù)據(jù)庫(kù)內(nèi)容的查詢的記錄。這將包括INSERT、UPDATE和CREATE TABLE語(yǔ)句,但是不包括SELECT語(yǔ)句。

    通常的想法是維持一個(gè)變更日志,這樣當(dāng)數(shù)據(jù)庫(kù)崩潰時(shí),你的恢復(fù)過(guò)程應(yīng)該是這樣的:首先使用備份(使用mysqldump命令產(chǎn)生),然后使用備份之后的變量日志。

    你也可以使用變更日志撤消錯(cuò)誤操作。例如,如果一個(gè)合作者告訴你他錯(cuò)誤地使用了一個(gè)DROP TABLE命令,你可以對(duì)變更日志進(jìn)行編輯以刪除這個(gè)命令,然后使用備份和修改過(guò)的變更日志進(jìn)行恢復(fù)。通過(guò)這種方法,你甚至可以保持這次意外事故之后其它表的變化。作為預(yù)防措施,你也許還要收回你的合作者的 DROP權(quán)限(在下一部分你將看到該怎么做)。

    告訴MySQL服務(wù)器維持一個(gè)變更日志是非常簡(jiǎn)單的,你只需要在服務(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ù)目錄的磁盤(pán)出了問(wèn)題,你肯定不能指望它還能好好保存你的備份!),你可以指定變更日志的路徑。

    但是,如果你的MySQL服務(wù)器是不間斷地工作的,在啟動(dòng)MySQL服務(wù)時(shí)你也許還需要一些系統(tǒng)配置。在這種情況下,增加一個(gè)命令行選擇可能變得很困難。建立變更日志的另一個(gè)簡(jiǎn)單的方法是在MySQL配置文件中增加相應(yīng)的選項(xiàng)。

    如果你還不清楚"什么是MySQL配置文件",不要擔(dān)心。事實(shí)上,在此之前,我們一直沒(méi)用到過(guò)這樣的配置文件。要建立這個(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)然,你可以自由地指定你的日志文件所寫(xiě)入的位置。保存這個(gè)文件并重啟你的MySQL服務(wù)。從現(xiàn)在開(kāi)始,MySQL服務(wù)運(yùn)行的情況將和你在命令行中使用了--log-update選項(xiàng)一樣。

    很明顯,對(duì)于一個(gè)服務(wù)來(lái)說(shuō),變更日志可能占用大量的空間。因?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ù)一直在線,而且在過(guò)去的一周中,沒(méi)有收到任何改變數(shù)據(jù)庫(kù)內(nèi)容的查詢。

    如果你是一個(gè)有經(jīng)驗(yàn)的用戶,使用“時(shí)鐘守護(hù)程序”設(shè)置一個(gè)腳本來(lái)定期(比方說(shuō),每周一次)執(zhí)行數(shù)據(jù)庫(kù)的備份并刪除舊的變更日志應(yīng)該是相當(dāng)簡(jiǎn)單的。如果你還需要一點(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ù)庫(kù)將是非常簡(jiǎn)單的。在建立一個(gè)空數(shù)據(jù)庫(kù)后應(yīng)用我們?cè)谏弦还?jié)中討論的方法導(dǎo)入備份,然后使用帶--one-database命令行選項(xiàng)的mysql命令導(dǎo)入變更日志。這會(huì)指示服務(wù)器僅僅運(yùn)行變更日志中與我們想要恢復(fù)的數(shù)據(jù)庫(kù)(在這個(gè)例子中是指dbname)相關(guān)的查詢:
    % mysql -u root -ppassword --one-database dbname < update.100
    % mysql -u root -ppassword --one-database dbname < update.102
    ...

    MySQL訪問(wèn)控制
    在這個(gè)教程的早些時(shí)候,我們?cè)?jīng)提到一個(gè)叫做mysql的數(shù)據(jù)庫(kù),在每一個(gè)MySQL服務(wù)中都包含這個(gè)數(shù)據(jù)庫(kù),它是用來(lái)保存用戶的相關(guān)信息、他們的口令以及他們的權(quán)限的。但是,在此之前,我們一直使用root用戶登錄到MySQL服務(wù),這個(gè)用戶可以訪問(wèn)所有的數(shù)據(jù)庫(kù)和數(shù)據(jù)表。

    如果你的MySQL服務(wù)僅僅被通過(guò)PHP訪問(wèn),而用你對(duì)于將root用戶的口令告訴什么人很小心,那么root帳號(hào)可能已經(jīng)足夠了。但是,如果一個(gè)MySQL服務(wù)是被許多人共享的,(例如,一個(gè)Web主機(jī)希望對(duì)它的每一個(gè)用戶提供同一個(gè)MySQL服務(wù)),為不同的用戶設(shè)置相應(yīng)的訪問(wèn)權(quán)限就顯得很重要了。

    在MySQL參考手冊(cè)的第六章中詳細(xì)介紹了MySQL的訪問(wèn)控制系統(tǒng)。從原理上來(lái)說(shuō),用戶的訪問(wèn)是由mysql數(shù)據(jù)庫(kù)中的五個(gè)數(shù)據(jù)表來(lái)管理的:user、db、host、tables_priv和columns_priv。如果你想直接使用INSERT、UPDATE和DELETE語(yǔ)句來(lái)編輯這些表,我建議你先閱讀一下MySQL指南中的相關(guān)章節(jié)。而從3.22.11版本開(kāi)始,MySQL提供了簡(jiǎn)單的方法來(lái)管理用戶的訪問(wèn)。使用MySQL提供的非標(biāo)準(zhǔn)的命令GRANT和REVOKE,你可以建立用戶并賦予其相應(yīng)的權(quán)限,而不必關(guān)心它在前面提到的五個(gè)表中的存儲(chǔ)形式。

    使用GRANT
    GRANT命令用來(lái)建立新用戶,指定用戶口令并增加用戶權(quán)限。其格式如下:
    mysql> GRANT <privileges> ON <what>
    -> TO <user> [IDENTIFIED BY "<password>"]
    -> [WITH GRANT OPTION];
 
    正如你看到的,在這個(gè)命令中有許多待填的內(nèi)容。讓我們逐一地對(duì)它們進(jìn)行介紹,并最終給出一些例子以讓你對(duì)它們的協(xié)同工作有一個(gè)了解。
    <privileges>是一個(gè)用逗號(hào)分隔的你想要賦予的權(quán)限的列表。你可以指定的權(quán)限可以分為三種類型:
    數(shù)據(jù)庫(kù)/數(shù)據(jù)表/數(shù)據(jù)列權(quán)限:
    ALTER: 修改已存在的數(shù)據(jù)表(例如增加/刪除列)和索引。
    CREATE: 建立新的數(shù)據(jù)庫(kù)或數(shù)據(jù)表。
    DELETE: 刪除表的記錄。
    DROP: 刪除數(shù)據(jù)表或數(shù)據(jù)庫(kù)。
    INDEX: 建立或刪除索引。
    INSERT: 增加表的記錄。
    SELECT: 顯示/搜索表的記錄。
    UPDATE: 修改表中已存在的記錄。
    全局管理權(quán)限:
    FILE: 在MySQL服務(wù)器上讀寫(xiě)文件。
    PROCESS: 顯示或殺死屬于其它用戶的服務(wù)線程。
    RELOAD: 重載訪問(wèn)控制表,刷新日志等。
    SHUTDOWN: 關(guān)閉MySQL服務(wù)。
    特別的權(quán)限:
    ALL: 允許做任何事(和root一樣)。
    USAGE: 只允許登錄--其它什么也不允許做。
    這些權(quán)限所涉及到的MySQL的特征,其中的一些我們至今還沒(méi)看到,而其中的絕大部分是你所熟悉的。
    <what> 定義了這些權(quán)限所作用的區(qū)域。*.*意味著權(quán)限對(duì)所有數(shù)據(jù)庫(kù)和數(shù)據(jù)表有效。dbName.*意味著對(duì)名為dbName的數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)表有效。dbName.tblName意味著僅對(duì)名為dbName中的名為tblName的數(shù)據(jù)表有效。你甚至還可以通過(guò)在賦予的權(quán)限后面使用圓括號(hào)中的數(shù)據(jù)列的列表以指定權(quán)限僅對(duì)這些列有效(在后面我們將看到這樣的例子)。
    <user>指定可以應(yīng)用這些權(quán)限的用戶。在MySQL中,一個(gè)用戶通過(guò)它登錄的用戶名和用戶使用的計(jì)算機(jī)的主機(jī)名/IP地址來(lái)指定。這兩個(gè)值都可以使用%通配符(例如kevin@%將允許使用用戶名kevin從任何機(jī)器上登錄以享有你指定的權(quán)限)。
    <password>指定了用戶連接MySQL服務(wù)所用的口令。它被用方括號(hào)括起,說(shuō)明IDENTIFIED BY "<password>"在GRANT命令中是可選項(xiàng)。這里指定的口令會(huì)取代用戶原來(lái)的密碼。如果沒(méi)有為一個(gè)新用戶指定口令,當(dāng)他進(jìn)行連接時(shí)就不需要口令。

    這個(gè)命令中可選的WITH GRANT OPTION部分指定了用戶可以使用GRANT/REVOKE命令將他擁有的權(quán)限賦予其他用戶。請(qǐng)小心使用這項(xiàng)功能--雖然這個(gè)問(wèn)題可能不是那么明顯!例如,兩個(gè)都擁有這個(gè)功能的用戶可能會(huì)相互共享他們的權(quán)限,這也許不是你當(dāng)初想看到的。

    讓我們來(lái)看兩個(gè)例子。建立一個(gè)名為dbmanager的用戶,他可以使用口令managedb從server.host.net連接MySQL,并僅僅可以訪問(wèn)名為db的數(shù)據(jù)庫(kù)的全部?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)注意我們沒(méi)有賦予任何另外的權(quán)限(the USAGE權(quán)限只能允許用戶登錄),但是用戶已經(jīng)存在的權(quán)限不會(huì)被改變。

    現(xiàn)在讓我們建立一個(gè)新的名為jessica的用戶,他可以從host.net域的任意機(jī)器連接到MySQL。他可以更新數(shù)據(jù)庫(kù)中用戶的姓名和email地址,但是不需要查閱其它數(shù)據(jù)庫(kù)的信息。也就是說(shuō)他對(duì)db數(shù)據(jù)庫(kù)具有只讀的權(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可以用來(lái)連接的主機(jī)名時(shí)使用了%(通配符)符號(hào)。此外,我們也沒(méi)有給他向其他用戶傳遞他的權(quán)限的能力,因?yàn)槲覀冊(cè)诿畹淖詈鬀](méi)有帶上WITH GRANT OPTION。第二個(gè)命令示范了如何通過(guò)在賦予的權(quán)限后面的圓括號(hào)中用逗號(hào)分隔的列的列表對(duì)特定的數(shù)據(jù)列賦予權(quán)限。

    使用REVOKE
    正如你所預(yù)期的那樣,REVOKE命令是用來(lái)去除一個(gè)用戶以前被賦予的權(quán)限的。命令的語(yǔ)法如下:
    mysql> REVOKE <privileges> [(<columns>)]
    -> ON <what> FROM <user>;
 
    這個(gè)命令中各部分的功能和在上面的GRANT命令中時(shí)一樣。要去除Jessica的合作者的DROP權(quán)限(例如,如果他經(jīng)常錯(cuò)誤地刪除數(shù)據(jù)庫(kù)和表),你可以使用下面的命令:
    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";


    訪問(wèn)控制技巧
    由于MySQL中訪問(wèn)控制系統(tǒng)工作的方法的影響,在建立你的用戶之前你必須知道兩個(gè)特征。
    當(dāng)建立的用戶只能從MySQL服務(wù)運(yùn)行的計(jì)算機(jī)上登錄到MySQL服務(wù)(也就是說(shuō),你需要他們telnet到服務(wù)器并在那里運(yùn)行MySQL的客戶端程序,或者是使用象PHP這樣的服務(wù)器端腳本語(yǔ)言進(jìn)行通信),你大概會(huì)問(wèn)自己GRANT命令的<user>部分應(yīng)該填什么內(nèi)容。如果服務(wù)是運(yùn)行在www.host.net。你是應(yīng)該將用戶設(shè)置為username@www.host.net還是username@localhost呢?

    答案是,你不能依賴其中的任何一種來(lái)處理任何連接。從理論上來(lái)說(shuō),如果用戶在連接時(shí)(無(wú)論是使用mysql客戶端還是使用PHP的mysql_connect函數(shù))指定了主機(jī)名,這個(gè)主機(jī)名必須與訪問(wèn)控制系統(tǒng)中的記錄匹配。但是因?yàn)槟阋苍S不想強(qiáng)迫你的用戶指定主機(jī)名(事實(shí)上,mysql客戶端的用戶也許根本不會(huì)指定主機(jī)名),你最好使用下面這種工作環(huán)境。

    對(duì)于用戶需要能夠從MySQL服務(wù)在其上運(yùn)行的機(jī)器上連接MySQL的情況,在MySQL訪問(wèn)控制系統(tǒng)中建立兩個(gè)用戶記錄:一個(gè)使用實(shí)際的主機(jī)名(例如,username@www.host.net),另一個(gè)使用localhost(例如,username@localhost),當(dāng)然,你需要為兩個(gè)用戶分別grant/revoke所有的權(quán)限。

    MySQL管理者所要面對(duì)的另一個(gè)帶有普通性的問(wèn)題是一個(gè)其中的主機(jī)名使用了通配符的用戶記錄(例如,前面提到jessica@%.host.net)沒(méi)起作用。發(fā)生這種情況,一般是由于MySQL訪問(wèn)控制系統(tǒng)中記錄的優(yōu)先級(jí)的問(wèn)題。具體地說(shuō),越具體的主機(jī)名優(yōu)先級(jí)越高(例如,www.host.net是最具體的,%.host.net是比較具體的,而%是最不具體的)。

    在一個(gè)新安裝后,MySQL訪問(wèn)控制系統(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沒(méi)有輸入口令,他可能也只被給予了匿名用戶的權(quán)限(非常有限),而不是他原來(lái)被賦予的權(quán)限。
    解決這個(gè)問(wèn)題的方法是,要么你刪除匿名用戶的記錄(DELETE FROM user WHERE User=""),要么再為所有的可能從localhost連接的用戶指定兩條記錄(例如,相對(duì)于localhost以及相對(duì)于服務(wù)器的實(shí)際主機(jī)名):

    因?yàn)橐獮槊總(gè)用戶維護(hù)三個(gè)用戶記錄(以及相應(yīng)的三套權(quán)限)會(huì)很麻煩,所以我們推薦你刪除匿名用戶,除非你需要用他們來(lái)完成什么特殊的應(yīng)用:

    被鎖在外面?
    就象把鑰匙丟失在車上一樣,在花費(fèi)了一個(gè)小時(shí)安裝并調(diào)試好一個(gè)新的MySQL服務(wù)器之后忘記了口令的確是件麻煩事。幸運(yùn)的是,如果你有訪問(wèn)MySQL運(yùn)行的計(jì)算機(jī)的root權(quán)限,或者你能夠使用運(yùn)行MySQL服務(wù)的用戶登錄(如果你按照第一章中的指導(dǎo),這是指mysqlusr),那么不會(huì)出什么問(wèn)題。按照下面的步驟,你可以獲得服務(wù)的控制權(quán)。

    首先,你必須關(guān)閉MySQL服務(wù)。因?yàn)橥ǔJ褂玫膍ysqladmin需要用到你忘了的口令,你只能通過(guò)殺掉服務(wù)的進(jìn)程來(lái)完成這項(xiàng)工作。使用ps命令或者看看服務(wù)的PID文件(在MySQL數(shù)據(jù)目錄下),確定MySQL服務(wù)的進(jìn)程的ID,然后使用下面的命令終止它:
    % kill <pid>

    這里<pid>是MySQL服務(wù)的進(jìn)程的ID。這樣將可以終止服務(wù)。除非絕對(duì)必要,不要使用kill -9,因?yàn)檫@樣有可能損壞你的表文件。如果你被迫只能這么做,下面將告訴你如何檢查和修復(fù)那些文件。
    關(guān)閉了服務(wù)之后,你可以通過(guò)運(yùn)行帶--skip-grant-tables命令行選項(xiàng)的safe-mysqld (在Windows下使用mysqld或mysqld-nt)命令重啟它。這將指示MySQL服務(wù)允許自由的訪問(wèn),明顯的,我們應(yīng)該盡可能地短時(shí)間的使用這種模式運(yùn)行服務(wù),以避免固有的安全風(fēng)險(xiǎn)。

    連接成功后,改變你的root口令:
    mysql> USE mysql;
    mysql> UPDATE user SET Password=PASSWORD("newpassword")
    -> WHERE User="root";
 
    最后,斷開(kāi)連接并指示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è)問(wèn)題時(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ū)τ脕?lái)檢查和修改的MySQL數(shù)據(jù)文件的訪問(wèn)應(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ù)并使用新的文件取代原來(lái)的文件(也許你還需要使用期間的變更日志)。
    MySQL數(shù)據(jù)目錄不是太難理解的。每一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)子目錄,每個(gè)子目錄中包含了對(duì)應(yīng)于這個(gè)數(shù)據(jù)庫(kù)中的數(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ù)庫(kù)中所有的表,可以使用通配符:
    % myisamchk /usr/local/mysql/var/dbName/*.MYI

    要檢查所有數(shù)據(jù)庫(kù)中的所有表,可以使用兩個(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ò)誤的檢查是沒(méi)有破壞性的,這意味著你不必?fù)?dān)心執(zhí)行對(duì)你的數(shù)據(jù)文件的檢查會(huì)使已經(jīng)存在的問(wèn)題變得更糟。另一方面,修復(fù)選項(xiàng),雖然通常也是安全的,但是它對(duì)你的數(shù)據(jù)文件的更改是無(wú)法撤消的。因?yàn)檫@個(gè)原因,我們強(qiáng)烈推薦你試圖修復(fù)一個(gè)被破壞的表文件時(shí)首先做個(gè)備份,并確保在制作這個(gè)備份之前你的MySQL服務(wù)是關(guān)閉的。

    當(dāng)你試圖修復(fù)一個(gè)被破壞的表的問(wèn)題時(shí),有三種修復(fù)類型。如果你得到一個(gè)錯(cuò)誤信息指出一個(gè)臨時(shí)文件不能建立,刪除信息所指出的文件并再試一次--這通常是上一次修復(fù)操作遺留下來(lái)的。
    這三種修復(fù)方法如下所示:
    % myisamchk --recover --quick /path/to/tblName
    % myisamchk --recover /path/to/tblName
    % myisamchk --safe-recover /path/to/tblName
 
    第一種是最快的,用來(lái)修復(fù)最普通的問(wèn)題;而最后一種是最慢的,用來(lái)修復(fù)一些其它方法所不能修復(fù)的問(wèn)題。

    檢查和修復(fù)MySQL數(shù)據(jù)文件
    如果上面的方法無(wú)法修復(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語(yǔ)句來(lái)重新生成這張表,你可以重新生成一個(gè)新的.frm文件并和你的數(shù)據(jù)文件和索引文件(如果索引文件有問(wèn)題,使用上面的方法重建一個(gè)新的)一起使用。首先制作一個(gè)數(shù)據(jù)和索引文件的拷貝,然后刪除原來(lái)的文件(刪除數(shù)據(jù)目錄下有關(guān)這個(gè)表的所有記錄)。

    啟動(dòng)MySQL服務(wù)并使用當(dāng)初的CREATE TABLE文件建立一個(gè)新的表。新的.frm文件應(yīng)該可以正常工作了,但是最好你還是執(zhí)行一下標(biāo)準(zhǔn)的修復(fù)(上面的第二種方法)。

    結(jié)語(yǔ)
    OK,的確這一章沒(méi)有多少我們通常所習(xí)慣的可以具體執(zhí)行某項(xiàng)實(shí)際工作的代碼。但是所有的這些工作--備份和恢復(fù)數(shù)據(jù)庫(kù),管理MySQL的訪問(wèn)控制系統(tǒng),數(shù)據(jù)表的檢查和修復(fù)--都將有助于我們建立一個(gè)經(jīng)得住時(shí)間考驗(yàn)的MySQL數(shù)據(jù)庫(kù)服務(wù)器。

    在本教程的倒數(shù)第二章——第九章中,我們會(huì)學(xué)習(xí)一些更復(fù)雜的SQL技術(shù)以使得我們的關(guān)系型數(shù)據(jù)庫(kù)服務(wù)器可以完成一些你之前也許從未想到過(guò)的工作。

  

煤炭網(wǎng)版權(quán)與免責(zé)聲明:

凡本網(wǎng)注明"來(lái)源:煤炭網(wǎng)www.shanesbookmarks.com "的所有文字、圖片和音視頻稿件,版權(quán)均為"煤炭網(wǎng)www.shanesbookmarks.com "獨(dú)家所有,任何媒體、網(wǎng)站或個(gè)人在轉(zhuǎn)載使用時(shí)必須注明"來(lái)源:煤炭網(wǎng)www.shanesbookmarks.com ",違反者本網(wǎng)將依法追究責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,是本著為讀者傳遞更多信息的目的,并不意味著本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載使用時(shí),必須保留本網(wǎng)注明的稿件來(lái)源,禁止擅自篡改稿件來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。違反者本網(wǎng)也將依法追究責(zé)任。 如本網(wǎng)轉(zhuǎn)載稿件涉及版權(quán)等問(wèn)題,請(qǐng)作者在兩周內(nèi)盡快來(lái)電或來(lái)函聯(lián)系。

  • 用手機(jī)也能做煤炭生意啦!
  • 中煤遠(yuǎn)大:煤炭貿(mào)易也有了“支付寶”
  • 中煤開(kāi)啟煤炭出口貿(mào)易人民幣結(jié)算新時(shí)代
  • 下半年煤炭市場(chǎng)依然嚴(yán)峻
市場(chǎng)動(dòng)態(tài)

網(wǎng)站技術(shù)運(yùn)營(yíng):北京真石數(shù)字科技股份有限公司、喀什中煤遠(yuǎn)大供應(yīng)鏈管理有限公司、喀什煤網(wǎng)數(shù)字科技有限公司

總部地址:北京市豐臺(tái)區(qū)總部基地航豐路中航榮豐1層

京ICP備18023690號(hào)-1      京公網(wǎng)安備 11010602010109號(hào)


關(guān)注中煤遠(yuǎn)大微信
跟蹤最新行業(yè)資訊