首发自我的博客《旺旺知识库》http://www.toxingwang.com/database/mysql/1468.htmlhtml
MySQL的用户:用户名@主机mysql
用户名:16个字符之内sql
主机:能够是主机名、IP地址、网络地址等数据库
主机名:www.toxingwang.com,localhostvim
IP:192.168.0.1服务器
网络地址:172.16.0.0/255.255.0.0网络
主机还支持通配符:%和_ide
172.16.%.%函数
%.toxingwang.comurl
注意:对于包含了主机名的用户,MySQL会尝试反解析主机名,此时可能会形成链接很是慢,若是反解析的IP地址与链接点的地址不一样,还可能出现没法链接的状况。所以,为了加快链接并避免出现解析问题,能够在my.cnf文件中加入以下一行加速链接:
--skip-name-resolve
MySQL用户的密码有MySQL内部的password()函数管理。
MySQL用户只是用于认证,而用户具备的权限有相应的受权机制实现。首先MySQL用户受权的,主要为以下刘张表:
user: Contains user accounts, global privileges, and other non-privilege columns.
user: 用户账号、全局权限db: Contains database-level privileges.
db: 库级别权限host: Obsolete.
host: 废弃tables_priv: Contains table-level privileges.
tables_priv: 表级别权限columns_priv: Contains column-level privileges.
columns_priv: 列级别权限procs_priv: Contains stored procedure and function privileges.
procs_priv: 存储过程和存储函数相关的权限proxies_priv: Contains proxy-user privileges.
proxies_priv: 代理用户权限
在MySQL数据库服务启动后,这六张表会被直接加载到内存,而从此全部的认证都直接从内存中这六张表获取,而不是去读取磁盘。
user表范围列决定是否容许或拒绝到来的链接。对于容许的链接,user表授予的权限指出用户的全局(超级用户)权限。这些权限适用于服务器上的all数据库。
db表范围列决定用户能从哪一个主机存取哪一个数据库。权限列决定容许哪一个操做。授予的数据库级别的权限适用于数据库和它的表。
tables_priv和columns_priv表相似于db表,可是更精致:它们在表和列级应用而非在数据库级。授予表级别的权限适用于表和全部它的列。授予列级别的权限只适用于专用列。
procs_priv表适用于保存的程序。授予程序级别的权限只适用于单个程序。
管理权限(例如RELOAD或SHUTDOWN等等)仅在user表中被指定。这是由于管理性操做是服务器自己的操做而且不是特定数据库,所以没有理由在其余受权表中列出这样的权限。事实上,只须要查询user表来决定你是否执行一个管理操做。
FILE权限也仅在user表中指定。它不是管理性权限,但你在服务器主机上读或写文件的能力与你正在存取的数据库无关。
当mysqld服务器启动时,将受权表的内容读入到内存中。你能够经过FLUSH PRIVILEGES语句或执行mysqladmin flush-privileges或mysqladmin reload命令让它从新读取表。
帐户权限信息被存储在mysql数据库的user、db、host、tables_priv、columns_priv和procs_priv表中。在MySQL启动时时,服务器将这些数据库表内容读入内存。
GRANT和REVOKE语句所用的涉及权限的名称显示在下表,还有在受权表中每一个权限的表列名称和每一个权限有关的上下文。
权限 |
列 |
上下文 |
CREATE |
Create_priv |
数据库、表或索引 |
DROP |
Drop_priv |
数据库或表 |
GRANT OPTION |
Grant_priv |
数据库、表或保存的程序 |
REFERENCES |
References_priv |
数据库或表 |
ALTER |
Alter_priv |
表 |
DELETE |
Delete_priv |
表 |
INDEX |
Index_priv |
表 |
INSERT |
Insert_priv |
表 |
SELECT |
Select_priv |
表 |
UPDATE |
Update_priv |
表 |
CREATE VIEW |
Create_view_priv |
视图 |
SHOW VIEW |
Show_view_priv |
视图 |
ALTER ROUTINE |
Alter_routine_priv |
保存的程序 |
CREATE ROUTINE |
Create_routine_priv |
保存的程序 |
EXECUTE |
Execute_priv |
保存的程序 |
FILE |
File_priv |
服务器主机上的文件访问 |
CREATE TEMPORARY TABLES |
Create_tmp_table_priv |
服务器管理 |
LOCK TABLES |
Lock_tables_priv |
服务器管理 |
CREATE USER |
Create_user_priv |
服务器管理 |
PROCESS |
Process_priv |
服务器管理 |
RELOAD |
Reload_priv |
服务器管理 |
REPLICATION CLIENT |
Repl_client_priv |
服务器管理 |
REPLICATION SLAVE |
Repl_slave_priv |
服务器管理 |
SHOW DATABASES |
Show_db_priv |
服务器管理 |
SHUTDOWN |
Shutdown_priv |
服务器管理 |
SUPER |
Super_priv |
服务器管理 |
当mysqld启动时,全部受权表的内容被读进内存而且今后时生效。
当服务器注意到受权表被改变了时,现存的客户端链接有以下影响:
表和列权限在客户端的下一次请求时生效。
数据库权限改变在下一个USE db_name命令生效。
全局权限的改变和密码改变在下一次客户端链接时生效。
若是用GRANT、REVOKE或SET PASSWORD对受权表进行修改,服务器会注意到并当即从新将受权表载入内存。
若是你手动地修改受权表(使用INSERT、UPDATE或DELETE等等),你应该执行mysqladmin flush-privileges或mysqladmin reload告诉服务器再装载受权表,不然你的更改将不会生效,除非你重启服务器。
若是你直接更改了受权表但忘记重载,重启服务器后你的更改方生效。这样可能让你迷惑为何你的更改没有什么变化!
基本语法:
CREATE USER username@host [IDENTIFIED BY 'password']
示例:
mysql> CREATE USER barlow@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.34 sec)
基本语法:
GRANT priv_type[(column_list)] ON [object_type] priv_level TO username@'%' [IDENTIFIED BY [PASSWORD] 'password'];
priv_type:ALL或上面的权限表格中的权限。
priv_level: *| *.*| db_name.*| db_name.tbl_name| tbl_name| db_name.routine_name
示例:
mysql> GRANT CREATE,INSERT,SELECT,UPDATE,DELETE ON testdb.* TO barlow@'%';
Query OK, 0 rows affected (0.21 sec)mysql> SHOW GRANTS FOR 'barlow'@'%';
+-------------------------------------------------------------------------------------------------------+
| Grants for barlow@% |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'barlow'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `testdb`.* TO 'barlow'@'%' |
+-------------------------------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
从上图能够看出,barlow@'%'用户已经没有了INSERT权限。
基本语法:
SET PASSWORD FOR 'user_name'@'host' = PASSWORD('new_password');
示例:
mysql> SET PASSWORD FOR 'barlow'@'%' = PASSWORD('987654');
Query OK, 0 rows affected (0.07 sec)
说明:管理员能够修改任何用户的密码,但普通用户只能修改本身的密码。
用户修改本身的密码语法(也可使用上述语法修改):
SET PASSWORD = PASSWORD('new_password');
方法二:直接update mysql.user表的password字段实现修改密码:
基本语法:
mysql> use mysql
mysql> UPDATE user SET Password = PASSWORD('new_password') WHERE User='user_name' AND Host='host';mysql> FLUSH PRIVILEGES;
示例:
mysql> use mysql
Database changedmysql> UPDATE user SET Password = PASSWORD('redhat') WHERE User='barlow' AND Host='%';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.08 sec)
若是root用户的密码忘记后,能够经过以下方法找回:
中止mysqld服务
启动mysqld_safe时传递两个参数:--skip-grant-tables --skip-networking
启动mysqld服务
使用直接update mysql.user表的password字段实现修改root用户密码
示例:
中止服务,修改mysqld_safe传递参数:
[root@localhost ~]# service mysqld stop
Shutting down MySQL........ SUCCESS![root@localhost ~]# vim /etc/init.d/mysqld
<a href="http://www.toxingwang.com/wp-content/uploads/2013/09/mysql-root1.jpg" class="cboxElement" rel="example4" 1468"="" style="text-decoration: none; color: rgb(1, 150, 227);">
登陆mysql修改密码:
[root@localhost ~]# service mysqld start
Starting MySQL....................... SUCCESS![root@localhost ~]# mysql ##注意,这里已经不须要登陆密码了
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respectiveowners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> UPDATE mysql.user SET Password = PASSWORD('123456') WHERE User='root';
Query OK, 0 rows affected (0.00 sec)Rows matched: 3 Changed: 0 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.03 sec)
恢复mysqld_safe传递参数:
[root@localhost ~]# service mysqld stop
Shutting down MySQL........ SUCCESS![root@localhost ~]# vim /etc/init.d/mysqld
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
[root@localhost ~]# service mysqld start
Starting MySQL...... SUCCESS![root@localhost ~]# mysql ##再次登陆,提示须要密码
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@localhost ~]# mysql -u root –p ##使用新密码正常登陆
Enter password:Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.13 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respectiveowners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
更多mysql用户和权限管理的内容,可参考官方文档:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#privilege-changes