整理、记录常用的MySQL基础知识;时间久了,很多就忘记了。

操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL.

安装、启动和连接

安装

安装完MySQL Server后,需要运行mysql_secure_installation确保安全, 运行mysql_secure_installation会执行几个设置:

  • 为root用户设置密码
  • 是否删除匿名账号
  • 是否取消root用户远程登录
  • 是否删除test库和对test库的访问权限
  • 是否刷新授权表使修改生效

启动管理

MacOS

查看MySQL服务状态

sudo /usr/local/mysql/support-files/mysql.server status

停止MySQL服务

sudo /usr/local/mysql/support-files/mysql.server stop

开始MySQL服务

sudo /usr/local/mysql/support-files/mysql.server start

重新启动MySQL

sudo /usr/local/mysql/support-files/mysql.server restart

Linux系统

可以使用下面三种命令之一的方式来管理MySQL服务。

systemctl start mysql

或者

service mysql start

或者

sudo /etc/init.d/mysql start

连接

本地连接

mysql -uroot -p

远程连接

注意:

  1. 如果在运行时mysql_secure_installation去掉了root的远程连接,则需要先创建新的MySQL账户(参考 管理MySQL账户 一节)。
  2. 当使用navtive password插件(默认)验证用户的时候,会检查 发起连接的机器 + 用户名 + 密码

远程连接命令:

mysql -u[username] -h[server_host] -p

管理MySQL账户

MySQL的账户信息存储在mysql库中的user表里。

查看user表信息

describe mysql.user;

或者

desc mysql.user;

备注: MySQL 5.7及之后版本,password字段被移除,密码存储在authentication_string字段。

查看当前所有账户信息

SELECT * FROM mysql.user\G;

*_priv值为Y,表名该账户有对应的权限。

查看当前登录到MySQL Server的user列表

SELECT
user,
host,
db,
command
FROM
information_schema.processlist;

或者,

SHOW PROCESSLIST;

账户(user)管理

创建新MySQL用户账号

MySQL账号的格式: ‘user_name’@’host_name‘

创建后的MySQL账号只能登陆MySQL服务,但没有任何访问数据的权限;需要使用GRANT赋予对应的权限。

CREATE USER 'zclmoon'@'localhost' IDENTIFIED BY 'abc123_';
  1. 创建账户名为:zclmoon
  2. loalhost 连接MySQL server
  3. 密码为: abc123_

注意,安全考虑:

  1. 不要创建没有密码的账号
  2. 不要创建匿名账号
  3. host name尽量不要使用通配符 %_ (接收从任何地方来的连接);

同时创建多个user:

CREATE USER user1@localhost, user2, user3@localhost, user4@localhost
IDENTIFIED BY 'Init Password';

更新已有账户密码

方法一,使用管理员权限修改zclmoon账号密码:

SET PASSWORD FOR zclmoon@localhost='abc123__';

如果是MySQL 5.7.5、MariaDB 10.1.20 版本或之前的版本,使用命令;新版本也可以使用此命令。

ALTER USER 'database_user'@'localhost' IDENTIFIED BY 'new_password';

方法二,zclmoon连接后,自己修改密码:

set password='123';

过期账号密码

alter user zclmoon@localhost password expire;

连接没有问题,当查询的时候会报需要重置密码错误。然后使用 SET PASSWORD = 'new_pwd';重置密码即可。

修改账户名

rename user richie_test@localhost to zclmoon@localhost;

删除账号

drop user zclmoon@localhost;

删除正在连接的账户

当用户zcl正在连接MySQL Server时,DBA把该user drop掉,此时zcl仍然在连接中,并仍然可以正常做操作;只有等该user下次重新登录的时候才生效。

如果,DBA想立马结束该user的连接和操作,可以在drop user之前,关闭该user的连接session。

通过SHOW PROCESSLIST 查看user的session id。然后使用 KILL session_id终结该session.

最后再drop user即可。

问题:KILL之后, Drop USER 之前,如果使用zcl账户的客户端有操作,则会自动重建一个session出来。

  • 因为mysql cli客户端lost connection后会自动重连。
  • 解决办法: kill之后快速 drop user即可;可以把两条语句写在一起执行。

    示例:
 kill 31; drop user proxy_user@localhost;

账户权限(privilege)管理

MySQL Privilege Levels

  1. Global: 使用 *.* 语法,整个MySQL Server的所有对象(库,表,存储过程和函数等等);
  2. Database: 使用 database_name.* 语法,此数据库的所有对象;
  3. Table:database_name.table_name,此表的所有行数据;
  4. Column: 需要在每个privilege指定表的列,此表的特定列;
  5. Stored Routine: 存储过程和函数;
  6. Proxy:指定为已有账户的代理,然后会有该账户的所有权限。

显示账号被赋予的权限

SHOW GRANTS
FOR zclmoon@localhost;

或者

SHOW GRANTS; # 显示当前用户的权限

给账号某个db的所有权限

GRANT ALL
ON database_name.*
TO 'database_user'@'localhost';

给账号所有db的所有权限

GRANT ALL
ON *.*
TO 'database_user'@'localhost'
WITH GRANT OPTION;

特别注意:这里如果没有 WITH GRANT OPTION,会不工作,用户还是没有权限访问数据库对象;测试下来看,因为是root权限的原因。

好的实践: 给用户指定特定的数据库或表的权限,而不是所有。

给账号特定的权限

GRANT SELECT, INSERT, DELETE
ON database_name.*
TO `database_user`@'localhost';

给账号执行存储过程的权限

GRANT EXECUTE
ON PROCEDURE YourProcedureName
TO zclmoon@localhost;

给账号表里特定列的权限

GRANT
SELECT (employeeNumner,lastName, firstName,email),
UPDATE(lastName)
ON employees
TO zclmoon@localhost;

Proxy账号

使用Proxy User前,需要先让MySQL Server支持此机制。

  1. 检查系统变量:check_proxy_users,这个默认是0,没启用,所以MySQL Server不会使用proxy user mapping。
  2. 如果 check_proxy_users已经启用(值为1),则还需要启用两个插件:
    • mysql_native_password 插件: 启用 mysql_native_password_proxy_users.
    • sha256_password 插件: 启用 sha256_password_proxy_users.

修改my.cnf配置文件:

[mysqld]
check_proxy_users=ON
mysql_native_password_proxy_users=ON
sha256_password_proxy_users=ON

Grant Proxy:

GRANT PROXY
ON root@localhost
TO zclmoon@localhost;

查看当前登录是否用了proxy:

SELECT @@proxy_user;

遇到的问题: proxy user 一直没起作用:

解决方法:

创建user的时候,需要带上WITH mysql_native_password:

CREATE USER 'proxy_user'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'password';

也尝试了默认的方式和不加my.cnf后面两项配置,都不工作;具体原因还没搞清楚 ......

Revoke Proxy:

REVOKE PROXY
ON root@localhost
FROM zclmoon@localhost;

MySQL移除账号权限

REVOKE ALL, GRANT OPTION
FROM user1@localhost, user2@localhost;

注意: 不加 GRANT OPTION,会提示语法错误。

角色(role)管理

Role可以理解为一组privileges的集合,可以赋予多个具有相同privilege的用户users.

在大部分开源的RDBMS,role其实是一个不能登录的user的别名。

MySQL也是这么做的,Create Role后,可以在mysql.user表里看到多一条user记录(account_lockedpassword_expiredYauthentication_string 是空)。

列出所有的role

SELECT DISTINCT User 'Role Name', if(from_user is NULL,0, 1) Active
FROM mysql.user
LEFT JOIN role_edges
ON from_user=user
WHERE account_locked='Y' AND password_expired='Y' AND authentication_string='';

上面 Active 表示role被assign到user过,assign 表是 role_edges

如果想查询一个role assign给哪些user了,可以直接在role_edges表里查询。

创建Role

role和user账号一样,也有两部分组成: role_name@host_name (不指定host_name,则host_name默认为%)

CREATE ROLE test_role1, test_role2;

删除Role

DROP ROLE test_role1;

给Role赋权限

GRANT ALL
ON cms.*
TO test_role1, test_role2;

Revoke Role的权限

REVOKE INSERT, UPDATE, DELETE
ON cms.*
FROM test_role1;

给账号指定Role

GRANT test_role1
TO user1@localhost

检查user role的指定,并用using语句看role对应的privileges

SHOW GRANTS
FOR user1@localhost
USING test_role1;

查看当前role

SELECT current_role();

备注

GRANT语句可以赋予权限(privilege)和角色(role);不可以在同一个grant语句里混用权限和角色的赋予;ON关键字可用来分辨grant是赋予权限还是赋予角色:

  1. 有 ON,则表示赋予权限
  2. 没有 ON,则表示赋予角色

示例:

GRANT ALL ON db1.* TO 'user1'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';

参考资料

  1. Beginners Guide to MySQL User Management
  2. How to Manage MySQL Databases and Users from the Command Line
  3. MySQL Administratrion
  4. GRANT Statement
  5. Proxy Users - Server Support for Proxy User Mapping
  6. The Ultimate Guide To MySQL Roles By Examples
  7. MySQL 8.0: Listing Roles

原文地址:MySQL基础知识:启动管理和账号管理

MySQL基础知识:启动管理和账号管理的更多相关文章

  1. Linux基础知识第六讲,远程管理ssh操作

    目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...

  2. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  3. mysql基础知识大全

    前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...

  4. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  5. MySQL基础知识:创建MySQL数据库和表

    虚构一个微型在线书店的数据库和数据,作为后续MySQL脚本的执行源,方便后续MySQL和SQL的练习. 在虚构这个库的过程中,主要涉及的是如何使用命令行管理 MySQL数据库对象:数据库.表.索引.外 ...

  6. MySQL基础知识:Character Set和Collation

    A character set is a set of symbols and encodings. A collation is a set of rules for comparing chara ...

  7. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  8. mysql基础之mariadb库管理和表管理语句

    一.数据库管理语句 1.Syntax: CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ... cr ...

  9. python学习之-- Mysql 基础知识

    数据库介绍及MYSQL基础操作了解 关系型数据库(RDBMS)是按照数据结构来组织,存储和管理数据的仓库.特点:1:数据以表格的形式出现2:每行为各种记录名称3:每列为记录名称所对应的数据域4:许多的 ...

随机推荐

  1. Codeforces Round #666 (Div. 2) Power Sequence、Multiples of Length 思维

    题目链接:Power Sequence 题意: 给你n个数vi,你可以对这个序列进行两种操作 1.可以改变其中任意个vi的位置,无成本 2.可以对vi进行加1或减1,每次操作成本为1 如果操作之后的v ...

  2. AtCoder Beginner Contest 170 D - Not Divisible (数学)

    题意:有一长度为\(n\)的数组,求该数组中有多少元素不能整除其它任一元素的个数. 题解:刚开始写了个分解质因数(我是傻逼),后来发现直接暴力枚举因子即可,注意某个元素出现多次时肯定不满足情况,再特判 ...

  3. 📚C#/.NET/.NET Core推荐学习书籍(升职加薪,你值得拥有)

    前言: 作为一名程序员,我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力.古人有云:"书中自有黄金屋,书中只有颜如玉",说明了书籍的重要性,没错工作多年来,发现身边那 ...

  4. Bootstrap巨幕

    这是一个轻量.灵活的组件,它能延伸至整个浏览器视口来展示网站上的关键内容. jumbotron修饰 <div class="jumbotron"> <h1> ...

  5. 013.NET5_MVC_Razor扩展Html控件01

    Razor扩展控件  第一种方式: 1. 定义一个静态类 2. 定义静态扩展方法,扩展IHtmlHelper类型,返回IHtmlContent类型: 本质:通过后台方法,返回一个已经存在的Html标签 ...

  6. How to get the real screen size(screen resolution) by using js

    How to get the real screen size(screen resolution) by using js 获取用户屏幕的真实像素分辨率, 屏幕实际尺寸 window.deviceP ...

  7. 如何使用 js 扩展 prototype 方法

    如何使用 js 扩展 prototype 方法 expand prototype function enhancedLog(msg = ``) { // this.msg = msg; enhance ...

  8. WoT

    WoT IoT / AIoT Web of Things (WoT) Architecture W3C Recommendation 9 April 2020 https://www.w3.org/T ...

  9. Learning Web Performance with MDN

    Learning Web Performance with MDN Web 性能是客观的衡量标准,是加载时间和运行时的感知用户体验. https://developer.mozilla.org/en- ...

  10. Git Best Practice All In One

    Git Best Practice All In One git workflow 本地开发环境: 开发人员自测的,可以是自己本地部署的静态服务器,当然也可类似是运行 npm server类似的环境, ...