MySQL-11-字符目录权限
字符集的相关
1 | show variables like 'character%'; |
character_set_server
:服务器级别的字符集character_set_database
:当前数据库的字符集character_set_client
:服务器解码请求时使用的字符集character_set_connection
:服务器处理请求时会把请求字符串从 character_set_client 转为 character_set_connectioncharacter_set_results
:服务器向客户端返回数据时使用的字符集
默认编码
- 如果
创建或修改列
时没有显式的指定字符集和比较规则,则该列默认用表的
字符集和比较规则 - 如果
创建表时
没有显式的指定字符集和比较规则,则该表默认用数据库的
字符集和比较规则 - 如果
创建数据库时
没有显式的指定字符集和比较规则,则该数据库默认用服务器的
字符集和比较规则
字符编码处理过程
大小写
Linux
1、数据库名、表名、表的别名、变量名是严格区分大小写的;
2、关键字、函数名称在 SQL 中不区分大小写;
3、列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;
编写规范
- 关键字和函数名称全部大写;
- 数据库名、表名、表别名、字段名、字段别名等全部小写;
- SQL 语句必须以分号结尾。
数据库文件
MySQL数据库文件的存放路径:/var/lib/mysql/
,可以用下面的命令查看:
1 | SHOW VARIABLES LIKE 'datadir'; |
里面存放着所有数据库的定义和数据,下面的举例都是用 MySQL 默认的引擎 InnoDB。
MySQL 5.7
每一个数据库在 /var/lib/mysql/
下面都有一个自己的文件夹,里面包含:
- 数据库的属性文件:
db.opt
包含字符集,比较规则。 - 数据库表定义:
tableName.frm
Frame - 数据库表数据:
tableName.ibd
InnoDB Data
MySQL 8.0
不在提供 db.opt
和 tableName.frm
,而是集成在 tableName.idb
中。
系统数据库
MySQL 自带了四个默认的系统数据库:
mysql infromation_schema performance_schema sys
mysql
MySQL 系统自带的核心数据库,它存储了 MySQL 的用户账户和权限信息,一些存储过程、事件的定
义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
比如 mysql.user 表里面就存着数据库的用户信息,如果修改了这张表,那么就也会该表数据库的用户设置。
information_schema
库保存着MySQL服务器 维护的所有其他数据库的信息 ,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为 元数据。在系统数据库 information_schema 中提供了一些以 innodb_sys 开头的表,用于表示内部系统表。
可以从这张表里面看到所有的数据库的架构。
performance_schema
这个数据库里主要保存 MySQL 服务器运行过程中的一些状态信息,可以用来 监控 MySQL 服务的各类性能指标 。包括统计最近执行了哪些语句,在执行过程的每个阶段都
花费了多长时间,内存的使用情况等信息。
sys
MySQL 系统自带的数据库,这个数据库主要是通过 视图 的形式把 information_schema 和 performance_schema 结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能。目标是把performance_schema 的把复杂度降低,让使用者能更好的阅读这个库里的内容。更快的了解 DB 的运行情况。
账号管理
账号规则
- 帐号名称的格式为: ‘user_name’@’host_name’ 表示用户名和用户登陆来源。
- 如果只指定了 user_name, 则等价于 ‘user_name’@’%’; 例如, ’me’ 等价于 ‘me’@’%’。
- 如果用户名和主机名是合法的标识符, 则可以省略引号。 否则必须用引号引起来。
用户名:如果用户名是非空白值(nonblank value), 客户端连接时使用的用户名必须在字符上与这个值完全一致,如果用户名是一个空白值(空字符串), 则可以和任意用户名匹配。 帐号中用户名为空, 也就是匿名用户。 要在SQL中指定匿名用户, 请使用引号把空串作为用户名引起来, 例如 ‘’@’localhost’。
主机名: 可以是域名(host name) 或者是 IP 地址(支持IPv4/IPv6)。 ’localhost’ 表示本机。 ’127.0.0.1’ 表示本机的IPv4回环地址。 ’::1’ 则表示本机的IPv6回环地址。% 和 _ 通配符可以模糊匹配主机名和IP地址。 匹配规则和SQL标准中的 LIKE 语句一致。 例如, 百分号 ’%’ 与所有主机名匹配, 而 ’%.mysql.com’ 则与 mysql.com 域中的所有主机匹配。 而 ’198.51.100.%’ 则与 198.51.100 网段下的所有C类地址匹配。
账号存储在 mysql.user 表下面,表的主键就是 User 和 Host 组成的复合主键,一起标识唯一的账号。登陆的时候就在这个表里面去匹配 User 和 Host 来确定账号密码和赋予的权限。
创建用户
1 | CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']]; |
注意:
- “[ ]”表示可选,也就是说,可以指定用户登录时需要密码验证,也可以不指定密码验证,这样用户可以直接登录。不过,不指定密码的方式不安全,不推荐使用。如果指定密码值,这里需要使用 IDENTIFIED BY 指定明文密码值。
比如:
1 | CREATE USER 'test_user'@'localhost' IDENTIFIED BY '123456'; |
修改用户名和密码
修改用户名(mysql.user 权限拥有者去做):
1 | UPDATE mysql.user SET USER='xorex002' WHERE USER='xorex001'; -- 直接修改 mysql.user 即可 |
修改密码:
1 | ALTER USER USER() IDENTIFIED BY 'new_password'; |
删除用户
1 | DROP USER user[,user]…; |
比如:
1 | DROP USER 'xorex001'@'%'; |
权限管理
要注意权限更迭之后,需要重新登陆之后才可以哦。
1 | SHOW PRIVILEGES; -- 查看有什么权限 |
- CREATE 和 DROP 权限 ,可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将 MySQL 数据库中的 DROP 权限授予某用户,用户就可以删除 MySQL 访问权限保存的数据库。
- SELECT、INSERT、UPDATE 和 DELETE 权限 允许在一个数据库现有的表上实施操作。
- SELECT 权限只有在它们真正从一个表中检索行时才被用到。
- INDEX 权限 允许创建或删除索引,INDEX 适用于已有的表。如果具有某个表的 CREATE 权限,就可以在 CREATE TABLE 语句中包括索引定义。
- ALTER 权限 可以使用 ALTER TABLE 来更改表的结构和重新命名表。
- CREATE ROUTINE 权限 用来创建保存的程序(函数和程序),ALTER ROUTINE 权限用来更改和删除保存的程序, EXECUTE 权限 用来执行保存的程序。
- GRANT 权限 允许授权给其他用户,可用于数据库、表和保存的程序。
- FILE 权限 使用户可以使用 LOAD DATA INFILE 和 SELECT … INTO OUTFILE 语句读或写服务器上的文件,任何被授予 FILE 权限的用户都能读或写 MySQL 服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。
查看权限
1 | SHOW GRANTS; |
授予权限
授权的时候如果发现没有该用户,则会直接新建一个用户。
1 | GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址; |
回收权限
1 | REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址; |
角色管理
这个类似于 Linux 中的 Group,用于归纳相同的权限
创建角色
1 | CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]... |
删除角色
1 | DROP ROLE '角色名'; |
赋予权限
1 | GRANT 权限1,权限2 ON 数据库.表 TO 'role_name'[@'host_name']; |
查看权限
1 | SHOW GRANTS FOR '角色名'; |
回收权限
1 | REVOKE 权限1,权限2 ON 数据库.表 FROM '角色名'; |
用户和角色
给用户赋予角色
角色创建并授权后,要赋给用户并处于 激活状态
才能发挥作用。
1 | GRANT 角色名 TO 用户名; |
然后激活角色:
1 | SET DEFAULT ROLE ALL TO 'xorex'@'localhost'; |
撤销用户角色
1 | REVOKE 角色名 FROM 用户名; |
设置强制默认角色
比如给所有账号 role1 角色,所有只能在 localhost 登陆的账号 role2 角色,所有只能在 server.xorex.space 下登陆的账号 role3 角色。
启动前:
1 | [mysqld]mandatory_roles='role1,role2@localhost,role3@%.server.xorex.space' |
启动后:
1 | -- 系统重启后仍然有效 |