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:超级管理员才具备的,给别的用户授权的功能;
小备注:SQL语句truncate table 表名
具有清空表的作用,他的操作是先drop然后再create,但是只需要提供drop权限即可。
授权、回收操作
语法
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等的命令行优先级高于配置文件。
启动和关闭数据库
启动命令
- systemctl start mysqld
- mysql.server
- mysqld_safe &
- mysqld &
说明:
- 可以通过mysqld_safe去定制mysql的默认功能操作,同时可以去启动mysqld,还会检测mysqld。
- mysqld和mysqld_safe启动数据库时,可以加入自己执行的参数,如
--skip-grant-tables
,--skip-networking
,defaults-file=/opt/my.cnf
。 - 以上多种方式,都可以单独启动MySQL服务,mysqld_safe和mysqld一般是在临时维护时使用。
- 另外,从Centos 7系统开始,支持systemd直接调用mysqld的方式进行启动数据库。
关闭命令
- systemlctl stop mysqld
- service mysqld stop
- /etc/init.d/mysqld stop
- mysqladmin -uroot -p进入MySQL后使用SQL语句:shut down;
- mysql -uroot -p -e"shut down;"