最近開始將開發工具都轉移到 Mac 上了,其中也會莫名其妙的遇到一些坑,不如干脆將整個流程都記錄下來,方便以后查找。

下載與安裝

首先進入 MySQL 官網,選擇免費的Community版:MySQL Community Server。MySQL 官網提供了tar.gzdmg兩種格式的安裝包,接下來主要圍繞使用dmg安裝來說。

download

下載后雙擊打開安裝包,根據說明一步步確認即可完成安裝。安裝成功后打開系統偏好設置,在最下面可以找到 MySQL,通過它可以查看 MySQL 狀態並啟動和關閉 MySQL。

start

指定配置

使用該方式啟動 MySQL 時是沒有指定配置文件的,因此 MySQL 會按照以下順序載入配置文件:

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. /usr/local/mysql/etc/my.cnf
  4. ~/.my.cnf

    只需要創建其中一個文件並設定好配置即可。

mysql: command not found

安裝后直接在命令行輸入mysql會提示mysql: command not found,需要先將其添加到環境變量:

vim ~/.bash_profile

添加以下指令:

export PATH=${PATH}:/usr/local/mysql/bin

保存后立即使其生效:

source ~/.bash_profile

便可以使用 MySQL 的相關命令了。

配置用戶

剛安裝好的 MySQL 只有一個密碼為空的root用戶,首先需要給該用戶設置一個密碼:

mysqladmin -u root password 你的密碼

然后使用設置好的密碼登錄 MySQl:

mysql -u root -p
輸入剛才設置的密碼

由於root用戶只能用於本地登錄,無法遠程登錄,所以還需要創建一個用於遠程登錄的用戶:

GRANT ALL ON *.* TO 你的用戶名 @'%' IDENTIFIED BY '你的密碼' WITH GRANT OPTION;

這條語句的意思是創建一個用戶,賦予它以任何方式訪問,在任何數據庫的所有操作權限,但是實際這里的任何訪問方式其實不包括localhost,所以還需要單獨設定:

GRANT ALL ON *.* TO 你的用戶名 @localhost IDENTIFIED BY '你的密碼' WITH GRANT OPTION;

與上一條語句一樣,只是將任何訪問方式改為了以localhost訪問。

ERROR 2003 (HY000): Can’t connect to MySQL server on ‘127.0.0.1’ (61)

配置完遠程登錄的賬戶后,嘗試使用該賬戶登錄一下 MySQL:

mysql -h localhost -u 你的用戶名 -p
輸入密碼

確實是可以登錄成功的,可是如果使用 ip 登錄:

mysql -h 127.0.0.1 -u 你的用戶名 -p
輸入密碼

卻會出現ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)的錯誤。原因是使用dmg安裝的 MySQL 啟動時的默認端口號不是3306而是3307,可以在這里修改:

sudo nano com.oracle.oss.mysql.mysqld.plist

--port的值改為3306即可:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key> <string>com.oracle.oss.mysql.mysqld</string>
<key>ProcessType</key> <string>Interactive</string>
<key>Disabled</key> <false/>
<key>RunAtLoad</key> <true/>
<key>KeepAlive</key> <true/>
<key>SessionCreate</key> <true/>
<key>LaunchOnlyOnce</key> <false/>
<key>UserName</key> <string>_mysql</string>
<key>GroupName</key> <string>_mysql</string>
<key>ExitTimeOut</key> <integer>600</integer>
<key>Program</key> <string>/usr/local/mysql/bin/mysqld</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/mysql/bin/mysqld</string>
<string>--user=_mysql</string>
<string>--basedir=/usr/local/mysql</string>
<string>--datadir=/usr/local/mysql/data</string>
<string>--plugin-dir=/usr/local/mysql/lib/plugin</string>
<string>--log-error=/usr/local/mysql/data/mysqld.local.err</string>
<string>--pid-file=/usr/local/mysql/data/mysqld.local.pid</string>
<string>--port=3307</string>
</array>
<key>WorkingDirectory</key> <string>/usr/local/mysql</string>
</dict>
</plist>

或是直接指定端口號連接:

mysql -h 127.0.0.1 -P 3307 -u 你的用戶名 -p
輸入密碼

Out of resources when opening file ‘…’

這兩個都是 JDBC 連接 MySQL 時報的錯,之所以放在一起說是因為改着改着莫名其妙兩個都好了。

配好 MySQL 項目后運行了一個多數據源並使用數據庫連接池的項目,一共有 32 個數據源,tomcat-jdbc 連接池每個數據源初始化 10 個連接,在創建一半數據源之后開始出現第一個錯誤:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

很多種情況都會導致這個錯誤,不過這里應該是數據庫連接數不夠,想到配置完后幾乎沒有編輯my.cnf文件,於是添加了這些屬性:

max_connect_errors = 10000
max_connections=10000
max_user_connections=10000

修改完后使用show variables like 'max%';查看數據庫屬性,發現對應數值確實改變了,但是運行程序還是會出現一樣的問題。

后來也 google 了很久,推測應該是系統配置導致的限制,但是也沒找到問題具體出在哪里,只好先把初始化的線程數改小看看能不能正常運行,結果程序運行了一段時間后又出現另一個錯誤:

Out of resources when opening file './xxx.MYD' (Errcode: 24)

這個錯誤的原因就很顯而易見了,肯定是 MySQL 打開的文件過多了,但是我明明記得在my.cnf中設置了open_files_limit,不可能出現這個錯誤啊。

結果使用show variables like 'open%';一看,配置竟然沒生效,文件數只有可憐的 256,再三確認配置沒有問題后認定原因肯定出在系統配置上。

首先使用ulimit -n查看系統的文件數限制,果然是 256,看來 MySQL 會在my.cnfulimit中選擇較小的一方作為真正的值。

然后 google 一下 Mac 如何修改這個數值,一種方式是使用launchctl limit maxfiles 65535將文件數修改成 65535,嘗試后發現確實系統的ulimit -n和 MySQL 的open_files_limit都變成了 65535。當時以為這樣就解決了,結果又發現 JDBC 無法連接 MySQL 了,而 MySQL 客戶端就能連上,真是匪夷所思。還好這個配置只要重啟電腦就會失效,重啟過后又能正常的連上 MySQL 了。

還有一種方法只能用在 Mac OS X Yosemite 上的,首先創建/Library/LaunchDaemons/limit.maxfiles.plist文件,添加以下內容:

<?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>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>65536</string>
<string>65536</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>

創建/Library/LaunchDaemons/limit.maxproc.plist文件,添加以下內容:

<?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>limit.maxproc</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxproc</string>
<string>2048</string>
<string>2048</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>

然后重啟電腦就會發現數值已經改變了,所有方式也都能正常連接,我把初始化線程數調回來以后發現第一個錯誤也不會出現了。