您好,欢迎访问一九零五行业门户网

mysql数据库用户和权限管理记录_MySQL

bitscn.com
一、mysql用户的基本说明:
1.1 用户的基本结构
mysql的用户:用户名@主机
■用户名:16个字符以内
■主机:可以是主机名、ip地址、网络地址等
主机名:www.111cn.net,localhost
ip:192.168.0.1
网络地址:172.16.0.0/255.255.0.0
主机还支持通配符:%和_
172.16.%.%
%.111cn.net
注意:对于包含了主机名的用户,mysql会尝试反解析主机名,此时可能会造成连接非常慢,如果反解析的ip地址与连接点的地址不同,还可能出现无法连接的情况。因此,为了加快连接并避免出现解析问题,可以在my.cnf文件中加入如下一行加速连接:
--skip-name-resolve
mysql用户的密码有mysql内部的password()函数管理。
1.2 授权表:
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数据库服务启动后,这六张表会被直接加载到内存,而今后所有的认证都直接从内存中这六张表获取,而不是去读取磁盘。
1.3 各授权表的说明:
■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提供的权限
账户权限信息被存储在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告诉服务器再装载授权表,否则你的更改将不会生效,除非你重启服务器。
如果你直接更改了授权表但忘记重载,重启服务器后你的更改方生效。这样可能让你迷惑为什么你的更改没有什么变化!
四、mysql用户账户管理
4.1 创建用户与授权:
4.1.1 创建用户:create user
基本语法:
create user username@host [identified by 'password']
示例:
mysql> create user barlow@'%' identified by '123456';
query ok, 0 rows affected (0.34 sec)
4.2.2 创建用户并授权:grant
基本语法:
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)
通过上图实例可以看到,用户只拥有明确授权的权限。
4.3 用户管理
4.3.1 删除用户:
基本语法:
drop user 'username'@'host'
4.3.2 重命名用户:
基本语法:
rename user old_name to new_name
4.3.3 收回已授予的用户权限
基本语法:
revoke  priv_type [(column_list)]   [, priv_type [(column_list)]] ... on [object_type] priv_level  from user [, user] ...
示例:
mysql> mysql> revoke insert on testdb.* from  barlow@'%';
query ok, 0 rows affected (0.01 sec)
从上图可以看出,barlow@'%'用户已经没有了insert权限。                       
4.3.4 修改用户密码:
方法一:set password
基本语法:
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 changed
mysql> 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)
4.4 找回root用户的密码:
如果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
登录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 respective
owners.
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 respective
owners.
type 'help;' or 'h' for help. type 'c' to clear the current input statement.
mysql>
更多详细内容请查看:http://www.111cn.net/database/mysql/56298.htm
bitscn.com
其它类似信息

推荐信息