MySQL遠(yuǎn)程訪問(wèn)設(shè)置終極方法
數(shù)據(jù)庫(kù)對(duì)于服務(wù)端開(kāi)發(fā)人員來(lái)說(shuō),幾乎就是左膀右臂。幾乎每一個(gè)服務(wù)端開(kāi)發(fā)人員都要和數(shù)據(jù)庫(kù)打交道。而MySQL又以其開(kāi)源免費(fèi),小巧玲瓏,簡(jiǎn)單易用,功能強(qiáng)大占據(jù)中國(guó)數(shù)據(jù)庫(kù)使用份額的半壁江山。從去年接觸到Vagrant以來(lái),Vagrant以其方便易用深深吸引了D瓜哥。為了盡可能地和生產(chǎn)環(huán)境保持盡可能的一致性,減少不必要的問(wèn)題的發(fā)生,Vagrant+Ubuntu+MySQL幾乎是絕配。
MySQL允許遠(yuǎn)程訪問(wèn)的設(shè)置
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地址。但是,如果只是開(kāi)發(fā)用的數(shù)據(jù)庫(kù),為了方便起見(jiàn),還是推薦直接注釋掉。
從上面的注釋中,可以看出,舊版本的MySQL(從一些資料上顯示是5.0及其以前的版本)上使用的是skip-networking。所以,善意提醒一下,使用舊版本的小伙伴請(qǐng)注意一下。
2.刪除匿名用戶
登錄進(jìn)數(shù)據(jù)庫(kù):
>mysql -uroot -p123456
然后,切換到數(shù)據(jù)庫(kù)mysql。SQL如下:
use mysql;
然后,刪除匿名用戶。SQL如下:
delete from user where user='';
3.增加允許遠(yuǎn)程訪問(wèn)的用戶或者允許現(xiàn)有用戶的遠(yuǎn)程訪問(wèn)。
接著上面,刪除匿名用戶后,給root授予在任意主機(jī)(%)訪問(wèn)任意數(shù)據(jù)庫(kù)的所有權(quán)限。SQL語(yǔ)句如下:
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
如果需要指定訪問(wèn)主機(jī),可以把%替換為主機(jī)的IP或者主機(jī)名。另外,這種方法會(huì)在數(shù)據(jù)庫(kù)mysql的表user中,增加一條記錄。如果不想增加記錄,只是想把某個(gè)已存在的用戶(例如root)修改成允許遠(yuǎn)程主機(jī)訪問(wèn),則可以使用如下SQL來(lái)完成:
update user set host='%' where user='root' and host='localhost';
4.退出數(shù)據(jù)庫(kù)
mysql> exit
在MySQL Shell執(zhí)行完SQL后,需要退出到Bash執(zhí)行系統(tǒng)命令,需要執(zhí)行exit。因?yàn)檫@個(gè)太常用也太簡(jiǎn)單。以下內(nèi)容就提示“退出”,不再重復(fù)列出這個(gè)命令。
5.重啟數(shù)據(jù)庫(kù)
完成上述所有步驟后,需要重啟一下數(shù)據(jù)庫(kù),才能讓修改的配置生效。執(zhí)行如下命令重啟數(shù)據(jù)庫(kù):
>sudo service mysql restart
到此為止,應(yīng)該就可以遠(yuǎn)程訪問(wèn)數(shù)據(jù)庫(kù)了。
當(dāng)然,“雄關(guān)漫道真如鐵”,世界并不是想象的那么圖樣圖森破,可能還會(huì)遇到一些問(wèn)題,影響到正常使用。下面,D瓜哥把自己遇到的一些問(wèn)題整理處理,方便各位朋友參考解決。(退一步講,沒(méi)有這些問(wèn)題來(lái)?yè)伍T(mén)面,D瓜哥該叫“終極解決辦法”嗎?!哈哈)
常見(jiàn)問(wèn)題解答
華仔說(shuō)的好啊,“出來(lái)混的都是要還的”。對(duì)于我們從事挨踢行業(yè)的小伙伴來(lái)說(shuō),“出來(lái)混的都是從問(wèn)題堆里走的”。馮鞏也說(shuō)的好,“作為北京人,兜里沒(méi)揣兩千塊錢(qián)都不好意思給別人打招呼”。D瓜哥想,對(duì)于干挨踢的小伙伴們來(lái)說(shuō),沒(méi)遇到過(guò)問(wèn)題,都不好意思說(shuō)自己是干挨踢的。所以,對(duì)于一些常見(jiàn)的問(wèn)題,或者說(shuō)是常用操作可能引發(fā)的問(wèn)題來(lái)說(shuō),有必要整理一下,方便以后隨時(shí)查閱使用。
ERROR 1045 (28000)錯(cuò)誤的原因以及解決辦法
>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)
如果沒(méi)有按照上面流程,刪除匿名用戶,再或者你是按照網(wǎng)上查的資料來(lái)進(jìn)行設(shè)置(大多都沒(méi)有“刪除匿名用戶”這步),都可能導(dǎo)致這個(gè)問(wèn)題。至于這個(gè)問(wèn)題的原因說(shuō)起來(lái),D瓜哥感覺(jué)“怪怪”的。要說(shuō)清楚這個(gè)原因,還得從MySQL數(shù)據(jù)庫(kù)的用戶認(rèn)證機(jī)制說(shuō)起。
MySQL中,用戶相關(guān)的信息存在數(shù)據(jù)庫(kù)mysql的user。然我們看一下該表的結(jié)構(gòu),命令以及返回值如下:
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)
或者查看一下該表的建表語(yǔ)句。命令如下:
mysql> show create table user;
由于返回值中摻雜了一些不必要的無(wú)用信息,為了方便大家查看,D瓜哥對(duì)返回值做了簡(jiǎn)單的處理,只把最主要的建表語(yǔ)句部分提取出來(lái)。如下:
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'
從上面兩個(gè)方法中的任何一個(gè)都可以看出,MySQL中,使用(Host, User)這樣的組合鍵作為主鍵,也就是標(biāo)識(shí)唯一一個(gè)用戶。換句話說(shuō),即使對(duì)于同一個(gè)用戶名,例如root,隨著host的不同,也表示不同的用戶,就可以由不同的密碼和權(quán)限。這是,我們可以查看一下該表內(nèi)的數(shù)據(jù)。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)
可以看到數(shù)據(jù)庫(kù)中有如上這些用戶。那么,如果有'root'@'localhost'登錄時(shí),怎么匹配呢?
根據(jù)MySQL官方文檔MySQL :: MySQL 5.6 Reference Manual :: 6.2.4 Access Control, Stage 1: Connection Verification里是如下面這樣說(shuō)的:
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).
請(qǐng)注意這句話:“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.”
那么,當(dāng)從本地連接到數(shù)據(jù)庫(kù)時(shí),匿名用戶將覆蓋其他如'[any_username]'@'%'之類(lèi)的用戶。具體匹配過(guò)程如下:
在'root'@'localhost'可以匹配'root'@'%',''也可以匹配root,那么'root'@'localhost'也可以匹配''@'localhost'。根據(jù)上面的文檔顯示,主機(jī)(host)有比用戶名稱(chēng)user更高的匹配優(yōu)先級(jí),則localhost比%有比更高的匹配優(yōu)先級(jí)。所以,''@'localhost'比'root'@'%'匹配優(yōu)先級(jí)更高,'root'@'localhost'就匹配到了''@'localhost'。根據(jù)我們上面的查詢(xún)結(jié)果來(lái)看,''@'localhost'的密碼為空,與登錄時(shí)提供的密碼123456不匹配。所以,就登錄失敗了。
說(shuō)到這里,想必大家已經(jīng)想到了解決方案:很簡(jiǎn)單,直接把匿名用戶刪掉就可以了。
但是,現(xiàn)在的問(wèn)題時(shí),在本地根本登錄不上數(shù)據(jù)庫(kù),更別扯刪除數(shù)據(jù)了。
怎么辦?D瓜哥想到了三個(gè)解決辦法,方法如下:
①、比較扯淡的解決方法,在另外一臺(tái)電腦或者虛擬機(jī)上,遠(yuǎn)程連接這個(gè)數(shù)據(jù)庫(kù)
這是我想到的一個(gè)比較扯淡的解決方法。既然我們已經(jīng)允許了遠(yuǎn)程連接,那么我們就可以在另外一臺(tái)電腦或者另外一個(gè)虛擬機(jī)上,遠(yuǎn)程連接到這個(gè)數(shù)據(jù)庫(kù),然后把刪除匿名用戶。步驟如下:
1.在遠(yuǎn)程電腦上連接到該數(shù)據(jù)庫(kù)。命令如下:
mysql -h192.168.1.119 -uroot -p123456
2.然后,切換到mysql數(shù)據(jù)庫(kù)。命令如下:
use mysql
3.刪除匿名用戶。SQL如下:
delete from user where user='';
4.退出,然后就可以在本地直接登錄數(shù)據(jù)庫(kù)了。
②、投機(jī)取巧的解決辦法,在本地使用跳過(guò)權(quán)限表認(rèn)證的登錄數(shù)據(jù)庫(kù)
剛剛在上面的原因解釋中已經(jīng)說(shuō)過(guò),雖然登錄使用的root帳號(hào),但是被數(shù)據(jù)庫(kù)處理成了匿名用戶。而登錄用的帳號(hào)和密碼與匿名帳號(hào)信息不匹配,才導(dǎo)致權(quán)限認(rèn)證沒(méi)有通過(guò)。那干脆就“不走尋常路”,跳過(guò)權(quán)限認(rèn)證這一步,直接登錄不就OK了。具體做法類(lèi)似“忘記密碼”的處理方式類(lèi)似,所以,可以參考下面的 忘記數(shù)據(jù)庫(kù)密碼 。需要注意的時(shí),這里和“忘記數(shù)據(jù)庫(kù)密碼”的處理不一樣的是,這里不需要這里只需要登錄進(jìn)去,登錄進(jìn)去之后需要?jiǎng)h除匿名帳號(hào)而不是重置密碼。至于刪除匿名帳號(hào)的方法,請(qǐng)參考上面的介紹,這里就不再贅述。
③、最詭異的解決辦法,在本地偽裝成遠(yuǎn)程主機(jī)來(lái)登錄數(shù)據(jù)庫(kù)
既然如果不知道IP地址,MySQL會(huì)默認(rèn)認(rèn)為從本地主機(jī)登錄。那么,我們就指定一下主機(jī),把自己偽裝成遠(yuǎn)程主機(jī)登錄。D瓜哥認(rèn)為這個(gè)解決辦法從MySQL的認(rèn)證機(jī)制上是說(shuō)得通的。
首先,使用ifconfig查出本地主機(jī)的IP(注意,不是127開(kāi)頭的回環(huán)地址)。
然后,使用如下命令登錄:
mysql -h192.168.1.119 -uroot -p123456
再然后的工作就是刪除匿名用戶。上面已經(jīng)介紹過(guò)了,這里不再贅述。
對(duì)于這個(gè)方法,D瓜哥需要特別說(shuō)明一下。這個(gè)方法是D瓜哥推測(cè)出來(lái)的,還經(jīng)過(guò)實(shí)際測(cè)試。所以,所以,歡迎板磚和雞蛋!哈哈
忘記MySQL用戶密碼的解決辦法
因?yàn)樾枰靡粋€(gè)好久不怎么使用的數(shù)據(jù)庫(kù),密碼忘記了,所以遇到了這個(gè)問(wèn)題。這次本來(lái)沒(méi)打算寫(xiě)這個(gè)內(nèi)容,但是計(jì)劃趕不上變化,因?yàn)橛龅搅薊RROR 1045 (28000)。后來(lái),發(fā)現(xiàn)使用這個(gè)方法也可以解決掉這個(gè)問(wèn)題。為了以后自己查資料方便,干脆把這個(gè)主題提出來(lái),作為“常見(jiàn)問(wèn)題”之一,也記錄一下。
1.停止MySQL數(shù)據(jù)庫(kù)。命令如下:
sudo service mysql stop
暴力點(diǎn)的做法是,使用ps命令查出來(lái)MySQL數(shù)據(jù)庫(kù)的PID,然后在使用kill -9 PID直接殺掉數(shù)據(jù)庫(kù)進(jìn)程。這個(gè)方法,太過(guò)血腥,就不提供命令了。呵呵
2.啟動(dòng)數(shù)據(jù)庫(kù)。命令如下:
sudo mysqld_safe --skip-grant-tables &
說(shuō)明:參數(shù)--skip-grant-tables的意思是啟動(dòng)MySQL服務(wù)的時(shí)候跳過(guò)權(quán)限表認(rèn)證。啟動(dòng)后,連接到MySQL的root不需要口令。
另外,某些計(jì)算機(jī)上沒(méi)有安裝mysqld_safe命令,則可以使用如下命令來(lái)啟動(dòng)數(shù)據(jù)庫(kù):
sudo mysqld --skip-grant-tables &
除此之外,還可以修改MySQL的配置文件/etc/mysql/my.cnf,在[mysqld]的部分中加上一句:skip-grant-tables。但是,使用這種方式在重置完密碼后,還要再重新刪除這句話。D瓜哥個(gè)人感覺(jué)比較麻煩。僅做了解,不推薦使用這種方式。
3.登錄數(shù)據(jù)庫(kù)。命令如下:
mysql -uroot
4.切換到mysql數(shù)據(jù)庫(kù)
mysql> use mysql
5.修改root帳號(hào)密碼
mysql> update user set password=password('123456') where user='root';
6.退出,然后重啟數(shù)據(jù)庫(kù)
>sudo service mysql restart
現(xiàn)在,應(yīng)該就可以使用新密碼正常訪問(wèn)數(shù)據(jù)庫(kù)了。
ERROR 2002 (HY000)錯(cuò)誤的原因以及解決辦法
在登錄數(shù)據(jù)庫(kù)的過(guò)程中,可能遇到如下錯(cuò)誤:
mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
剛開(kāi)始,D瓜哥以為是數(shù)據(jù)庫(kù)沒(méi)有正確創(chuàng)建mysqld.sock這個(gè)文件,到/var/run/mysqld/下查看了一下,確實(shí)沒(méi)有這個(gè)文件。
這是怎么回事?怎么會(huì)沒(méi)有這個(gè)文件呢?難道數(shù)據(jù)庫(kù)沒(méi)有啟動(dòng)起來(lái)。使用如下命令查看一下:
>ps aux | grep mysql
Shit,竟然什么都沒(méi)有輸出??磥?lái)確實(shí)是數(shù)據(jù)庫(kù)沒(méi)有啟動(dòng)起來(lái)。使用如下命令啟動(dòng)數(shù)據(jù)庫(kù):
>sudo service mysql start
如果是需要啟動(dòng)跳過(guò)認(rèn)證的方式啟動(dòng),則使用如下命令之一:
sudo mysqld_safe --skip-grant-tables &
如果提示沒(méi)有mysqld_safe,則使用如下命令:
>sudo mysqld --skip-grant-tables &
然后就可以正常登錄了。
關(guān)于這個(gè)問(wèn)題,D瓜哥還想再多說(shuō)兩句:這個(gè)錯(cuò)誤的根本原因是沒(méi)有找到mysqld.sock文件,造成這個(gè)問(wèn)題的原因有兩種:一根本沒(méi)有創(chuàng)建這個(gè)文件,也就是沒(méi)有啟動(dòng)數(shù)據(jù)庫(kù),這也是D瓜哥在這里介紹的原因;另外一個(gè)原因也有可能是創(chuàng)建的目錄不在默認(rèn)目錄,或者連接數(shù)據(jù)庫(kù)時(shí)指定的這個(gè)文件目錄和實(shí)際產(chǎn)生的目錄不符。D瓜哥在網(wǎng)上查資料時(shí),也印著了這個(gè)猜測(cè)。部分網(wǎng)友的問(wèn)題就是D瓜哥所說(shuō)的第二個(gè)原因造成的。所以,網(wǎng)上對(duì)于這個(gè)問(wèn)題的解決方案還存在另外一個(gè)方法。因?yàn)镈瓜哥沒(méi)有遇到,而且情況又比較多,D瓜哥這里就不再過(guò)多介紹了。請(qǐng)遇到這個(gè)問(wèn)題的朋友自行查資料解決。
ERROR 2003 (HY000)錯(cuò)誤的原因以及解決辦法。
$ 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)
是說(shuō)話,出現(xiàn)這個(gè)問(wèn)題,D瓜哥也很蛋疼。不知這又是怎么搞的!不過(guò),好在有錯(cuò)誤代碼(ERROR 2003 (HY000)),有了這個(gè)就有了打開(kāi)解決方法之門(mén)的鑰匙。解決方法垂手可得。
用Google百度一下,之后在StackOverflow上查到了原因:MySQL數(shù)據(jù)庫(kù)的配置文件/etc/mysql/my.cnf中的bind-address = 127.0.0.1沒(méi)有注釋掉,導(dǎo)致MySQL只能接收本地的訪問(wèn)。
知道了原因,解決方法也就隨之而來(lái),注釋掉這行,然后重啟服務(wù)器。具體做法,參考本文開(kāi)頭部分。
ERROR 1130錯(cuò)誤的原因以及解決辦法
D瓜哥在查資料的過(guò)程中,還遇到別人提到的一個(gè)錯(cuò)誤。日志如下:
ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server
給的解答是“所用主機(jī)的IP地址不在被允許登錄的IP之內(nèi)”。
D瓜哥也測(cè)試了一下這個(gè)錯(cuò)誤。剛剛開(kāi)始測(cè)試的時(shí)候,這個(gè)錯(cuò)誤沒(méi)有重現(xiàn),還以為我測(cè)試有問(wèn)題。后來(lái),重啟了一下數(shù)據(jù)庫(kù),再次測(cè)試發(fā)現(xiàn)成功了。確實(shí)有這個(gè)錯(cuò)誤。另外,根據(jù)D瓜哥個(gè)人測(cè)試經(jīng)驗(yàn),善意提醒一句,對(duì)mysql.user表進(jìn)行修改后,記得執(zhí)行一下flush privileges或者重啟一下數(shù)據(jù)庫(kù)。
關(guān)于mysqld_safe的簡(jiǎn)介
在這次解決這些問(wèn)題的過(guò)程中,D瓜哥查看了一下MySQL的進(jìn)程。命令以及返回值如下:
>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
嗯?!有木有發(fā)現(xiàn)一個(gè)剛剛說(shuō)明的熟悉的東東:mysqld_safe。這個(gè)東東怎么啟動(dòng)起來(lái)呢?剛開(kāi)始D瓜哥以為這個(gè)東西不應(yīng)該啟動(dòng),甚至還可能導(dǎo)致遠(yuǎn)程登錄數(shù)據(jù)庫(kù)不成功。(因?yàn)楫?dāng)時(shí)確實(shí)有這個(gè)問(wèn)題。而且,在上面跳過(guò)認(rèn)證校驗(yàn)的啟動(dòng)時(shí),用到這個(gè)命令了。所以,D瓜哥認(rèn)為它不應(yīng)該被啟動(dòng)。)經(jīng)過(guò)和敵人(你知道,這肯定是這里提到的一些問(wèn)題)“艱苦卓絕”斗爭(zhēng)后,發(fā)現(xiàn)問(wèn)題不是這個(gè)東東造成的。幸好多思考了一點(diǎn),否則D瓜哥晚節(jié)不保啊!哈哈
因?yàn)閯倓傄詾檫@是個(gè)問(wèn)題。所以,就把這個(gè)加入到了問(wèn)題列表里。經(jīng)過(guò)D瓜哥的了解,發(fā)現(xiàn)這不是個(gè)問(wèn)題,但是對(duì)于D瓜哥來(lái)說(shuō),這確實(shí)解決了D瓜哥的一個(gè)疑問(wèn),也暫且算是問(wèn)題吧。為了方便有同樣問(wèn)題的小伙伴,D瓜哥覺(jué)得有必要把mysqld_safe給詳細(xì)說(shuō)明一下。
關(guān)于mysqld_safe的介紹,最權(quán)威的資料自然是官方文檔,由于D瓜哥使用的是MySQL 5.6版。所以,這里參考MySQL :: MySQL 5.6 Reference Manual :: 4.3.2 mysqld_safe — MySQL Server Startup Script來(lái)進(jìn)行說(shuō)明。以下內(nèi)容翻譯自官方文檔的說(shuō)明。
官方文檔中,關(guān)于mysqld_safe部分的標(biāo)題,就可以很好地說(shuō)明mysqld_safe的定位:MySQL服務(wù)器的啟動(dòng)腳本。正文內(nèi)容還說(shuō)到,在Unix下,mysqld_safe是推薦的MySQL服務(wù)器的啟動(dòng)方式。mysqld_safe可以增加一些安全特性,比如當(dāng)服務(wù)器發(fā)生故障時(shí),重啟數(shù)據(jù)庫(kù)服務(wù)器,并且將運(yùn)行信息記錄到錯(cuò)誤日志文件中。
更多信息,還請(qǐng)各位朋友自行查閱MySQL :: MySQL 5.6 Reference Manual :: 4.3.2 mysqld_safe — MySQL Server Startup Script。不過(guò),這里沒(méi)有講到我們剛剛使用的參數(shù)--skip-grant-tables,關(guān)于這個(gè)參數(shù),在MySQL :: MySQL 5.6 Reference Manual :: 5.1.3 Server Command Options中做了介紹。
flush privileges的解釋說(shuō)明
好吧,D瓜哥承認(rèn)這是一個(gè)不是問(wèn)題的問(wèn)題。但是,對(duì)于D瓜哥來(lái)說(shuō),這還是一個(gè)疑惑,或者說(shuō),D瓜哥想知道這句話的確切含義。
從字面意思來(lái)說(shuō),flush privileges可以翻譯為“刷新權(quán)限”。這個(gè)也確實(shí)是flush privileges的一個(gè)功能:從數(shù)據(jù)庫(kù)msql中的授權(quán)表中,重新加載權(quán)限結(jié)果。
mysql新設(shè)置用戶或更改密碼后需用flush privileges刷新mysql的系統(tǒng)權(quán)限相關(guān)表,否則會(huì)出現(xiàn)拒絕訪問(wèn);還有一種方法,就是重新啟動(dòng)mysql數(shù)據(jù)庫(kù),來(lái)使新設(shè)置生效。
除此之外,flush privileges還可以釋放內(nèi)存的功能。mysql會(huì)緩存grant,create user,create server和install plugin語(yǔ)句的結(jié)果。這些內(nèi)存直到執(zhí)行revoke,drop user,drop server和uninstall plugin才會(huì)釋放。所以,如果數(shù)據(jù)庫(kù)執(zhí)行了很多前面的語(yǔ)句,則會(huì)增加內(nèi)存開(kāi)銷(xiāo)。執(zhí)行flush privileges就會(huì)釋放這部分的內(nèi)存。
- MySQL數(shù)據(jù)庫(kù)設(shè)置遠(yuǎn)程訪問(wèn)權(quán)限方法小結(jié)
- mysql數(shù)據(jù)庫(kù)遠(yuǎn)程訪問(wèn)設(shè)置方法
- mysql設(shè)置遠(yuǎn)程訪問(wèn)數(shù)據(jù)庫(kù)的多種方法
- MySQL8.0設(shè)置遠(yuǎn)程訪問(wèn)權(quán)限的方法
- MySQL 不允許從遠(yuǎn)程訪問(wèn)的解決方法
- 遠(yuǎn)程訪問(wèn)MySQL數(shù)據(jù)庫(kù)的方法小結(jié)
- 配置SQL Server2022遠(yuǎn)程訪問(wèn)的方法步驟
相關(guān)文章
MySQL通過(guò)DQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的條件查詢(xún)
這篇文章給大家介紹了MySQL如何通過(guò)DQL進(jìn)行數(shù)據(jù)庫(kù)數(shù)據(jù)的條件查詢(xún),文中通過(guò)代碼示例和圖文結(jié)合介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01MySQL高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn)
這篇文章主要介紹了MySQL高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02mysql連接查詢(xún)(左連接,右連接,內(nèi)連接)
這篇文章主要介紹了mysql連接查詢(xún)(左連接,右連接,內(nèi)連接)的相關(guān)資料,這里舉例說(shuō)明如果使用及附實(shí)例代碼,需要的朋友可以參考下2017-07-07navicat連接mysql報(bào)錯(cuò)1251的解決方法
這篇文章主要為大家詳細(xì)介紹了navicat連接mysql報(bào)錯(cuò)1251的解決方法,文中解決方法介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07mysql 8.0.15 winx64解壓版安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 winx64解壓版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02mysql中drop、truncate與delete的區(qū)別詳析
對(duì)于drop、truncate和delete雖然簡(jiǎn)單,但是真要使用或者面試時(shí)候問(wèn)到還是需要有一定的總結(jié),下面這篇文章主要給大家介紹了關(guān)于mysql中drop、truncate與delete區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-03-03