2009-03-28

MySQL基本使用

  虽然没爱,但是会用到的,所以呢,还是学习一下。这里已经表示你用mysql命令登录进了数据库的情况了。

命令
mysql> SELECT VERSION(), CURRENT_DATE;
这个基本可以说明问题了,mysql的命令都是以;结尾的,当然注意是半角的,而且不区分大小写。
而显示都是以这种形式出现的:

+---------------+--------------+
version() current_date
+---------------+--------------+
5.1.29-rc-log 2009-03-28
+---------------+--------------+
1 row in set (0.00 sec)


这里举例:

mysql> show databases;
+--------------------+
Database
+--------------------+
information_schema
joinus
mysql
subversiondatabase
test
+--------------------+
5 rows in set (0.00 sec)

这个命令显示了你的机器上有哪些数据库

mysql> use test;
Database changed

这个命令选择了test这个数据库

显然,作为一个提供数据存储服务的程序,我们需要分配用户和对应的数据库,这里我们新建一个用户以允许用户登录到mysql,并且控制它自己的数据库。
所以这个命令等同于新建用户的:

GRANT priv_type ON db_name.table_name TO user_name IDENTIFIED BY ‘password’[WITH GRANT OPTION]





其中,大写的单词都是语法中的关键字,小写的部分是需要用户来完成,其中:

priv_type 表示权限类型,比如 select 、 insert 、 create 等,详细的权限名称可以参考 user 表中 field 字段名称,去掉后缀“ _priv ”后就是实际的权限名称。如果要授予全部的权限,可以用“ all privileges ”来代替。

  • db_name 表示数据库名称,‘ * ’表示所有数据库
  • table_name 表示表的名称,‘ * ’表示所有表。
  • user_name 表示要创建的用户名称,注意这个名称由用户名和 host 两部分组成。
  • password 表示用户的密码,用明文表示,创建的时候会自动进行加密。
  • WITH GRANT OPTION 表示新用户可以将自己的权限授予其他用户,如果不写,默认不可以。

这里需要注意的是,如果单独赋予管理权限,则“ ON db_name.table_name ”字句中的“ db_name.table_name ”需要写为“ *.*” ,因为管理权限是和某个具体的数据库无关的。

下面,我们创建三个用户,一个是超级用户,授予它对所有数据库的所有表的所有权限;另外一个是普通用户,授予它对数据库 test1 中表 t1 的 select 、 update 、 insert 、 delete 权限,这种情况适用于大多数情况,因为我们出于对数据的安全性考虑,一般不会给用户设置为超级权限;第三个是需要执行文件操作的用户,需要授予 file 权限。

创建超级用户:

mysql> grant all privileges on *.* to user1@localhost identified by '123';

Query OK, 0 rows affected (0.04 sec)

创建普通用户:

mysql> grant select,update,insert,delete on test1.t1 to user2@localhost identified by '123';

Query OK, 0 rows affected (0.01 sec)

创建具有文件权限的用户:

mysql> grant file on *.* to user3@localhost identified by '123';

Query OK, 0 rows affected (0.01 sec)

上例中的用户 host 都设置为 localhost ,只允许本地连接,这个值被记录到 user 表中的 host 字段中, host 可以是以下设置:

A. 主机名或 IP 号,或“ localhost ”指出本地主机。

B. 使用通配符字符 “%” 和 “_” 。其中,“ % ”匹配任何主机名, 使 用 “_” 匹配任何单个字符。空 Host 值等价于“ % ”。它的含义与 LIKE 操作符的模式匹配操作相同。例如,“ % ”的 Host 值与所有主机名匹配,而“ %.mysql.com ”匹配 mysql.com 域的所有主机。



这里我新建了一个用户:

grant all privileges on test.* to testuser@localhost identified by '123456';

当我使用这个用户登上去并使用

mysql> show databases;
+--------------------+
Database
+--------------------+
information_schema
test
+--------------------+
2 rows in set (0.00 sec)

所以我只能看到我有权限的数据库。
不过这里有个有趣的地方是,只要管理员给用户指定一个数据库的权限,如果这个数据库不存在的话,用户登录上来后可以自己创建。
管理员分配了ireport数据库的权限:
grant all on ireport.* to 'ulysess'@'localhost'
比如我用testuser登录后
mysql> create database ireport;
Query OK, 1 row affected (0.00 sec)


关于用户权限,在mysql数据库中,是有一个叫做权限表的东西的,这个可以读这篇引用:



权限系统认证过程实际是通过 MySQL 内部的 6 个权限表来实现的,分别是: user 、 db 、 host 、 tables_priv 、 columns_priv 和 procs_priv ,它们都位于 MySQL 安装后的“ mysql ”数据库中,这些权限表的作用如下:

A. user 控制 “ 用户名 ” ( user )可以从哪一台 “ 主机名 ”(host) 访问 mysql ,该表包括全局权限的控制。例 如,如果 user 表授予用户 DELETE 权限, 那么此用户可以在服务器主机上删除任何数据库中的记录!换句话说, user 表权限是超级用户权限。只把 user 表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,应该把在 user 表中的权限设成 'N' 并且仅在特定数据库的基础上授权。

B. Db 规定哪个用户可以访问哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。

C. Host 表与 db 表结合使用在一个较好层次上控制特定主机对数据库的访问权限。

D. tables_priv 和 columns_priv 表类似于 db 表,但是权限更加精细:它们在表和列级应用而非在数据库级。授予表级别的权限适用于表和所有它的列。授予列级别的权限只适用于专用列。

E. procs_priv 规定谁可以执行哪个存储过程。

其中, user 表最为重要,它控制着整个 MySQL 的全局权限。 user 中的列主要分为四个部分:用户列、权限列、安全列、资源控制列,其中,我们用的最多的是用户列和权限列,权限列又分为普通权限和管理权限。普通权限主要用 于数据表的操作,比如 select_priv 、 create_priv 等;而管理权限主要用来对数据库进行管理的操作,比如 process_priv 、 super_priv 等等,普通权限在其他权限表中都可能有记录,而管理权限只在 user 表中有记录。

当用户与 MySQL 进行权限认证时,权限表的存取过程如下:

A. 先从 user 表中的 host 、 user 和 password 三个字段中判断连接的 IP 、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。

B. 如果通过身份验证,则通过 user 、 db 、 host 、 tables_priv 、 columns_priv 、 procs_priv 这几个权限表得到对应的数据库权限并进行授权。




恩,适时锻炼,打完收工,暂时只需要用到这么多,先这样吧。。。

------------------------------------------------------------------------------------
更新:
  我等必然常用到的 Mysql的一个常用功能就是修改用户和密码,那么看看三种修改用户密码的方法:
  • 登录mysql后
    use mysql;
    UPDATE user SET password=PASSWORD("NEW_PASSWORD") WHERE user='USER_TO_BE_CHANGE';

      mysql> FLUSH PRIVILEGES;
  • 登录mysql后
    SET PASSWORD FOR hunte=PASSWORD('NEW_PASSWORD');
  • 在系统的命令行下
    mysqladmin -u root "old password" "new password"


----------------------------------------------------------------------------------
再次更新:
删除用户:
DELETE FROM user WHERE User="testuser" and Host="localhost";
删除数据库:
drop database testdatabase;

没有评论: