mysql安全權(quán)限講解

      網(wǎng)友投稿 958 2022-05-29

      Mysql 默認(rèn)有個(gè)root用戶,但是這個(gè)用戶權(quán)限太大,一般只在管理數(shù)據(jù)庫時(shí)候才用。如果在項(xiàng)目中要連接 MySQL 數(shù)據(jù)庫,則建議新建一個(gè)權(quán)限較小的用戶來連接。

      在 MySQL 命令行模式下輸入如下命令可以為 MySQL 創(chuàng)建一個(gè)新用戶:

      1

      CREATE? USER? username IDENTIFIED BY? 'password' ;

      新用戶創(chuàng)建完成,但是此刻如果以此用戶登陸的話,會(huì)報(bào)錯(cuò),因?yàn)槲覀冞€沒有為這個(gè)用戶分配相應(yīng)權(quán)限,分配權(quán)限的命令如下:

      1

      GRANT? ALL? PRIVILEGES? ON? *.* TO? 'username' @ 'localhost'? IDENTIFIED BY? 'password' ;

      授予username用戶在所有數(shù)據(jù)庫上的所有權(quán)限。

      如果此時(shí)發(fā)現(xiàn)剛剛給的權(quán)限太大了,如果我們只是想授予它在某個(gè)數(shù)據(jù)庫上的權(quán)限,那么需要切換到root 用戶撤銷剛才的權(quán)限,重新授權(quán):

      1

      2

      EVOKE ALL? PRIVILEGES? ON? *.* FROM? 'username' @ 'localhost' ;

      GRANT? ALL? PRIVILEGES? ON? wordpress.* TO? 'username' @ 'localhost'? IDENTIFIED BY? 'password' ;

      甚至還可以指定該用戶只能執(zhí)行 select 和 update 命令:

      1

      GRANT? SELECT , UPDATE? ON? wordpress.* TO? 'username' @ 'localhost'? IDENTIFIED BY? 'password' ;

      這樣一來,再次以u(píng)sername登陸 MySQL,只有wordpress數(shù)據(jù)庫是對(duì)其可見的,并且如果你只授權(quán)它select權(quán)限,那么它就不能執(zhí)行delete 語句。

      另外每當(dāng)調(diào)整權(quán)限后,通常需要執(zhí)行以下語句刷新權(quán)限:

      1

      FLUSH PRIVILEGES ;

      刪除剛才創(chuàng)建的用戶:

      1

      DROP? USER? username@localhost;

      仔細(xì)上面幾個(gè)命令,可以發(fā)現(xiàn)不管是授權(quán),還是撤銷授權(quán),都要指定響應(yīng)的host(即 @ 符號(hào)后面的內(nèi)容),因?yàn)橐陨霞案衩顚?shí)際上都是在操作mysql 數(shù)據(jù)庫中的user表,可以用如下命令查看相應(yīng)用戶及對(duì)應(yīng)的host:

      1

      SELECT? User , Host FROM? user ;

      MySQL Study之--MySQL用戶及權(quán)限管理

      MySQL服務(wù)器通過MySQL權(quán)限表來控制用戶對(duì)數(shù)據(jù)庫的訪問,MySQL權(quán)限表存放在mysql數(shù)據(jù)庫里,由mysql_install_db腳本初始化。這些MySQL權(quán)限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結(jié)構(gòu)和內(nèi)容:

      user權(quán)限表:記錄允許連接到服務(wù)器的用戶帳號(hào)信息,里面的權(quán)限是全局級(jí)的。

      db權(quán)限表:記錄各個(gè)帳號(hào)在各個(gè)數(shù)據(jù)庫上的操作權(quán)限。

      table_priv權(quán)限表:記錄數(shù)據(jù)表級(jí)的操作權(quán)限。

      columns_priv權(quán)限表:記錄數(shù)據(jù)列級(jí)的操作權(quán)限。

      host權(quán)限表:配合db權(quán)限表對(duì)給定主機(jī)上數(shù)據(jù)庫級(jí)操作權(quán)限作更細(xì)致的控制。這個(gè)權(quán)限表不受GRANT和REVOKE語句的影響。

      案例分析:

      一、創(chuàng)建用戶并授權(quán)(root用戶)

      [root@mysrv ~]# mysql -u root -poracle

      mysql> select version()\g

      +-------------------------------------------+

      | version() |

      +-------------------------------------------+

      | 5.6.25-enterprise-commercial-advanced-log |

      +-------------------------------------------+

      1 row in set (0.00 sec)

      mysql> show databases;

      +--------------------+

      | Database |

      +--------------------+

      | information_schema |

      | mysql |

      | performance_schema |

      | prod |

      | test |

      +--------------------+

      5 rows in set (0.01 sec)

      1、建立tom用戶并授權(quán)(特權(quán)管理用戶)

      mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option;

      Query OK, 0 rows affected (0.00 sec)

      查看用戶創(chuàng)建是否成功:

      mysql> select user,host from user ;

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      + -------+-----------+

      | user?? | host????? |

      + -------+-----------+

      | tom?? | %???????? |

      | root? | 127.0.0.1 |

      | root? | ::1?????? |

      |?????? | localhost |

      | root? | localhost |

      | scott | localhost |

      |?????? | mysrv???? |

      | root? | mysrv???? |

      + -------+-----------+

      8 rows? in? set? (0.00 sec)

      查看tom用戶的授權(quán):

      mysql> show grants for tom;

      +----------------------------------------------------------------------------------------------------+

      | Grants for tom@% |

      +----------------------------------------------------------------------------------------------------+

      | GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |

      | GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |

      +----------------------------------------------------------------------------------------------------+

      GRANT 語法:

      GRANT privileges (columns)

      ON what

      TO user IDENTIFIED BY "password"

      WITH GRANT OPTION

      權(quán)限列表:

      ALTER: 修改表和索引。

      CREATE: 創(chuàng)建數(shù)據(jù)庫和表。

      DELETE: 刪除表中已有的記錄。

      DROP: 拋棄(刪除)數(shù)據(jù)庫和表。

      INDEX: 創(chuàng)建或拋棄索引。

      INSERT: 向表中插入新行。

      REFERENCE: 未用。

      SELECT: 檢索表中的記錄。

      UPDATE: 修改現(xiàn)存表記錄。

      FILE: 讀或?qū)懛?wù)器上的文件。

      PROCESS: 查看服務(wù)器中執(zhí)行的線程信息或殺死線程。

      RELOAD: 重載授權(quán)表或清空日志、主機(jī)緩存或表緩存。

      SHUTDOWN: 關(guān)閉服務(wù)器。

      ALL: 所有權(quán)限,ALL PRIVILEGES同義詞。

      USAGE: 特殊的 "無權(quán)限" 權(quán)限。

      用 戶賬戶包括 "username" 和 "host" 兩部分,后者表示該用戶被允許從何地接入。tom@'%' 表示任何地址,默認(rèn)可以省略。還可以是 "tom@192.168.1.%"、"tom@%.abc.com" 等。數(shù)據(jù)庫格式為 db@table,可以是 "test.*" 或 "*.*",前者表示 test 數(shù)據(jù)庫的所有表,后者表示所有數(shù)據(jù)庫的所有表。

      子句 "WITH GRANT OPTION" 表示該用戶可以為其他用戶分配權(quán)限。

      2、我們用 root 再創(chuàng)建幾個(gè)用戶,然后由 test 數(shù)據(jù)庫的管理員tom為他們分配權(quán)限。

      mysql> create user 'tom1' identified by 'tom1' ,'tom2' identified by 'tom2';

      Query OK, 0 rows affected (0.00 sec)

      mysql> select user,host from user ;

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      + -------+-----------+

      | user?? | host????? |

      + -------+-----------+

      | tom?? | %???????? |

      | tom1? | %???????? |

      | tom2? | %???????? |

      | root? | 127.0.0.1 |

      | root? | ::1?????? |

      |?????? | localhost |

      | root? | localhost |

      | scott | localhost |

      |?????? | mysrv???? |

      | root? | mysrv???? |

      + -------+-----------+

      10 rows? in? set? (0.00 sec)

      root用戶退出,tom登陸,并授權(quán)用戶訪問prod庫

      [root@mysrv ~]# mysql -u tom -ptom

      ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)

      tom用戶竟不能登陸!!!

      再對(duì)tom用戶授權(quán):

      mysql> grant all on prod.* to 'tom'@'localhost' identified by 'tom' with grant option;;

      Query OK, 0 rows affected (0.00 sec)

      mysql> show grants for tom;

      +----------------------------------------------------------------------------------------------------+

      | Grants for tom@% |

      +----------------------------------------------------------------------------------------------------+

      | GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |

      | GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |

      +----------------------------------------------------------------------------------------------------+

      2 rows in set (0.00 sec)

      mysql> use mysql;

      Database changed

      mysql> select user,host from user ;

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      + -------+-----------+

      | user?? | host????? |

      + -------+-----------+

      | tom?? | %???????? |

      | tom1? | %???????? |

      | tom2? | %???????? |

      | root? | 127.0.0.1 |

      | root? | ::1?????? |

      |?????? | localhost |

      | root? | localhost |

      | scott | localhost |

      | tom?? | localhost |

      |?????? | mysrv???? |

      | root? | mysrv???? |

      + -------+-----------+

      11 rows? in? set? (0.00 sec)

      tom登陸:

      [root@mysrv ~]# mysql -u tom -ptom prod

      mysql> select database();

      +------------+

      | database() |

      +------------+

      | prod |

      +------------+

      1 row in set (0.01 sec)

      mysql> select current_user();

      +----------------+

      | current_user() |

      +----------------+

      | tom@localhost |

      +----------------+

      1 row in set (0.00 sec)

      創(chuàng)建表:

      mysql> show tables;

      +----------------+

      | Tables_in_prod |

      +----------------+

      | t1 |

      +----------------+

      1 row in set (0.00 sec)

      mysql> create table t2 as select * from t1;

      Query OK, 3 rows affected (0.15 sec)

      Records: 3 Duplicates: 0 Warnings: 0

      查看表信息:

      mysql> desc t2;

      +-------+-------------+------+-----+---------+-------+

      | Field | Type | Null | Key | Default | Extra |

      +-------+-------------+------+-----+---------+-------+

      | id | int(11) | YES | | NULL | |

      | name | varchar(10) | YES | | NULL | |

      +-------+-------------+------+-----+---------+-------+

      2 rows in set (0.01 sec)

      mysql> show create table t2;

      +-------+---------------------------------------------------------------------------------------------------------------------------+

      | Table | Create Table |

      +-------+---------------------------------------------------------------------------------------------------------------------------+

      | t2 | CREATE TABLE `t2` (

      `id` int(11) DEFAULT NULL,

      `name` varchar(10) DEFAULT NULL

      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

      +-------+---------------------------------------------------------------------------------------------------------------------------+

      1 row in set (0.01 sec)

      mysql> show create table t2\G;

      *************************** 1. row ***************************

      Table: t2

      Create Table: CREATE TABLE `t2` (

      `id` int(11) DEFAULT NULL,

      `name` varchar(10) DEFAULT NULL

      ) ENGINE=InnoDB DEFAULT CHARSET=latin1

      1 row in set (0.00 sec)

      mysql> select * from t2;

      +------+-------+

      | id | name |

      +------+-------+

      | 10 | tom |

      | 20 | jerry |

      | 30 | rose |

      +------+-------+

      3 rows in set (0.00 sec)

      3、tom用戶為tom1,tom2授權(quán)

      mysql> grant select on prod.* to tom1;

      Query OK, 0 rows affected (0.00 sec)

      mysql> grant select on prod.* to tom2;

      Query OK, 0 rows affected (0.02 sec)

      mysql> grant insert,update on prod.* to tom2;

      Query OK, 0 rows affected (0.00 sec)

      tom2登陸(從遠(yuǎn)程登陸):

      C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2

      mysql> select database();

      +------------+

      | database() |

      +------------+

      | NULL |

      +------------+

      1 row in set (0.00 sec)

      mysql> use prod;

      Database changed

      mysql> select database();

      +------------+

      | database() |

      +------------+

      | prod |

      +------------+

      1 row in set (0.00 sec)

      mysql> select current_user();

      +----------------+

      | current_user() |

      +----------------+

      | tom2@% |

      +----------------+

      1 row in set (0.00 sec)

      mysql> show grants for tom2;

      +------------------------------------------------------------------+

      | Grants for tom2@% |

      +------------------------------------------------------------------+

      | GRANT USAGE ON *.* TO 'tom2'@'%' IDENTIFIED BY PASSWORD?|

      | GRANT SELECT, INSERT, UPDATE ON `prod`.* TO 'tom2'@'%' |

      +------------------------------------------------------------------+

      2 rows in set (0.00 sec)

      mysql> show tables;

      +----------------+

      | Tables_in_prod |

      +----------------+

      | t1 |

      | t2 |

      +----------------+

      2 rows in set (0.00 sec)

      mysql> select * from t1;

      +------+-------+

      | id | name |

      +------+-------+

      | 10 | tom |

      | 20 | jerry |

      | 30 | rose |

      +------+-------+

      3 rows in set (0.00 sec)

      mysql> select * from t2;

      +------+-------+

      | id | name |

      +------+-------+

      | 10 | tom |

      | 20 | jerry |

      | 30 | rose |

      +------+-------+

      3 rows in set (0.00 sec)

      mysql> insert into t1 values (40,'john');

      Query OK, 1 row affected (0.00 sec)

      mysql> commit;

      Query OK, 0 rows affected (0.09 sec)

      mysql> select * from t1;

      +------+-------+

      | id | name |

      +------+-------+

      | 10 | tom |

      | 20 | jerry |

      | 30 | rose |

      | 40 | john |

      +------+-------+

      4 rows in set (0.00 sec)

      mysql> update t1 set name='ellen' where id=40;

      Query OK, 1 row affected (0.01 sec)

      Rows matched: 1 Changed: 1 Warnings: 0

      mysql> select * from t1;

      +------+-------+

      | id | name |

      +------+-------+

      | 10 | tom |

      | 20 | jerry |

      | 30 | rose |

      | 40 | ellen |

      +------+-------+

      4 rows in set (0.00 sec)

      mysql> delete from t1;

      ERROR 1142 (42000): DELETE command denied to user 'tom2'@'192.168.8.254' for tab

      le 't1'

      mysql> commit;

      Query OK, 0 rows affected (0.05 sec)

      mysql> select * from t1;

      +------+-------+

      | id | name |

      +------+-------+

      | 10 | tom |

      | 20 | jerry |

      | 30 | rose |

      | 40 | ellen |

      +------+-------+

      4 rows in set (0.00 sec)

      4、回收tom2的update權(quán)限:

      mysql> revoke update on prod.* from tom2;

      Query OK, 0 rows affected (0.00 sec)

      tom2再重新登陸:

      C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2

      mysql> use prod;

      Database changed

      mysql> update t1 set name='lily' where id=10;

      ERROR 1142 (42000): UPDATE command denied to user 'tom2'@'192.168.8.254' for tab

      le 't1'

      ---update失敗!

      二、修改用戶口令:

      1、root用戶修改普通用戶口令

      mysql> set password for tom1=password('oracle');

      Query OK, 0 rows affected (0.01 sec)

      mysql> flush privileges;

      Query OK, 0 rows affected (0.00 sec)

      tom1重新登陸:

      C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1

      Warning: Using a password on the command line interface can be insecure.

      ERROR 1045 (28000): Access denied for user 'tom1'@'192.168.8.254' (using passwor

      d: YES)

      ---舊口令登陸失敗!

      C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle

      mysql>

      2、普通用戶修改自己密碼:

      C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle

      mysql> set password=password('tom1');

      Query OK, 0 rows affected (0.00 sec)

      重新登陸:

      C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1

      mysql>

      ---新密碼登陸成功 !

      三、刪除用戶:

      1、回收用戶所有權(quán)限

      mysql> revoke all on prod.* from tom2;

      Query OK, 0 rows affected (0.01 sec)

      2、刪除用戶

      mysql> drop user tom2;

      Query OK, 0 rows affected (0.00 sec)

      mysql> flush privileges;

      Query OK, 0 rows affected (0.00 sec)

      mysql> select user,host from user;

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      + -------+-----------+

      | user?? | host????? |

      + -------+-----------+

      | jerry | %???????? |

      | rose? | %???????? |

      | tom?? | %???????? |

      | tom1? | %???????? |

      | root? | 127.0.0.1 |

      | root? | ::1?????? |

      |?????? | localhost |

      | jerry | localhost |

      | root? | localhost |

      | rose? | localhost |

      | scott | localhost |

      | tom?? | localhost |

      |?????? | mysrv???? |

      | root? | mysrv???? |

      + -------+-----------+

      14 rows? in? set? (0.00 sec)

      ------- 摘要 --------------------------------------

      創(chuàng)建用戶:

      GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

      CREATE USER user2 IDENTIFIED BY 'password';

      分配權(quán)限:

      GRANT select ON testdb.* TO user2;

      查看權(quán)限:

      SHOW GRANTS FOR user1;

      修改密碼:

      SET PASSWORD FOR user1 = PASSWORD('newpwd');

      SET PASSWORD = PASSWORD('newpwd');

      移除權(quán)限:

      REVOKE all ON *.* FROM user1;

      刪除用戶:

      DROP USER user1;

      數(shù)據(jù)庫列表:

      SHOW DATABASES;

      數(shù)據(jù)表列表:

      SHOW TABLES;

      當(dāng)前數(shù)據(jù)庫:

      SELECT DATABASE();

      當(dāng)前用戶:

      SELECT USER();

      數(shù)據(jù)表結(jié)構(gòu):

      DESCRIBE table1;

      刷新權(quán)限:

      FLUSH PRIVILEGES;

      grant和revoke可以在幾個(gè)層次上控制訪問權(quán)限

      1,整個(gè)服務(wù)器,使用 grant ALL 和revoke ALL

      2,整個(gè)數(shù)據(jù)庫,使用on database.*

      3,特點(diǎn)表,使用on database.table

      4,特定的列

      5,特定的存儲(chǔ)過程

      user表中host列的值的意義

      % 匹配所有主機(jī)

      localhost localhost不會(huì)被解析成IP地址,直接通過UNIXsocket連接

      127.0.0.1 會(huì)通過TCP/IP協(xié)議連接,并且只能在本機(jī)訪問;

      ::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1

      grant 普通數(shù)據(jù)用戶,查詢、插入、更新、刪除 數(shù)據(jù)庫中所有表數(shù)據(jù)的權(quán)利。

      grant select on testdb.* to common_user@’%’

      grant insert on testdb.* to common_user@’%’

      grant update on testdb.* to common_user@’%’

      grant delete on testdb.* to common_user@’%’

      或者,用一條 MySQL 命令來替代:

      grant select, insert, update, delete on testdb.* to common_user@’%’

      grant 數(shù)據(jù)庫開發(fā)人員,創(chuàng)建表、索引、視圖、存儲(chǔ)過程、函數(shù)。。。等權(quán)限。

      grant 創(chuàng)建、修改、刪除 MySQL 數(shù)據(jù)表結(jié)構(gòu)權(quán)限。

      grant create on testdb.* to developer@’192.168.0.%’;

      grant alter on testdb.* to developer@’192.168.0.%’;

      grant drop on testdb.* to developer@’192.168.0.%’;

      grant 操作 MySQL 外鍵權(quán)限。

      grant references on testdb.* to developer@’192.168.0.%’;

      grant 操作 MySQL 臨時(shí)表權(quán)限。

      grant create temporary tables on testdb.* to developer@’192.168.0.%’;

      grant 操作 MySQL 索引權(quán)限。

      grant index on testdb.* to developer@’192.168.0.%’;

      grant 操作 MySQL 視圖、查看視圖源代碼 權(quán)限。

      grant create view on testdb.* to developer@’192.168.0.%’;

      grant show view on testdb.* to developer@’192.168.0.%’;

      grant 操作 MySQL 存儲(chǔ)過程、函數(shù) 權(quán)限。

      grant create routine on testdb.* to developer@’192.168.0.%’; -- now, can show procedure status

      grant alter routine on testdb.* to developer@’192.168.0.%’; -- now, you can drop a procedure

      grant execute on testdb.* to developer@’192.168.0.%’;

      grant 普通 DBA 管理某個(gè) MySQL 數(shù)據(jù)庫的權(quán)限。

      grant all privileges on testdb to dba@’localhost’

      其中,關(guān)鍵字 “privileges” 可以省略。

      grant 高級(jí) DBA 管理 MySQL 中所有數(shù)據(jù)庫的權(quán)限。

      grant all on *.* to dba@’localhost’

      MySQL grant 權(quán)限,分別可以作用在多個(gè)層次上。

      1. grant 作用在整個(gè) MySQL 服務(wù)器上:

      grant select on *.* to dba@localhost; -- dba 可以查詢 MySQL 中所有數(shù)據(jù)庫中的表。

      grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有數(shù)據(jù)庫

      2. grant 作用在單個(gè)數(shù)據(jù)庫上:

      grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。

      3. grant 作用在單個(gè)數(shù)據(jù)表上:

      grant select, insert, update, delete on testdb.orders to dba@localhost;

      4. grant 作用在表中的列上:

      grant select(id, se, rank) on testdb.apache_log to dba@localhost;

      5. grant 作用在存儲(chǔ)過程、函數(shù)上:

      grant execute on procedure testdb.pr_add to ’dba’@’localhost’

      grant execute on function testdb.fn_add to ’dba’@’localhost’

      注意:修改完權(quán)限以后 一定要刷新服務(wù),或者重啟服務(wù),刷新服務(wù)用:FLUSH PRIVILEGES。

      MySQL權(quán)限級(jí)別介紹

      MySQL權(quán)限級(jí)別

      全局性的管理權(quán)限,作用于整個(gè)MySQL實(shí)例級(jí)別

      數(shù)據(jù)庫級(jí)別的權(quán)限,作用于某個(gè)指定的數(shù)據(jù)庫上或者所有的數(shù)據(jù)庫上

      數(shù)據(jù)庫對(duì)象級(jí)別的權(quán)限,作用于指定的數(shù)據(jù)庫對(duì)象上(表、視圖等)或 者所有的數(shù)據(jù)庫對(duì)象上

      權(quán)限存儲(chǔ)在mysql庫的user, db, tables_priv, columns_priv, and procs_priv這幾個(gè)系統(tǒng)表中,待MySQL實(shí)例啟動(dòng)后就加載到內(nèi)存中

      MySQL權(quán)限級(jí)別介紹

      對(duì)比root用戶在幾個(gè)權(quán)限系統(tǒng)表中的數(shù)據(jù)

      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’; ##無記錄

      MySQL權(quán)限詳解(1)

      All/All Privileges權(quán)限代表全局或者全數(shù)據(jù)庫對(duì)象級(jí)別的所有權(quán)限

      Alter權(quán)限代表允許修改表結(jié)構(gòu)的權(quán)限,但必須要求有create和insert權(quán) 限配合。如果是rename表名,則要求有alter和drop原表,create和 insert新表的權(quán)限

      Alter routine權(quán)限代表允許修改或者刪除存儲(chǔ)過程、函數(shù)的權(quán)限

      Create權(quán)限代表允許創(chuàng)建新的數(shù)據(jù)庫和表的權(quán)限

      Createroutine權(quán)限代表允許創(chuàng)建存儲(chǔ)過程、函數(shù)的權(quán)限

      Createtablespace權(quán)限代表允許創(chuàng)建、修改、刪除表空間和日志組的權(quán) 限

      Create temporary tables權(quán)限代表允許創(chuàng)建臨時(shí)表的權(quán)限

      Createuser權(quán)限代表允許創(chuàng)建、修改、刪除、重命名user的權(quán)限

      Createview權(quán)限代表允許創(chuàng)建視圖的權(quán)限

      MySQL權(quán)限詳解(2)

      ? Delete權(quán)限代表允許刪除行數(shù)據(jù)的權(quán)限

      ? Drop權(quán)限代表允許刪除數(shù)據(jù)庫、表、視圖的權(quán)限,包括truncatetable命令

      ? Event權(quán)限代表允許查詢,創(chuàng)建,修改,刪除MySQL事件

      ? Execute權(quán)限代表允許執(zhí)行存儲(chǔ)過程和函數(shù)的權(quán)限

      ? File權(quán)限代表允許在MySQL可以訪問的目錄進(jìn)行讀寫磁盤文件操作,可使用 的命令包括load data infile,select ... into outfile,load file()函數(shù)

      ? Grant option權(quán)限代表是否允許此用戶授權(quán)或者收回給其他用戶你給予的權(quán) 限

      ? Index權(quán)限代表是否允許創(chuàng)建和刪除索引

      ? Insert權(quán)限代表是否允許在表里插入數(shù)據(jù),同時(shí)在執(zhí)行analyze table,optimize table,repair table語句的時(shí)候也需要insert權(quán)限

      ? Lock權(quán)限代表允許對(duì)擁有select權(quán)限的表進(jìn)行鎖定,以防止其他鏈接對(duì)此表 的讀或?qū)?/p>

      MySQL權(quán)限詳解(3)

      ? Process權(quán)限代表允許查看MySQL中的進(jìn)程信息,比如執(zhí)行showprocesslist,

      ? Reference權(quán)限是在5.7.6版本之后引入,代表是否允許創(chuàng)建外鍵

      ? Reload權(quán)限代表允許執(zhí)行flush命令,指明重新加載權(quán)限表到系統(tǒng)內(nèi)存中, refresh命令代表關(guān)閉和重新開啟日志文件并刷新所有的表

      ? Replication client權(quán)限代表允許執(zhí)行show master status,show slave status,show binary logs命令

      ? Replication slave權(quán)限代表允許slave主機(jī)通過此用戶連接master以便建立主從 復(fù)制關(guān)系

      ? Select權(quán)限代表允許從表中查看數(shù)據(jù),某些不查詢表數(shù)據(jù)的select執(zhí)行則不需 要此權(quán)限,如Select 1+1,Select PI()+2;而且select權(quán)限在執(zhí)行update/delete 語句中含有where條件的情況下也是需要的

      ? Showdatabases權(quán)限代表通過執(zhí)行showdatabases命令查看所有的數(shù)據(jù)庫名

      ? Show view權(quán)限代表通過執(zhí)行show create view命令查看視圖創(chuàng)建的語句mysqladmin processlist, show engine等命令

      MySQL權(quán)限詳解(4)

      ? Shutdown權(quán)限代表允許關(guān)閉數(shù)據(jù)庫實(shí)例,執(zhí)行語句包括mysqladmin shutdown

      ? Super權(quán)限代表允許執(zhí)行一系列數(shù)據(jù)庫管理命令,包括kill強(qiáng)制關(guān)閉某個(gè)連接 命令,change master to創(chuàng)建復(fù)制關(guān)系命令,以及create/alter/drop server等命 令

      ? Trigger權(quán)限代表允許創(chuàng)建,刪除,執(zhí)行,顯示觸發(fā)器的權(quán)限

      ? Update權(quán)限代表允許修改表中的數(shù)據(jù)的權(quán)限

      ? Usage權(quán)限是創(chuàng)建一個(gè)用戶之后的默認(rèn)權(quán)限,其本身代表連接登錄權(quán)限

      系統(tǒng)權(quán)限表

      ? 權(quán)限存儲(chǔ)在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個(gè)系統(tǒng)表中,待MySQL實(shí)例啟動(dòng)后就加載到內(nèi)存中

      ? User表:存放用戶賬戶信息以及全局級(jí)別(所有數(shù)據(jù)庫)權(quán)限,決定了 來自哪些主機(jī)的哪些用戶可以訪問數(shù)據(jù)庫實(shí)例,如果有全局權(quán)限則意味

      著對(duì)所有數(shù)據(jù)庫都有此權(quán)限

      mysql安全權(quán)限的講解

      ? Db表:存放數(shù)據(jù)庫級(jí)別的權(quán)限,決定了來自哪些主機(jī)的哪些用戶可以訪 問此數(shù)據(jù)庫

      ? Tables_priv表:存放表級(jí)別的權(quán)限,決定了來自哪些主機(jī)的哪些用戶可以 訪問數(shù)據(jù)庫的這個(gè)表

      ? Columns_priv表:存放列級(jí)別的權(quán)限,決定了來自哪些主機(jī)的哪些用戶可 以訪問數(shù)據(jù)庫表的這個(gè)字段

      ? Procs_priv表:存放存儲(chǔ)過程和函數(shù)級(jí)別的權(quán)限

      ? User和db權(quán)限表結(jié)構(gòu)

      ? User權(quán)限表結(jié)構(gòu)中的特殊字段

      ? Plugin,password,authentication_string三個(gè)字段存放用戶認(rèn)證信息

      ? Password_expired設(shè)置成’Y’則表明允許DBA將此用戶的密碼設(shè)置成過期而 且過期后要求用戶的使用者重置密碼(alter user/set password重置密碼)

      ? Password_last_changed作為一個(gè)時(shí)間戳字段代表密碼上次修改時(shí)間,執(zhí) 行create user/alter user/set password/grant等命令創(chuàng)建用戶或修改用戶密 碼時(shí)此數(shù)值自動(dòng)更新

      ? Password_lifetime代表從password_last_changed時(shí)間開始此密碼過期的天 數(shù)

      ? Account_locked代表此用戶被鎖住,無法使用

      ? Tables_priv和columns_priv權(quán)限表結(jié)構(gòu)

      ? Timestamp和grantor兩個(gè)字段暫時(shí)沒用

      ? Tables_priv和columns_priv權(quán)限值

      ? procs_priv權(quán)限表結(jié)構(gòu)

      ? Routine_type是枚舉類型,代表是存儲(chǔ)過程還是函數(shù)

      ? Timestamp和grantor兩個(gè)字段暫時(shí)沒用

      ? 系統(tǒng)權(quán)限表字段長(zhǎng)度限制表

      ? 權(quán)限認(rèn)證中的大小寫敏感問題

      ? 字段user,password,authencation_string,db,table_name大小寫敏感

      ? 字段host,column_name,routine_name大小寫不敏感

      ? User用戶大小寫敏感

      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主機(jī)名大小寫不敏感

      mysql> create user abc@Localhost;

      ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'

      MySQL授權(quán)用戶

      ? MySQL的授權(quán)用戶由兩部分組成:用戶名和登錄主機(jī)名

      ? 表達(dá)用戶的語法為‘user_name’@‘host_name’

      ? 單引號(hào)不是必須,但如果其中包含特殊字符則是必須的

      ? ‘’@‘localhost’代表匿名登錄的用戶

      ? Host_name可以使主機(jī)名或者ipv4/ipv6的地址。Localhost代表本機(jī),127.0.0.1代表ipv4的 本機(jī)地址,::1代表ipv6的本機(jī)地址

      ? Host_name字段允許使用%和_兩個(gè)匹配字符,比如’%’代表所有主機(jī),’%.mysql.com’代表 來自mysql.com這個(gè)域名下的所有主機(jī),‘192.168.1.%’代表所有來自192.168.1網(wǎng)段的主機(jī)

      MySQL修改權(quán)限的生效

      ? 執(zhí)行Grant,revoke,setpassword,renameuser命令修改權(quán)限之后,MySQL會(huì)自動(dòng)

      將修改后的權(quán)限信息同步加載到系統(tǒng)內(nèi)存中

      ? 如果執(zhí)行insert/update/delete操作上述的系統(tǒng)權(quán)限表之后,則必須再執(zhí)行刷 新權(quán)限命令才能同步到系統(tǒng)內(nèi)存中,刷新權(quán)限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload

      ? 如果是修改tables和columns級(jí)別的權(quán)限,則客戶端的下次操作新權(quán)限就會(huì)生 效

      ? 如果是修改database級(jí)別的權(quán)限,則新權(quán)限在客戶端執(zhí)行use database命令后 生效

      ? 如果是修改global級(jí)別的權(quán)限,則需要重新創(chuàng)建連接新權(quán)限才能生效

      ? --skip-grant-tables可以跳過所有系統(tǒng)權(quán)限表而允許所有用戶登錄,只在特殊 情況下暫時(shí)使用

      MySQL用戶連接

      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

      創(chuàng)建MySQL用戶

      ? 有兩種方式創(chuàng)建MySQL授權(quán)用戶

      ? 執(zhí)行createuser/grant命令(推薦方式)

      ? 通過insert語句直接操作MySQL系統(tǒng)權(quán)限表

      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;

      創(chuàng)建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

      回收MySQL用戶權(quán)限

      ? 通過revoke命令收回用戶權(quán)限

      mysql> revoke select on `sys`.`sys_config` from 'mysql.sys'@localhost;

      刪除MySQL用戶

      ? 通過執(zhí)行drop user命令刪除MySQL用戶

      mysql> DROP USER 'jeffrey'@'localhost';

      設(shè)置MySQL用戶資源限制

      ? 通過設(shè)置全局變量max_user_connections可以限制所有用戶在同一時(shí) 間連接MySQL實(shí)例的數(shù)量,但此參數(shù)無法對(duì)每個(gè)用戶區(qū)別對(duì)待,所以 MySQL提供了對(duì)每個(gè)用戶的資源限制管理

      ? MAX_QUERIES_PER_HOUR:一個(gè)用戶在一個(gè)小時(shí)內(nèi)可以執(zhí)行查詢的次 數(shù)(基本包含所有語句)

      ? MAX_UPDATES_PER_HOUR:一個(gè)用戶在一個(gè)小時(shí)內(nèi)可以執(zhí)行修改的次 數(shù)(僅包含修改數(shù)據(jù)庫或表的語句)

      ? MAX_CONNECTIONS_PER_HOUR:一個(gè)用戶在一個(gè)小時(shí)內(nèi)可以連接 MySQL的時(shí)間

      ? MAX_USER_CONNECTIONS:一個(gè)用戶可以在同一時(shí)間連接MySQL實(shí)例 的數(shù)量

      ? 從5.0.3版本開始,對(duì)用戶‘user’@‘%.example.com’的資源限制是指所有 通過example.com域名主機(jī)連接user用戶的連接,而不是分別指從 host1.example.com和host2.example.com主機(jī)過來的連接

      設(shè)置MySQL用戶資源限制

      ? 通過執(zhí)行createuser/alteruser設(shè)置/修改用戶的資源限制

      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;

      ? 取消某項(xiàng)資源限制既是把原先的值修改成0

      mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;

      ? 當(dāng)針對(duì)某個(gè)用戶的max_user_connections非0時(shí),則忽略全局系統(tǒng)參數(shù) max_user_connections,反之則全局系統(tǒng)參數(shù)生效

      設(shè)置MySQL用戶的密碼

      ? 執(zhí)行create user創(chuàng)建用戶和密碼

      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');

      設(shè)置MySQL用戶密碼過期策略

      ? 設(shè)置系統(tǒng)參數(shù)default_password_lifetime作用于所有的用戶賬戶

      ? default_password_lifetime=180 設(shè)置180天過期

      ? default_password_lifetime=0 設(shè)置密碼不過期

      ? 如果為每個(gè)用戶設(shè)置了密碼過期策略,則會(huì)覆蓋上述系統(tǒng)參數(shù)

      ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL90DAY;

      ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INEVER;密碼不過期

      ALTER USER‘jeffrey’@‘localhost’ PASSWORD EXPIRE DEFAULT;默認(rèn)過期策略

      ? 手動(dòng)強(qiáng)制某個(gè)用戶密碼過期

      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|

      MySQL用戶lock

      通過執(zhí)行create user/alter user命令中帶account lock/unlock子句設(shè) 置用戶的lock狀態(tài)

      Createuser語句默認(rèn)的用戶是unlock狀態(tài)

      mysql>create user abc2@localhost identified by 'mysql' account lock;

      QueryOK,0rowsaffected(0.01sec)

      Alter user語句默認(rèn)不會(huì)修改用戶的lock/unlock狀態(tài)

      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)

      -- 當(dāng)客戶端使用lock狀態(tài)的用戶登錄MySQL時(shí),會(huì)收到如此報(bào)錯(cuò) Access denied for user 'user_name'@'host_name'.

      Account is locked.

      企業(yè)應(yīng)用中的常規(guī)MySQL用戶

      ? 企業(yè)生產(chǎn)系統(tǒng)中MySQL用戶的創(chuàng)建通常由DBA統(tǒng)一協(xié)調(diào)創(chuàng)建,而且按需

      創(chuàng)建

      ? DBA通常直接使用root用戶來管理數(shù)據(jù)庫

      ? 通常會(huì)創(chuàng)建指定業(yè)務(wù)數(shù)據(jù)庫上的增刪改查、臨時(shí)表、執(zhí)行存儲(chǔ)過程的權(quán)限給應(yīng) 用程序來連接數(shù)據(jù)庫

      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.%' |

      ? 通常也會(huì)創(chuàng)建指定業(yè)務(wù)數(shù)據(jù)庫上的只讀權(quán)限給特定應(yīng)用程序或某些高級(jí)別人員 來查詢數(shù)據(jù),防止數(shù)據(jù)被修改

      Create user app_readonly identified by ‘mysql’;

      Grant select on esn.* to app_readonly identified by ‘mysq’;

      MySQL 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:請(qǐng)你講講分布式系統(tǒng)中分布式環(huán)境中的數(shù)據(jù)是如何管理的?
      下一篇:python并發(fā)編程之多線程
      相關(guān)文章
      久久精品国产精品亚洲人人 | 中文字幕亚洲日本岛国片| 男人天堂2018亚洲男人天堂| 亚洲电影免费在线观看| 亚洲第一AAAAA片| 亚洲成AV人片在线观看无码| 亚洲精品乱码久久久久久自慰| 怡红院亚洲怡红院首页| 中文字幕亚洲综合久久菠萝蜜| 2022中文字字幕久亚洲| 国产AV无码专区亚洲AV漫画| 亚洲一区二区三区无码中文字幕| 亚洲综合色自拍一区| 亚洲精品乱码久久久久久中文字幕| 亚洲精品乱码久久久久久按摩| 亚洲国产日韩在线视频| 亚洲AV无码一区二区二三区软件| 久久精品国产亚洲夜色AV网站| 亚洲高清在线视频| 亚洲精品欧洲精品| 久久精品国产亚洲AV久| 亚洲综合精品成人| 日韩在线视精品在亚洲| 亚洲精品无码AV中文字幕电影网站| 亚洲一级片免费看| 国产亚洲精品资源在线26u| 亚洲AV无码一区二区二三区软件 | 亚洲自偷自偷在线制服 | 亚洲永久精品ww47| 亚洲AV日韩精品久久久久| 亚洲精品成人久久| 精品亚洲AV无码一区二区三区| 亚洲中文字幕一二三四区| 亚洲高清乱码午夜电影网| 亚洲AV成人精品日韩一区18p| 国产成人亚洲精品91专区手机| 亚洲男人的天堂www| 久久亚洲精品中文字幕| 精品亚洲AV无码一区二区| 亚洲精华国产精华精华液好用| 亚洲成年看片在线观看|