I’ve been doing some work with WordPress and Joomla recently, which led to the need to have mysql up and running on my dev server; it’s a mac mini running OS X Mavericks Server.
I’d like the mysqld process to run as a daemon in the background after the server boots; that way I don’t have to log in and start the process after each server reboot. I couldn’t find a recent, up-to-date faq for doing this, so I thought I would write what I did.
I’m a big fan of homebrew, so I used it to install mysql.
homebrew is a unix-style package manager for OS X; it’s awesome!
If you don’t have homebrew installed on your mac, you can get it by opening the terminal app and using this command:
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
Then to install mysql…
brew install mysql
Read the output of the above command carefully, as there are a few more steps that won’t be covered here today that are required to initialize and setup your new mysql database.
The homebrew mysql package comes with some info for automatically launching mysql on login. You can access the info with the following command:
brew info mysql
This is the last part of the output of the above command:
...
To have launchd start mysql at login:
ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
mysql.server start
Remember, I want to have mysql run as a daemon even when there is no user actively logged into the dev server…
This can easily be accomplished by copying the homebrew.mxcl.mysql.plist
file that is provided with the homebrew mysql package to the /Library/LaunchDaemons/
folder and then making some edits to the file in it’s new location.
Here is the contents of the included plist file:
<?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>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mysql</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mysql/bin/mysqld_safe</string>
<string>--bind-address=127.0.0.1</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/var</string>
</dict>
</plist>
There are a couple of issues that need to be addressed with the default plist file if you want to run mysql as a daemon.
- You’ll want to call the mysqld executable directly instead of invoking the
mysqld_safe
script. - You need to provide the user account that you would like to have run the
mysqld
process. - You need to provide the complete path to the WorkingDirectory; which on my system is
/usr/local/var/mysql
Before getting started with any changes to the included plist file, make a copy in the /Library/LaunchDaemons/
folder:
sudo cp /usr/local/opt/mysql/homebrew.mxcl.mysql.plist /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
Then open your favorite unix text editor (vim in my case):
sudo vim /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
Then make the following edits…
To call mysqld directly edit the line:
<string>/usr/local/opt/mysql/bin/mysqld_safe</string>
and change it to:
<string>/usr/local/opt/mysql/bin/mysqld</string>
To add the user account that you would like to have run the mysqld process, add the following line under the <key>ProgramArguments</key>
line:
<string>--user=mysqlusergoeshere</string>
where mysqlusergoeshere
is the unix name of the account you want to run the mysql process.
After
<key>RunAtLoad</key>
<true/>
Add the following two lines:
<key>UserName</key>
<string>mysqlusergoeshere</string>
Make sure the path for your WorkingDirectory leads to folder where your mysql data is located; in my case this was /usr/local/var/mysql
:
<key>WorkingDirectory</key>
<string>/usr/local/var/mysql</string>
Here is the contents of the complete plist file with all the necessary modifications:
<?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>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mysql</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mysql/bin/mysqld</string>
<string>--bind-address=127.0.0.1</string>
<string>--user=mysqlusergoeshere</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>mysqlusergoeshere</string>
<key>WorkingDirectory</key>
<string>/usr/local/var/mysql</string>
</dict>
</plist>
Once you have all the changes made to the plist file, you’ll want to change ownership and permissions of the file so that it will work with the launchctl
process.
If it isn’t already, change the owner to root
and the group to wheel
.
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
Set the appropriate permission by changing the file mode to 644:
sudo chmod 644 /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
The last step is to load the plist with launchctl
:
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
mysqld
should load immediately after this last command is run. It should also now load each time the system boots.
If you make changes to the plist file and need to reload it with launchctl
, make sure you first unload the file:
sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
I hope this guide helps anyone out who would like to have their homebrew mysql run as a daemon on OS X Mavericks.
Thanks for the article! I have one question though:
Why do I want to run mysqld directly instead of using mysql_safe which has some nice monitoring features build in?
My question, what is the recommended user that should be running mysql?
should it be _www , my personal user account on the system, or root?
Hi Mike,
Probably does not need to be root, any administrative account will do.
I tried the _mysql user and unfortunately I get issues with mysql writing to the pid and err file. I have had success with my regular user login name though .. but I don’t necessarily think I want mysql running on that account.
Thoughts?
Hi Mike,
I have a separate admin user account that I use to run services in the background; I don’t use my regular user login. I like to keep it separate. You can easily create another administrative user just for this purpose.
Fixed it!
I changed the permissions of the /usr/local/var/mysql folder and its contents to the appropriate user, in my case:
sudo chown -R _mysql /usr/local/var/mysql/
And made sure that _mysql user was the user used in the plist.
Thanks for the great article.
Awesome! I’m glad the article was useful!