{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020/08/08/mysql-用户和角色管理入门/","result":{"data":{"site":{"siteMetadata":{"title":"CHENHUOJUN BLOG"}},"post":{"id":"77112d1f-f271-59a8-abe5-b360293e829b","html":"<p>MySQL 8.0 在用户管理方面增加了角色管理，默认的密码加密方式也做了调整，由之前的 SHA1 改为了 SHA2。同时加上 MySQL 5.7 的禁用用户和用户过期的功能，MySQL 在用户管理方面的功能和安全性都较之前版本大大的增强了。</p>\n<p>在本教程中，我们将介绍 MySQL 下用户管理上的一些新特性和如何使用角色来简化权限管理。</p>\n<blockquote>\n<p>注：本教程大部分特性要 MySQL 8.0 + 以上版本才支持。</p>\n</blockquote>\n<h2 id=\"mysql-用户管理\" style=\"position:relative;\"><a href=\"#mysql-%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86\" aria-label=\"mysql 用户管理 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MySQL 用户管理</h2>\n<h3 id=\"验证插件和密码加密方式的变化\" style=\"position:relative;\"><a href=\"#%E9%AA%8C%E8%AF%81%E6%8F%92%E4%BB%B6%E5%92%8C%E5%AF%86%E7%A0%81%E5%8A%A0%E5%AF%86%E6%96%B9%E5%BC%8F%E7%9A%84%E5%8F%98%E5%8C%96\" aria-label=\"验证插件和密码加密方式的变化 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>验证插件和密码加密方式的变化</h3>\n<p>在 MySQL 8.0 中，<code>caching_sha2_password</code> 是默认的身份验证插件而不是之前版本的 <code>mysql_native_password</code>，默认的密码加密方式是 SHA2。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> show variables like <span class=\"token string\">'default_authentication_plugin'</span><span class=\"token punctuation\">;</span>\n+-------------------------------+-----------------------+\n<span class=\"token operator\">|</span> Variable_name                 <span class=\"token operator\">|</span> Value                 <span class=\"token operator\">|</span>\n+-------------------------------+-----------------------+\n<span class=\"token operator\">|</span> default_authentication_plugin <span class=\"token operator\">|</span> caching_sha2_password <span class=\"token operator\">|</span>\n+-------------------------------+-----------------------+\n<span class=\"token number\">1</span> row <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span>\n\nmysql<span class=\"token operator\">></span> <span class=\"token keyword\">select</span> user,host,plugin from mysql.user<span class=\"token punctuation\">;</span>\n+------------------+-----------+-----------------------+\n<span class=\"token operator\">|</span> user             <span class=\"token operator\">|</span> <span class=\"token function\">host</span>      <span class=\"token operator\">|</span> plugin                <span class=\"token operator\">|</span>\n+------------------+-----------+-----------------------+\n<span class=\"token operator\">|</span> root             <span class=\"token operator\">|</span> %         <span class=\"token operator\">|</span> caching_sha2_password <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> mysql.infoschema <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> mysql_native_password <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> mysql.session    <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> mysql_native_password <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> mysql.sys        <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> mysql_native_password <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> root             <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> caching_sha2_password <span class=\"token operator\">|</span>\n+------------------+-----------+-----------------------+\n<span class=\"token number\">5</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>如果需要保持之前的验证方式并保持之前版本的密码加密方式需要在配置文件 <code>my.cnf</code> 中修改以下配置项并重启服务后生效。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">default_authentication_plugin = mysql_native_password</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<blockquote>\n<p>注：此选项暂不支持 MySQL 8.0 动态修改特性。</p>\n</blockquote>\n<h3 id=\"用户授权和修改密码\" style=\"position:relative;\"><a href=\"#%E7%94%A8%E6%88%B7%E6%8E%88%E6%9D%83%E5%92%8C%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81\" aria-label=\"用户授权和修改密码 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>用户授权和修改密码</h3>\n<p>MySQL 8.0 的用户授权语句和之前版本有所区别，老版本的常用授权语句在 MySQL 8.0 版本中 已不能使用，如使用旧版本授权语句会报错。</p>\n<ul>\n<li>在 MySQL 8.0 用之前版本授权语句创建用户。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> GRANT ALL PRIVILEGES ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>mike<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> IDENTIFIED BY <span class=\"token string\">'000000'</span> WITH GRANT OPTION<span class=\"token punctuation\">;</span>\nERROR <span class=\"token number\">1064</span> <span class=\"token punctuation\">(</span><span class=\"token number\">42000</span><span class=\"token punctuation\">)</span>: You have an error <span class=\"token keyword\">in</span> your SQL syntax<span class=\"token punctuation\">;</span> check the manual that corresponds to your MySQL server version <span class=\"token keyword\">for</span> the right syntax to use near <span class=\"token string\">'IDENTIFIED BY '</span>000000<span class=\"token string\">' WITH GRANT OPTION'</span> at line <span class=\"token number\">1</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<ul>\n<li>在 MySQL 8.0 版本中正确授权语句。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> GRANT ALL ON *.* TO <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> WITH GRANT OPTION<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h3 id=\"密码过期时间管理\" style=\"position:relative;\"><a href=\"#%E5%AF%86%E7%A0%81%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86\" aria-label=\"密码过期时间管理 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>密码过期时间管理</h3>\n<p>MySQL从 5.6.6开始引入密码自动过期的新功能，并在 MySQL 5.7.4 版本中改进了用户密码过期时间这个特性。现在可以通过一个全局变量 <code>default_password_lifetime</code> 来设置一个全局的自动密码过期策略。</p>\n<p><code>default_password_lifetime</code> 其默认值为 0，表示禁用自动密码过期。<code>default_password_lifetime</code> 的值如是是正整数 N ，则表示允许的设置密码生存周期为 N，单位为天。</p>\n<ul>\n<li><code>default_password_lifetime</code> 全局密码到期策略默认为永久不过期。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> show variables like <span class=\"token string\">'default_password_lifetime'</span><span class=\"token punctuation\">;</span>\n+---------------------------+-------+\n<span class=\"token operator\">|</span> Variable_name             <span class=\"token operator\">|</span> Value <span class=\"token operator\">|</span>\n+---------------------------+-------+\n<span class=\"token operator\">|</span> default_password_lifetime <span class=\"token operator\">|</span> <span class=\"token number\">0</span>     <span class=\"token operator\">|</span>\n+---------------------------+-------+\n<span class=\"token number\">1</span> row <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<ul>\n<li>如果你要建立一个全局策略，让所有用户的密码的使用期限为六个月，可在服务端配置文件 <code>my.cnf</code> 中修改 <code>default_password_lifetime</code> 配置项的值为 180。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">default_password_lifetime=180</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<ul>\n<li>如果你要恢复全局策略，让所有用户的密码永不过期，可在服务端配置文件 my.cnf 中修改 default<em>password</em>lifetime 配置项的值为 0。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">default_password_lifetime=0</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<ul>\n<li><code>default_password_lifetime</code> 参数是支持永久动态设置的，你也可以用以下命令在 MySQL 命令行下直接设置生效。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\"><span class=\"token comment\"># 设置默认密码过期策略为 180 天后过期</span>\nmysql<span class=\"token operator\">></span> SET PERSIST default_password_lifetime <span class=\"token operator\">=</span> <span class=\"token number\">180</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 设置默认密码过期策略为永不过期</span>\nmysql<span class=\"token operator\">></span> SET PERSIST default_password_lifetime <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># MySQL 8.0 永久动态修改参数会保存在配置文件 mysqld-auto.cnf 中，保存的格式为JSON串。</span>\n$ <span class=\"token function\">cat</span>  /var/lib/mysql/mysqld-auto.cnf\n<span class=\"token punctuation\">{</span> <span class=\"token string\">\"Version\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token number\">1</span> , <span class=\"token string\">\"mysql_server\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"default_password_lifetime\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"Value\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"180\"</span> , <span class=\"token string\">\"Metadata\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"Timestamp\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token number\">1525663928688419</span> , <span class=\"token string\">\"User\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"root\"</span> , <span class=\"token string\">\"Host\"</span> <span class=\"token builtin class-name\">:</span> <span class=\"token string\">\"\"</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<ul>\n<li>创建和修改带有密码过期时间的用户示例</li>\n</ul>\n<p>创建或修改一个用户的密码过期时间为 90 天。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span> PASSWORD EXPIRE INTERVAL <span class=\"token number\">90</span> DAY<span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> ALTER <span class=\"token environment constant\">USER</span> <span class=\"token variable\"><span class=\"token variable\">`</span>mike<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> PASSWORD EXPIRE INTERVAL <span class=\"token number\">90</span> DAY<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>建或修改一个用户的密码过期时间为永不过期。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> PASSWORD EXPIRE NEVER<span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> ALTER <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> PASSWORD EXPIRE NEVER<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>创建或修改一个遵循全局到期策略的用户。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> PASSWORD EXPIRE DEFAULT<span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> ALTER <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> PASSWORD EXPIRE DEFAULT<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>查看用户的密码过期时间。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> <span class=\"token keyword\">select</span> user,host,password_last_changed,password_lifetime,password_expired from mysql.user<span class=\"token punctuation\">;</span>\n+------------------+-----------+-----------------------+-------------------+------------------+\n<span class=\"token operator\">|</span> user             <span class=\"token operator\">|</span> <span class=\"token function\">host</span>      <span class=\"token operator\">|</span> password_last_changed <span class=\"token operator\">|</span> password_lifetime <span class=\"token operator\">|</span> password_expired <span class=\"token operator\">|</span>\n+------------------+-----------+-----------------------+-------------------+------------------+\n<span class=\"token operator\">|</span> mike             <span class=\"token operator\">|</span> %         <span class=\"token operator\">|</span> <span class=\"token number\">2018</span>-05-07 <span class=\"token number\">11</span>:13:39   <span class=\"token operator\">|</span>                <span class=\"token number\">90</span> <span class=\"token operator\">|</span> N                <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> root             <span class=\"token operator\">|</span> %         <span class=\"token operator\">|</span> <span class=\"token number\">2018</span>-05-04 <span class=\"token number\">16</span>:46:05   <span class=\"token operator\">|</span>              NULL <span class=\"token operator\">|</span> N                <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> mysql.infoschema <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> <span class=\"token number\">2018</span>-05-04 <span class=\"token number\">16</span>:45:55   <span class=\"token operator\">|</span>              NULL <span class=\"token operator\">|</span> N                <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> mysql.session    <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> <span class=\"token number\">2018</span>-05-04 <span class=\"token number\">16</span>:45:55   <span class=\"token operator\">|</span>              NULL <span class=\"token operator\">|</span> N                <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> mysql.sys        <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> <span class=\"token number\">2018</span>-05-04 <span class=\"token number\">16</span>:45:55   <span class=\"token operator\">|</span>              NULL <span class=\"token operator\">|</span> N                <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> root             <span class=\"token operator\">|</span> localhost <span class=\"token operator\">|</span> <span class=\"token number\">2018</span>-05-04 <span class=\"token number\">16</span>:46:05   <span class=\"token operator\">|</span>              NULL <span class=\"token operator\">|</span> N                <span class=\"token operator\">|</span>\n+------------------+-----------+-----------------------+-------------------+------------------+\n<span class=\"token number\">6</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"锁定解锁用户帐户\" style=\"position:relative;\"><a href=\"#%E9%94%81%E5%AE%9A%E8%A7%A3%E9%94%81%E7%94%A8%E6%88%B7%E5%B8%90%E6%88%B7\" aria-label=\"锁定解锁用户帐户 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>锁定/解锁用户帐户</h3>\n<p>从 MySQL 5.7.8 开始，用户管理方面添加了锁定/解锁用户帐户的新特性。下面我们就来看下这个特性的一些具体示例。</p>\n<ul>\n<li>创建一个带帐户锁的用户</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike-temp1'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span> ACCOUNT LOCK<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>接下来尝试用新创建的用户登陆，此时会得到一个 ERROR 3118 错误消息提示。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">$ mysql -umike-temp1 -p000000\nmysql: <span class=\"token punctuation\">[</span>Warning<span class=\"token punctuation\">]</span> Using a password on the <span class=\"token builtin class-name\">command</span> line interface can be insecure.\nERROR <span class=\"token number\">3118</span> <span class=\"token punctuation\">(</span>HY000<span class=\"token punctuation\">)</span>: Access denied <span class=\"token keyword\">for</span> user <span class=\"token string\">'mike-temp1'</span>@<span class=\"token string\">'172.22.0.1'</span><span class=\"token builtin class-name\">.</span> Account is locked.</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>如果你需要解锁此用户，此时就需要使用以下语句对其进行解锁了。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> ALTER <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike-temp1'</span>@<span class=\"token string\">'%'</span> ACCOUNT UNLOCK<span class=\"token punctuation\">;</span>\nQuery OK, <span class=\"token number\">0</span> rows affected <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>现在，这个用户就已经解锁，再次尝试登陆。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">$ mysql -umike-temp1 -p000000\nWelcome to the MySQL monitor.  Commands end with <span class=\"token punctuation\">;</span> or <span class=\"token punctuation\">\\</span>g.\nYour MySQL connection <span class=\"token function\">id</span> is <span class=\"token number\">10</span>\nServer version: <span class=\"token number\">8.0</span>.11 MySQL Community Server - GPL\n\nCopyright <span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span> <span class=\"token number\">2000</span>, <span class=\"token number\">2018</span>, Oracle and/or its affiliates. All rights reserved.\n\nOracle is a registered trademark of Oracle Corporation and/or its\naffiliates. Other names may be trademarks of their respective\nowners.\n\nType <span class=\"token string\">'help;'</span> or <span class=\"token string\">'\\h'</span> <span class=\"token keyword\">for</span> help. Type <span class=\"token string\">'<span class=\"token entity\" title=\"\\c\">\\c</span>'</span> to <span class=\"token function\">clear</span> the current input statement.\n\nmysql<span class=\"token operator\">></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<ul>\n<li>修改一个用户为锁定状态</li>\n</ul>\n<p>如果用户已建立，你也可以这样锁定用户帐户。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> ALTER <span class=\"token environment constant\">USER</span> <span class=\"token string\">'mike'</span>@<span class=\"token string\">'%'</span> ACCOUNT LOCK<span class=\"token punctuation\">;</span>\nQuery OK, <span class=\"token number\">0</span> rows affected <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h3 id=\"设置-mysql-用户密码重用策略\" style=\"position:relative;\"><a href=\"#%E8%AE%BE%E7%BD%AE-mysql-%E7%94%A8%E6%88%B7%E5%AF%86%E7%A0%81%E9%87%8D%E7%94%A8%E7%AD%96%E7%95%A5\" aria-label=\"设置 mysql 用户密码重用策略 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>设置 MySQL 用户密码重用策略</h3>\n<p>从 MySQL 8.0 开始允许限制重复使用以前的密码。可以根据密码更改次数、已用时间或两者来建立密码重用限制。帐户的密码历史由过去分配的密码组成，<code>MySQL</code> 可以限制从此历史记录中选择新密码。</p>\n<ul>\n<li>如果根据密码更改次数限制帐户，则无法从指定数量的最新密码中选择新密码。例如：如果密码更改的最小数量设置为 3，则新密码不能与任何最近的3个密码相同。</li>\n<li>如果根据密码修改时间来限制帐户，则无法将指定时间历史记录中的密码中选择为新密码。例如：如果密码重用间隔设置为 60，则新密码不得在最近 60 天内选择的密码相同。</li>\n</ul>\n<blockquote>\n<p>注：空密码不记录在密码历史记录中，并随时可以重复使用。</p>\n</blockquote>\n<p>要建立全局密码重用策略，可修改 <code>password_history</code> 和 <code>password_reuse_interval</code>系统变量。该变量可在服务配置文件 my.cnf 中配置，以禁止重复使用最近 6 个密码或最近 180 天内使用过的任何密码为例。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">password_history=6\npassword_reuse_interval=180</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>该参数是支持永久动态设置，也可以直接用下面语句进行设置。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SET PERSIST password_history <span class=\"token operator\">=</span> <span class=\"token number\">6</span><span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> SET PERSIST password_reuse_interval <span class=\"token operator\">=</span> <span class=\"token number\">180</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<h2 id=\"mysql-角色管理\" style=\"position:relative;\"><a href=\"#mysql-%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86\" aria-label=\"mysql 角色管理 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MySQL 角色管理</h2>\n<p>MySQL 数据库中通常都会出现多个拥有相同权限集合的用户，在之前版本中只有分别向多个用户授予和撤销权限才能实现单独更改每个用户的权限。在用户数量比较多的时候，这样的操作是非常耗时的。</p>\n<p>MySQL 8.0 为了用户权限管理更容易，提供了一个角色管理的新功能。角色是指定的权限集合，和用户帐户一样可以对角色进行权限的授予和撤消。如果用户被授予角色权限，则该用户拥有该角色的权限。</p>\n<p>MySQL 8.0 提供的角色管理功能如下：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">CREATE ROLE // 角色创建\nDROP ROLE // 角色删除\nGRANT // 为用户和角色分配权限\nREVOKE // 为用户和角色撤销权限\nSHOW GRANTS // 显示用户和角色的权限\nSET DEFAULT ROLE // 指定哪些帐户角色默认处于活动状态\nSET ROLE // 更改当前会话中的活动角色\nCURRENT_ROLE() // 显示当前会话中的活动角色</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"创建角色并授予用户角色权限\" style=\"position:relative;\"><a href=\"#%E5%88%9B%E5%BB%BA%E8%A7%92%E8%89%B2%E5%B9%B6%E6%8E%88%E4%BA%88%E7%94%A8%E6%88%B7%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90\" aria-label=\"创建角色并授予用户角色权限 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>创建角色并授予用户角色权限</h3>\n<p>这里我们以几种常见场景为例。</p>\n<ul>\n<li>应用程序需要读/写权限。</li>\n<li>运维人员需要完全访问数据库。</li>\n<li>部分开发人员需要读取权限。</li>\n<li>部分开发人员需要读写权限。</li>\n</ul>\n<p>如果要向多个用户授予相同的权限集，则应按如下步骤来进行。</p>\n<ul>\n<li>创建新的角色</li>\n<li>授予角色权限</li>\n<li>授予用户角色</li>\n</ul>\n<p>首先，我们创建四个角色。为了清楚区分角色的权限，建议将角色名称命名得比较直观。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE ROLE <span class=\"token string\">'app'</span>, <span class=\"token string\">'ops'</span>, <span class=\"token string\">'dev_read'</span>, <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<blockquote>\n<p>注：角色名称格式类似于由用户和主机部分组成的用户帐户，如：<code>role_name@host_name</code>。如果省略主机部分，则默认为 “%”，表示任何主机。</p>\n</blockquote>\n<p>创建好角色后，我们就给角色授予对应的权限。要授予角色权限，您可以使用 <code>GRANT</code> 语句。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\"><span class=\"token comment\"># 以下语句是向 app 角色授予 wordpress 数据库的读写权限</span>\nmysql<span class=\"token operator\">></span> GRANT SELECT, INSERT, UPDATE, DELETE ON wordpress.* TO <span class=\"token string\">'app'</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># 以下语句是向 ops 角色授予 wordpress 数据库的所有权限</span>\nmysql<span class=\"token operator\">></span> GRANT ALL PRIVILEGES ON wordpress.* TO <span class=\"token string\">'ops'</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># 以下语句是向 dev_read 角色授予 wordpress 数据库的只读权限</span>\nmysql<span class=\"token operator\">></span> GRANT SELECT ON wordpress.* TO <span class=\"token string\">'dev_read'</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># 以下语句是向 dev_write 角色授予 wordpress 数据库的写权限</span>\nmysql<span class=\"token operator\">></span> GRANT INSERT, UPDATE, DELETE ON wordpress.* TO <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<blockquote>\n<p>注：这里假定需授权的数据库名称为 <code>wordpress</code>。</p>\n</blockquote>\n<p>最后根据实际情况，我们将指定用户加入到对应的角色。假设需要一个应用程序使用的帐户、一个运维人员帐户、一个是开发人员只读帐户和两个开发人员读写帐户。</p>\n<ul>\n<li>创建新用户</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\"><span class=\"token comment\"># 应用程序帐户</span>\nmysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'app01'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># 运维人员帐户</span>\nmysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'ops01'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># 开发人员只读帐户</span>\nmysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># 开发读写帐户</span>\nmysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'dev02'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'dev03'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<ul>\n<li>给用户分配角色</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> GRANT app TO <span class=\"token string\">'app01'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> GRANT ops TO <span class=\"token string\">'ops01'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span>\nmysql<span class=\"token operator\">></span> GRANT dev_read TO <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>如果要将多个用户同时加入多个角色，可以使用类似语句。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> GRANT dev_read, dev_write TO <span class=\"token string\">'dev02'</span>@<span class=\"token string\">'%'</span>, <span class=\"token string\">'dev03'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h3 id=\"检查角色权限\" style=\"position:relative;\"><a href=\"#%E6%A3%80%E6%9F%A5%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90\" aria-label=\"检查角色权限 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>检查角色权限</h3>\n<p>要验证角色是否正确分配，可以使用 <code>SHOW GRANTS</code> 语句。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SHOW GRANTS FOR <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span>\n+-------------------------------------+\n<span class=\"token operator\">|</span> Grants <span class=\"token keyword\">for</span> dev01@%                  <span class=\"token operator\">|</span>\n+-------------------------------------+\n<span class=\"token operator\">|</span> GRANT USAGE ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev01<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>   <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT <span class=\"token variable\"><span class=\"token variable\">`</span>dev_read<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev01<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n+-------------------------------------+\n<span class=\"token number\">2</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>正如你所看到的，和之前版本不同的是 <code>SHOW GRANTS</code> 只返回授予角色。如果要显示角色所代表的权限，需要加上 <code>USING</code> 子句和授权角色的名称。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SHOW GRANTS FOR <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'%'</span> USING dev_read<span class=\"token punctuation\">;</span>\n+----------------------------------------------+\n<span class=\"token operator\">|</span> Grants <span class=\"token keyword\">for</span> dev01@%                           <span class=\"token operator\">|</span>\n+----------------------------------------------+\n<span class=\"token operator\">|</span> GRANT USAGE ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev01<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>            <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT SELECT ON <span class=\"token variable\"><span class=\"token variable\">`</span>wordpress<span class=\"token variable\">`</span></span>.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev01<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT <span class=\"token variable\"><span class=\"token variable\">`</span>dev_read<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev01<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>          <span class=\"token operator\">|</span>\n+----------------------------------------------+\n<span class=\"token number\">3</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"设置默认角色\" style=\"position:relative;\"><a href=\"#%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4%E8%A7%92%E8%89%B2\" aria-label=\"设置默认角色 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>设置默认角色</h3>\n<p>现在，如果您使用 <code>dev01</code> 用户帐户连接到 <code>MySQL</code>，并尝试访问 <code>wordpress</code> 数据库会出现以下错误。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">$ mysql -u dev01 -p000000\nWelcome to the MySQL monitor.  Commands end with <span class=\"token punctuation\">;</span> or <span class=\"token punctuation\">\\</span>g.\nYour MySQL connection <span class=\"token function\">id</span> is <span class=\"token number\">11</span>\nServer version: <span class=\"token number\">8.0</span>.11 MySQL Community Server - GPL\n\nCopyright <span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span> <span class=\"token number\">2000</span>, <span class=\"token number\">2018</span>, Oracle and/or its affiliates. All rights reserved.\n\nOracle is a registered trademark of Oracle Corporation and/or its\naffiliates. Other names may be trademarks of their respective\nowners.\n\nType <span class=\"token string\">'help;'</span> or <span class=\"token string\">'\\h'</span> <span class=\"token keyword\">for</span> help. Type <span class=\"token string\">'<span class=\"token entity\" title=\"\\c\">\\c</span>'</span> to <span class=\"token function\">clear</span> the current input statement.\n\nmysql<span class=\"token operator\">></span> use wordpress<span class=\"token punctuation\">;</span>\nERROR <span class=\"token number\">1044</span> <span class=\"token punctuation\">(</span><span class=\"token number\">42000</span><span class=\"token punctuation\">)</span>: Access denied <span class=\"token keyword\">for</span> user <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'%'</span> to database <span class=\"token string\">'wordpress'</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>这是因为在向用户帐户授予角色后，当用户帐户连接到数据库服务器时，它并不会自动使角色变为活动状态。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\"><span class=\"token comment\"># 调用 CURRENT_ROLE() 函数查看当前角色。</span>\nmysql<span class=\"token operator\">></span> SELECT current_role<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n+----------------+\n<span class=\"token operator\">|</span> current_role<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span>\n+----------------+\n<span class=\"token operator\">|</span> NONE           <span class=\"token operator\">|</span>\n+----------------+\n<span class=\"token number\">1</span> row <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>这里返回 NONE，就意味着当前没有启用任何角色。要在每次用户帐户连接到数据库服务器时指定哪些角色应该处于活动状态，需用使用 SET DEFAULT ROLE 语句来指定。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\"><span class=\"token comment\"># 以下语句将把 dev01 帐户分配的所有角色都设置为默认值。</span>\nmysql<span class=\"token operator\">></span> SET DEFAULT ROLE ALL TO <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>再次使用 dev01 用户帐户连接到 MySQL 数据库服务器并调用 CURRENT_ROLE() 函数，您将看到 dev01 用户帐户的默认角色。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">$ mysql -u dev01 -p000000\nWelcome to the MySQL monitor.  Commands end with <span class=\"token punctuation\">;</span> or <span class=\"token punctuation\">\\</span>g.\nYour MySQL connection <span class=\"token function\">id</span> is <span class=\"token number\">11</span>\nServer version: <span class=\"token number\">8.0</span>.11 MySQL Community Server - GPL\n\nCopyright <span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span> <span class=\"token number\">2000</span>, <span class=\"token number\">2018</span>, Oracle and/or its affiliates. All rights reserved.\n\nOracle is a registered trademark of Oracle Corporation and/or its\naffiliates. Other names may be trademarks of their respective\nowners.\n\nType <span class=\"token string\">'help;'</span> or <span class=\"token string\">'\\h'</span> <span class=\"token keyword\">for</span> help. Type <span class=\"token string\">'<span class=\"token entity\" title=\"\\c\">\\c</span>'</span> to <span class=\"token function\">clear</span> the current input statement.\n\nmysql<span class=\"token operator\">></span> \n\n<span class=\"token comment\"># 查看 dev01 用户帐户的默认角色。</span>\nmysql<span class=\"token operator\">></span> SELECT current_role<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n+----------------+\n<span class=\"token operator\">|</span> current_role<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span>\n+----------------+\n<span class=\"token operator\">|</span> <span class=\"token variable\"><span class=\"token variable\">`</span>dev_read<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n+----------------+\n<span class=\"token number\">1</span> row <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>最后通过将当前数据库切换到 <code>wordpress</code> 数据库，并执行 <code>SELECT</code> 语句和 <code>DELETE</code> 语句来测试 <code>dev01</code> 帐户的权限。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> use wordpress<span class=\"token punctuation\">;</span>\nDatabase changed\n\nmysql<span class=\"token operator\">></span> <span class=\"token keyword\">select</span>  count<span class=\"token punctuation\">(</span>*<span class=\"token punctuation\">)</span> from wp_terms<span class=\"token punctuation\">;</span>\n+----------+\n<span class=\"token operator\">|</span> count<span class=\"token punctuation\">(</span>*<span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span>\n+----------+\n<span class=\"token operator\">|</span>      <span class=\"token number\">357</span> <span class=\"token operator\">|</span>\n+----------+\n<span class=\"token number\">1</span> row <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span>\n\nmysql<span class=\"token operator\">></span> DELETE from wp_terms<span class=\"token punctuation\">;</span>\nERROR <span class=\"token number\">1142</span> <span class=\"token punctuation\">(</span><span class=\"token number\">42000</span><span class=\"token punctuation\">)</span>: DELETE <span class=\"token builtin class-name\">command</span> denied to user <span class=\"token string\">'dev01'</span>@<span class=\"token string\">'172.22.0.1'</span> <span class=\"token keyword\">for</span> table <span class=\"token string\">'wp_terms'</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>如上面结果所示，当我们发出 <code>DELETE</code> 语句时，就收到一个错误。因为 dev01 用户帐户只有读取访问权限。</p>\n<h3 id=\"设置活动角色\" style=\"position:relative;\"><a href=\"#%E8%AE%BE%E7%BD%AE%E6%B4%BB%E5%8A%A8%E8%A7%92%E8%89%B2\" aria-label=\"设置活动角色 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>设置活动角色</h3>\n<p>用户帐户可以通过指定哪个授权角色处于活动状态来修改当前用户在当前会话中的有效权限。</p>\n<ul>\n<li>将活动角色设置为 <code>NONE</code>，表示没有活动角色。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SET ROLE NONE<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<ul>\n<li>将活动角色设置为所有授予的角色。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SET ROLE ALL<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<ul>\n<li>将活动角色设置为由 <code>SET DEFAULT ROLE</code> 语句设置的默认角色。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SET ROLE DEFAULT<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<ul>\n<li>同时设置多个活动的角色。</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SET ROLE granted_role_1, granted_role_2, <span class=\"token punctuation\">..</span>.</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h3 id=\"撤消角色或角色权限\" style=\"position:relative;\"><a href=\"#%E6%92%A4%E6%B6%88%E8%A7%92%E8%89%B2%E6%88%96%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90\" aria-label=\"撤消角色或角色权限 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>撤消角色或角色权限</h3>\n<p>正如可以授权某个用户的角色一样，也可以从用户帐户中撤销这些角色。要从用户帐户中撤销角色需要使用 <code>REVOKE</code> 语句。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> REVOKE role FROM user<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><code>REVOKE</code> 也可以用于修改角色权限。这不仅影响角色本身权限，还影响任何授予该角色的用户权限。假设想临时让所有开发用户只读，可以使用 <code>REVOKE</code> 从 <code>dev_write</code> 角色中撤消修改权限。我们先来看下用户帐户 <code>dev02</code> 撤消前的权限。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SHOW GRANTS FOR <span class=\"token string\">'dev02'</span>@<span class=\"token string\">'%'</span> USING <span class=\"token string\">'dev_read'</span>, <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span>\n+----------------------------------------------------------------------+\n<span class=\"token operator\">|</span> Grants <span class=\"token keyword\">for</span> dev02@%                                                   <span class=\"token operator\">|</span>\n+----------------------------------------------------------------------+\n<span class=\"token operator\">|</span> GRANT USAGE ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                                    <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT SELECT, INSERT, UPDATE, DELETE ON <span class=\"token variable\"><span class=\"token variable\">`</span>wordpress<span class=\"token variable\">`</span></span>.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT <span class=\"token variable\"><span class=\"token variable\">`</span>dev_read<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>,<span class=\"token variable\"><span class=\"token variable\">`</span>dev_write<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                  <span class=\"token operator\">|</span>\n+----------------------------------------------------------------------+\n<span class=\"token number\">3</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>接下来从 <code>dev_write</code> 角色中撤消掉修改权限。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span>\nQuery OK, <span class=\"token number\">0</span> rows affected <span class=\"token punctuation\">(</span><span class=\"token number\">0.03</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>最后我们在来看看 <code>dev02</code> 用户帐户当前权限。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SHOW GRANTS FOR <span class=\"token string\">'dev02'</span>@<span class=\"token string\">'%'</span> USING <span class=\"token string\">'dev_read'</span>, <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span>\n+-----------------------------------------------------+\n<span class=\"token operator\">|</span> Grants <span class=\"token keyword\">for</span> dev02@%                                  <span class=\"token operator\">|</span>\n+-----------------------------------------------------+\n<span class=\"token operator\">|</span> GRANT USAGE ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                   <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT SELECT ON <span class=\"token variable\"><span class=\"token variable\">`</span>wordpress<span class=\"token variable\">`</span></span>.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>        <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT <span class=\"token variable\"><span class=\"token variable\">`</span>dev_read<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>,<span class=\"token variable\"><span class=\"token variable\">`</span>dev_write<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n+-----------------------------------------------------+\n<span class=\"token number\">3</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>从上面的结果可以看出，角色中撤销权限会影响到该角色中任何用户的权限。因此 dev02 现在已经没有表修改权限（<code>INSERT</code>，<code>UPDATE</code>，和 <code>DELETE</code> 权限已经去掉）。如果要恢复角色的修改权限，只需重新授予它们即可。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\"><span class=\"token comment\"># 授予 dev_write 角色修改权限。</span>\nmysql<span class=\"token operator\">></span> GRANT INSERT, UPDATE, DELETE ON wordpress.* TO <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 再次查看 dev02 用户权限，修改权限已经恢复。</span>\nmysql<span class=\"token operator\">></span> SHOW GRANTS FOR <span class=\"token string\">'dev02'</span>@<span class=\"token string\">'%'</span> USING <span class=\"token string\">'dev_read'</span>, <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span>\n+----------------------------------------------------------------------+\n<span class=\"token operator\">|</span> Grants <span class=\"token keyword\">for</span> dev02@%                                                   <span class=\"token operator\">|</span>\n+----------------------------------------------------------------------+\n<span class=\"token operator\">|</span> GRANT USAGE ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                                    <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT SELECT, INSERT, UPDATE, DELETE ON <span class=\"token variable\"><span class=\"token variable\">`</span>wordpress<span class=\"token variable\">`</span></span>.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT <span class=\"token variable\"><span class=\"token variable\">`</span>dev_read<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>,<span class=\"token variable\"><span class=\"token variable\">`</span>dev_write<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                  <span class=\"token operator\">|</span>\n+----------------------------------------------------------------------+\n<span class=\"token number\">3</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3 id=\"删除角色\" style=\"position:relative;\"><a href=\"#%E5%88%A0%E9%99%A4%E8%A7%92%E8%89%B2\" aria-label=\"删除角色 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>删除角色</h3>\n<p>要删除一个或多个角色，可以使用 <code>DROP ROLE</code> 语句。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> DROP ROLE <span class=\"token string\">'role_name'</span>, <span class=\"token string\">'role_name'</span>, <span class=\"token punctuation\">..</span>.<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>如同 <code>REVOKE</code> 语句一样，删除角色会从授权它的每个帐户中撤消该角色。例如，要删除 <code>dev_read</code>，<code>dev_write</code>角色，可使用以下语句。</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> DROP ROLE <span class=\"token string\">'dev_read'</span>, <span class=\"token string\">'dev_write'</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<h3 id=\"复制用户帐户权限到另一个用户\" style=\"position:relative;\"><a href=\"#%E5%A4%8D%E5%88%B6%E7%94%A8%E6%88%B7%E5%B8%90%E6%88%B7%E6%9D%83%E9%99%90%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7\" aria-label=\"复制用户帐户权限到另一个用户 permalink\" class=\"auto-anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>复制用户帐户权限到另一个用户</h3>\n<p>MySQL 8.0 将每一个用户帐户视为角色，因此可以将用户帐户授予另一个用户帐户。例如：将一开发人员帐号权限复制到另一开发人员帐号。</p>\n<ul>\n<li>创建一个新的开发用户帐户</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> CREATE <span class=\"token environment constant\">USER</span> <span class=\"token string\">'dev04'</span>@<span class=\"token string\">'%'</span> IDENTIFIED BY <span class=\"token string\">'000000'</span><span class=\"token punctuation\">;</span>\nQuery OK, <span class=\"token number\">0</span> rows affected <span class=\"token punctuation\">(</span><span class=\"token number\">0.04</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<ul>\n<li>将 <code>dev02</code> 用户帐户的权限复制到 <code>dev04</code> 用户帐户</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> GRANT <span class=\"token string\">'dev02'</span>@<span class=\"token string\">'%'</span> TO <span class=\"token string\">'dev04'</span>@<span class=\"token string\">'%'</span><span class=\"token punctuation\">;</span>\nQuery OK, <span class=\"token number\">0</span> rows affected <span class=\"token punctuation\">(</span><span class=\"token number\">0.09</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<ul>\n<li>查看 dev04 用户帐户的权限</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-shell line-numbers\"><code class=\"language-shell\">mysql<span class=\"token operator\">></span> SHOW GRANTS FOR <span class=\"token string\">'dev04'</span>@<span class=\"token string\">'%'</span> USING <span class=\"token string\">'dev02'</span><span class=\"token punctuation\">;</span>\n+----------------------------------------------------------------------+\n<span class=\"token operator\">|</span> Grants <span class=\"token keyword\">for</span> dev04@%                                                   <span class=\"token operator\">|</span>\n+----------------------------------------------------------------------+\n<span class=\"token operator\">|</span> GRANT USAGE ON *.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev04<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                                    <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT SELECT, INSERT, UPDATE, DELETE ON <span class=\"token variable\"><span class=\"token variable\">`</span>wordpress<span class=\"token variable\">`</span></span>.* TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev04<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> GRANT <span class=\"token variable\"><span class=\"token variable\">`</span>dev02<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span> TO <span class=\"token variable\"><span class=\"token variable\">`</span>dev04<span class=\"token variable\">`</span></span>@<span class=\"token variable\"><span class=\"token variable\">`</span>%<span class=\"token variable\">`</span></span>                                     <span class=\"token operator\">|</span>\n+----------------------------------------------------------------------+\n<span class=\"token number\">3</span> rows <span class=\"token keyword\">in</span> <span class=\"token builtin class-name\">set</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.00</span> sec<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>","excerpt":"MySQL 8.0 在用户管理方面增加了角色管理，默认的密码加密方式也做了调整，由之前的 SHA1 改为了 SHA2。同时加上 MySQL 5.7 的禁用用户和用户过期的功能，MySQL 在用户管理方面的功能和安全性都较之前版本大大的增强了。 在本教程中，我们将介绍 MySQL 下用户管理上的一些新特性和如何使用角色来简化权限管理。 注：本教程大部分特性要 MySQL 8.…","tableOfContents":"<ul>\n<li>\n<p><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#mysql-%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86\">MySQL 用户管理</a></p>\n<ul>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E9%AA%8C%E8%AF%81%E6%8F%92%E4%BB%B6%E5%92%8C%E5%AF%86%E7%A0%81%E5%8A%A0%E5%AF%86%E6%96%B9%E5%BC%8F%E7%9A%84%E5%8F%98%E5%8C%96\">验证插件和密码加密方式的变化</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E7%94%A8%E6%88%B7%E6%8E%88%E6%9D%83%E5%92%8C%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81\">用户授权和修改密码</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E5%AF%86%E7%A0%81%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86\">密码过期时间管理</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E9%94%81%E5%AE%9A%E8%A7%A3%E9%94%81%E7%94%A8%E6%88%B7%E5%B8%90%E6%88%B7\">锁定/解锁用户帐户</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E8%AE%BE%E7%BD%AE-mysql-%E7%94%A8%E6%88%B7%E5%AF%86%E7%A0%81%E9%87%8D%E7%94%A8%E7%AD%96%E7%95%A5\">设置 MySQL 用户密码重用策略</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#mysql-%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86\">MySQL 角色管理</a></p>\n<ul>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E5%88%9B%E5%BB%BA%E8%A7%92%E8%89%B2%E5%B9%B6%E6%8E%88%E4%BA%88%E7%94%A8%E6%88%B7%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90\">创建角色并授予用户角色权限</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E6%A3%80%E6%9F%A5%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90\">检查角色权限</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4%E8%A7%92%E8%89%B2\">设置默认角色</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E8%AE%BE%E7%BD%AE%E6%B4%BB%E5%8A%A8%E8%A7%92%E8%89%B2\">设置活动角色</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E6%92%A4%E6%B6%88%E8%A7%92%E8%89%B2%E6%88%96%E8%A7%92%E8%89%B2%E6%9D%83%E9%99%90\">撤消角色或角色权限</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E5%88%A0%E9%99%A4%E8%A7%92%E8%89%B2\">删除角色</a></li>\n<li><a href=\"/2020/08/08/mysql-%E7%94%A8%E6%88%B7%E5%92%8C%E8%A7%92%E8%89%B2%E7%AE%A1%E7%90%86%E5%85%A5%E9%97%A8/#%E5%A4%8D%E5%88%B6%E7%94%A8%E6%88%B7%E5%B8%90%E6%88%B7%E6%9D%83%E9%99%90%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7\">复制用户帐户权限到另一个用户</a></li>\n</ul>\n</li>\n</ul>","fields":{"slug":"/2020/08/08/mysql-用户和角色管理入门/"},"frontmatter":{"date":"August 08, 2020","title":"MySQL 用户和角色管理入门","description":"MySQL 8.0 正式版目前已发布，MySQL 8.0 增加了很多新的功能，具体可参考 MySQL 8.0 正式版 8.0.11 发布 一文。","quote":{"content":"A man has choice to begin love, but not to end it.","author":"Bohn","source":""},"tags":["Linux","MySQL"]}}},"pageContext":{"id":"77112d1f-f271-59a8-abe5-b360293e829b","prev":{"title":"Mysql 8.x 创建用户和数据库","path":"/2020/08/08/mysql-8-x-创建用户和数据库/"},"next":{"title":"如何在Debian上安装和保护Redis","path":"/2020/08/10/如何在debian上安装和保护redis/"}}}}