user, db, tables_priv, columns_priv, and procs_priv
這幾個系統表中,待MySQL實例啓動後就加載到內存中對比root用戶在幾個權限系統表中的數據mysql
mysql> select * from user where user=‘root’ and host=‘localhost’; ##都是’Y’ mysql> select * from db where user=‘root’ and host=‘localhost’; ##無記錄 mysql> select * from tables_priv where host=‘localhost’ and user=‘root’; ##無記錄 mysql> select * from columns_priv where user=‘root’ and host=‘localhost’; ##無記錄 mysql> select * from procs_priv where user=‘root’ and host=‘localhost’; ##無記錄
• Delete權限表明容許刪除行數據的權限
• Drop權限表明容許刪除數據庫、表、視圖的權限,包括truncatetable命令
• Event權限表明容許查詢,建立,修改,刪除MySQL事件
• Execute權限表明容許執行存儲過程和函數的權限
• File權限表明容許在MySQL能夠訪問的目錄進行讀寫磁盤文件操做,可以使用 的命令包括load data infile,select ... into outfile,load file()函數
• Grant option權限表明是否容許此用戶受權或者收回給其餘用戶你給予的權 限
• Index權限表明是否容許建立和刪除索引
• Insert權限表明是否容許在表裏插入數據,同時在執行analyze table,optimize table,repair table語句的時候也須要insert權限
• Lock權限表明容許對擁有select權限的表進行鎖定,以防止其餘連接對此表 的讀或寫sql
• Process權限表明容許查看MySQL中的進程信息,好比執行showprocesslist,
• Reference權限是在5.7.6版本以後引入,表明是否容許建立外鍵
• Reload權限表明容許執行flush命令,指明從新加載權限表到系統內存中, refresh命令表明關閉和從新開啓日誌文件並刷新全部的表
• Replication client權限表明容許執行show master status,show slave status,show binary logs命令
• Replication slave權限表明容許slave主機經過此用戶鏈接master以便創建主從 複製關係
• Select權限表明容許從表中查看數據,某些不查詢表數據的select執行則不需 要此權限,如Select 1+1,Select PI()+2;並且select權限在執行update/delete 語句中含有where條件的狀況下也是須要的
• Showdatabases權限表明經過執行showdatabases命令查看全部的數據庫名
• Show view權限表明經過執行show create view命令查看視圖建立的語句mysqladmin processlist, show engine等命令shell
• Shutdown權限表明容許關閉數據庫實例,執行語句包括mysqladmin shutdown
• Super權限表明容許執行一系列數據庫管理命令,包括kill強制關閉某個鏈接 命令,change master to建立複製關係命令,以及create/alter/drop server等命 令
• Trigger權限表明容許建立,刪除,執行,顯示觸發器的權限
• Update權限表明容許修改表中的數據的權限
• Usage權限是建立一個用戶以後的默認權限,其自己表明鏈接登陸權限數據庫
• 權限存儲在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啓動後就加載到內存中
• User表:存放用戶帳戶信息以及全局級別(全部數據庫)權限,決定了 來自哪些主機的哪些用戶能夠訪問數據庫實例,若是有全局權限則意味
着對全部數據庫都有此權限
• Db表:存放數據庫級別的權限,決定了來自哪些主機的哪些用戶能夠訪 問此數據庫
• Tables_priv表:存放表級別的權限,決定了來自哪些主機的哪些用戶能夠 訪問數據庫的這個表
• Columns_priv表:存放列級別的權限,決定了來自哪些主機的哪些用戶可 以訪問數據庫表的這個字段
• Procs_priv表:存放存儲過程和函數級別的權限
• User和db權限表結構
• User權限表結構中的特殊字段
• Plugin,password,authentication_string三個字段存放用戶認證信息
• Password_expired設置成’Y’則代表容許DBA將此用戶的密碼設置成過時而 且過時後要求用戶的使用者重置密碼(alter user/set password重置密碼)
• Password_last_changed做爲一個時間戳字段表明密碼上次修改時間,執 行create user/alter user/set password/grant等命令建立用戶或修改用戶密 碼時此數值自動更新
• Password_lifetime表明從password_last_changed時間開始此密碼過時的天 數
• Account_locked表明此用戶被鎖住,沒法使用
• Tables_priv和columns_priv權限表結構
• Timestamp和grantor兩個字段暫時沒用
• Tables_priv和columns_priv權限值
• procs_priv權限表結構
• Routine_type是枚舉類型,表明是存儲過程仍是函數
• Timestamp和grantor兩個字段暫時沒用
• 系統權限表字段長度限制表
• 權限認證中的大小寫敏感問題
• 字段user,password,authencation_string,db,table_name大小寫敏感
• 字段host,column_name,routine_name大小寫不敏感
• User用戶大小寫敏感app
mysql> create user abc@localhost; ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost' mysql> create user Abc@localhost; Query OK, 0 rows affected (0.01 sec)
• Host主機名大小寫不敏感ide
mysql> create user abc@Localhost; ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'
• MySQL的受權用戶由兩部分組成:用戶名和登陸主機名
• 表達用戶的語法爲‘user_name’@‘host_name’
• 單引號不是必須,但若是其中包含特殊字符則是必須的
• ‘’@‘localhost’表明匿名登陸的用戶
• Host_name可使主機名或者ipv4/ipv6的地址。Localhost表明本機,127.0.0.1表明ipv4的 本機地址,::1表明ipv6的本機地址
• Host_name字段容許使用%和_兩個匹配字符,好比’%’表明全部主機,’%.mysql.com’表明 來自mysql.com這個域名下的全部主機,‘192.168.1.%’表明全部來自192.168.1網段的主機函數
• 執行Grant,revoke,setpassword,renameuser命令修改權限以後,MySQL會自動
將修改後的權限信息同步加載到系統內存中
• 若是執行insert/update/delete操做上述的系統權限表以後,則必須再執行刷 新權限命令才能同步到系統內存中,刷新權限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload
• 若是是修改tables和columns級別的權限,則客戶端的下次操做新權限就會生 效
• 若是是修改database級別的權限,則新權限在客戶端執行use database命令後 生效
• 若是是修改global級別的權限,則須要從新建立鏈接新權限才能生效
• --skip-grant-tables能夠跳過全部系統權限表而容許全部用戶登陸,只在特殊 狀況下暫時使用this
mysql --user=finley --password db_name mysql -u finley -p db_name mysql --user=finley --password=password db_name shell> mysql -u finley -ppassword db_name
• 有兩種方式建立MySQL受權用戶
• 執行createuser/grant命令(推薦方式)
• 經過insert語句直接操做MySQL系統權限表spa
mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass'; mysql>GRANTALLPRIVILEGESON*.*TO'finley'@'localhost' WITH GRANT OPTION; mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%‘ WITH GRANT OPTION; mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass'; mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; mysql> grant select(id) on test.temp to cdq@localhost;
建立MySQL用戶日誌
mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON bankaccount.* -> TO 'custom'@'localhost'; mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON expenses.* -> TO 'custom'@'host47.example.com'; mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
• 經過revoke命令收回用戶權限
mysql> revoke select on `sys`.`sys_config` from 'mysql.sys'@localhost;
• 經過執行drop user命令刪除MySQL用戶
mysql> DROP USER 'jeffrey'@'localhost';
• 經過設置全局變量max_user_connections能夠限制全部用戶在同一時 間鏈接MySQL實例的數量,但此參數沒法對每一個用戶區別對待,因此 MySQL提供了對每一個用戶的資源限制管理
• MAX_QUERIES_PER_HOUR:一個用戶在一個小時內能夠執行查詢的次 數(基本包含全部語句)
• MAX_UPDATES_PER_HOUR:一個用戶在一個小時內能夠執行修改的次 數(僅包含修改數據庫或表的語句)
• MAX_CONNECTIONS_PER_HOUR:一個用戶在一個小時內能夠鏈接 MySQL的時間
• MAX_USER_CONNECTIONS:一個用戶能夠在同一時間鏈接MySQL實例 的數量
• 從5.0.3版本開始,對用戶‘user’@‘%.example.com’的資源限制是指全部 經過example.com域名主機鏈接user用戶的鏈接,而不是分別指從 host1.example.com和host2.example.com主機過來的鏈接
• 經過執行createuser/alteruser設置/修改用戶的資源限制
mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank' -> -> -> -> WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2; mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
• 取消某項資源限制既是把原先的值修改爲0
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
• 當針對某個用戶的max_user_connections非0時,則忽略全局系統參數 max_user_connections,反之則全局系統參數生效
設置MySQL用戶的密碼
• 執行create user建立用戶和密碼
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
• 修改用戶密碼的方式包括:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass'); mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; shell> mysqladmin -u user_name -h host_name password "new_password";
• 修改自己用戶密碼的方式包括:
mysql> ALTER USER USER() IDENTIFIED BY 'mypass'; mysql> SET PASSWORD = PASSWORD('mypass');
• 設置系統參數default_password_lifetime做用於全部的用戶帳戶
• default_password_lifetime=180 設置180天過時
• default_password_lifetime=0 設置密碼不過時
• 若是爲每一個用戶設置了密碼過時策略,則會覆蓋上述系統參數
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL90DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INEVER;密碼不過時 ALTER USER‘jeffrey’@‘localhost’ PASSWORD EXPIRE DEFAULT;默認過時策略
• 手動強制某個用戶密碼過時
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE; mysql> SELECT 1; ERROR 1820 (HY000): You must SET PASSWORD before executing this statement mysql> ALTER USER USER() IDENTIFIED BY 'new_password'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT 1; |1|
經過執行create user/alter user命令中帶account lock/unlock子句設 置用戶的lock狀態
Createuser語句默認的用戶是unlock狀態
mysql>create user abc2@localhost identified by 'mysql' account lock; QueryOK,0rowsaffected(0.01sec) Alter user語句默認不會修改用戶的lock/unlock狀態 mysql>alter user 'mysql.sys'@localhost account lock; Query OK,0 row saffected(0.00sec) mysql>alter user 'mysql.sys'@localhost account unlock; Query OK,0 row saffected(0.00sec) -- 當客戶端使用lock狀態的用戶登陸MySQL時,會收到如此報錯 Access denied for user 'user_name'@'host_name'. Account is locked.
• 企業生產系統中MySQL用戶的建立一般由DBA統一協調建立,並且按需
建立
• DBA一般直接使用root用戶來管理數據庫
• 一般會建立指定業務數據庫上的增刪改查、臨時表、執行存儲過程的權限給應 用程序來鏈接數據庫
Create user app_full identified by ‘mysql’; Grant select,update,insert,delete,create temporary tables,execute on esn.* to app_full@’10.0.0.%’; mysql>show grants for app_full@'10.0.0.%'; +------------------------------------------------------------------------------------------------------------+ |Grantsforapp_full@10.0.0.% | +------------------------------------------------------------------------------------------------------------+ |GRANTUSAGEON*.*TO'app_full'@'10.0.0.%' | | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE ON `esn`.* TO 'app_full'@'10.0.0.%' |
• 一般也會建立指定業務數據庫上的只讀權限給特定應用程序或某些高級別人員 來查詢數據,防止數據被修改
Create user app_readonly identified by ‘mysql’; Grant select on esn.* to app_readonly identified by ‘mysq’;