作為MySQL管理員一個普通的目標就是確保服務器盡可能地處於運行狀態使得客戶機能夠隨時訪問它但是有時最好關閉服務器(例如如果正在進行數據庫的重定位不希望服務器在該數據庫中更新表)保持服務器運行和偶爾關閉它的需求關系不是本文所解決的但是我們至少可以討論如何使服務器啟動和停止以便您具備進行這兩個操作的能力
本章的說明只用於UNIX 系統
調用本章給出的命令
為了簡潔在大多數情況中諸如mysqla d m i nmysqldump 等程序在本章中沒有給出任何 h u或 p選項筆者假定您將會用連接服務器所需的任何選項調用這些程序
用無特權的用戶賬號運行MySQL服務器
在討論如何啟動服務器之前考慮一下在服務器啟動時應該運行哪個賬號服務器可以手工和自動啟動如果手工啟動則服務器以UNIX 用戶身份運行(您恰好作為該用戶進行了注冊)即如果筆者以paul 進行注冊並啟動服務器則它將以paul 身份運行如果用s u命令將用戶切換到root 然後啟動服務器則服務器以root 身份運行
但是大多數時候可能都不會采用手工啟動服務器您很可能將安排服務器在系統引導時作為標准啟動過程的一部分自動地運行在UNIX中該啟動過程由系統以UNIX 的r o o t用戶的身份執行該過程中啟動的任何進程都用root 的權限運行
應該緊記MySQL服務器啟動過程的兩個目標
要服務器以某些非root 的用戶身份啟動通常除非進程真的需要root 訪問權而mysql辦不到否則應限制任何進程的能力
要服務器始終以同一個用戶的身份運行服務器有時作為一個用戶運行而有時又作為另一個用戶運行時會產生矛盾這將導致文件和目錄以不同的所有權在該數據下被創建甚至引起服務器不能訪問數據庫或表以同一個用戶的身份一致地運行服務器可以避免該問題
為了以標准的非特權的用戶身份運行數據庫可按如下步驟執行該過程
) 選擇用於運行服務器的賬號mysqld 可以以任何用戶身份運行但是很明顯它只為MySQL活動創建了一個單獨的賬號您也可以為MySQL專門指定一個組筆者將調用的這些用戶和組的名字命名為mysqladm 和mysqlg r p如果您使用了其他的名字則在本書中有mysqladm 和mysqlgrp 的地方替換它們
如果您在自己的賬號下安裝了MySQL並且系統中沒有特定的管理權限則您可以在自己的ID 用戶下運行服務器在這種情況下應使用您自己的注冊名和組名替代mysqladm 和mysqlgrp
如果您利用RPM 文件在RedHat Linux 下安裝了MySQL則該安裝程序將在mysql名下自動創建了一個賬號應使用該名字替換mysqladm
) 如果必要的話可用系統常用的賬號創建過程( a c count c r e a t i o n)來創建服務器賬號這需要以root 身份進行操作
) 關閉服務器(如果它在運行)
) 修改數據目錄以及任何子目錄和文件的所有權使mysqladm 用戶擁有它們例如如果數據目錄是/ us r / l o c a l / v a r則可按以下設置mysqladm 用戶的所有權
# cd /usr/local/var 移動到數據目錄
# chown r mysqladminmysqlgrp 設置所有目錄和文件的所有權
) 修改數據目錄以及任何子目錄和文件的許可權使得只有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 選項被增加到MySQL 的mysql中如果您的版本比MySQL 舊則在啟動服務器並作為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則可能引起所有權被拒絕的錯誤刪除該錯誤文件再試一次
調用mysqlserver 腳本通過運行s a f e _ mysqld mysql server該腳本啟動服務器該腳本建議在使用System V 啟動/關閉系統的系統中使用這個系統包括幾個包含在機器登錄或退出一個特定運行級時被調用的腳本的目錄它可以利用start 或stop 參數進行調用以指明希望啟動還是關閉服務器
safe_mysqld 腳本被安裝在MySQL安裝目錄的bin 目錄下或者在MySQL源程序分發包的scripts 目錄中mysqlserver 腳本安裝在MySQL安裝目錄的s h a r e / mysql目錄下或者在MySQL源程序分發包的supportfiles 目錄中如果要使用它應將其拷貝到合適的啟動目錄中
對於BSD 風格的系統在/etc 目錄中有幾個文件相對應它們在引導期間開始服務這些文件的名字通常以 r c開始因此很可能會有一個名為rclocal (或類似的名字)的文件來啟動本地的安裝服務在這樣的系統中您可能要按如下方法添加一些行到rclocal 文件中以啟動服務器(如果路徑與您系統中的不同可將其修改成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/rcd/initd 和/ e t c / r c d / r c d應該按如下方法安裝該腳本
# cp mysqlserver /etc/rcd/initd
# cd /etc/initd
# chmod mysqlserver
# cd /etc/rcd/rcd
# In s /initd/mysqlserver Smysql 在Solaris 中主腳本目錄為/ e t c / i n i t d運行級目錄為/ e t c / r c d因此上述命令將替換為
#cp mysqlserver /etc/initd
# cd /etc/initd
# chmod mysqlserver
# cd /etc/rcd
# In s /initd/mysqlserver smysql 在系統啟動期間Smysql腳本利用start 參數自動調用
如果您擁有chkconfig 命令(它在Linux 中很常用)則可用其幫助安裝mysqlserver 腳本來代替手工運行上述的命令
指定啟動選項
在啟動服務器時如果想要指定附加的啟動選項可用兩種方法進行操作您可以修改所使用的啟動腳本( safe_mysqld 或mysql server)並在調用服務器的命令行中直接指定這些選項您還可以在選項文件中指定選項筆者建議如果可能的話應在全局選項文件中指定服務器選項通常該文件的位置是UNIX 中的/ e t c / mycnf 和Windows 中的c:mycnf(有關使用選項文件的細節請參閱附錄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=CSTCDT
export TZ
如果修改了啟動腳本當下次安裝MySQL時(如升級到更新的版本)將失去這些修改除非在之前將該啟動腳本拷貝到了其他地方在安裝新的版本之後將您的腳本與新安裝的腳本進行比較以便看看重新建立還需要做什麼改動
在啟動期間檢查表
除了在系統引導時安排服務器的啟動外您還可以安裝一個腳本來運行mysamchk 和i s a m c h k以便在服務器啟動前對表進行檢查您可能打算在服務器崩潰後重新啟動但表可能已經毀壞了在服務器啟動前檢查這些表是發現問題的好辦法第 章包含了有關編寫和安裝這種腳本的細節
關閉服務器
要想手工關閉服務器可使用mysqla d m i n
% mysqladmin shutdown
要想自動關閉服務器您不需要做特別的操作BSD 系統通常會通過給進程發送一個TERM 信號來關閉服務進程或者對其作出反應或者被隨便地取消當mysqld 接收到信號時它會通過終止來響應對於利用mysqlserver 啟動服務器的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 pitvipersnakenet shutdown
如果此套接字文件被cron 作業刪除則問題將復發直到您修改cron 作業或使用另一個套接字文件為止您可以用全局選項文件指定另一個套接字文件例如如果數據目錄為/ us r / l o c a l / v a r則可通過將以下行添加到/ e t c / mycnf 中來移動套接字文件到那裡
[mysqld]
socket=/usr/local/var/mysqlsock
[client]
socket=/usr/local/var/mysqlsock
路徑名是為服務器和客戶機程序二者所指定的以便它們能使用相同的套接字文件如果只對服務器設置路徑名客戶機程序將仍然在舊的位置上查找套接字文件在做出這個修改後應重新啟動服務器使它在新的位置創建套接字文件
如果由於您忘記了root 的口令或將其修改為一個您不知道的值而不能進行連接則需要收回服務器的控制以便重新設置口令
關閉服務器如果您以root 用戶的身份在服務器主機上進行登錄可用kill 命令終止服務器通過使用ps 命令或通過查看服務器的PID 文件(通常放在數據目錄中)能找出服務器的ID 進程
最好先試著用標准的kill 命令取消服務器該命令將一個TERM 信號發送到服務器上以查看服務器是否通過關閉信號來響應也就是說表和日志將被適當地刷新如果服務器被堵塞並且沒有響應正常的終止信號可使用kill 強制終止它這是最後的一個
方法因為可能存在未刷新的更改並且要承擔非一致狀態下將表保留下來的風險如果用kill 終止服務器應確保在重新啟動服務器之前利用myisamchk 和i s a m c h k對表進行檢查(參見第章)
用skipgranttables 選項重新啟動服務器該操作告訴服務器不要使用授權的表檢查連接這允許您作為root 用戶不用輸入口令即可進行連接在連接之後修改r o o t的口令
告訴服務器再利用mysqladmin flushprivileges 使用授權表啟動如果您的mysqladmin 版本不識別f l us h priv i l e g e s試著進行重新加載
From:http://tw.wingwit.com/Article/program/MySQL/201404/30561.html