在Mac下安裝MySQL
最近開始將開發工具都轉移到 Mac 上了,其中也會莫名其妙的遇到一些坑,不如干脆將整個流程都記錄下來,方便以后查找。
下載與安裝
首先進入 MySQL 官網,選擇免費的Community
版:MySQL Community Server
。MySQL 官網提供了tar.gz
和dmg
兩種格式的安裝包,接下來主要圍繞使用dmg
安裝來說。
下載后雙擊打開安裝包,根據說明一步步確認即可完成安裝。安裝成功后打開系統偏好設置,在最下面可以找到 MySQL,通過它可以查看 MySQL 狀態並啟動和關閉 MySQL。
指定配置
使用該方式啟動 MySQL 時是沒有指定配置文件的,因此 MySQL 會按照以下順序載入配置文件:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
-
~/.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"?> |
或是直接指定端口號連接:
mysql -h 127.0.0.1 -P 3307 -u 你的用戶名 -p |
Communications link failure
Out of resources when opening file ‘…’
這兩個都是 JDBC 連接 MySQL 時報的錯,之所以放在一起說是因為改着改着莫名其妙兩個都好了。
配好 MySQL 項目后運行了一個多數據源並使用數據庫連接池的項目,一共有 32 個數據源,tomcat-jdbc 連接池每個數據源初始化 10 個連接,在創建一半數據源之后開始出現第一個錯誤:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure |
很多種情況都會導致這個錯誤,不過這里應該是數據庫連接數不夠,想到配置完后幾乎沒有編輯my.cnf
文件,於是添加了這些屬性:
max_connect_errors = 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.cnf
和ulimit
中選擇較小的一方作為真正的值。
然后 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"?> |
創建/Library/LaunchDaemons/limit.maxproc.plist
文件,添加以下內容:
<?xml version="1.0" encoding="UTF-8"?> |
然后重啟電腦就會發現數值已經改變了,所有方式也都能正常連接,我把初始化線程數調回來以后發現第一個錯誤也不會出現了。