MySQL教學

如何安裝二個 MySQL 在同一台 Ubuntu Server 上

App 後台服務的必要性

我們在開發 App 時,除了單機版程式之外,往往至少需要一個後台來作服務的提供者。依筆者來看,這是手機 App 強大的地方之一。要比 CPU 速度,比視窗大小,手機不可能會比筆電或是桌機來得更好。要打電動或是上網,手機其實並不是個很好的媒體。然而手機 App 至少有二個地方完全的壓過了桌機與筆電:

1.可取得性:在任何地方,就如Jobs 當年的名橋段,從牛仔褲裡掏出了… 一支手機!筆電即始可以帶著走,但是也不是任何時間能夠打開使用。然而手機是連搭公車站著都可以使用,這就很不同了~ 一天之中,帶著筆電在外頭跑來跑去的,真正打開來的時間可能不到能夠使用手機的 1/5。

2. 通往世界的窗口:手機不只是手機,而是手機通過網路,可以連接全世界幾近無限的網路服務。這是這一波革命的核心價值之一。即始我在滿員電車裡,除了幻想著某些橋段之外,我可以查看郵件,上網購物,google 所有興趣的頁面,以及頁面導向的進一步頁面,查看交通路況,看看家裡小朋友有沒有乖乖睡午覺,連絡週末的聚會,立即回答老闆剛傳來的疑問… 太多太多事可以作。

所以,回到原議題,在大多數的 App 裡後台的服務是必要的。

如何搭建 App 後台服務

後台的選擇,依筆者的經驗,至少有二個方法:搭用別人架好的平台,如著名的 Parse.com,或者就是自己作苦工,建立自己的後台。二者各有優缺點,視專案而作適合的選擇。

而若要搭建自己的後台,又至少需要分為測試後台與正式後台二種。這樣才不會避免開發新功能時不小心將不該 Po 的資料傳送給使用者,而導至使用經驗的大幅降低。

若使用 parse.com 作為後台,這件事倒是相對容易很多,就開二個 parse 目錄即可。若自己搭建後台,那要如何區分正式後台與測試後台,就需要動些腦筋了。(註:2016年1月,Parse.com 已宣布 2017年1月將關閉服務。)

以使用LAMP作為後台伺服器為例,就會遇到了一個很基本的需求,儘管可以將多個網域指向同一台機器,然而該機器上的 Port 3306 (MySQL 預設 port)只有一個。當然使用二台機器就可以省一些事,但是卻增加了一些硬體成本以及維護成本。畢竟,有二台機器,就表示定期備份要作二倍的工。

這裡可以有二個選擇:使用二個不同的資料庫名字,或者,就架二個 MySQL。前者的優點是不用去傷腦筋怎麼架二個 MySQL,但是缺點卻是 PHP 程式在正式版與測試版之間需要作切換。後者的優點則相反,程式幾乎不需要作切換,但是如何安裝二個  MySQL 在同一台機器上,卻需要費一些工。

在同一個 Ubuntu Server 上設 2 個 MySQL service 設定步驟

由於筆者所使用的後台是 Ubuntu Server,而MySQL 官網上的文章是 Linux 的,並不適合 Ubuntu ,這讓我浪費了不少時間。在奮戰一下午之後,終於找到正確的路搞定這件事。以下是操作步驟。(注意,不同的 OS 步驟不相同,僅供參考)

筆者環境:

OS: Ubuntu 14.04.2 LTS

MySQL:  5.5.41-0ubuntu0.14.04.1 

1. 先備份原來的資料庫

你不會希望慘劇發生,除非你的機器本來資料庫裡就是空的。

命令:

mysqldump --all-databases --user=root --password=密碼 -h localhost > 檔名.sql

萬一出了什麼事,只要保留好這個檔案,一切可能還有救

2. Stop MySQL

sudo service mysql stop

3. 建立 data 目錄,等一下會把另一個 MySQL  安裝在這裡。所有權要改為 mysql,不然會有問題。

sudo mkdir /var/lib/mysql3308

sudo chown -R mysql /var/lib/mysql3308

4. 建立 log 目錄,第二台 MySQL 若有任何錯誤訊息,可以由這裡看到

sudo mkdir /var/log/mysql/mysql3308
sudo chown -R mysql /var/log/mysql/mysql3308

5. 建立 config 檔

sudo cp /etc/mysql/my.cnf /etc/mysql/my3308.cnf

請參考 https://github.com/naveensnayak/mysql-multi/blob/master/my3308.cnf

6. 修改 Apparmor ( Ubuntu 的軟體防火牆)設定檔 /etc/apparmor.d/usr.sbin.mysqld

加上

/var/lib/mysql3308/ r,

/var/lib/mysql3308/** rwk,

/var/run/mysqld/mysqld.pid3308 rw,

/var/run/mysqld/mysqld.sock3308 w,

/run/mysqld/mysqld.pid3308 rw,

/run/mysqld/mysqld.sock3308 w,

然後重開apparmor

sudo service apparmor reload

7. 安裝另一份 MySQL

sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql3308 --defaults-file=/etc/mysql/my3308.cnf

這裡若你步驟6作得不對的話,就會出問題。

mysqld_safe Logging to '/var/log/mysql/mysql3308/error.log'.
mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql3308
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid3308 ended

然後用 netstat -ltn 可以看到, port 3308 根本沒起來。

用 tail -100 /var/log/mysql/mysql3308/error.log 可以看到錯誤訊息。

8. 連線

mysql -h 127.0.0.1 --port=3308 -u root

這裡很重要的是,host 要用 127.0.0.1 而不能用 localhost,若使用 localhost 它會忽略 port 參數,而連到了 port 3306 的 MySQL。然後若你還作了什麼操作的話,就會發生悲劇了。

9. 修改 root 密碼

剛架好的 MySQL 的 root 是沒有密碼的,連上之後可以用這個指令來修改密碼。

update mysql.user set password=PASSWORD('密碼') where User='root';

恭喜!終於大功告成,可以用一台機器可以架二個 MySQL 了。