本章的說明只用於UNIX 系統。如果正在運行Windows 系統,可以跳過本章,因為附錄A“獲得和安裝軟體”一節中包含了所有需要的啟動和關閉命令。
調用本章給出的命令
為了簡潔,在大多數情況中,諸如mysqla d m i n、mysqldump 等程式在本章中沒有給出任何- h、- u或- p選項。筆者假定您將會用串連伺服器所需的任何選項調用這些程式。
用無特權的使用者帳號運行MySQL伺服器
在討論如何啟動伺服器之前,考慮一下在伺服器啟動時應該運行哪個帳號。伺服器可以手工和自動啟動。如果手工啟動,則伺服器以UNIX 使用者身份運行(您恰好作為該使用者進行了註冊)。即,如果筆者以paul 進行註冊並啟動伺服器,則它將以paul 身份運行。如果用s u命令將使用者切換到root 然後啟動伺服器,則伺服器以root 身份運行。
但是,大多數時候可能都不會採用手工啟動伺服器。您很可能將安排伺服器在系統引導時作為標準啟動過程的一部分自動地運行。在UNIX中,該啟動過程由系統以UNIX 的r o o t使用者的身份執行,該過程中啟動的任何進程都用root 的許可權運行。
應該緊記MySQL伺服器啟動過程的兩個目標:
要伺服器以某些非root 的使用者身份啟動。通常,除非進程真的需要root 訪問權而mysql辦不到,否則應限制任何進程的能力。
要伺服器始終以同一個使用者的身份運行。伺服器有時作為一個使用者運行而有時又作為另一個使用者運行時會產生矛盾。這將導致檔案和目錄以不同的所有權在該資料下被建立,甚至引起伺服器不能訪問資料庫或表。以同一個使用者的身份一致地運行伺服器可以避免該問題。
為了以標準的、非特權的使用者身份運行資料庫,可按如下步驟執行該過程:
1) 選擇用於運行伺服器的帳號。mysqld 可以以任何使用者身份運行,但是很明顯,它只為MySQL活動建立了一個單獨的帳號。您也可以為MySQL專門指定一個組。筆者將調用的這些使用者和組的名字命名為mysqladm 和mysqlg r p。如果您使用了其他的名字,則在本書中有mysqladm 和mysqlgrp 的地方替換它們
如果您在自己的帳號下安裝了MySQL並且系統中沒有特定的系統管理權限,則您可以在自己的ID 使用者下運行伺服器。在這種情況下,應使用您自己的註冊名和組名替代mysqladm 和mysqlgrp 。
如果您利用RPM 檔案在RedHat Linux 下安裝了MySQL,則該安裝程式將在mysql名下自動建立了一個帳號。應使用該名字替換mysqladm 。
2) 如果必要的話,可用系統常用的帳號建立過程( a c count - c r e a t i o n)來建立伺服器帳號。這需要以root 身份進行操作。
3) 關閉伺服器(如果它在運行)。
4) 修改資料目錄以及任何子目錄和檔案的所有權,使mysqladm 使用者擁有它們。例如,如果資料目錄是/ us r / l o c a l / v a r,則可按以下設定mysqladm 使用者的所有權:
# cd /usr/local/var 移動到資料目錄
# chown -r mysqladmin.mysqlgrp 設定所有目錄和檔案的所有權
5) 修改資料目錄以及任何子目錄和檔案的許可權,使得只有mysqladm 使用者能夠訪問它們。設定該方式以避免其他人員訪問是一種好得安全預防措施。如果資料目錄是/ us r / l o c a l / v a r,則可通過mysqladm 使用者按下列操作設定應具有的一切(您需要以root 身份運行這些命令):
# cd /usr/local/var 移動到資料目錄
# chmod -R go -rwx 使所有一切只對mysqladm 可訪問
在設定資料目錄及其內容的所有權和方式時,觀察符號串連。您需要跟蹤符號串連並修改所指向的檔案或目錄的所有權和方式。如果這些串連檔案所定位的目錄不屬於您,則這樣做可能會引起麻煩,因此您必須是root 使用者。
在完成前述過程後,應確保無論是作為mysqladm 還是作為root 使用者註冊都始終啟動伺服器。在後者中,要確保指定了--user = mysqladm 的選項,使伺服器可以將其使用者ID 切換到mysqla d m(該選項在系統啟動過程中也可使用)。
--user 選項被增加到MySQL3.22 的mysql中。如果您的版本比MySQL3.22 舊,則在啟動伺服器並作為root 使用者運行時,可以使用su命令指示系統在指定帳號下運行伺服器。您需要閱讀有關su的人工頁,因為作為一個指定使用者運行命令的文法被改變了。
啟動伺服器的方法
如果您已經確定了用來運行伺服器的帳號,則可以選擇安排怎樣啟動伺服器。可以從命令列手工運行,或在系統啟動過程中自動運行伺服器。有三種啟動伺服器的主要方法:
直接調用mysqld。這或許是最小的命令方法。除了說明mysqld --help 是一個有用的命令(用它可以尋找您可利用其他啟動方法使用的選項)外,筆者不打算進一步討論它。
調用safe_mysqld 指令碼。safe_mysqld 試圖確定伺服器程式和資料目錄的位置,然後利用反映這些位置的選項調用伺服器。safe_mysqld 將伺服器的標準錯誤輸出重新導向到資料目錄的錯誤檔案中,並以記錄的形式出現。在啟動伺服器後, safe_mysqld 還監控
伺服器,並在其死機時重新啟動。safe_mysqld 通常用於UNIX 的BSD 風格的版本。
如果您曾經作為root 或在系統啟動程式中啟動s a f e _ mysqld,則錯誤記錄檔將由r o o t擁有。如果您試著以非特權的使用者身份調用s a f e _ mysqld,則可能引起“所有權被拒絕”的錯誤。刪除該錯誤檔案再試一次。
調用mysql.server 指令碼。通過運行s a f e _ mysqld . mysql. server,該指令碼啟動伺服器。該指令碼建議在使用System V 啟動/關閉系統的系統中使用。這個系統包括幾個包含在機器登入或退出一個特定運行級時被調用的指令碼的目錄。它可以利用start 或stop 參數進行調用,以指明希望啟動還是關閉伺服器。
safe_mysqld 指令碼被安裝在MySQL安裝目錄的bin 目錄下,或者在MySQL來源程式分發包的scripts 目錄中。mysql.server 指令碼安裝在MySQL安裝目錄的s h a r e / mysql目錄下,或者在MySQL來源程式分發包的support-files 目錄中。如果要使用它,應將其
拷貝到合適的啟動目錄中。
對於BSD 風格的系統,在/etc 目錄中有幾個檔案相對應,它們在引導期間開始服務。這些檔案的名字通常以‘ r c'開始,因此很可能會有一個名為rc.local (或類似的名字)的檔案來啟動本地的安裝服務。在這樣的系統中,您可能要按如下方法添加一些行到rc.local 檔案中以啟動伺服器(如果路徑與您系統中的不同,可將其修改成s a f e _ mysqld):
if (-x /usr/local/bin/safe_mysqld);then
/usr/local/bin/safe_mysqld &
fi
對於System V 風格的系統,可以通過將其放置在/etc 下的合適的啟動目錄中來安裝mysql. server。如果您運行Linux 並從RPM 檔案中安裝了MySQL,那麼這此操作可能已經完成了。否則,應該在主啟動指令碼目錄中安裝該指令碼,並在合適的運行級目錄中設定對它的串連。您還可使該指令碼僅對root 使用者可執行。
開機檔案目錄的布局隨系統而變化,因此將需要全面檢查來弄清系統是怎樣組織它們的。例如,在LinuxPPC 中,這些目錄為/etc/rc.d/init.d 和/ e t c / r c . d / r c 3 . d。應該按如下方法安裝該指令碼:
# cp mysql.server /etc/rc.d/init.d
# cd /etc/init.d
# chmod 500 mysql.server
# cd /etc/rc.d/rc3.d
# In -s ../init.d/mysql.server S99mysql 在Solaris 中,主指令碼目錄為/ e t c / i n i t . d,運行級目錄為/ e t c / r c 2 . d,因此上述命令將替換為:
#cp mysql.server /etc/init.d
# cd /etc/init.d
# chmod 500 mysql.server
# cd /etc/rc2.d
# In -s ../init.d/mysql.server s99mysql 在系統啟動期間,S99mysql指令碼利用start 參數自動調用。
如果您擁有chkconfig 命令(它在Linux 中很常用),則可用其協助安裝mysql.server 指令碼來代替手工運行上述的命令。
1. 指定啟動選項
在啟動伺服器時,如果想要指定附加的啟動選項,可用兩種方法進行操作。您可以修改所使用的啟動指令碼( safe_mysqld 或mysql. server),並在調用伺服器的命令列中直接指定這些選項。您還可以在選項檔案中指定選項。筆者建議,如果可能的話,應在全域選項檔案中指定伺服器選項。通常該檔案的位置是UNIX 中的/ e t c / my.cnf 和Windows 中的c:my.cnf(有關使用選項檔案的細節,請參閱附錄E)。
某些種類的資訊不能作為伺服器的選項指定。為了這些選項,您可能需要修改s a f e _ mysqld。例如,如果伺服器不能正確地拾取GMT 中的本地時區(local time zone)和返回時間值,可以設定TZ 環境變數以給該變數一個提示。如果用safe_mysqld 或mysql. ser ver啟動伺服器,可以將時區設定增加到safe_mysqld 中。找到啟動伺服器的命令列,並在該行之前增加下列命令:
TZ=US/Central
export TZ
這個命令將TZ 設定為US Central 時區。您需要使用合適位置的時區。該文法是S o l a r i s 的,您的系統可能會有所不同。例如,設定TZ 變數的另一個常用文法為:
TZ=CST6CDT
export TZ
如果修改了啟動指令碼,當下次安裝MySQL時(如,升級到更新的版本),將失去這些修改,除非在之前將該啟動指令碼拷貝到了其他地方。在安裝新的版本之後,將您的指令碼與新安裝的指令碼進行比較,以便看看重建立立還需要做什麼改動。
2. 在啟動期間檢查表
除了在系統引導時安排伺服器的啟動外,您還可以安裝一個指令碼來運行mysamchk 和i s a m c h k,以便在伺服器啟動前對錶進行檢查。您可能打算在伺服器崩潰後重新啟動,但表可能已經毀壞了。在伺服器啟動前檢查這些表是發現問題的好辦法。第13 章包含了有關編寫和安裝這種指令碼的細節。
關閉伺服器
要想手工關閉伺服器,可使用mysqla d m i n:
% mysqladmin shutdown
要想自動關閉伺服器,您不需要做特別的操作。BSD 系統通常會通過給進程發送一個TERM 訊號來關閉服務。進程或者對其作出反應,或者被隨便地取消。當mysqld 接收到訊號時,它會通過終止來響應。對於利用mysql.server 啟動伺服器的System V-風格的系統,該關閉進程將調用帶有stop 參數的指令碼來指示伺服器進行關閉──當然,這是在假定您已經安裝了mysql. ser ver的情況下進行的。
在不串連時收回伺服器的控制
在某些環境中,由於不能串連到伺服器,您需要用手工重新啟動它。當然,這有點荒謬,因為一般是通過串連到伺服器然後告知伺服器終止來手工關閉伺服器的。那麼這種情況是怎樣出現的?
首先,MySQL的root 口令可能得到了一個您不知道的值。這種情況可能是在修改口令時發生的─例如,如果在輸入新的口令值時碰巧鍵入了一個不可見的控制字元。還有可能就是完全忘記了口令。
其次,對於localhost 的串連通常是通過UNIX 域的通訊端檔案進行的,它一般為/ t m p / mysql. s o c k。如果該通訊端檔案被刪除了,則本地客戶機將不能進行串連。如果系統偶爾運行了一個刪除/tmp 中的臨時檔案的cron 作業,這種情況就可能會發生。
如果因為失去通訊端檔案而不能進行串連,可以通過重新啟動伺服器簡單地進行恢複,因為伺服器在啟動期間重建立立了該檔案。這裡應知道的是,不能用該通訊端建立串連(因為它已經不存在)而必須建立TCP/IP 串連。例如,如果伺服器的主機是pit - viper. s n a k e . n e t,則可以按如下方法進行串連:
% mysqladmin -p -uroot -h pit-viper.snake.net shutdown
如果此通訊端檔案被cron 作業刪除,則問題將複發,直到您修改cron 作業或使用另一個通訊端檔案為止。您可以用全域選項檔案指定另一個通訊端檔案。例如,如果資料目錄為/ us r / l o c a l / v a r,則可通過將以下行添加到/ e t c / my.cnf 中來移動通訊端檔案到那裡:
[mysqld]
socket=/usr/local/var/mysql.sock
[client]
socket=/usr/local/var/mysql.sock
路徑名是為伺服器和客戶機程式二者所指定的,以便它們能使用相同的通訊端檔案。如果只對伺服器設定路徑名,客戶機程式將仍然在舊的位置上尋找通訊端檔案。在做出這個修改後應重新啟動伺服器,使它在新的位置建立通訊端檔案。
如果由於您忘記了root 的口令或將其修改為一個您不知道的值而不能進行串連,則需要收回伺服器的控制以便重新設定口令:
關閉伺服器。如果您以root 使用者的身份在伺服器主機上進行登入,可用kill 命令終止伺服器。通過使用ps 命令或通過查看伺服器的PID 檔案(通常放在資料目錄中)能找出伺服器的ID 進程。
最好先試著用標準的kill 命令取消伺服器,該命令將一個TERM 訊號發送到伺服器上,以查看伺服器是否通過關閉訊號來響應。也就是說,表和日誌將被適當地重新整理。如果伺服器被堵塞並且沒有響應正常的終止訊號,可使用kill -9 強制終止它。這是最後的一個
方法,因為可能存在未重新整理的更改,並且要承擔非一致狀態下將表保留下來的風險。如果用kill -9 終止伺服器,應確保在重新啟動伺服器之前利用myisamchk 和i s a m c h k對錶進行檢查(參見第13章)
用--skip-grant-tables 選項重新啟動伺服器。該操作告訴伺服器不要使用授權的表檢查串連。這允許您作為root 使用者不用輸入口令即可進行串連。在串連之後,修改r o o t的口令。
告訴伺服器再利用mysqladmin flush-privileges 使用授權表啟動。如果您的mysqladmin 版本不識別f l us h - priv i l e g e s,試著進行重新載入。