數據庫對於服務端開發人員來說,幾乎就是左膀右臂。幾乎每一個服務端開發人員都要和數據庫打交道。而MySQL又以其開源免費,小巧玲珑,簡單易用,功能強大占據中國數據庫使用份額的半壁江山。從去年接觸到Vagrant以來,Vagrant以其方便易用深深吸引了D瓜哥。為了盡可能地和生產環境保持盡可能的一致性,減少不必要的問題的發生,Vagrant+Ubuntu+MySQL幾乎是絕配。
MySQL允許遠程訪問的設置
1.注釋bind-address = 127.0.0.1。
復制代碼 代碼如下:
>cd /etc/mysql
>sudo vim my.cnf
將bind-address = 127.0.0.1注釋掉(即在行首加#),如下:
復制代碼 代碼如下:
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
除了注視掉這句話之外,還可以把後面的IP地址修改成允許連接的IP地址。但是,如果只是開發用的數據庫,為了方便起見,還是推薦直接注釋掉。
從上面的注釋中,可以看出,舊版本的MySQL(從一些資料上顯示是5.0及其以前的版本)上使用的是skip-networking。所以,善意提醒一下,使用舊版本的小伙伴請注意一下。
2.刪除匿名用戶
登錄進數據庫:
復制代碼 代碼如下:
>mysql -uroot -p123456
然後,切換到數據庫mysql。SQL如下:
復制代碼 代碼如下:
use mysql;
然後,刪除匿名用戶。SQL如下:
復制代碼 代碼如下:
delete from user where user='';
3.增加允許遠程訪問的用戶或者允許現有用戶的遠程訪問。
接著上面,刪除匿名用戶後,給root授予在任意主機(%)訪問任意數據庫的所有權限。SQL語句如下:
復制代碼 代碼如下:
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
如果需要指定訪問主機,可以把%替換為主機的IP或者主機名。另外,這種方法會在數據庫mysql的表user中,增加一條記錄。如果不想增加記錄,只是想把某個已存在的用戶(例如root)修改成允許遠程主機訪問,則可以使用如下SQL來完成:
復制代碼 代碼如下:
update user set host='%' where user='root' and host='localhost';
4.退出數據庫
復制代碼 代碼如下:
mysql> exit
在MySQL Shell執行完SQL後,需要退出到Bash執行系統命令,需要執行exit。因為這個太常用也太簡單。以下內容就提示“退出”,不再重復列出這個命令。
5.重啟數據庫
完成上述所有步驟後,需要重啟一下數據庫,才能讓修改的配置生效。執行如下命令重啟數據庫:
復制代碼 代碼如下:
>sudo service mysql restart
到此為止,應該就可以遠程訪問數據庫了。
當然,“雄關漫道真如鐵”,世界並不是想象的那麼圖樣圖森破,可能還會遇到一些問題,影響到正常使用。下面,D瓜哥把自己遇到的一些問題整理處理,方便各位朋友參考解決。(退一步講,沒有這些問題來撐門面,D瓜哥該叫“終極解決辦法”嗎?!哈哈)
常見問題解答
華仔說的好啊,“出來混的都是要還的”。對於我們從事挨踢行業的小伙伴來說,“出來混的都是從問題堆裡走的”。馮鞏也說的好,“作為北京人,兜裡沒揣兩千塊錢都不好意思給別人打招呼”。D瓜哥想,對於干挨踢的小伙伴們來說,沒遇到過問題,都不好意思說自己是干挨踢的。所以,對於一些常見的問題,或者說是常用操作可能引發的問題來說,有必要整理一下,方便以後隨時查閱使用。
ERROR 1045 (28000)錯誤的原因以及解決辦法
復制代碼 代碼如下:
>mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
如果沒有按照上面流程,刪除匿名用戶,再或者你是按照網上查的資料來進行設置(大多都沒有“刪除匿名用戶”這步),都可能導致這個問題。至於這個問題的原因說起來,D瓜哥感覺“怪怪”的。要說清楚這個原因,還得從MySQL數據庫的用戶認證機制說起。
MySQL中,用戶相關的信息存在數據庫mysql的user。然我們看一下該表的結構,命令以及返回值如下:
復制代碼 代碼如下:
mysql> desc user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | YES | | | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
+------------------------+-----------------------------------+------+-----+---------+-------+
43 rows in set (0.00 sec)
或者查看一下該表的建表語句。命令如下:
復制代碼 代碼如下:
mysql> show create table user;
由於返回值中摻雜了一些不必要的無用信息,為了方便大家查看,D瓜哥對返回值做了簡單的處理,只把最主要的建表語句部分提取出來。如下:
復制代碼 代碼如下:
CREATE TABLE `user` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int(11) unsigned NOT NULL DEFAULT '0',
`max_updates` int(11) unsigned NOT NULL DEFAULT '0',
`max_connections` int(11) unsigned NOT NULL DEFAULT '0',
`max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',
`plugin` char(64) COLLATE utf8_bin DEFAULT '',
`authentication_string` text COLLATE utf8_bin,
`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
從上面兩個方法中的任何一個都可以看出,MySQL中,使用(Host, User)這樣的組合鍵作為主鍵,也就是標識唯一一個用戶。換句話說,即使對於同一個用戶名,例如root,隨著host的不同,也表示不同的用戶,就可以由不同的密碼和權限。這是,我們可以查看一下該表內的數據。SQL以及返回值如下:
復制代碼 代碼如下:
mysql> select user, host, password from user;
+------------------+--------------------------+-------------------------------------------+
| user | host | password |
+------------------+--------------------------+-------------------------------------------+
| root | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | vagrant-ubuntu-trusty-64 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | ::1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| | localhost | |
| | vagrant-ubuntu-trusty-64 | |
| debian-sys-maint | localhost | *9B8E84CA988E1CA66CEB919A0D9D3BF1532942B6 |
+------------------+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)
可以看到數據庫中有如上這些用戶。那麼,如果有'root'@'localhost'登錄時,怎麼匹配呢?
根據MySQL官方文檔MySQL :: MySQL 5.6 Reference Manual :: 6.2.4 Access Control, Stage 1: Connection Verification裡是如下面這樣說的:
復制代碼 代碼如下:
When multiple matches are possible, the server must determine which of them to use. It resolves this issue as follows:
Whenever the server reads the user table into memory, it sorts the rows.
When a client attempts to connect, the server looks through the rows in sorted order.
The server uses the first row that matches the client host name and user name.
The server uses sorting rules that order rows with the most-specific Host values first. Literal host names and IP addresses are the most specific. (The specificity of a literal IP address is not affected by whether it has a netmask, so 192.168.1.13 and 192.168.1.0/255.255.255.0 are considered equally specific.) The pattern ‘%' means “any host” and is least specific. The empty string ” also means “any host” but sorts after ‘%'. Rows with the same Host value are ordered with the most-specific User values first (a blank User value means “any user” and is least specific).
請注意這句話:“The server uses sorting rules that order rows with the most-specific Host values first. Literal host names and IP addresses are the most specific.”
那麼,當從本地連接到數據庫時,匿名用戶將覆蓋其他如'[any_username]'@'%'之類的用戶。具體匹配過程如下:
在'root'@'localhost'可以匹配'root'@'%',''也可以匹配root,那麼'root'@'localhost'也可以匹配''@'localhost'。根據上面的文檔顯示,主機(host)有比用戶名稱user更高的匹配優先級,則localhost比%有比更高的匹配優先級。所以,''@'localhost'比'root'@'%'匹配優先級更高,'root'@'localhost'就匹配到了''@'localhost'。根據我們上面的查詢結果來看,''@'localhost'的密碼為空,與登錄時提供的密碼123456不匹配。所以,就登錄失敗了。
說到這裡,想必大家已經想到了解決方案:很簡單,直接把匿名用戶刪掉就可以了。
但是,現在的問題時,在本地根本登錄不上數據庫,更別扯刪除數據了。
怎麼辦?D瓜哥想到了三個解決辦法,方法如下:
①、比較扯淡的解決方法,在另外一台電腦或者虛擬機上,遠程連接這個數據庫
這是我想到的一個比較扯淡的解決方法。既然我們已經允許了遠程連接,那麼我們就可以在另外一台電腦或者另外一個虛擬機上,遠程連接到這個數據庫,然後把刪除匿名用戶。步驟如下:
1.在遠程電腦上連接到該數據庫。命令如下:
復制代碼 代碼如下:
mysql -h192.168.1.119 -uroot -p123456
2.然後,切換到mysql數據庫。命令如下:
復制代碼 代碼如下:
use mysql
3.刪除匿名用戶。SQL如下:
復制代碼 代碼如下:
delete from user where user='';
4.退出,然後就可以在本地直接登錄數據庫了。
②、投機取巧的解決辦法,在本地使用跳過權限表認證的登錄數據庫
剛剛在上面的原因解釋中已經說過,雖然登錄使用的root帳號,但是被數據庫處理成了匿名用戶。而登錄用的帳號和密碼與匿名帳號信息不匹配,才導致權限認證沒有通過。那干脆就“不走尋常路”,跳過權限認證這一步,直接登錄不就OK了。具體做法類似“忘記密碼”的處理方式類似,所以,可以參考下面的 忘記數據庫密碼 。需要注意的時,這裡和“忘記數據庫密碼”的處理不一樣的是,這裡不需要這裡只需要登錄進去,登錄進去之後需要刪除匿名帳號而不是重置密碼。至於刪除匿名帳號的方法,請參考上面的介紹,這裡就不再贅述。
③、最詭異的解決辦法,在本地偽裝成遠程主機來登錄數據庫
既然如果不知道IP地址,MySQL會默認認為從本地主機登錄。那麼,我們就指定一下主機,把自己偽裝成遠程主機登錄。D瓜哥認為這個解決辦法從MySQL的認證機制上是說得通的。
首先,使用ifconfig查出本地主機的IP(注意,不是127開頭的回環地址)。
然後,使用如下命令登錄:
復制代碼 代碼如下:
mysql -h192.168.1.119 -uroot -p123456
再然後的工作就是刪除匿名用戶。上面已經介紹過了,這裡不再贅述。
對於這個方法,D瓜哥需要特別說明一下。這個方法是D瓜哥推測出來的,還經過實際測試。所以,所以,歡迎板磚和雞蛋!哈哈
忘記MySQL用戶密碼的解決辦法
因為需要用一個好久不怎麼使用的數據庫,密碼忘記了,所以遇到了這個問題。這次本來沒打算寫這個內容,但是計劃趕不上變化,因為遇到了ERROR 1045 (28000)。後來,發現使用這個方法也可以解決掉這個問題。為了以後自己查資料方便,干脆把這個主題提出來,作為“常見問題”之一,也記錄一下。
1.停止MySQL數據庫。命令如下:
復制代碼 代碼如下:
sudo service mysql stop
暴力點的做法是,使用ps命令查出來MySQL數據庫的PID,然後在使用kill -9 PID直接殺掉數據庫進程。這個方法,太過血腥,就不提供命令了。呵呵
2.啟動數據庫。命令如下:
復制代碼 代碼如下:
sudo mysqld_safe --skip-grant-tables &
說明:參數--skip-grant-tables的意思是啟動MySQL服務的時候跳過權限表認證。啟動後,連接到MySQL的root不需要口令。
另外,某些計算機上沒有安裝mysqld_safe命令,則可以使用如下命令來啟動數據庫:
復制代碼 代碼如下:
sudo mysqld --skip-grant-tables &
除此之外,還可以修改MySQL的配置文件/etc/mysql/my.cnf,在[mysqld]的部分中加上一句:skip-grant-tables。但是,使用這種方式在重置完密碼後,還要再重新刪除這句話。D瓜哥個人感覺比較麻煩。僅做了解,不推薦使用這種方式。
3.登錄數據庫。命令如下:
復制代碼 代碼如下:
mysql -uroot
4.切換到mysql數據庫
復制代碼 代碼如下:
mysql> use mysql
5.修改root帳號密碼
復制代碼 代碼如下:
mysql> update user set password=password('123456') where user='root';
6.退出,然後重啟數據庫
復制代碼 代碼如下:
>sudo service mysql restart
現在,應該就可以使用新密碼正常訪問數據庫了。
ERROR 2002 (HY000)錯誤的原因以及解決辦法
在登錄數據庫的過程中,可能遇到如下錯誤:
復制代碼 代碼如下:
mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
剛開始,D瓜哥以為是數據庫沒有正確創建mysqld.sock這個文件,到/var/run/mysqld/下查看了一下,確實沒有這個文件。
這是怎麼回事?怎麼會沒有這個文件呢?難道數據庫沒有啟動起來。使用如下命令查看一下:
復制代碼 代碼如下:
>ps aux | grep mysql
Shit,竟然什麼都沒有輸出。看來確實是數據庫沒有啟動起來。使用如下命令啟動數據庫:
復制代碼 代碼如下:
>sudo service mysql start
如果是需要啟動跳過認證的方式啟動,則使用如下命令之一:
復制代碼 代碼如下:
sudo mysqld_safe --skip-grant-tables &
如果提示沒有mysqld_safe,則使用如下命令:
復制代碼 代碼如下:
>sudo mysqld --skip-grant-tables &
然後就可以正常登錄了。
關於這個問題,D瓜哥還想再多說兩句:這個錯誤的根本原因是沒有找到mysqld.sock文件,造成這個問題的原因有兩種:一根本沒有創建這個文件,也就是沒有啟動數據庫,這也是D瓜哥在這裡介紹的原因;另外一個原因也有可能是創建的目錄不在默認目錄,或者連接數據庫時指定的這個文件目錄和實際產生的目錄不符。D瓜哥在網上查資料時,也印著了這個猜測。部分網友的問題就是D瓜哥所說的第二個原因造成的。所以,網上對於這個問題的解決方案還存在另外一個方法。因為D瓜哥沒有遇到,而且情況又比較多,D瓜哥這裡就不再過多介紹了。請遇到這個問題的朋友自行查資料解決。
ERROR 2003 (HY000)錯誤的原因以及解決辦法。
復制代碼 代碼如下:
$ mysql -h192.168.1.113 -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.113' (111)
是說話,出現這個問題,D瓜哥也很蛋疼。不知這又是怎麼搞的!不過,好在有錯誤代碼(ERROR 2003 (HY000)),有了這個就有了打開解決方法之門的鑰匙。解決方法垂手可得。
用Google百度一下,之後在StackOverflow上查到了原因:MySQL數據庫的配置文件/etc/mysql/my.cnf中的bind-address = 127.0.0.1沒有注釋掉,導致MySQL只能接收本地的訪問。
知道了原因,解決方法也就隨之而來,注釋掉這行,然後重啟服務器。具體做法,參考本文開頭部分。
ERROR 1130錯誤的原因以及解決辦法
D瓜哥在查資料的過程中,還遇到別人提到的一個錯誤。日志如下:
復制代碼 代碼如下:
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server
給的解答是“所用主機的IP地址不在被允許登錄的IP之內”。
D瓜哥也測試了一下這個錯誤。剛剛開始測試的時候,這個錯誤沒有重現,還以為我測試有問題。後來,重啟了一下數據庫,再次測試發現成功了。確實有這個錯誤。另外,根據D瓜哥個人測試經驗,善意提醒一句,對mysql.user表進行修改後,記得執行一下flush privileges或者重啟一下數據庫。
關於mysqld_safe的簡介
在這次解決這些問題的過程中,D瓜哥查看了一下MySQL的進程。命令以及返回值如下:
復制代碼 代碼如下:
>ps aux | grep mysql
root 1231 0.0 0.0 4444 740 ? S 15:09 0:00 /bin/sh /usr/bin/mysqld_safe
mysql 1604 0.9 23.0 1134700 471332 ? Sl 15:09 0:23 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root 1605 0.0 0.0 4340 644 ? S 15:09 0:00 logger -t mysqld -p daemon.error
vagrant 3942 0.0 0.0 12140 928 pts/0 S+ 15:51 0:00 grep --color mysql
嗯?!有木有發現一個剛剛說明的熟悉的東東:mysqld_safe。這個東東怎麼啟動起來呢?剛開始D瓜哥以為這個東西不應該啟動,甚至還可能導致遠程登錄數據庫不成功。(因為當時確實有這個問題。而且,在上面跳過認證校驗的啟動時,用到這個命令了。所以,D瓜哥認為它不應該被啟動。)經過和敵人(你知道,這肯定是這裡提到的一些問題)“艱苦卓絕”斗爭後,發現問題不是這個東東造成的。幸好多思考了一點,否則D瓜哥晚節不保啊!哈哈
因為剛剛以為這是個問題。所以,就把這個加入到了問題列表裡。經過D瓜哥的了解,發現這不是個問題,但是對於D瓜哥來說,這確實解決了D瓜哥的一個疑問,也暫且算是問題吧。為了方便有同樣問題的小伙伴,D瓜哥覺得有必要把mysqld_safe給詳細說明一下。
關於mysqld_safe的介紹,最權威的資料自然是官方文檔,由於D瓜哥使用的是MySQL 5.6版。所以,這裡參考MySQL :: MySQL 5.6 Reference Manual :: 4.3.2 mysqld_safe — MySQL Server Startup Script來進行說明。以下內容翻譯自官方文檔的說明。
官方文檔中,關於mysqld_safe部分的標題,就可以很好地說明mysqld_safe的定位:MySQL服務器的啟動腳本。正文內容還說到,在Unix下,mysqld_safe是推薦的MySQL服務器的啟動方式。mysqld_safe可以增加一些安全特性,比如當服務器發生故障時,重啟數據庫服務器,並且將運行信息記錄到錯誤日志文件中。
更多信息,還請各位朋友自行查閱MySQL :: MySQL 5.6 Reference Manual :: 4.3.2 mysqld_safe — MySQL Server Startup Script。不過,這裡沒有講到我們剛剛使用的參數--skip-grant-tables,關於這個參數,在MySQL :: MySQL 5.6 Reference Manual :: 5.1.3 Server Command Options中做了介紹。
flush privileges的解釋說明
好吧,D瓜哥承認這是一個不是問題的問題。但是,對於D瓜哥來說,這還是一個疑惑,或者說,D瓜哥想知道這句話的確切含義。
從字面意思來說,flush privileges可以翻譯為“刷新權限”。這個也確實是flush privileges的一個功能:從數據庫msql中的授權表中,重新加載權限結果。
mysql新設置用戶或更改密碼後需用flush privileges刷新mysql的系統權限相關表,否則會出現拒絕訪問;還有一種方法,就是重新啟動mysql數據庫,來使新設置生效。
除此之外,flush privileges還可以釋放內存的功能。mysql會緩存grant,create user,create server和install plugin語句的結果。這些內存直到執行revoke,drop user,drop server和uninstall plugin才會釋放。所以,如果數據庫執行了很多前面的語句,則會增加內存開銷。執行flush privileges就會釋放這部分的內存。