一個重要的應用就是如何在遺忘root使用者密碼的時候修改密碼,使用的方法是啟動MySQL伺服器時忽略載入授權表。
由MySQL使用使用者名稱和口令的方法與Unix或Windows使用的方式有很多不同之處:
·MySQL 使用於認證目的的使用者名稱,與Unix使用者名稱(登入名稱字)或Windows使用者名稱無關。預設地,大多數MySQL客戶嘗試使用當前 Unix使用者名稱作為MySQL使用者名稱登入,但是這僅僅為了方便。客戶程式允許用-u或--user選項指定一個不同的名字,這意味著無論如何你不能使得一個資料庫更安全,除非所有的MySQL使用者名稱都有口令。任何人可以試圖用任何名字串連伺服器,而且如果他們指定了沒有口令的任何名字,他們將成功。
·MySQL使用者名稱最長可以是16各字元;典型地,Unix使用者名稱限制為8個字元。
·MySQL口令與Unix口令沒關係。在你使用登入到一台Unix機器口令和你使用在那台機器上存取一個資料庫的口令之間沒有必要有關聯。
·MySQL加密口令使用了一個Unix登入期間所用的不同演算法。
本節將介紹如何為MySQL資料庫系統的使用者修改密碼。
使用myadmin公用程式
使用mysqladmin公用程式修改密碼的命令列是:
shell>mysqladmin -u user -p password "newpassword"
運行這個命令,在提示輸入密碼時,資料就密碼,則使用者user的密碼就被改為newpassword
。如果,原來的使用者沒有密碼,則不比指定-p選項。例如,初始化授權表之後,root使用者的密碼就是空的,你可以這樣為root使用者設立密碼:
shell>mysqladmin -u root password "newpassword"
使用語句SET PASSWORD
使用mysqladmin為使用者修改密碼有一個明顯的缺點,就是必須知道使用者原來的密碼,如果是為了給遺忘了密碼的使用者重設密碼就無能為力了。一個專門用於修改密碼的SQL語句為SET PASSWORD:
·SET PASSWORD = PASSWORD('some password')
設定目前使用者的口令。任何非匿名的使用者能改變他自己的口令!
串連到伺服器後,你可以這樣改變自己的密碼:
複製代碼 代碼如下: mysql> SET PASSWORD = PASSWORD('another pass');
·SET PASSWORD FOR user = PASSWORD('some password')
設定當前伺服器主機上的一個特定使用者的口令。只有具備存取mysql資料庫的使用者可以這樣做。使用者應該以user@hostname格式給出,這裡 user和hostname完全與他們列在mysql.user表條目的User和Host列一樣。例如,如果你有一個條目其User和Host欄位是 'bob'和'%.loc.gov',你將寫成:
mysql> SET PASSWORD FOR bob@"%.loc.gov" = PASSWORD("newpass");
直接修改授權表
另一種修改,密碼的方法是直接修改授權表user。只有具備存取mysql資料庫的使用者可以這樣做。
例如,如果你有一個條目其User和Host欄位是'bob'和'%.loc.gov',你將寫成:
mysql> UPDATE mysql.user SET password=PASSWORD("newpass") where user="bob' AND host="%.loc.gov";
mysql>FLUSH PRIVILEGES;
重新設定一個遺忘的root口令
如果你遺忘了root使用者的口令,那麼將會是一件非常麻煩的事。除非你有其它有特權的使用者,否則很多操作都無法完成,例如,關閉資料庫等等。
你應當選用--without-grant-tables選項啟動mysqld服務,你可以在這時更改授權表的相關內容,也可以用mysqlaccess檢查你的授權是否到位。
例如,如果你忘記了你的MYSQL的root口令的話,你可以通過下面的過程恢複。
1、關閉MySQL伺服器
向mysqld server 發送kill命令關掉mysqld server(不是 kill -9),存放進程ID的檔案通常在MYSQL的資料庫所在的目錄中。
kill `cat /mysql-data-directory/hostname.pid`
你必須是UNIX的root使用者或者是你所啟動並執行SERVER上的同等使用者,才能執行這個操作。
如果在windows平台上,也可以停止進程。如果是NT還可以用net stop mysql命令關閉資料庫。
2、使用'--skip-grant-tables' 參數來啟動 mysqld。
Unix平台:
$su mysql
$safe_mysqld --skip-grant-tables &
Windows平台:
C:\mysql\bin>mysqld --skip-grant-tables
以上語句,假定都位於正確的目錄。
3、串連到伺服器,修改口令
使用'mysql -h hostname mysql'命令登入到mysqld server ,用grant命令改變口令:
mysql>GRANT ALL ON *.* TO root@localhost INDENTIFIED BY 'new password'
-> WITH GRANT OPTION;
mysql>GRANT ALL ON *.* TO root@% INDENTIFIED BY 'new password'
-> WITH GRANT OPTION;
(如果存在一個能從任意地址登入的root使用者,初始化授權表後,產生該使用者,為了安全,你可能已經刪除該使用者)。
其實也可以直接修改授權表:
mysql> use mysql;
mysql> update user set password =password('yourpass') where user='root';
你可能使用工具mysqladmin修改密碼:
shell> mysqladmin -h hostname -u root password 'new password
但是它修改的密碼語伺服器匹配的使用者有關。如果,你從伺服器主機串連,那麼伺服器匹配的是root@localhost,修改該使用者密碼,否則一般修改root@%密碼,除非你有其它root使用者存在。
4. 載入許可權表:
shell> mysqladmin -h hostname flush-privileges
或者使用 SQL 命令`FLUSH PRIVILEGES'。
當然,在這裡,你也可以重啟mysqld。