2009-12-16 40 views
49

我有幾千個MySQL用戶都設置爲允許從特定主機訪問。問題是,現在我將擁有兩臺機器(將來會更多),這將需要使用同一個帳戶訪問每個數據庫。爲MySQL用戶重新分配主機訪問權限

我想快速簡單地(儘可能自動化)來運行並修改每個用戶帳戶的主機部分以適應內部網絡通配符。例如:

'bugsy'@'internalfoo'可以訪問'bugsy'數據庫。

我想現在允許從任何地方內部網絡

「bugsy'@'10.0.0.%」先後獲得了「巴格西」 DB上巴格西訪問。

+1

我不知道這是否會有更多的運氣在serverfault.com – 2009-12-16 12:11:27

+0

謝謝T.J.我也將結帳serverfault.com(不知道!) – 2009-12-16 12:25:05

+0

現在你已經發布了這個問題,我建議在這裏關閉它。這不是真的與編程有關,更多的是服務器故障。 – 2009-12-16 13:03:58

回答

100

僅供參考,解決的辦法是:

UPDATE mysql.user SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; 
UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; 
FLUSH PRIVILEGES; 
+0

好價錢! (是的,發佈這個答案要比原來的評論好得多,當時我錯過了你的評論......) – 2012-08-21 09:39:09

+3

這並沒有正確地重新分配所有權限,下面的@pedrocheckos答案正確執行了所需的操作。 – 2017-03-31 13:12:52

1

我還沒有做到這一點,所以藉此與一粒鹽和「測試,測試,測試」的一大幫忙。

如果(在安全控制的測試環境),你直接在mysql.user,可能mysql.db表修改Host列,會發生什麼? (例如,update聲明)。我不認爲MySQL使用用戶的主機作爲密碼編碼的一部分(PASSWORD函數並未暗示它),但您必須嘗試確定它。您可能需要發出FLUSH PRIVILEGES命令(或停止並重新啓動服務器)。

對於某些存儲引擎(例如MyISAM),您可能還需要檢查/修改.frm文件的任何用戶創建的視圖。 .frm文件存儲定義者,包括定義者的主機。 (我不得不這樣做,在主機間移動數據庫這裏曾有過導致錯誤的主機要記錄一個錯誤配置......時)

+0

感謝您的回覆T.J. 我嘗試修改mysql.user和mysql的用戶記錄。db,雖然這些更改似乎執行得很好,但我仍然無法從內部網絡上的任何主機連接,而不是允許用戶訪問的原始主機。 我不知道如何修改.frm文件(它們是二進制文件)......我假設你是指mysql /目錄中的那些文件(而不是用戶可以訪問的適用數據庫)。我很猶豫是否直接在文件中進行操作。在MySQL中真的沒有支持的方式嗎?這似乎是相當短視的。 – 2009-12-16 12:13:52

+0

更改表格後,我希望您需要執行'FLUSH PRIVILEGES'命令(請參閱http://dev.mysql.com/doc/refman/5.0/en/flush.html),或者當然也可以停止並啓動服務。我所討論的'frm'文件將用於數據庫中的視圖,並且也將位於數據庫子目錄中。我爲MyISAM存儲引擎所熟悉的是純文本;因人而異。 – 2009-12-16 12:57:00

+0

「家庭」?我的打字技巧真的惡化了......;) – 2009-12-16 12:57:43

4

更一般的答案是

UPDATE mysql.user SET host = {newhost} WHERE user = {youruser} 
54

接受的答案只重命名用戶,但權限被留下。

我推薦使用:

RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5'; 

根據MySQL documentation

重命名用戶造成的老用戶持有的權限是那些持有的新用戶。

+0

我得到錯誤1396(HY000):操作RENAME USER'foo'@'%'失敗 – 2017-09-12 06:07:34