前言:Mysql重要性、安裝等本大章節不做闡述。主要講述mysql使用mysql權限、架構與存儲引擎、業務設計、mysql優化
一、簡單的權限使用
grant SELECT on mall.* TO 'dev'@'192.168.244.%' IDENTIFIED BY '123' WITH GRANT OPTION;
對dev用戶加上mall庫中所有表的查詢權限,只能在192.168.0.*的 網段進行查詢操作。
二、深入理解mysql權限
1、用戶標識是什麼
在 mysql 中的權限不是單純的賦予給用戶的,而是賦予給” 用戶+IP
”的。比如 dev 用戶是否能登陸,用什麼密碼登陸,並且能訪問什麼數據庫等都需要加上 IP,這樣 纔算一個完整的用戶標識
2、用戶權限設計的表
mysql.user,mysql.db,mysql.table_priv,mysql_column_priv
那這些表有什麼用,和權限又有什麼關係呢?
- User的一行記錄代表一個用戶標識
- db的一行記錄代表對數據庫的權限
- table_priv的一行記錄代表對錶的權限
- column_priv的一行記錄代表對某一列的權限
舉例:有用戶只能訪問某張表的部分數據
新建一張account表並且插入部分數據
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`balance` int(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_balance` (`balance`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `account` VALUES ('1', 'lilei', '900');
INSERT INTO `account` VALUES ('2', 'hanmei', '100');
INSERT INTO `account` VALUES ('3', 'lucy', '250');
INSERT INTO `account` VALUES ('5', 'tom', '0');
對於前面創建的 dev 用戶我不想讓他訪問 balance 列,但是 id 和 name 列是可以訪問的,這樣 的需求在工作中不是沒有。
grant select(id,name) on mall.account to 'dev'@'192.168.244.%';
對dev用戶在account表中只加id,name的select權限
我們可以去看下相關權限表中的數據。
table_priv
column_priv
現在dev用戶直接去查詢全表就會報錯:無權訪問
但是隻查詢id、name是可以的。
三、mysql角色
mysql5.7及以後提出了Role Like的概念,類似於Oracle、PostgreSQL、 SqlServer中的角色。下面介紹下怎麼使用。
show variables like "%proxy%"
你得先把 check_proxy_users,mysql_native_password_proxy_users 這兩個變量設置成 true 才 行
set GLOBAL check_proxy_users =1;
set GLOBAL mysql_native_password_proxy_users = 1;
- 創建一個角色
create user 'dev_role'
- 創建二個開發人員賬號
create user 'RD_1'
create user 'RD_2'
- 將用戶加入到角色組中
grant proxy on 'RD_1' to 'deer'
grant proxy on 'RD_2' to 'enjoy'
- 給角色dev_role加上權限
grant select(id,name) on mall.account to 'dev_role'
- 使用開發者賬號查看數據時,發現開發者持有角色的權限
角色信息存儲在proxies_priv表中