MySQL 的基本設定
在 LAMP 伺服器裡面,Linux, Apache, PHP 已經處理完畢,那麼 MySQL 呢?所以,接下來就是要處理這個資料庫軟體囉。 在啟動 MySQL 前其實系統並沒有幫我們建立任何的資料庫。當你初次啟動 MySQL 後,系統才會針對資料庫進行初始化的建立啊。 不相信的話你可以先看看 /var/lib/mysql/ 這個目錄,裡面其實沒有任何資料的啦。


  • 啟動 MySQL (設定 MySQL root 密碼與新增 MysQL 用戶帳號)
首先得要啟動 MySQL 才行,啟動的方法還是很簡單啊!
[root@www ~]# /etc/init.d/mysqld start
[root@www ~]# chkconfig mysqld on
# 如果是初次啟動,螢幕會顯示一些訊息且 /var/lib/mysql 會建立資料庫。
[root@www ~]# netstat -tulnp | grep 'mysql'
Proto Recv-Q Send-Q Local Address  Foreign Address   State   PID/Program name
tcp        0      0 0.0.0.0:3306   0.0.0.0:*         LISTEN  2726/mysqld
# 底下在測試看能否以手動的方式連上 MySQL 資料庫!
[root@www ~]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> exit
Bye
MySQL 預設監聽的埠口在 port 3306,從上面看來我們的 MySQL 似乎是啟動了,不過剛剛初始化的 MySQL 資料庫管理員並沒有任何密碼,所以很可能我們的資料庫是會被使用者搞爛掉的~所以你最好對 MySQL 的管理員帳號設定一下密碼才好。 另外,上面那個 root 與我們 Linux 帳號的 root 是完全無關的!因為 MySQL 資料庫軟體也是個多人的操作環境,在該軟體內有個管理者恰好帳號也是 root 而已。
那麼如何針對 MySQL 這個軟體內的 root 這個管理者設定他的密碼呢?你可以這樣做:
[root@www ~]# mysqladmin -u root password 'your.password'
# 從此以後 MySQL 的 root 帳號就需要密碼了!如下所示:
[root@www ~]# mysql -u root -p
Enter password:  <==你必須要在這裡輸入剛剛建立的密碼!
mysql> exit
如此一來 MySQL 資料庫的管理方面會比較安全些啦!其實更好的作法是分別建立不同的使用者管理不同的資料庫。 舉例來說,如果你要給予 vbirduser 這個使用者一個 MySQL 的資料庫使用權,假設你要給他的資料庫名稱為 vbirddb,且密碼為 vbirdpw 時,你可以這樣做:
[root@www ~]# mysql -u root -p
Enter password:  <==如前所述,你必須要輸入密碼嘛!
mysql> create database vbirddb;  <==注意每個指令後面都要加上分號 (;)
Query OK, 1 row affected (0.01 sec)
mysql> grant all privileges on vbirddb.* to vbirduser@localhost 
identified by 'vbirdpw' ;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              | <==用來記錄 MySQL 帳號、主機等重要資訊的主要資料庫!
| test               | 
| vbirddb            | <==我們剛剛建立的資料庫在此
+--------------------+
4 rows in set (0.00 sec)
mysql> use mysql;
mysql> select * from user where user = 'vbirduser';
# 上面兩個指令在查詢系統有沒有 vbirduser 這個帳號,若有出現一堆東西,
# 那就是查詢到該帳號了!這樣就建置妥當囉!
mysql> exit
然後你可以利用『 mysql -u vbirduser -p 』這個指令來嘗試登入 MySQL 試看看,嘿嘿!就知道 vbirduser 這個使用者在 MySQL 裡面擁有一個名稱為 vbirddb 的資料庫啦!其他更多的用法就得請你自行參考 SQL 相關的語法囉!不在本文的討論範圍啦!


  • 效能調校 /etc/my.cnf
由於 MySQL 這個資料庫系統如果在很多使用者同時連線時,可能會造成某些效能方面的瓶頸, 因此,如果你的資料庫真的好大好大,建議可以改用 postgresql 這套軟體,這套軟體的使用與 mysql 似乎差異不大。 不過,我們還是提供一些簡單的方式來處理小站的 MySQL 效能好了。相關的資料鳥哥是參考這一篇簡單的中文說明:
[root@www ~]# vim /etc/my.cnf
[mysqld]
default-storage-engine=innodb
# 關於目錄資料與語系的設定等等;
default-character-set   = utf8   <==每個人的編碼都不相同,不要隨意跟我一樣
port                    = 3306
skip-locking
# 關於記憶體的設定,注意,記憶體的簡單計算方式為:
# key_buffer + (sort_buffer + read_buffer ) * max_connection
# 且總量不可高於實際的實體記憶體量!所以,我底下的資料應該是 OK 的
# 128 + (2+2)*150 = 728MB
key_buffer              = 128M
sort_buffer_size        = 2M
read_buffer_size        = 2M
join_buffer_size        = 2M
max_connections         = 150
max_connect_errors      = 10
read_rnd_buffer_size    = 4M
max_allowed_packet      = 4M
table_cache             = 1024
myisam_sort_buffer_size = 32M
thread_cache            = 16
query_cache_size        = 16M
tmp_table_size          = 64M
# 由連線到確定斷線的時間,原本是 28800 (sec) ,約 8 小時,我將他改為 20 分鐘!
wait_timeout            = 1200
thread_concurrency      = 8
innodb_data_file_path = ibdata1:10M:autoextend
innodb_buffer_pool_size = 128M
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 16
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
你要注意的是,因為鳥哥的主機上面假設記憶體有 2GB 啊!所以跟記憶體相關的資料才會寫很大! 請依照你實際擁有的記憶體量來處理喔!還得加上你的 Apache 本身的記憶體用量! 所以...如果你的網站流量很大的話,在校能測試上面要很注意啊!


  • MySQL root 密碼忘記的緊急處理
如果你不小心忘記 MySQL 的密碼怎麼辦?網路上有一些工具可以讓你去處理 MySQL 資料庫的挽回。 如果你的資料庫內容並不是很重要,刪除也無所謂的話 (測試中 @_@),那麼可以將 MySQL 關閉後, 將 /var/lib/mysql/* 那個目錄內的資料刪除掉,然後再重新啟動 MySQL ,那麼 MySQL 資料庫會重建, 你的 root 又沒有密碼啦!
不過,這個方法僅適合你的資料庫並不重要的時候,如果資料庫很重要...那千萬不要隨便刪除啊!