MySQL遠程訪問設置終極方法

這篇文章主要介紹了MySQL遠程訪問設置終極方法,本文總結了多種設置方法和技巧,是解決遠程訪問的終極解決方案,需要的朋友可以參考下

數據庫對於服務端開發人員來說,幾乎就是左膀右臂。幾乎每一個服務端開發人員都要和數據庫打交道。而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就會釋放這部分的內存。


原文:http://www.jb51.net/article/58096.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章