MySQL服務(wù)器的啟動(dòng)和關(guān)閉
更新時(shí)間:2008年04月06日 01:06:21 作者:
作為MySQL管理員,一個(gè)普通的目標(biāo)就是確保服務(wù)器盡可能地處于運(yùn)行狀態(tài),使得客戶機(jī)能夠隨時(shí)訪問它。但是,有時(shí)最好關(guān)閉服務(wù)器(例如,如果正在進(jìn)行數(shù)據(jù)庫的重定位,不希望服務(wù)器在該數(shù)據(jù)庫中更新表)。保持服務(wù)器運(yùn)行和偶爾關(guān)閉它的需求關(guān)系不是本書所解
決的。但是我們至少可以討論如何使服務(wù)器啟動(dòng)和停止,以便您具備進(jìn)行這兩個(gè)操作的能力。
本章的說明只用于UNIX 系統(tǒng)。如果正在運(yùn)行Windows 系統(tǒng),可以跳過本章,因?yàn)楦戒汚“獲得和安裝軟件”一節(jié)中包含了所有需要的啟動(dòng)和關(guān)閉命令。
調(diào)用本章給出的命令
為了簡潔,在大多數(shù)情況中,諸如mysqla d m i n、mysqldump 等程序在本章中沒有給出任何- h、- u或- p選項(xiàng)。筆者假定您將會(huì)用連接服務(wù)器所需的任何選項(xiàng)調(diào)用這些程序。
用無特權(quán)的用戶賬號(hào)運(yùn)行MySQL服務(wù)器
在討論如何啟動(dòng)服務(wù)器之前,考慮一下在服務(wù)器啟動(dòng)時(shí)應(yīng)該運(yùn)行哪個(gè)賬號(hào)。服務(wù)器可以手工和自動(dòng)啟動(dòng)。如果手工啟動(dòng),則服務(wù)器以UNIX 用戶身份運(yùn)行(您恰好作為該用戶進(jìn)行了注冊(cè))。即,如果筆者以paul 進(jìn)行注冊(cè)并啟動(dòng)服務(wù)器,則它將以paul 身份運(yùn)行。如果用s u命令將用戶切換到root 然后啟動(dòng)服務(wù)器,則服務(wù)器以root 身份運(yùn)行。
但是,大多數(shù)時(shí)候可能都不會(huì)采用手工啟動(dòng)服務(wù)器。您很可能將安排服務(wù)器在系統(tǒng)引導(dǎo)時(shí)作為標(biāo)準(zhǔn)啟動(dòng)過程的一部分自動(dòng)地運(yùn)行。在UNIX中,該啟動(dòng)過程由系統(tǒng)以UNIX 的r o o t用戶的身份執(zhí)行,該過程中啟動(dòng)的任何進(jìn)程都用root 的權(quán)限運(yùn)行。
應(yīng)該緊記MySQL服務(wù)器啟動(dòng)過程的兩個(gè)目標(biāo):
要服務(wù)器以某些非root 的用戶身份啟動(dòng)。通常,除非進(jìn)程真的需要root 訪問權(quán)而mysql辦不到,否則應(yīng)限制任何進(jìn)程的能力。
要服務(wù)器始終以同一個(gè)用戶的身份運(yùn)行。服務(wù)器有時(shí)作為一個(gè)用戶運(yùn)行而有時(shí)又作為另一個(gè)用戶運(yùn)行時(shí)會(huì)產(chǎn)生矛盾。這將導(dǎo)致文件和目錄以不同的所有權(quán)在該數(shù)據(jù)下被創(chuàng)建,甚至引起服務(wù)器不能訪問數(shù)據(jù)庫或表。以同一個(gè)用戶的身份一致地運(yùn)行服務(wù)器可以避免該問題。
為了以標(biāo)準(zhǔn)的、非特權(quán)的用戶身份運(yùn)行數(shù)據(jù)庫,可按如下步驟執(zhí)行該過程:
1) 選擇用于運(yùn)行服務(wù)器的賬號(hào)。mysqld 可以以任何用戶身份運(yùn)行,但是很明顯,它只為MySQL活動(dòng)創(chuàng)建了一個(gè)單獨(dú)的賬號(hào)。您也可以為MySQL專門指定一個(gè)組。筆者將調(diào)用的這些用戶和組的名字命名為mysqladm 和mysqlg r p。如果您使用了其他的名字,則在本書中有mysqladm 和mysqlgrp 的地方替換它們
如果您在自己的賬號(hào)下安裝了MySQL并且系統(tǒng)中沒有特定的管理權(quán)限,則您可以在自己的ID 用戶下運(yùn)行服務(wù)器。在這種情況下,應(yīng)使用您自己的注冊(cè)名和組名替代mysqladm 和mysqlgrp 。
如果您利用RPM 文件在RedHat Linux 下安裝了MySQL,則該安裝程序?qū)⒃趍ysql名下自動(dòng)創(chuàng)建了一個(gè)賬號(hào)。應(yīng)使用該名字替換mysqladm 。
2) 如果必要的話,可用系統(tǒng)常用的賬號(hào)創(chuàng)建過程( a c count - c r e a t i o n)來創(chuàng)建服務(wù)器賬號(hào)。這需要以root 身份進(jìn)行操作。
3) 關(guān)閉服務(wù)器(如果它在運(yùn)行)。
4) 修改數(shù)據(jù)目錄以及任何子目錄和文件的所有權(quán),使mysqladm 用戶擁有它們。例如,如果數(shù)據(jù)目錄是/ us r / l o c a l / v a r,則可按以下設(shè)置mysqladm 用戶的所有權(quán):
# cd /usr/local/var 移動(dòng)到數(shù)據(jù)目錄
# chown -r mysqladmin.mysqlgrp 設(shè)置所有目錄和文件的所有權(quán)
5) 修改數(shù)據(jù)目錄以及任何子目錄和文件的許可權(quán),使得只有mysqladm 用戶能夠訪問它們。設(shè)置該方式以避免其他人員訪問是一種好得安全預(yù)防措施。如果數(shù)據(jù)目錄是/ us r / l o c a l / v a r,則可通過mysqladm 用戶按下列操作設(shè)置應(yīng)具有的一切(您需要以root 身份運(yùn)行這些命令):
# cd /usr/local/var 移動(dòng)到數(shù)據(jù)目錄
# chmod -R go -rwx 使所有一切只對(duì)mysqladm 可訪問
在設(shè)置數(shù)據(jù)目錄及其內(nèi)容的所有權(quán)和方式時(shí),觀察符號(hào)連接。您需要跟蹤符號(hào)連接并修改所指向的文件或目錄的所有權(quán)和方式。如果這些連接文件所定位的目錄不屬于您,則這樣做可能會(huì)引起麻煩,因此您必須是root 用戶。
在完成前述過程后,應(yīng)確保無論是作為mysqladm 還是作為root 用戶注冊(cè)都始終啟動(dòng)服務(wù)器。在后者中,要確保指定了--user = mysqladm 的選項(xiàng),使服務(wù)器可以將其用戶ID 切換到mysqla d m(該選項(xiàng)在系統(tǒng)啟動(dòng)過程中也可使用)。
--user 選項(xiàng)被增加到MySQL3.22 的mysql中。如果您的版本比MySQL3.22 舊,則在啟動(dòng)服務(wù)器并作為root 用戶運(yùn)行時(shí),可以使用su命令指示系統(tǒng)在指定賬號(hào)下運(yùn)行服務(wù)器。您需要閱讀有關(guān)su的人工頁,因?yàn)樽鳛橐粋€(gè)指定用戶運(yùn)行命令的語法被改變了。
啟動(dòng)服務(wù)器的方法
如果您已經(jīng)確定了用來運(yùn)行服務(wù)器的賬號(hào),則可以選擇安排怎樣啟動(dòng)服務(wù)器??梢詮拿钚惺止み\(yùn)行,或在系統(tǒng)啟動(dòng)過程中自動(dòng)運(yùn)行服務(wù)器。有三種啟動(dòng)服務(wù)器的主要方法:
直接調(diào)用mysqld。這或許是最小的命令方法。除了說明mysqld --help 是一個(gè)有用的命令(用它可以查找您可利用其他啟動(dòng)方法使用的選項(xiàng))外,筆者不打算進(jìn)一步討論它。
調(diào)用safe_mysqld 腳本。safe_mysqld 試圖確定服務(wù)器程序和數(shù)據(jù)目錄的位置,然后利用反映這些位置的選項(xiàng)調(diào)用服務(wù)器。safe_mysqld 將服務(wù)器的標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到數(shù)據(jù)目錄的錯(cuò)誤文件中,并以記錄的形式出現(xiàn)。在啟動(dòng)服務(wù)器后, safe_mysqld 還監(jiān)控
服務(wù)器,并在其死機(jī)時(shí)重新啟動(dòng)。safe_mysqld 通常用于UNIX 的BSD 風(fēng)格的版本。
如果您曾經(jīng)作為root 或在系統(tǒng)啟動(dòng)程序中啟動(dòng)s a f e _ mysqld,則錯(cuò)誤日志將由r o o t擁有。如果您試著以非特權(quán)的用戶身份調(diào)用s a f e _ mysqld,則可能引起“所有權(quán)被拒絕”的錯(cuò)誤。刪除該錯(cuò)誤文件再試一次。
調(diào)用mysql.server 腳本。通過運(yùn)行s a f e _ mysqld . mysql. server,該腳本啟動(dòng)服務(wù)器。該腳本建議在使用System V 啟動(dòng)/關(guān)閉系統(tǒng)的系統(tǒng)中使用。這個(gè)系統(tǒng)包括幾個(gè)包含在機(jī)器登錄或退出一個(gè)特定運(yùn)行級(jí)時(shí)被調(diào)用的腳本的目錄。它可以利用start 或stop 參數(shù)進(jìn)行調(diào)用,以指明希望啟動(dòng)還是關(guān)閉服務(wù)器。
safe_mysqld 腳本被安裝在MySQL安裝目錄的bin 目錄下,或者在MySQL源程序分發(fā)包的scripts 目錄中。mysql.server 腳本安裝在MySQL安裝目錄的s h a r e / mysql目錄下,或者在MySQL源程序分發(fā)包的support-files 目錄中。如果要使用它,應(yīng)將其
拷貝到合適的啟動(dòng)目錄中。
對(duì)于BSD 風(fēng)格的系統(tǒng),在/etc 目錄中有幾個(gè)文件相對(duì)應(yīng),它們?cè)谝龑?dǎo)期間開始服務(wù)。這些文件的名字通常以‘ r c'開始,因此很可能會(huì)有一個(gè)名為rc.local (或類似的名字)的文件來啟動(dòng)本地的安裝服務(wù)。在這樣的系統(tǒng)中,您可能要按如下方法添加一些行到rc.local 文件中以啟動(dòng)服務(wù)器(如果路徑與您系統(tǒng)中的不同,可將其修改成s a f e _ mysqld):
if (-x /usr/local/bin/safe_mysqld);then
/usr/local/bin/safe_mysqld &
fi
對(duì)于System V 風(fēng)格的系統(tǒng),可以通過將其放置在/etc 下的合適的啟動(dòng)目錄中來安裝mysql. server。如果您運(yùn)行Linux 并從RPM 文件中安裝了MySQL,那么這此操作可能已經(jīng)完成了。否則,應(yīng)該在主啟動(dòng)腳本目錄中安裝該腳本,并在合適的運(yùn)行級(jí)目錄中設(shè)置對(duì)它的連接。您還可使該腳本僅對(duì)root 用戶可執(zhí)行。
啟動(dòng)文件目錄的布局隨系統(tǒng)而變化,因此將需要全面檢查來弄清系統(tǒng)是怎樣組織它們的。例如,在LinuxPPC 中,這些目錄為/etc/rc.d/init.d 和/ e t c / r c . d / r c 3 . d。應(yīng)該按如下方法安裝該腳本:
# 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,運(yùn)行級(jí)目錄為/ 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 在系統(tǒng)啟動(dòng)期間,S99mysql腳本利用start 參數(shù)自動(dòng)調(diào)用。
如果您擁有chkconfig 命令(它在Linux 中很常用),則可用其幫助安裝mysql.server 腳本來代替手工運(yùn)行上述的命令。
1. 指定啟動(dòng)選項(xiàng)
在啟動(dòng)服務(wù)器時(shí),如果想要指定附加的啟動(dòng)選項(xiàng),可用兩種方法進(jìn)行操作。您可以修改所使用的啟動(dòng)腳本( safe_mysqld 或mysql. server),并在調(diào)用服務(wù)器的命令行中直接指定這些選項(xiàng)。您還可以在選項(xiàng)文件中指定選項(xiàng)。筆者建議,如果可能的話,應(yīng)在全局選項(xiàng)文件中指定服務(wù)器選項(xiàng)。通常該文件的位置是UNIX 中的/ e t c / my.cnf 和Windows 中的c:my.cnf(有關(guān)使用選項(xiàng)文件的細(xì)節(jié),請(qǐng)參閱附錄E)。
某些種類的信息不能作為服務(wù)器的選項(xiàng)指定。為了這些選項(xiàng),您可能需要修改s a f e _ mysqld。例如,如果服務(wù)器不能正確地拾取GMT 中的本地時(shí)區(qū)(local time zone)和返回時(shí)間值,可以設(shè)置TZ 環(huán)境變量以給該變量一個(gè)提示。如果用safe_mysqld 或mysql. ser ver啟動(dòng)服務(wù)器,可以將時(shí)區(qū)設(shè)置增加到safe_mysqld 中。找到啟動(dòng)服務(wù)器的命令行,并在該行之前增加下列命令:
TZ=US/Central
export TZ
這個(gè)命令將TZ 設(shè)置為US Central 時(shí)區(qū)。您需要使用合適位置的時(shí)區(qū)。該語法是S o l a r i s 的,您的系統(tǒng)可能會(huì)有所不同。例如,設(shè)置TZ 變量的另一個(gè)常用語法為:
TZ=CST6CDT
export TZ
如果修改了啟動(dòng)腳本,當(dāng)下次安裝MySQL時(shí)(如,升級(jí)到更新的版本),將失去這些修改,除非在之前將該啟動(dòng)腳本拷貝到了其他地方。在安裝新的版本之后,將您的腳本與新安裝的腳本進(jìn)行比較,以便看看重新建立還需要做什么改動(dòng)。
2. 在啟動(dòng)期間檢查表
除了在系統(tǒng)引導(dǎo)時(shí)安排服務(wù)器的啟動(dòng)外,您還可以安裝一個(gè)腳本來運(yùn)行mysamchk 和i s a m c h k,以便在服務(wù)器啟動(dòng)前對(duì)表進(jìn)行檢查。您可能打算在服務(wù)器崩潰后重新啟動(dòng),但表可能已經(jīng)毀壞了。在服務(wù)器啟動(dòng)前檢查這些表是發(fā)現(xiàn)問題的好辦法。第13 章包含了有關(guān)編寫和安裝這種腳本的細(xì)節(jié)。
關(guān)閉服務(wù)器
要想手工關(guān)閉服務(wù)器,可使用mysqla d m i n:
% mysqladmin shutdown
要想自動(dòng)關(guān)閉服務(wù)器,您不需要做特別的操作。BSD 系統(tǒng)通常會(huì)通過給進(jìn)程發(fā)送一個(gè)TERM 信號(hào)來關(guān)閉服務(wù)。進(jìn)程或者對(duì)其作出反應(yīng),或者被隨便地取消。當(dāng)mysqld 接收到信號(hào)時(shí),它會(huì)通過終止來響應(yīng)。對(duì)于利用mysql.server 啟動(dòng)服務(wù)器的System V-風(fēng)格的系統(tǒng),該關(guān)閉進(jìn)程將調(diào)用帶有stop 參數(shù)的腳本來指示服務(wù)器進(jìn)行關(guān)閉──當(dāng)然,這是在假定您已經(jīng)安裝了mysql. ser ver的情況下進(jìn)行的。
在不連接時(shí)收回服務(wù)器的控制
在某些環(huán)境中,由于不能連接到服務(wù)器,您需要用手工重新啟動(dòng)它。當(dāng)然,這有點(diǎn)荒謬,因?yàn)橐话闶峭ㄟ^連接到服務(wù)器然后告知服務(wù)器終止來手工關(guān)閉服務(wù)器的。那么這種情況是怎樣出現(xiàn)的?
首先,MySQL的root 口令可能得到了一個(gè)您不知道的值。這種情況可能是在修改口令時(shí)發(fā)生的─例如,如果在輸入新的口令值時(shí)碰巧鍵入了一個(gè)不可見的控制字符。還有可能就是完全忘記了口令。
其次,對(duì)于localhost 的連接通常是通過UNIX 域的套接字文件進(jìn)行的,它一般為/ t m p / mysql. s o c k。如果該套接字文件被刪除了,則本地客戶機(jī)將不能進(jìn)行連接。如果系統(tǒng)偶爾運(yùn)行了一個(gè)刪除/tmp 中的臨時(shí)文件的cron 作業(yè),這種情況就可能會(huì)發(fā)生。
如果因?yàn)槭ヌ捉幼治募荒苓M(jìn)行連接,可以通過重新啟動(dòng)服務(wù)器簡單地進(jìn)行恢復(fù),因?yàn)榉?wù)器在啟動(dòng)期間重新建立了該文件。這里應(yīng)知道的是,不能用該套接字建立連接(因?yàn)樗呀?jīng)不存在)而必須建立TCP/IP 連接。例如,如果服務(wù)器的主機(jī)是pit - viper. s n a k e . n e t,則可以按如下方法進(jìn)行連接:
% mysqladmin -p -uroot -h pit-viper.snake.net shutdown
如果此套接字文件被cron 作業(yè)刪除,則問題將復(fù)發(fā),直到您修改cron 作業(yè)或使用另一個(gè)套接字文件為止。您可以用全局選項(xiàng)文件指定另一個(gè)套接字文件。例如,如果數(shù)據(jù)目錄為/ us r / l o c a l / v a r,則可通過將以下行添加到/ e t c / my.cnf 中來移動(dòng)套接字文件到那里:
[mysqld]
socket=/usr/local/var/mysql.sock
[client]
socket=/usr/local/var/mysql.sock
路徑名是為服務(wù)器和客戶機(jī)程序二者所指定的,以便它們能使用相同的套接字文件。如果只對(duì)服務(wù)器設(shè)置路徑名,客戶機(jī)程序?qū)⑷匀辉谂f的位置上查找套接字文件。在做出這個(gè)修改后應(yīng)重新啟動(dòng)服務(wù)器,使它在新的位置創(chuàng)建套接字文件。
如果由于您忘記了root 的口令或?qū)⑵湫薷臑橐粋€(gè)您不知道的值而不能進(jìn)行連接,則需要收回服務(wù)器的控制以便重新設(shè)置口令:
關(guān)閉服務(wù)器。如果您以root 用戶的身份在服務(wù)器主機(jī)上進(jìn)行登錄,可用kill 命令終止服務(wù)器。通過使用ps 命令或通過查看服務(wù)器的PID 文件(通常放在數(shù)據(jù)目錄中)能找出服務(wù)器的ID 進(jìn)程。
最好先試著用標(biāo)準(zhǔn)的kill 命令取消服務(wù)器,該命令將一個(gè)TERM 信號(hào)發(fā)送到服務(wù)器上,以查看服務(wù)器是否通過關(guān)閉信號(hào)來響應(yīng)。也就是說,表和日志將被適當(dāng)?shù)厮⑿隆H绻?wù)器被堵塞并且沒有響應(yīng)正常的終止信號(hào),可使用kill -9 強(qiáng)制終止它。這是最后的一個(gè)
方法,因?yàn)榭赡艽嬖谖此⑿碌母?,并且要承?dān)非一致狀態(tài)下將表保留下來的風(fēng)險(xiǎn)。如果用kill -9 終止服務(wù)器,應(yīng)確保在重新啟動(dòng)服務(wù)器之前利用myisamchk 和i s a m c h k對(duì)表進(jìn)行檢查(參見第13章)
用--skip-grant-tables 選項(xiàng)重新啟動(dòng)服務(wù)器。該操作告訴服務(wù)器不要使用授權(quán)的表檢查連接。這允許您作為root 用戶不用輸入口令即可進(jìn)行連接。在連接之后,修改r o o t的口令。
告訴服務(wù)器再利用mysqladmin flush-privileges 使用授權(quán)表啟動(dòng)。如果您的mysqladmin 版本不識(shí)別f l us h - priv i l e g e s,試著進(jìn)行重新加載。
相關(guān)文章
MySQL Innodb 存儲(chǔ)結(jié)構(gòu) 和 存儲(chǔ)Null值 用法詳解
這篇文章主要介紹了MySQL Innodb 存儲(chǔ)結(jié)構(gòu) 和 存儲(chǔ)Null值 用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Mysql5.7定時(shí)備份的實(shí)現(xiàn)
這篇文章主要介紹了Mysql5.7定時(shí)備份的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11MySQL將多條數(shù)據(jù)合并成一條的完整代碼示例
我們?cè)诓僮鲾?shù)據(jù)的時(shí)候,有時(shí)候需要把多行數(shù)據(jù),拼接成一行,下面這篇文章主要給大家介紹了關(guān)于MySQL將多條數(shù)據(jù)合并成一條的完整代碼示例,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05在MySQL數(shù)據(jù)庫中復(fù)位根用戶的密碼的方法
2007-12-12mysql id從1開始自增 快速解決id不連續(xù)的問題
這篇文章主要介紹了mysql id從1開始自增 快速解決id不連續(xù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07MySQL創(chuàng)建數(shù)據(jù)庫和創(chuàng)建數(shù)據(jù)表
MySQL?是最常用的數(shù)據(jù)庫,在數(shù)據(jù)庫操作中,基本都是增刪改查操作,簡稱CRUD。但是,這篇文章主要介紹了數(shù)據(jù)庫和數(shù)據(jù)表如何創(chuàng)建,想詳細(xì)了解的小伙伴可以參考閱讀一下2023-03-03解決MySQL innoDB間隙鎖產(chǎn)生的死鎖問題
線上經(jīng)常偶發(fā)死鎖問題,當(dāng)時(shí)處理一張表,也沒有聯(lián)表處理,但是有兩個(gè)mq入口,并且消息體存在一樣的情況,但是是偶發(fā)的,又模擬不出來什么場(chǎng)景會(huì)導(dǎo)致死鎖,只能進(jìn)行代碼分析,問題還原的方式去排查問題,本文給大家介紹了如何解決MySQL innoDB間隙鎖產(chǎn)生的死鎖問題2023-10-10