最近工作中需要裝MongoDB環境,搭建過程中遇到了一些問題,在這里記錄一下安裝MongoDB環境的方法以及問題的解決方法。有兩種安裝MongoDB的方法:brew安裝和手動安裝。
目錄
使用Homebrew安裝MongoDB
手動安裝MongoDB(不使用Homebrew)
兩種安裝方式對應的卸載方法
執行mongo命令提示command not found
使用Homebrew安裝MongoDB
-
安裝Homebrew(如果你還沒有安裝): 打開終端(Terminal)并運行以下命令來安裝Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安裝完成后,運行以下命令以確保Homebrew安裝正確:
brew doctor
-
通過Homebrew安裝MongoDB: MongoDB官方已經不支持通過Homebrew直接安裝,但你可以使用第三方tap來安裝。在終端運行以下命令:
brew tap mongodb/brew brew install mongodb-community
-
啟動MongoDB服務: 你可以使用
brew
服務來啟動MongoDB:brew services start mongodb/brew/mongodb-community
這將配置MongoDB作為后臺服務啟動。執行這條命令遇到了報錯:
Error: uninitialized constant Homebrew::Service::System /usr/local/Homebrew/Library/Homebrew/macos_version.rb:150:in `const_missing' /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services/cmd/services.rb:61:in `services' /usr/local/Homebrew/Library/Homebrew/brew.rb:94:in `<main>'
這個錯誤信息表明在嘗試使用Homebrew的
services
命令時遇到了問題。Homebrew::Service::System
是一個未初始化的常量,這通常意味著Homebrew的某部分沒有正確加載或者Homebrew本身可能存在損壞。為了解決這個問題,可以嘗試以下幾個步驟:(1)更新Homebrew: 運行以下命令以確保Homebrew和所有的tap都是最新的:
brew update brew upgrade
(2)檢查Homebrew的健康狀況: 運行以下命令來檢查Homebrew的狀態,并修復任何報告的問題:
brew doctor
(3)重新啟動你的計算機: 有時候,簡單地重新啟動計算機可以解決臨時的系統問題。? ? ? ? ? ? ? 以上三步都沒有解決我的問題。? ? ? ?(4)重新安裝Homebrew服務: 如果更新和修復之后問題仍然存在,嘗試卸載Homebrew服務然后重新安裝:
brew untap homebrew/services brew tap homebrew/services
這一步解決了我的問題。
(5)檢查Homebrew的版本: 確保你的Homebrew版本是最新的。運行以下命令查看當前版本:
brew --version
如果不是最新的,再次運行
brew update
。(6)重新安裝Homebrew: 如果以上步驟都不能解決問題,你可能需要重新安裝Homebrew。首先,備份你當前的Homebrew安裝(包括已安裝的包),然后根據Homebrew的文檔進行重新安裝。如果在嘗試這些步驟之后問題依然存在,你可能需要查看Homebrew的GitHub倉庫中的Issues頁面看看是否有其他人遇到了類似的問題,或者創建一個新的Issue求助。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?啟動mongodb服務成功: -
驗證MongoDB是否正在運行: 在終端運行以下命令來連接MongoDB服務器:
mongo
如果MongoDB已經啟動,你將看到MongoDB shell的提示符。這一步我又遇到了問題:
qa@QAdeMacBook-Pro ~ % mongo zsh: command not found: mongo
這意味著
mongo
shell 并不在你的系統 PATH 環境變量中。這通常發生在以下幾種情況:(1)MongoDB shell沒有安裝:在某些情況下,MongoDB服務器和MongoDB shell是分開安裝的。確保你已經安裝了包含mongo
shell的MongoDB包。(2)PATH環境變量未正確設置:當你安裝MongoDB時,mongo
shell的可執行文件應該位于MongoDB的bin
目錄中。你需要確保這個目錄被添加到了你的PATH環境變量中。解決這個問題的步驟如下:(1)確認mongo shell是否安裝: 你可以通過brew list
命令檢查是否安裝了mongo
shell:brew list | grep mongo
如果這個命令返回了與
mongodb-community
相關的結果,那么mongo
shell應該已經安裝了。(2)添加MongoDB的bin目錄到PATH: 找到MongoDB的安裝目錄,并將其
bin
目錄添加到你的PATH環境變量中。通常,如果你是通過Homebrew安裝的MongoDB,它的bin
目錄可能位于/usr/local/opt/mongodb-community/bin
。你可以通過以下命令將其添加到你的.zshrc
文件中:echo 'export PATH="/usr/local/opt/mongodb-community/bin:$PATH"' >> ~/.zshrc
然后,運行
source ~/.zshrc
來重新加載你的配置,或者重新打開一個終端窗口。(3)驗證PATH環境變量: 使用echo $PATH
命令來確認PATH環境變量是否包含了MongoDB的bin
目錄。(4)再次嘗試運行mongo shell: 在終端中輸入mongo
并回車,看看是否能夠啟動MongoDB shell。如果你按照上述步驟操作后仍然無法運行mongo
命令,可能需要重新安裝MongoDB shell或者進一步檢查你的系統配置。我按照要求設置了環境變量,還是會有這個報錯。如果要停止使用
brew services
啟動的MongoDB服務,你可以執行以下命令:brew services stop mongodb
如果你的MongoDB是通過
mongodb-community
包安裝的,你可能需要執行:brew services stop mongodb-community
如果你想查看所有通過
brew services
管理的服務的狀態,可以使用:brew services list
這將列出所有服務及其當前狀態(如已啟動、已停止等)。這樣,你就可以輕松管理你的MongoDB服務以及任何其他使用Homebrew安裝的后臺服務。
手動安裝MongoDB(不使用Homebrew)
-
下載MongoDB: 訪問MongoDB官方網站下載頁(https://www.mongodb.com/try/download/community),選擇適合的版本下載。
-
解壓MongoDB壓縮包: 下載完成后,解壓MongoDB壓縮包到一個你選擇的目錄。
-
配置環境變量: 將MongoDB目錄的
bin
文件夾添加到你的PATH環境變量中。你可以在~/.bash_profile
、~/.zshrc
或你的shell配置文件中添加以下行:export PATH=<MongoDB安裝目錄>/bin:$PATH
替換
<MongoDB安裝目錄>
為你的實際安裝路徑。/Users/qa/Downloads/mongodb-macos-x86_64-7.0.4/bin,export PATH="/Users/qa/Downloads/mongodb-macos-x86_64-7.0.4/bin:$PATH" -
創建數據和日志目錄: 默認情況下,MongoDB將數據存儲在
/data/db
目錄中,但你需要手動創建這個目錄:sudo mkdir -p /data/db sudo chown `id -un` /data/db
你也可以選擇其他目錄來存儲數據,但需要在啟動MongoDB時指定。執行sudo mkdir -p /data/db 報錯mkdir: /data: Read-only file system。
在macOS上,特別是從Catalina (10.15) 版本開始,系統引入了只讀的系統卷,這意味著你不能直接在根目錄(
/
)下創建或修改文件夾,因此你會遇到 "Read-only file system" 的錯誤。為了解決這個問題,你可以在用戶的主目錄或其他非系統保護區域創建數據目錄。例如,你可以在你的主目錄下創建一個
db
目錄:(1)打開終端。(2)運行以下命令來創建一個名為mongodb-data
的目錄(你可以根據自己的需要命名這個目錄):mkdir -p ~/mongodb-data
(3)然后你需要告訴MongoDB使用這個新的數據目錄。當你啟動
mongod
服務時,使用--dbpath
選項指定數據目錄的路徑:mongod --dbpath ~/mongodb-data
這樣,MongoDB就會使用你在主目錄下創建的
mongodb-data
文件夾來存儲數據,而不是默認的/data/db
目錄。請注意,如果你是通過Homebrew安裝的MongoDB,并且希望使用
brew services
來管理MongoDB服務,你可能需要修改Homebrew服務的配置文件來指定新的數據目錄路徑。這通常涉及到編輯MongoDB的plist文件(位于/usr/local/Cellar/mongodb-community/{version}/homebrew.mxcl.mongodb-community.plist
,其中{version}
需要替換為實際安裝的版本號),并在其中添加--dbpath
選項。 -
啟動MongoDB: 在終端運行以下命令來啟動MongoDB:
mongod
如果你更改了數據存儲目錄,使用
--dbpath
選項指定路徑:mongod --dbpath <你的數據目錄路徑>
-
連接MongoDB: 打開另一個終端窗口,運行以下命令連接MongoDB:
mongo
當我啟動mongodb服務時,遇到了錯誤:
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"E", "c":"CONTROL", "id":20568, "ctx":"initandlisten","msg":"Error setting up listener","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":"setup bind :: caused by :: Address already in use"}}}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"REPL", "id":4784900, "ctx":"initandlisten","msg":"Stepping down the ReplicationCoordinator for shutdown","attr":{"waitTimeMillis":15000}}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"REPL", "id":4794602, "ctx":"initandlisten","msg":"Attempting to enter quiesce mode"}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"-", "id":6371601, "ctx":"initandlisten","msg":"Shutting down the FLE Crud thread pool"}
{"t":{"$date":"2023-12-29T15:46:46.054+08:00"},"s":"I", "c":"COMMAND", "id":4784901, "ctx":"initandlisten","msg":"Shutting down the MirrorMaestro"}
Error setting up listener
這表明MongoDB服務在嘗試綁定到某個網絡地址(如localhost
)和端口(默認是27017
)時遇到了問題。錯誤的具體內容是:
Address already in use
這意味著MongoDB服務嘗試綁定的端口已經被其他進程占用了。在大多數情況下,這是因為另一個MongoDB實例已經在運行,或者有其他服務正在使用該端口。
要解決這個問題,你可以采取以下步驟:
-
查找占用端口的進程:你可以使用
lsof
或netstat
命令來查找哪個進程正在使用27017端口。例如:lsof -i :27017
或者
netstat -anp | grep 27017
這將列出所有使用27017端口的進程信息。
-
結束占用端口的進程:如果確定是MongoDB的另一個實例占用了端口,并且你確定要關閉它,你可以使用
kill
命令來結束該進程。例如:kill <PID>
其中
<PID>
是占用端口的進程ID。 -
重新啟動MongoDB服務:在結束占用端口的進程之后,你可以嘗試再次啟動MongoDB服務:
mongod --dbpath ~/mongodb-data
以上就是在Mac上搭建MongoDB環境的基本步驟。如果有任何問題,可以參考MongoDB的官方文檔或者在安裝過程中查看終端中的錯誤信息。
兩種安裝方式對應的卸載方法
如果你在電腦上既使用Homebrew安裝了MongoDB,又手動安裝了MongoDB,并為它們配置了不同的環境變量,可能會遇到以下問題:
-
端口沖突:MongoDB默認使用27017端口。如果兩個MongoDB實例都嘗試使用同一個端口,那么后啟動的實例將無法綁定到該端口上,因為它已經被第一個實例占用了。
-
配置混淆:如果你為兩個MongoDB實例設置了不同的環境變量,可能會導致運行時的配置混淆。例如,當你嘗試啟動或與MongoDB交互時,你可能不確定正在使用哪個版本的MongoDB實例。
-
路徑沖突:如果兩個MongoDB實例配置的數據目錄或日志目錄相同,可能會導致數據覆蓋或損壞。
-
版本沖突:如果兩個MongoDB實例的版本不同,可能會導致客戶端工具、驅動程序或應用程序與MongoDB實例的兼容性問題。
-
管理復雜性:維護兩個MongoDB實例意味著你需要記住兩套配置、兩個不同的命令集以及兩個服務的啟動和停止方式,這增加了管理的復雜性。
為了避免這些問題,建議你選擇一種安裝方式,并且堅持使用它:
-
如果選擇Homebrew:你可以通過
brew services
管理MongoDB服務,并且依賴Homebrew來處理版本更新和路徑配置。 -
如果選擇手動安裝:你需要自己管理MongoDB的啟動、停止、配置和更新。
卸載用Homebrew安裝的MongoDB,可以運行:
brew services stop mongodb
brew uninstall mongodb
如果你想刪除手動安裝的MongoDB,你需要停止服務(如果它正在運行),然后刪除MongoDB的文件夾和配置文件。
在做出決定之前,請確保備份所有重要的數據,以免在卸載過程中丟失。
執行mongo命令提示command not found
首先想到的原因是沒有配置環境變量會有這個問題,
即使你已經配置過環境變量,這可能是由以下原因引起的:
-
環境變量未生效:你可能在配置文件中正確設置了環境變量,但是更改可能還沒有生效。你可以通過關閉并重新打開你的終端窗口來刷新環境變量,或者在當前終端中運行
source ~/.bash_profile
(或對應的配置文件,比如~/.zshrc
或~/.bashrc
等,取決于你使用的shell)來使更改立即生效。 -
錯誤的環境變量路徑:你可能在環境變量中設置了錯誤的路徑。檢查你的
.bash_profile
、.bashrc
、.zshrc
或其他shell配置文件中的PATH
環境變量,確保它包含了MongoDB的可執行文件目錄。對于Homebrew安裝的MongoDB,它通常位于/usr/local/bin
目錄中。 -
配置文件未加載:如果你使用的是非常規的shell或者有特殊的配置,可能你的環境變量配置文件(如
.bash_profile
、.bashrc
、.zshrc
等)沒有被加載。確保你在正確的文件中添加了環境變量,并且這個文件在你的shell啟動時會被讀取。 -
多個MongoDB版本:由于你提到電腦上同時用brew安裝了MongoDB,也手動安裝了MongoDB,可能存在多個版本的MongoDB。確保你的
PATH
環境變量指向的是你想要使用的MongoDB版本的路徑。 -
權限問題:可能是由于權限問題導致的。確認
mongo
命令的可執行文件是否具有適當的執行權限。 -
Shell不識別更改:如果你使用的是zsh而不是bash,你需要在
.zshrc
而不是.bash_profile
中設置環境變量。
你可以通過執行以下命令來確認mongo
命令的位置:
which mongo
或者查找系統中所有mongo
命令的位置:
find / -name mongo 2>/dev/null
如果以上命令返回了
mongo
命令的路徑,確保這個路徑被包含在你的PATH
環境變量中。如果命令沒有返回任何路徑,那么可能你的MongoDB沒有安裝正確,或者mongo
命令的路徑沒有被加入到PATH
中。
一旦你找到了正確的mongo
命令路徑,你可以通過以下命令將它添加到你的PATH
環境變量中(假設mongo
命令位于/path/to/mongo/bin
):
export PATH="/path/to/mongo/bin:$PATH"
然后將這行添加到你的shell配置文件中(.bash_profile
、.bashrc
、.zshrc
等),保存文件,并重新加載配置或重啟你的終端。