在mysql中已經設定了mysql組和mysql使用者。
當使用MySQL的時候,發現使用這樣的命令mysql -h 127.0.0.1 -u mysql -p 不能訪問資料庫
root#mysql -h 127.0.0.1 -u mysql -p
Enter password:******
ERROR 1045: Access denied for user: 'mysql@127.0.01' (Using password: YES)
原因:
在127.0.0.1上的使用者mysql沒有串連localhost上MySQL的許可權,可以通過如下的方式確認:
root#mysql -h localhost-u mysql -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 4 to server version: 4.0.20a-debug
Type 'help;' or '/h' for help. Type '/c' to clear the buffer.
mysql> use mysql; (此DB存放MySQL的各種配置資訊)
Database changed
mysql> select host,user from user; (查看使用者的許可權情況)
+-------------+-------+
| host | user |
+-------------+-------+
| localhost | |
| localhost | root |
| localhost | |
| localhost | mysql |
+-------------+-------+
6 rows in set (0.02 sec)
由此可以看出,只能以localhost的主機方式訪問。
解決方案:
mysql> Grant all privileges on *.* to 'root'@'%' identified by ******* with grant option;
Query OK, 0 rows affected (0.02 sec) (%表示是所有的外部機器,如果指定某一台機,就將%改為相應的機器名)
mysql> Grant all privileges on *.* to 'mysql'@'%' identified by ******* with grant option;
Query OK, 0 rows affected (0.02 sec) (%表示是所有的外部機器,如果指定某一台機,就將%改為相應的機器名)
mysql> flush privileges; (運行為句才生效,或者重啟MySQL)
Query OK, 0 rows affected (0.03 sec)
mysql> select host,user from user; (再次查看使用者的許可權情況)
+-------------+-------+
| host | user |
+-------------+-------+
| % | mysql |
| % | root |
| localhost | |
| localhost | root |
| localhost | |
| localhost | mysql |
+-------------+-------+
mysql>exit
現在再試試:
root#mysql -h mysql -u root -p
Enter password:******
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 9 to server version: 4.0.20a-debug
Type 'help;' or '/h' for help. Type '/c' to clear the buffer.
mysql>
就成功串連上了。
注意:
以上的設定不緊是對原生使用者使用許可權的更改,在所有外部的機器上都可以使用指定的使用者登陸串連。當使用mysql-front在windows下管理資料庫時,可能由於版本的問題有些程式不支援使用密碼,出現以下提示:
1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
可以使用mymanager來管理mysql。
取消許可權和刪除使用者.
為了收回某個使用者的許可權,可使用REVOKE 語句。除了要用FROM 替換TO 並且沒有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的文法與GRANT 語句非常相似: .
REVOKE privileges (columns) ON what FROM user .
user 部分必須與您想要取消其許可權的使用者的原始GRANT 語句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 語句授權,然後用REVOKE 語句取消其中的一部分。REVOKE 語句只刪除許可權,不刪除使用者。使用者的項仍然保留在user 表中,即使您取消了該使用者的所有許可權也是如此。這意味著該使用者仍然可串連到伺服器上。要想刪除整個使用者,必須用DELETE 語句將該使用者的記錄從user 表中直接刪除:.
DELETE 語句刪除該使用者的項, FLUSH 語句告訴伺服器重新載入授權表(當使用GRANT 或REVOKE 語句,而不是直接修改授權表時,這些表將自動重新載入)。 .
////////////////////////////////////////////////////////////////////////////////////////////
MySQL剛安裝完只認得的主機是:localhost和127.0.0.1,如果你要讓你機上的IP可以正常登入有兩種辦法:
一是對你的IP 172.16.1.10 進行授權
grant privileges on dbname.* to "user"@"172.16.1.10 " identified by "password";
如果只是你自己用的話就可以"偷懶"這樣寫
grant all on *.* to "user"@"172.16.1.10 " identified by "password";
grant具體的用法你就參考一下mysql的使用者手冊吧,如果這樣不行的話,就只能通過以下方法進行授權了
mysql>use mysql;
database changed
mysql>INSERT INTO user VALUES('192.168.13.21','root',PASSWORD('qqq'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); 進行了,到底有多少欄位你用mysql query browser進去後看一下就知道了,很多的,呵呵.
二是就將root使用者設為可以遠程登入,也即是可以從任何機器上登入
mysql>use mysql;
database changed
mysql>update user set host="%" where user="root";
*****************************************
有2個不同的方法增加使用者:通過使用GRANT語句或通過直接操作MySQL授權表。比較好的方法是使用GRANT語句,因為他們是更簡明並且好像錯誤少些。
下面的例子顯示出如何使用mysql客戶安裝新使用者。這些例子假定許可權根據以前的章節描述的預設被安裝。這意味著為了改變,你必須在mysqld正在運行同一台機器上,你必須作為MySQL root使用者串連,並且root使用者必須對mysql資料庫有insert許可權和reload系統管理權限。另外,如果你改變了root使用者口令,你必須如下的mysql命令指定它。
你可以通過發出GRANT語句增加新使用者:
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO [email=monty@localhost
]monty@localhost[/email]
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO [email=admin@localhost]admin@localhost[/email];
mysql> GRANT USAGE ON *.* TO [email=dummy@localhost]dummy@localhost[/email];
這些GRANT語句安裝3個新使用者:
monty
可以從任何地方串連伺服器的一個完全的超級使用者,但是必須使用一個口令('something'做這個。注意,我們必須對[email=monty@localhost]monty@localhost[/email]和monty@"%"發出GRANT語句。如果我們增加localhost條目,對localhost的匿名使用者條目在我們從本地主機串連接時由mysql_install_db建立的條目將優先考慮,因為它有更特定的Host欄位值,所以以user表排列順序看更早到來。
admin
可以從localhost沒有一個口令進行串連並且被授予reload和process系統管理權限的使用者。這允許使用者執行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,還有mysqladmin processlist。沒有授予資料庫有關的許可權。他們能在以後通過發出另一個GRANT語句授權。
dummy
可以不用一個口令串連的一個使用者,但是只能從本地主機。全域許可權被設定為'N'--USAGE權限類別型允許你無需許可權就可設定一個使用者。它假定你將在以後授予資料庫相關的許可權。
你也可以直接通過發出INSERT語句增加同樣的使用者存取資訊,然後告訴伺服器再次裝入授權表:
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user SET Host='localhost',User='admin',
Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
取決於你的MySQL版本,對上述,你可能必須使用一個不同數目'Y'值(在3.22.11以前的版本有更少的許可權列)。對admin使用者,只用在3.22.11開始的版本具有的更加可讀的INSERT擴充的文法。
注意,為了設定一個超級使用者,你只需創造一個user表條目,其許可權欄位設為'Y'。不需要db或host表的條目。
在user表中的許可權列不是由最後一個INSERT語句明確設定的(對dummy使用者),因此那些列被賦予預設值'N'。這是GRANT USAGE做的同樣的事情。
下列例子增加一個使用者custom,他能從主機localhost、server.domain和whitehouse.gov串連。他只想要從localhost存取bankaccount資料庫,從whitehouse.gov存取expenses資料庫和從所有3台主機存取customer資料庫。他想要從所有3台主機上使用口令stupid。
為了使用GRANT語句設定個使用者的許可權,運行這些命令:
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON bankaccount.*
TO [email=custom@localhost]custom@localhost[/email]
IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON expenses.*
TO [email=custom@whitehouse.gov]custom@whitehouse.gov[/email]
IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON customer.*
TO [email=custom@'%']custom@[/email]
IDENTIFIED BY 'stupid';
通過直接修改授權表設定使用者權限,運行這些命令(注意,在結束時FLUSH PRIVILEGES):
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
頭3個INSERT語句增加user表條目,允許使用者custom用給定口令從不同的主機進行串連,但是沒有授予任何許可(所有許可權被設定為預設值'N')。後3個INSERT語句增加db表條目,授予custom以bankaccount、expenses和customer資料庫許可權,但是只能在從正確的主機存取時。通常,在授權表直接被修改時,伺服器必須被告知再次裝入他們(用FLUSH PRIVILEGES)以便使許可權修改生效。
如果你想要給特定的使用者從一個給定的域上的任何機器上存取許可權,你可以發出一個如下的GRANT語句:
mysql> GRANT ...
ON *.*
TO myusername@"%.mydomainname.com"
IDENTIFIED BY 'mypassword';
為了通過直接修改授權表做同樣的事情,這樣做:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;