MySQL數據庫服務器通常指的的是mysqld,而命令行mysql則是mysql客戶端程序,這兩個概念通常容易混淆。通常啟動mysql服務器即是啟動mysqld進程,mysqld啟動后,可以通過mysql連接到mysql服務器。本文主要描述了mysql服務器的幾種啟動方式以及如何關閉mysql服務器。
1.直接使用mysqld啟動
mysqld 即是mysql服務器,可以調用該命令直接啟動mysql服務器
mysqld 從配置文件中讀取[mysqld]以及[server]選項組的內容,也可以通過直接在命令行跟隨參數。
mysqld服務器讀取配置文件的順序,對於有多個配置文件存在,且同一參數有多個值的情形,以最后一次讀取為准。
命令行跟隨參數具有最高優先級
1.1當前mysql服務器運行環境

[root@rhel64a ~]# cat /etc/issue Red Hat Enterprise Linux Server release 6.4 (Santiago)
1.2查看mysqld啟動時的缺省選項

[root@rhel64a ~]# mysqld --print-defaults mysqld would have been started with the following arguments: --socket=/tmp/mysql3306.sock --port=3306 --pid-file=/var/lib/mysql/my3306.pid --user=mysql --server-id=3306 --federated [root@rhel64a ~]# ps -ef|grep mysql root 2963 2840 0 14:10 pts/0 00:00:00 grep mysql
1.3查看mysqld啟動配置文件的優先級

[root@rhel64a ~]# mysqld --verbose --help |grep -A 1 "Default options" Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
1.4查看當前的my.cnf配置文件

[root@rhel64a ~]# grep -v ^# /etc/my.cnf|head -n 7 [mysqld] socket = /tmp/mysql3306.sock port = 3306 pid-file = /var/lib/mysql/my3306.pid user = mysql server-id=3306 federated
1.5清空當前mysql服務器的錯誤日志文件

[root@rhel64a ~]# cat /dev/null>/var/lib/mysql/rhel64a.ycdata.net.err [root@rhel64a ~]# mysqld & #啟動mysqld服務器 [1] 3480 [root@rhel64a ~]# 2014-10-25 14:20:42 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2014-10-25 14:20:42 3480 [Note] InnoDB: Using atomics to ref count buffer pool pages 2014-10-25 14:20:42 3480 [Note] InnoDB: The InnoDB memory heap is disabled 2014-10-25 14:20:42 3480 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2014-10-25 14:20:42 3480 [Note] InnoDB: Memory barrier is not used 2014-10-25 14:20:42 3480 [Note] InnoDB: Compressed tables use zlib 1.2.3 2014-10-25 14:20:42 3480 [Note] InnoDB: Using Linux native AIO 2014-10-25 14:20:42 3480 [Note] InnoDB: Using CPU crc32 instructions 2014-10-25 14:20:42 3480 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2014-10-25 14:20:42 3480 [Note] InnoDB: Completed initialization of buffer pool 2014-10-25 14:20:42 3480 [Note] InnoDB: Highest supported file format is Barracuda. 2014-10-25 14:20:42 3480 [Note] InnoDB: 128 rollback segment(s) are active. 2014-10-25 14:20:42 3480 [Note] InnoDB: Waiting for purge to start 2014-10-25 14:20:42 3480 [Note] InnoDB: 5.6.21 started; log sequence number 1626087 2014-10-25 14:20:42 3480 [Note] Server hostname (bind-address): '*'; port: 3306 2014-10-25 14:20:42 3480 [Note] IPv6 is available. 2014-10-25 14:20:42 3480 [Note] - '::' resolves to '::'; 2014-10-25 14:20:42 3480 [Note] Server socket created on IP: '::'. 2014-10-25 14:20:42 3480 [Note] Event Scheduler: Loaded 0 events 2014-10-25 14:20:42 3480 [Note] mysqld: ready for connections. Version: '5.6.21' socket: '/tmp/mysql3306.sock' port: 3306 MySQL Community Server (GPL)l
1.6查詢mysqld進程

[root@rhel64a ~]# ps -ef|grep mysql|grep -v grep mysql 18240 2641 1 20:25 pts/2 00:00:00 mysqld [root@rhel64a ~]# mysql -uroot -pxxx -P3306 --protocol=tcp root@localhost[(none)]> show variables like 'version'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | version | 5.6.21 | +---------------+--------+
2.mysql安全啟動(mysqld_safe)
mysqld_safe是一個shell 腳本,會調用mysqld啟動mysql服務器,並監聽服務器。
如果mysqld進程異常終止,mysqld_safe將自動重啟mysqld
mysql_safe 從配置文件中讀取[mysqld],[server],[mysqld_safe]等選項,為保證向后兼容,mysql_safe還讀取[safe_mysql]選項。
2.1使用mysqladmin來閉之前啟動的mysql服務器

[root@rhel64a ~]# mysqladmin -uroot -pxxx shutdown -S /tmp/mysql3306.sock [root@rhel64a ~]# ps -ef|grep mysql root 4262 3418 0 14:40 pts/4 00:00:00 grep mysql
2.2使用mysqld_safe啟動實例

[root@rhel64a ~]# mysqld_safe --user=mysql & [1] 4273 [root@rhel64a ~]# 141025 14:40:34 mysqld_safe Logging to '/var/lib/mysql/rhel64a.ycdata.net.err'. 141025 14:40:34 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
2.3 查看啟動后的后台進程

[root@rhel64a ~]# ps -ef|grep mysql|grep -v grep #mysqld的進程為4438,其父進程為4273,即mysqld_safe root 4273 3418 0 14:40 pts/4 00:00:00 /bin/sh /usr/bin/mysqld_safe --user=mysql mysql 4438 4273 0 14:40 pts/4 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/rhel64a.ycdata.net.err --pid-file=/var/lib/mysql/my3306.pid --socket=/tmp/mysql3306.sock --port=3306 [root@rhel64a ~]# mysql -uroot -pxxx -P3306 --protocol=tcp root@localhost[(none)]> system kill -9 4438 #強制kill mysqld進程 root@localhost[(none)]> /usr/bin/mysqld_safe: line 166: 4438 Killed #下面的nohup為mysql啟動進程 nohup /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/rhel64a.ycdata.net.err --pid-file=/var/lib/mysql/my3306.pid --socket=/tmp/mysql3306.sock --port=3306 < /dev/null >> /var/lib/mysql/rhel64a.ycdata.net.err 2>&1 141025 14:42:29 mysqld_safe Number of processes running now: 0 141025 14:42:29 mysqld_safe mysqld restarted #提示該進程已經自動重新啟動
2.4校驗mysqld是否已經成功重啟

root@localhost[(none)]> system ps -ef|grep mysql|grep -v grep root 4273 3418 0 14:40 pts/4 00:00:00 /bin/sh /usr/bin/mysqld_safe --user=mysql root 4517 3418 0 14:41 pts/4 00:00:00 mysql -uroot -px x -P3306 --protocol=tcp mysql 4553 4273 0 14:42 pts/4 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/rhel64a.ycdata.net.err --pid-file=/var/lib/mysql/my3306.pid --socket=/tmp/mysql3306.sock --port=3306 root@localhost[(none)]> select databases(); ERROR 2013 (HY000): Lost connection to MySQL server during query #由於mysqld進程被殺掉,所以連接已經被斷開 root@localhost[(none)]> connect #重新連接 Connection id: 1 Current database: *** NONE *** root@localhost[(none)]> select database(); +------------+ | database() | +------------+ | NULL | +------------+
3.mysql(mysql.server)服務方式啟動
mysql.server為一個shell腳本,他會調用mysqld_safe,該腳本會讀取配置文件的[mysql.server]以及[mysqld]選項。
為向后兼容,也會讀取[mysql_server]選項
3.1首先使用mysqladmin關閉已存在的mysqld

root@localhost[(none)]> system mysqladmin -uroot -pxxx shutdown -S /tmp/mysql3306.sock Warning: Using a password on the command line interface can be insecure. 141025 14:47:18 mysqld_safe mysqld from pid file /var/lib/mysql/my3306.pid ended root@localhost[(none)]> exit Bye [1]+ Done mysqld_safe --user=mysql [root@rhel64a ~]# ls -hltr /etc/init.d/mysql #/etc/init.d目錄下已經配置了mysql啟動腳本,在安裝時添加 -rwxr-xr-x 1 root root 11K Sep 11 22:18 /etc/init.d/mysql #如果為rpm方式安裝會自動添加該啟動腳本 [root@rhel64a ~]# /etc/init.d/mysql --help #獲取mysql啟動腳本的使用幫助 Usage: mysql {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
3.2啟動或關閉mysqld

[root@rhel64a ~]# /etc/init.d/mysql start #啟動mysqld Starting MySQL.[ OK ] [root@rhel64a ~]# /etc/init.d/mysql stop #停止mysqld Shutting down MySQL..[ OK ]
3.2缺省情況下mysql已經作為一個服務添加到系統目錄已經配置了自啟動,如下

[root@rhel64a ~]# chkconfig --list |grep mysql mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off root@localhost[(none)]> system ps -ef|grep mysql |grep -v grep root 5127 1 0 14:49 pts/4 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/my3306.pid mysql 5306 5127 0 14:49 pts/4 00:00:07 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/rhel64a.ycdata.net.err --pid-file=/var/lib/mysql/my3306.pid --socket=/tmp/mysql3306.sock --port=3306 root 5340 3418 0 14:49 pts/4 00:00:00 mysql -uroot -px x -P3306 --protocol=tcp
#通過服務的方式啟動mysql服務器,mysql.server調用mysqld_safe,然后mysql_safe調用了mysqld
#從上面的方式可知,無論何種啟動方式,mysqld最終都會被調用。因為mysqld就是mysql服務器。
4.關閉mysql服務器
在前面的演示中,我們已經使用了mysqladmin以及service方式來關閉實例。即可以通過這2種方式來關閉數據庫。不再演示。
#獲取mysqladmin命令行的幫助信息,如下包含shutdown
[root@rhel64a ~]# mysqladmin --help|grep shutdown |grep server
shutdown Take server down
5.小結
a、注意理解mysqld與mysql。mysqld為mysql服務器或者稱之為服務器上的實例,用於提供客戶端訪問。mysql為客戶端訪問管理工具。
b、可以通過三種方式啟動mysql服務器(mysqld,mysqld_safe,service mysql start)
c、對於mysqld_safe,service mysql start方式,總是通過調用mysqld_safe來啟動mysqld進程,以防止mysqld意外宕掉而提供重啟服務。
d、可以通過mysqladmin shutdown以及service mysql stop來終止mysql服務器