BREW INSTALL MONGODB
This document outlines the process of installing MongoDB using brew 4.1.14 in an intel, macOS 14.0, Sonoma environment.
NOTE
MongoDBoffers a cloud service with afree tier.
If you use the cloud service, there is no need to installMongoDBlocally.- This document will guide you through the installation of
MongoDBviabrew. - The command provided in the official download page,
brew install mongodb-atlas, is intended for cloud users.
If you are not a cloud user, there is no need to install this package.π£ IMPORTANT
mongodb-atlashas been renamed tomongodb-atlas-cli. (Refer to thebrewdocumentation) - This document follows the installation guide from the
MongoDB7.0 Docs.
INSTALL
MongoDB cannot be installed from the default repository of brew.
You need to add the repository provided by MongoDB.
brew tap mongodb/brew
This adds MongoDB to the brew repository.
brew install mongodb/brew/mongodb-community
This installs MongoDB using the stable version provided by MongoDB without specifying a version.
As of the date of writing, version 7.0.2 will be installed.
π΅ NOTE
When installing without specifying a version,
you can usebrew infoto check the package version.brew info mongodb/brew/mongodb-communityInformation about the package will be displayed.
π΅ NOTE
You can intentionally specify a version to install.
brew install mongodb/brew/mongodb-community@6.0This installs an older version by specifying the version information.
RUN
After installation via brew, you can run it using brew services.
brew services start mongodb/brew/mongodb-communityThis command starts the MongoDB service using brew.
brew services info mongodb/brew/mongodb-communityThis command outputs information about the MongoDB service using brew.
mongodb-community (homebrew.mxcl.mongodb-community)
Running: β
Loaded: β
Schedulable: β
User: xiyo
PID: 21105If the running status is displayed as β, it indicates that the service is running normally.
To run it manually, enter the following command:
$(brew --prefix)/opt/mongodb-community/bin/mongod --config $(brew --prefix)/etc/mongod.conf --fork --logpath $(brew --prefix)/var/log/mongodb/mongod.log$(brew --prefix) returns the installation path of brew.
The --fork option runs the mongod process in the background.
The --logpath option specifies the location of the log file.
Both options must be used together when running in the background.
β οΈ TROUBLESHOOTING
ERROR: Bootstrap failed: 5: Input/output error
When trying to run mongoDB using brew services after connecting to macOS via ssh, an error occurs.
Warning: running over SSH, using user/* instead of gui/* domain!
Hide this warning by setting HOMEBREW_SERVICES_NO_DOMAIN_WARNING.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Bootstrap failed: 5: Input/output error
Try re-running the command as root for richer errors.
Error: Failure while executing; `/bin/launchctl bootstrap user/501 /Users/xiyo/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist` exited with 5.
Error Explanation:
-
Warning: running over SSH, using user/* instead of gui/* domain! Hide this warning by setting HOMEBREW_SERVICES_NO_DOMAIN_WARNING.This warning message indicates that when accessing via an
sshsession, the execution domain is running asuserinstead ofgui.
brewis a package manager designed for personal users.
Therefore, it should ideally run in theguidomain without issues, but since I executed it usingssh, this warning appears.
The last message informs you of the environment variable,HOMEBREW_SERVICES_NO_DOMAIN_WARNING, which can be set to hide this warning. -
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).HOMEBREW_NO_ENV_HINTSis an environment variable that, when set, can hide environment-related hint messages frombrew.
This is useful for users who want to keep command output concise.
Runningman brewwill display themanualforbrew, where you can find additional information about this environment variable. -
Bootstrap failed: 5: Input/output error Try re-running the command as root for richer errors. Error: Failure while executing; `/bin/launchctl bootstrap user/501 /Users/xiyo/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist` exited with 5.This is an error output from
launchctlinmacOS.
The command at the bottom,/bin/launchctl, distinguishes between theGUIdomain and theUSERdomain based on the execution environment ofbrew. (GUIrefers to physical logins, whileUSERrefers to remote sessions likessh.)
This is a characteristic of thelaunchctlcommand inmacOS, and when connected viassh,brewruns in theUSERdomain.If you explicitly change
user/501togui/501and execute it, it will run normally (501 is the user'suid).
However, if a screen requiringguiinput/output appears, it cannot proceed in ansshsession.
For example, if the firewall is active, it needs to be allowed from thegui.
Ultimately, since it must run in theguidomain, I accessedmacOSremotely usingvncand then executedbrew servicesto runmongoDBin the terminal.
π΅ NOTE
In the error message, there is a recommendation:
Try re-running the command as root for richer errors. # Run as `root` to see detailed errorsHowever,
mongoDBis blocked from running asrootfor security reasons.
If executed asroot, the ownership of thebrewdirectory will change, so you must either:sudo chown -R $(whoami) $(brew --prefix)/*This command changes the ownership of all
directoriesandfilesinbrewto the current user.
Alternatively, you can explicitly change the ownership of$(brew --prefix)/Cellar/mongodb-community.The
-Roption meansrecursive, which applies the command to all sub-files and directories.You should use the method of uninstalling and reinstalling.
brew uninstall mongodb/brew/mongodb-communityWhen you enter the uninstall command using
brew, it will clearly indicate whichdirectoriesneed to be deleted asroot.
PLIST
To diagnose permission issues that arise when running as root, instead of just looking for error resolutions, you can directly check the contents of the plist file mentioned in the error message.
π΅ NOTE
A
plistis a file used to manage services inmacOS.
cat /Users/xiyo/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist
This command outputs the service management file used in macOS to the current shell.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD plist 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>homebrew.mxcl.mongodb-community</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mongodb-community/bin/mongod</string>
<string>--config</string>
<string>/usr/local/etc/mongod.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>WorkingDirectory</key>
<string>/usr/local</string>
<key>StandardErrorPath</key>
<string>/usr/local/var/log/mongodb/output.log</string>
<key>StandardOutPath</key>
<string>/usr/local/var/log/mongodb/output.log</string>
<key>HardResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>64000</integer>
</dict>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>64000</integer>
</dict>
</dict>
</plist>
-
Label:- This is a unique identifier for the service. In this case, it is labeled as
homebrew.mxcl.mongodb-community.
- This is a unique identifier for the service. In this case, it is labeled as
-
ProgramArguments:- This specifies the program to be executed along with its arguments.
- Here, it is set to run the
/usr/local/opt/mongodb-community/bin/mongodprogram with the--config /usr/local/etc/mongod.confoption.
-
RunAtLoad:- If this key is set to
true, the service will automatically start when the system loads.
- If this key is set to
-
KeepAlive:- If this key is set to
true,launchdwill automatically restart the service if it stops. In this case, it is set tofalse, so the service will not restart if it stops.
- If this key is set to
-
WorkingDirectory:- This specifies the working directory when the service is executed. It is set to
/usr/localin this case.
- This specifies the working directory when the service is executed. It is set to
-
StandardErrorPathandStandardOutPath:- These specify the file paths for redirecting standard error and standard output. Both are set to
/usr/local/var/log/mongodb/output.log, meaning all output and error messages will be logged to this file.
- These specify the file paths for redirecting standard error and standard output. Both are set to
-
HardResourceLimitsandSoftResourceLimits:- These set resource limits for the service. Here, the maximum number of file descriptors is set to
64000with the keyNumberOfFiles.
- These set resource limits for the service. Here, the maximum number of file descriptors is set to
As specified in ProgramArguments, let's execute it directly.
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
This command runs mongod while explicitly specifying the config file.
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
{"t":{"$date":"2023-10-09T10:09:26.789Z"},"s":"F", "c":"CONTROL", "id":20574, "ctx":"thread1","msg":"Error during global initialization","attr":{"error":{"code":38,"codeName":"FileNotOpen","errmsg":"Can't initialize rotatable log file :: caused by :: Failed to open /usr/local/var/log/mongodb/mongo.log"}}}
According to the output, mongod is failing to open the log file /usr/local/var/log/mongodb/mongo.log.
This type of error typically occurs when the file is missing or when there are insufficient write permissions for the file.
Let's check directly.
ls -al /usr/local/var/log/mongodb/
This command checks the files under the directory.
total 24
drwxr-xr-x 4 xiyo admin 128 Oct 9 12:47 .
drwxr-xr-x 10 xiyo admin 320 Oct 9 12:23 ..
-rw------- 1 root admin 11360 Oct 9 12:47 mongo.log
-rw-r--r-- 1 root admin 0 Oct 9 12:47 output.log
The output shows that the ownership of the mongo.log file is set to root.
Running brew as root violates the rule that it should not be run as such, leading to permission issues.
Since the output.log file is also referenced in the plist, let's change the ownership of both files to the current user.
sudo chown -R $(whoami) /usr/local/var/log/mongodb/
This command changes the ownership of all files.
Now, let's run the command again.
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
This command executes mongod in the same way as the plist, directly specifying the config file.
To check if it is running correctly, let's verify the process.
ps aux | grep mongod
This command checks if mongod is running.
ps aux | grep mongod
root 94237 0.3 0.3 36489684 47860 ?? Ss 12:47PM 1:35.65 /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
xiyo 12842 0.0 0.0 34121212 524 s000 S+ 7:32PM 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox mongod
The output shows a total of 2 processes, with the one executed as root being the actual running mongod.
Since brew was run as root, it has caused permission issues throughout.
Let's terminate the process.
kill 94237
This command terminates the process using the kill command.
π΅ NOTE
Contrary to its name, the
killcommand is used to terminate a process normally.
To forcefully terminate a process, usekill -9.
Now, let's run it again and check the logs.
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
ps aux | grep mongod
This command runs mongod and checks the process.
xiyo 13061 0.0 0.0 34126336 496 s000 R+ 7:37PM 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox mongod
The output shows that mongod is not running.
Now, let's check the mongo.log.
tail /usr/local/var/log/mongodb/mongo.log
The cat command outputs everything, so we will use the tail command to display only the last 10 lines.
{"t":{"$date":"2023-10-09T19:33:33.994+09:00"},"s":"I", "c":"TENANT_M", "id":7091600, "ctx":"thread1","msg":"Starting TenantMigrationAccessBlockerRegistry"}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":12858,"port":27017,"dbPath":"/usr/local/var/mongodb","architecture":"64-bit","host":"XIYOsMini"}}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":23403, "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"7.0.2","gitVersion":"02b3c655e1302209ef046da6ba3ef6749dd0b62a","modules":[],"allocator":"system","environment":{"distarch":"x86_64","target_arch":"x86_64"}}}}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":51765, "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Mac OS X","version":"23.0.0"}}}
{"t":{"$date":"2023-10-09T19:33:33.995+09:00"},"s":"I", "c":"CONTROL", "id":21951, "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"config":"/usr/local/etc/mongod.conf","net":{"bindIp":"127.0.0.1, ::1","ipv6":true},"storage":{"dbPath":"/usr/local/var/mongodb"},"systemLog":{"destination":"file","logAppend":true,"path":"/usr/local/var/log/mongodb/mongo.log"}}}}
{"t":{"$date":"2023-10-09T19:33:34.001+09:00"},"s":"I", "c":"NETWORK", "id":5693100, "ctx":"initandlisten","msg":"Asio socket.set_option failed with std::system_error","attr":{"note":"acceptor TCP fast open","option":{"level":6,"name":261,"data":"00 04 00 00"},"error":{"what":"set_option: Invalid argument","message":"Invalid argument","category":"asio.system","value":22}}}
{"t":{"$date":"2023-10-09T19:33:34.002+09:00"},"s":"I", "c":"NETWORK", "id":5693100, "ctx":"initandlisten","msg":"Asio socket.set_option failed with std::system_error","attr":{"note":"acceptor TCP fast open","option":{"level":6,"name":261,"data":"00 04 00 00"},"error":{"what":"set_option: Invalid argument","message":"Invalid argument","category":"asio.system","value":22}}}
{"t":{"$date":"2023-10-09T19:33:34.004+09:00"},"s":"F", "c":"STORAGE", "id":28661, "ctx":"initandlisten","msg":"Unable to read the storage engine metadata file","attr":{"error":{"code":38,"codeName":"FileNotOpen","errmsg":"Failed to read metadata from /usr/local/var/mongodb/storage.bson"}}}
{"t":{"$date":"2023-10-09T19:33:34.004+09:00"},"s":"F", "c":"ASSERT", "id":23091, "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":28661,"file":"src/mongo/db/storage/storage_engine_metadata.cpp","line":93}}
{"t":{"$date":"2023-10-09T19:33:34.004+09:00"},"s":"F", "c":"ASSERT", "id":23092, "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}
Reading the output from the bottom, the third-to-last line shows the error message Unable to read the storage engine metadata file.
Let's check the ownership of the actual file and change it if necessary.
ls -al /usr/local/var/mongodb/
This command checks the ownership.
π΅ NOTE
varis short forvariable, and it is a directory that stores files that are created or modified during use.
total 560
drwxr-xr-x 20 xiyo admin 640 Oct 9 19:33 .
drwxrwxr-x 10 xiyo admin 320 Oct 9 12:23 ..
-rw------- 1 root admin 50 Oct 9 12:47 WiredTiger
-rw------- 1 root admin 21 Oct 9 12:47 WiredTiger.lock
-rw------- 1 root admin 1471 Oct 9 19:33 WiredTiger.turtle
-rw------- 1 root admin 69632 Oct 9 19:33 WiredTiger.wt
-rw------- 1 root admin 4096 Oct 9 19:33 WiredTigerHS.wt
-rw------- 1 root admin 20480 Oct 9 19:33 _mdb_catalog.wt
-rw------- 1 root admin 20480 Oct 9 19:33 collection-0-7618419118836831796.wt
-rw------- 1 root admin 20480 Oct 9 19:33 collection-2-7618419118836831796.wt
-rw------- 1 root admin 4096 Oct 9 19:33 collection-4-7618419118836831796.wt
drwx------ 3 root admin 96 Oct 9 19:33 diagnostic.data
-rw------- 1 root admin 0 Oct 9 19:33 mongod.lock
-rw------- 1 root admin 20480 Oct 9 19:33 sizeStorer.wt
-rw------- 1 root admin 114 Oct 9 12:47 storage.bson
The ownership is set to root.
Let's change the ownership from root to the current user and run mongod again.
sudo chown -R $(whoami) /usr/local/var/log/mongodb/
/usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
This command changes the ownership and immediately runs the process.
The shell becomes unresponsive, indicating that the process has started successfully.
Now that we have resolved the permission issues caused by violating the principle of not running brew as root, you can run mongoDB using brew services with either VNC or physical access to macOS.
Enjoy using mongoDB!