MySQL何時執行flush privileges?

2020-12-23 程序猿集錦

關注我,獲得更多分享。

需求背景

我們平時在給用戶授權grant語句執行後,都習慣性的執行一個命令flush privileges;,但是我發現有時候不執行這個命令,授權語句執行之後,權限驗證也是OK的,但是有時候發現不執行這個flush privileges;命令,權限認證還不能通過。

那麼到底什麼情況下需要執行flsh privileges;?什麼情況下不需要執行這個命令呢?

創建用戶

當我們創建用戶的時候,為了安全起見,我們會在用戶名後面增加一個host的限制,標識該用戶通過指定的密碼,只能通過該IP位址段才可以登錄MySQL。

創建用戶,語句如下所示:

createuser'user1'@'172.19.%' identified by'123456';

上面的示例是創建了一個用戶,名稱為'user1'@'172.19.%',可以通過172.19.網段,使用123456密碼來登錄MySQL。

如果用戶使用不在172.19.網段,通過這個密碼是不能登錄MySQL的。言外之意:'user1'@'ip1'和'uesr1'@'ip2'是兩個不同的用戶,我們不能單純的靠用戶名來確認用戶,需要把IP位址也納入進來。

上述語句執行成功後,MySQL會做兩件事情:

會在mysql.user表中增加一條記錄。記錄內容如下所示:

在MySQL在內存中維護的一個數組變量:acl_users,在這個變量中插入了一個元素,就是我新增加的用戶。但此時這個數組中記錄的用戶的權限也是全部為N,表示這個新增加的用戶沒有任何範圍權限。給用戶授權

前面我們創建了用戶,下面我們給這個用戶授予訪問權限,語句如下所示:

grantallon*.*to'user1'@'172.19.%';

上述語句執行完成後,MySQL也是做了兩件事情:

更新了mysql.user表中的這個用戶的權限列表,更新後的數據如下:

這個用戶的權限如下,從下圖中可以看出,該用戶用於所有的權限,也就是我們給授予的*.*的權限。

但是除了一個項Grant_priv的值為N,表示該用戶不能把自己當前所持有的權限再次賦予其他任何用戶,只能自己擁*.*有這些權限。而如果在我們的授權語句後面追加上with grant option關鍵字之後,Grant_priv的值也會變成Y,表示這個用戶可以把當前自己持有的權限,在賦予其他用戶。生產環境將不建議給授權的用戶增加with grant option選項。

更新了MySQL內存中數組acl_users的中值,把這個用戶對應的權限都跟改為Y,表示該用戶擁有了我們賦予它的權限。驗證登錄

用戶創建完成,權限也配置好了,現在我們還沒有執行flush privileges;命令。嘗試用用戶user1@'172.19.%'來登錄,登錄的時候,要確保你的登錄的時候使用的網段為172.19,驗證結果如下:

我們發現我們並沒有執行flush privileges;命令的前提下,直接使用這個用戶登錄,就可以登錄成功了。

這是為什麼?

因為我們在創建用戶和為用戶授權的時候,MySQL除了維護mysql.user表中的數據,還維護了內存中的acl_users數組。在內存中也更新了對應的用戶和權限信息。所以我們可以直接使用新創建的用戶名和密碼來登錄。

收回授權

現在我們把用戶的權限給收回,收回後不執行flush privileges;命令,看下用戶是否還可以登錄MySQL。收回授權的語句如下:

revokeallprivilegeson*.*from'user1'@'172.19.%';

驗證用戶是否還可以訪問所有的資料庫,這裡在驗證的時候,需要退出原先的登錄,重新建立連接才可以。因為MySQL資料庫中,所有的權限的修改,都是對新連接才生效,已經存在的連接不受影響的。

我們退出上一次的登錄,重新登錄後的結果如下:

看到只能看到information-schema了,其他都看不到了。這是因為所有的用戶,在沒有任何權限的時候,默認都可以看到information_schema這個資料庫。此時我們在收回用戶授權後並沒有執行flush privileges;命令。

刪除用戶

現在我們將用戶刪除掉,看下是否還可以登錄MySQL資料庫。刪除用戶的語句如下:

dropuser'user1'@'172.19.%';

驗證是否可以登錄,在驗證的時候,同樣我們需要先退出上一次的登錄重新建立連接。驗證後的結果如下

我們發現已經不能登錄MySQL資料庫了。此時我們在刪除用戶後並沒有執行flush privileges;命令。

總結

通過上面的創建用戶、給用戶授權、收回授權、刪除用戶的操作,我們可以發現在不執行flush privileges;命令的時候,這些操作都是生效了。也就是說,此時我們是沒有必要執行flush privileges;命令的。

那麼什麼情況下才需要執行flush privileges;命令呢?

當我們不是通過create user、grant、revoke、drop命令來操作用戶和權限,而是通過update語句直接去修改了mysql.user表中的數據的時候,此時我們需要執行flush privileges;命令。

此時我們也應該知道flush privileges;命令的作用了,它的作用就是清空MySQL內存中acl_users數組的數據內容,重新從mysql.user表中加載用戶的權限信息。

而當我們直接修改了mysql.user表中的內容的時候,MySQL內存中的acl_users數據信息是沒有被更新的,所以此時我們想讓我們對mysql.user表的修改直接生效,就需要手動的去更新acl_users數組的信息,而這個更新內存權限信息的操作,也就是通過flush privileges;命令來實現的。

所以,在我們日常的維護MySQL的時候,還是使用create usergrantrevoke、drop命令去維護用戶相關的信息。儘量避免直接使用update命令去修改mysql.user表中的信息。

如果你覺得這篇文章對你有幫助,也歡迎你把它分享給更多的朋友。

相關焦點

  • MySQL密碼管理
    -- mysqladmin -uroot -pold_password password new_password[root@jssdb01 ~]# mysqladmin -uroot -prootroot password root123mysqladmin: [Warning] Using a password
  • MySQL資料庫主從複製搭建
    --datadir=/data/3307/data --basedir=/application/mysql mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/application/mysql mysqld --initialize-insecure
  • MySQL 資料庫的安裝和密碼的設定
    以管理身份運行cmd進入安裝MySQL的bin目錄下,執行mysql -install,成功後執行net start mysql,顯示已成功啟動時,完成。若此時報出1067的錯誤,可能是my.ini配置有問題。執行mysqld -remove,刪除成功後,重新配置my.ini文件,重新執行步驟6.
  • 今日份知識分享:mysql創建遠程登入用戶
    切換到mysql表 在user表裡插入一個用戶就OK mysql> use mysql mysql> create database testDB; Query OK, 1 row affected (0.04 sec) mysql> grant all privileges on testDB.* to test@localhost identified by '
  • mysql主從配置詳細教程
    配置文件,做如下操作:註:mysql安裝方式的不同會導致mysql的配置文件的位置不一樣,大家要根據自己的安裝位置來找配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]bind_address
  • MySQL報1045(28000)錯誤的解決辦法
    【IT168 技術文檔】  今天不知道怎麼了,在windowns 7上安裝mysql,就是不成功,後來沒有辦法去,在http://dev.mysql.com/downloads/mysql/下了個免安裝的版本,解壓後,用是能用了。
  • 資料庫基礎:mysql主從集群搭建
    mysql 主從備份工作原理主從簡單的說就是把 一個伺服器上執行過的sql語句在別的伺服器上也重複執行一遍, 這樣只要兩個資料庫的初態是一樣的,那麼它們就能一直同步。當然這種複製和重複都是mysql自動實現的,我們只需要配置即可。
  • MySQL主從複製原理
    主從複製中涉及的線程主庫:Binlog_Dump Thread : DUMP_T從庫:SLAVE_IO_THREAD:IO_T、SLAVE_SQL_THREAD:SQL_T主從複製工作(過程)原理1.從庫執行
  • MySQL 大量 Opening tables 案例分析-愛可生
    :979),buf_dblwr_add_to_batch(buf0dblwr.cc:1154),buf_flush_write_block_low(buf0flu.cc:1099),buf_flush_page(buf0flu.cc:1099),buf_flush_try_neighbors(buf0flu.cc:1453),buf_flush_page_and_try_neighbors(buf0flu.cc
  • MySQL - Xtrabackup簡介
    Xtrabackup是由percona開源的免費資料庫熱備份軟體,它能對InnoDB資料庫和XtraDB存儲引擎的資料庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,如果資料庫大於50G,mysqldump備份就不太適合
  • 技術分享 | MySQL 閃回工具 MyFlash
    先 flush binlog,切換 binlog 文件:  mysql> flush logs;  Query OK, 0 rows affected (0.07 sec)  解析 binlog,查看對應 update 和 delete 操作,在 17:22:30 時進行 update 操作,在 17:23:35 時已經完成了delete 操作。
  • MYSQL SQL巡檢腳本
    select TABLE_SCHEMA, TABLE_NAME,COLUMN_NAME,DATA_TYPE #from information_schema.COLUMNS #where DATA_TYPE in ('enum','set','bit','binary') #-- and table_schema not in ('information_schema','mysql
  • 本地計算機上的MySQL服務啟動後停止.某些服務在未由其他服務或程序使用時將自動停止[解決方案]
    9、之後到bin目錄下執行命令(管理員身份打開命令行窗口):mysqld –initialize,如下圖所示。初始化大概需要20秒左右的時間,靜觀其變即可。10、此時通過命令行窗口再次登錄資料庫(命令為:mysql –u root -p)就可以順利進入了,但是輸入你之前的歷史遺留的密碼並不好使了,而且會報錯,報錯為:ERROR 1045 (28000): Access denied
  • 搭建MySQL主從集群,主從複製過程中同步延遲問題
    :在當前的主伺服器二進位日誌中,SLAVE中的I/O線程已經讀取的位置Relay_Log_File:SQL線程當前正在讀取和執行的中繼日誌文件的名稱Relay_Log_Pos:在當前的中繼日誌中,SQL線程已讀取和執行的位置Relay_Master_Log_File:由SQL線程執行的包含多數近期事件的主伺服器二進位日誌文件的名稱
  • MySQL如何計算統計redo log大小
    雖然我在這篇博客「MySQL中Redo Log相關的重要參數總結」中介紹了,MySQL 8.0引入了innodb_dedicated_server自適應參數,可基於伺服器的內存來動態設置innodb_buffer_pool_size,innodb_log_file_size和innodb_flush_method。默認情況下,此參數是關閉的。
  • MySQL 數據校驗工具-愛可生|mysql|perl|伺服器|node01_網易訂閱
    其原理是在主庫執行基於 statement 的 SQL 語句來生成主庫數據塊的checksum,把相同的 SQL 語句傳遞到從庫執行,並在從庫上計算相同數據塊的 checksum,最後,比較主從庫上相同數據塊的 checksum 值,由此判斷主從數據是否一致。它能在非常大的表上工作的一個原因是,它把每個表分成行塊,並檢查每個塊與單個替換。選擇查詢。它改變塊的大小,使校驗和查詢在所需的時間內運行。
  • MySQL系列二 - 搭建MySQL主從集群
    124的資料庫搭建什麼的參照上一章步驟執行就行。MySQL系列一 - MySQL安裝軟體環境CentOS 7MySQL5.7虛擬機IP: 192.168.64.123 (Master) / 192.168.64.124 (Slave)環境搭建主節點配置 修改 /etc/my.cnf文件,文件中添加修改後的my.cnf重啟MySQL, 重啟後在 /usr/local/mysql