MySQL基礎管理
用戶管理
用戶的作用
用戶的作用爲登錄MySQL數據庫和管理MySQL對象,不同的用戶也有着不同的用戶權限。
用戶的定義
MySQL用戶的特定格式爲:用戶名@‘白名單’。
白名單:允許登錄MySQL的地址列表,MySQL允許白名單的IP地址登錄MySQL,管理MySQL。
例如:
user@‘localhost’:用戶能夠通過本地登錄到MySQL(socket);
user@‘192.168.0.10’或user@‘xxx.com’:用戶通過192.168.0.10或xxx.com遠程登錄到MySQL服務器;
user@‘192.168.0.%’:通過192.168.0.xx/24遠程登錄到MySQL服務器;
user@‘192.168.0.5%’:通過192.168.0.50~192.168.0.59的IP遠程登錄到MySQL服務器;
user@’%’:用戶可以通過任何的IP登錄到MySQL服務器上;
注意:user@‘localhost’與user@’%'等不是同一個用戶。
用戶管理
1.查詢所有用戶:
select user(用戶名稱),host(白名單),authentication-string(經過加密後的密碼) from mysql.user;
2.添加用戶:
create user user@‘localhost’ identified by ‘123’;
3.修改用戶:
alter user user@‘localhost’ identified by ‘456’;
4.刪除用戶:
drop user user@‘localhost’;
注意:8.0版本之前,可以通過grant命令建立用戶+授權,8.0及以後的版本,只能先創建用戶後再授權。
權限管理
權限的表現方式
展示權限的命令:show privileges;
mysql> show privileges;
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege | Context | Comment |
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Alter | Tables | To alter the table |
| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
| Create | Databases,Tables,Indexes | To create new databases and tables |
| Create routine | Databases | To use CREATE FUNCTION/PROCEDURE |
| Create temporary tables | Databases | To use CREATE TEMPORARY TABLE |
| Create view | Tables | To create new views |
| Create user | Server Admin | To create new users |
| Delete | Tables | To delete existing rows |
| Drop | Databases,Tables | To drop databases, tables, and views |
| Event | Server Admin | To create, alter, drop and execute events |
| Execute | Functions,Procedures | To execute stored routines |
| File | File access on server | To read and write files on the server |
| Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess |
| Index | Tables | To create or drop indexes |
| Insert | Tables | To insert data into tables |
| Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) |
| Process | Server Admin | To view the plain text of currently executing queries |
| Proxy | Server Admin | To make proxy user possible |
| References | Databases,Tables | To have references on tables |
| Reload | Server Admin | To reload or refresh tables, logs and privileges |
| Replication client | Server Admin | To ask where the slave or master servers are |
| Replication slave | Server Admin | To read binary log events from the master |
| Select | Tables | To retrieve rows from table |
| Show databases | Server Admin | To see all databases with SHOW DATABASES |
| Show view | Tables | To see views with SHOW CREATE VIEW |
| Shutdown | Server Admin | To shut down the server |
| Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. |
| Trigger | Tables | To use triggers |
| Create tablespace | Server Admin | To create/alter/drop tablespaces |
| Update | Tables | To update existing rows |
| Usage | Server Admin | No privileges - allow connect only |
+-------------------------+---------------------------------------+-------------------------------------------------------+
ALL:以下所有權限,一般是普通管理員擁有的:SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE;
with grant option:超級管理員才具備的,給別的用戶授權的功能;
授權、回收操作
語法
8.0以前(創建對象並授權):
grant 權限 on 對象 to 用戶 identified by '密碼';
8.0+:
create user 用戶 identified by '密碼';
grant 權限 on 對象 to 用戶;
爲超級用戶授權:
GRANT 權限1,權限2,... on 對象 to 用戶 with grant option;
說明:
對象:庫以及表,格式爲庫.表
*.*
:所有的數據庫以及下面的所有表
庫.*
:指定的庫下的所有的表
庫.表
:指定庫下的指定的表
例子
1、創建並授權一個超級管理員用戶,使其可以在本地登錄並管理數據庫(使用8.0以後版本的語法):
# 創建linkai@'localhost'用戶
create user linkai@'localhost' identified by '密碼';
#爲linkai@'localhost'用戶授權
grant all on *.* to linkai@'localhost' with grant option;
#查詢所有用戶
select user,host from mysql.user;
#查詢用戶權限
show grants for linkai@'localhost';
2、創建並授權一個linkai@’%‘的普通管理用戶,對象是處理所有的表(這個有的不規範啊,不過本人在日常的學習上確實需要這麼一個用戶,就順便創建了,順便給你們看看linkai@’%'和linkai@'localhost’是不是同一個用戶。當然,在公司有規範最好要按照規範來,安全第一)(這次使用8.0以前的版本操作)
#創建並授權linkai@'%'用戶
grant all on *.* to linkai@'%' identified by '密碼';
#查詢所有用戶
select user,host from mysql.user;
#查詢用戶權限
show grants for linkai@'%';
3、創建並授權一個app@’%'的業務用戶,可以完成對所有表的增刪改查,對象是處理所有的表(這個也有的不規範啊,不過本人在日常的學習上確實需要這麼一個用戶,就順便創建了,在公司有規範最好要按照規範來,安全第一)(這次使用8.0以前的版本操作)
#創建並授權app@'%'用戶
grant select,insert,delete,update on *.* to app@'%' identified by '密碼';
#查詢所有用戶
select user,host from mysql.user;
#查詢用戶權限
show grants for app@'%';
查詢所有用戶的權限:
select * from mysql.user\G;
擴展:
user:存放創建的用戶和密碼包括全局實例級別管理權限設置;
db:存放設置的數據庫級別的權限設置;
tables_priv:存放表級別的權限設置;
columns_priv:存放字段級別的權限設置;
procs_priv:存放存儲過程中的權限設置。
注意:
1.多次grant是疊加權限;
2.create user後,該用戶只有userage權限。
回收權限
MySQL中不能通過重複授權來修改權限(重複授權只是對權限的疊加),只能回收權限。
#回收app@'%'原有的create權限
revoke create on *.* from app@'%';
#顯示app@'%'的權限
show grants for app@'%';
#刪除app@'%'用戶
drop user app@'%';
注意:
MySQL刪除用戶,權限也就跟着被刪除了,而對於Oracle來說,用戶被刪除會影響到它所管理的表,MySQL不會。
忘記root密碼的處理方式
先把操作步驟寫出來然後再說明一下:
- 先關閉數據庫:
service mysqld stop
或者systemctl stop mysqld
- 使用安全模式啓動(本地無密碼驗證登錄):`mysqld_safe --skip-grant-tables --skip-networking &
或者
service mysqld start --skip-grant-tables --skip-networking`- 修改登錄數據庫並修改密碼:
先登錄MySQL,這個過程不會對你的用戶名和密碼進行校驗;
手工加載授權表:flush privileges;
修改用戶密碼:alter user root@'localhost' identified by'密碼';
- 重啓數據庫到正常模式:
service mysqld restart
或者systemctl restart mysqld
說明:
兩個重要的參數:
--skip-grant-tables:跳過授權表
--skip-networking:跳過TCP/IP連接
MySQL數據庫中擁有安全模式,當忘記密碼時可以關閉MySQL的密碼驗證功能(MySQL的密碼驗證功能在server層的連接層),使用–skip-grant-tables參數後,此時MySQL無需賬號密碼即可登錄,但是對於遠程的用戶來說此時也可以無賬號密碼登錄爲超級管理員,非常不安全,所以需要使用–skip-networking語句跳過TCP/IP連接限制用戶從TCP/IP遠程連接,只能允許socket連接。
連接管理
MySQL自帶的客戶端
mysql、mysqldump備份工具、mysqladmin管理工具。
mysql:
- 本地socket連接:
前提:數據庫中必須實現授權用戶名@'IP’的用戶。 - 參數列表:
-u | 用戶名 |
-p | 密碼 |
-S | 本地socket文件位置 |
-h | 數據庫IP地址 |
-P | 數據庫端口號 |
-e | 免交互執行數據庫命令 |
< | 錄入SQL腳本 |
登錄語句:mysql -uroot -p -S /tmp/mysql.sock
(不加-u默認爲root用戶)
-e
的應用:
MySQL遠程客戶端程序(開發工具)
TCP/IP:前提:必須創建好可以遠程連接的用戶
mysql -u用戶名 -p -hIP地址 -P3306
各語言也有其對應的API:如php-mysql、pymysql
初始化配置
方式
源碼安裝:編譯過程中設置初始化參數
配置文件:數據庫啓動之前,設定的配置文件參數。/etc/my.cnf
啓動腳本命令行:mysqld_safe --skip-grant-tables --skip-networking &
說明:若my.cnf配置文件上配置的端口號爲3306,而mysqld_safe命令設置的端口號爲3307,則最終MySQL的端口號爲3307,命令的優先級要大於配置文件。
配置文件的應用
配置文件的讀取順序
命令:mysqld --help --verbose |grep my.cnf
查看:
說明:若/etc/my.cnf上的端口號爲3306,而~/.my.cnf上的端口號爲3307,則最終的MySQL端口號爲3307,以最後讀取的數據爲準。
特殊情況:
手工定製配置文件位置點:例如:/opt/my.cnf
mysqld --defaults-file=/opt/my.cnf&
或者
mysqld -safe --defaults-file=/opt/my.cnf&
配置文件書寫格式
[標籤]
配置參數=xxx
標籤是什麼:
區分不同程序的運行參數。
- [服務器端]:負責數據庫服務器端的運行參數設定
- [server]
[mysqld]
[mysqld_safe]
- [server]
- [客戶端]:影響本地客戶端的連接,不影響遠程客戶端
- [client]
[mysql]
[mysqldump]
現在我們一起來看/etc/my.cnf配置文件:
- [client]
#服務器端標籤
[mysqld]
#負責數據庫管理用戶
user=mysql
#軟件的安裝位置
basedir=/app/database/mysql
#數據的存放位置
datadir=/data/3306
#標誌節點的唯一編號,主從有用
server_id=6
#端口號
port=3306
#套接字文件
socket=/tmp/mysql.sock
#客戶端標籤
[mysql]
#讀取socket的文件位置點
socket=/tmp/mysql.sock
注意:mysqld命令行以及-S等的命令行優先級高於配置文件。