使用某一个RDBMS产品进行SQL语言的练习
二、实验内容
1、学习并安装RDBMS;
2、了解具体产品的功能和特点;
3、了解并使用产品的DEMO数据库;
4、使用SQL语句建立第三章的学生—课程数据库:
学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
学生选课表:SC(Sno,Cno,Grade)
使用SQL语言尽可能多地向3个表中插入数据;
5、完成第三章书上的例题;
三、实验问题解答:
1. 安装RDBMS的步骤;
(3). 安装前检查
安装前先看看是否已安装了MYSQL
可以用RPM来安装MYSQL,
# rpm –ivh MySQL-4.1.18-0.src.rpm
还可以用源码编译安装程序来安装, 源码包编译这样相对比较稳定,比你装rpm更适合自己的机器设置,而且它们一般会装到 /usr/local 目录,这样你以后如果换硬盘重装系统,也可以把以前 /usr/local 下的程序原封不动拷贝过去用。
(4). 下载安装包
用WGET命令从网上下载MYSQL源码安装包.
(5). 解压安装包
用FILE命令再确认一下文件,用TAR命令来解压源码包
-f 使用档案文件或设备
-x 从档案文件中释放文件
-v 详细报告tar处理的文件信息
-z 用gzip来压缩,配合X使用
没有错误提示,就表示解压正常
(6). 设置安装参数
用./CONFIGURE 来设置安装参数
--prefix=/usr/local/mysql 把mysql指定安装到/usr/local/mysql目录中
--localstatedir=/usr/local/mysql/db mysql数据库存放的目录
--with-unix-socket-path=/tmp/mysql.sock 这个是指定mysql服务器启动后,联机套接字文件所处的位置和文件名
--with-mysqld-user=mysql 这个是让mysql服务器也能让系统中mysql用户才能启动mysql服务器
--with-charset=gb2312 指定mysql默认语言为gb2312,也就是中文
--with-extra-charsets=all 对多语言的支持
(7). 编译源码
没有错误提示,设置好安装参数,就要开始编译了
用命令make(用于编译) 与make install(用于安装),也可以分开二行来打,
用&&的意思是说,当make命令执行成功后则执行make install。
编译过程要等一段时间,
又没有错误提示,这样就编译完成,可以用
# strip /usr/local/mysql/libexec/mysqld
整理最终的执行文件,缩小mysqld文件的体积。
(8). 生成初始数据库
(9). 配置数据库
添加配置文件:copy配置文件,有large,medium,small三个环境下的,根据机器性能选择,如果负荷比较大,可修改里面的一些变量的内存使用值
(10). 设置权限
处理好一些相关的所有权问题
(11). 设置为服务
# cp support-files/mysql.server /etc/init.d/mysqld1 复制启动的mysqld文件
# chmod 700 /etc/init.d/mysqld1 设置为X
# chkconfig --add mysqld1 把MYSQL加入启动列表
# chkconfig --level 35 mysqld1 on 设置INT 3和5是激活MYSQL的
# service mysqld1 start 启动MYSQL
(12). 服务是否正常
netstat -antp |grep 3306 查看端口,,在my.conf中设置
ps -aux |grep mysql 查看进程
mysqladmin ping 用mysql管理操作程序PING自己也正常
(13). 进入数据库
进入MYSQL,原来是没有密码的,但我这个数据库早用过的,且设置了密码
-U 用户
-P 密码
为了更方便的管理MYSQL可以下载一个phpmyadmin,就可以以WEB方式进行管理
把phpmyadmin放入apache的虚拟目录中,设置好相应的数据库帐号就行
2. 该RDBMS简介(功能、数据库保护和特点等);
(1) 简介
MySQL (发音为 "My Ess Que Ell")它由MySQL公司开发和支持。他是一个多人使用、多执行绪的 SQL 资料库 Server。MySQL 主要的目标在快速、稳定和容易使用。
(2) MySQL一些重要的特征
(14).使用核心线程的完全多线程。这意味着它能很容易地利用多CPU(如果有)。
(15).C 、C++、 Eiffel 、 Java、 Perl、 PHP、Python、和 TCL API。见20 MySQL 客户工具和 API。
(16).可运行在不同的平台上,见4.2 MySQL支持的操作系统。
(17).多种列类型:1、 2、 3、4、和 8 字节长度的有符号/无符号整数、FLOAT、DOUBLE、char、VARchar、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、SET和ENUM类型。 见7.3 列类型。
(18).利用一个优化的一遍扫描多重联结(one-sweep multi-join)非常快速地进行联结(join)。
(19).在查询的select和where部分支持全部运算符和函数,例如:
mysql> select CONCAT(first_name, " ", last_name) FROM tbl_name where income/dependents > 10000 AND age > 30;
(20).通过一个高度优化的类库实现SQL函数库并且像他们能达到的一样快速,通常在查询初始化后不应该有任何内存分配。
(21).全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函数( COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、 MAX()和MIN() )。
(22).支持ANSI SQL的LEFT OUTER JOIN和ODBC语法。
(23).你可以在同一查询中混用来自不同数据库的表。
(24).一个非常灵活且安全的权限和口令系统,并且它允许基于主机的认证。口令是安全的,因为当与一个服务器连接时,所有的口令传送被加密。
(25).ODBC for Windiws 95。所有的 ODBC 2 . 5 函数和其他许多函数。例如,你可以用Access连接你的 MySQL服务器。见16 MySQL ODBC 支持。
(26).具备索引压缩的快速B树磁盘表。
(27).每个表允许有16个索引。每个索引可以由1~16个列或列的一部分组成。最大索引长度是 256 个字节(在编译MySQL时,它可以改变)。一个索引可以使用一个char或VARchar字段的前缀。
(28).定长和变长记录。
(29).用作临时表的内存散列表。
(30).大数据库处理。我们正在对某些包含 50,000,000 个记录的数据库使用MySQL。
(31).所有列都有缺省值,你可以用INSERT插入一个表列的子集,那些没用明确给定值的列设置为他们的缺省值。
(32).为了可移植性使用 GNU Automake , Autoconf 和libtool。
(33).用C和C++编写,并用大量不同的编译器测试。
(34).一个非常快速的基于线程的内存分配系统。
(35).没有内存漏洞。用一个商用内存漏洞监测程序测试过(purify)。
(36).包括myisamchk,一个检查、优化和修复数据库表的快速实用程序,详见13 维护 MySQL安装。
(37).全面支持ISO-8859-1 Latin1 字符集。例如,斯堪的纳维亚的字符 @ringaccent{a}, @"a and @"o 在表和列名字被允许。
(38).所有数据以 ISO-8859-1 Latin1 格式保存。所有正常的字符串比较是忽略大小写的。
(39).根据 ISO-8859-1 Latin1 字符集进行排序(目前瑞典语的方式)。通过在源代码中增加排序顺序数组可以改变它。为了理解一个更高级的排序例子,看一看捷克语的排序代码。MySQL支持可在编译时指定的很多不同的字符集。
(40).表和列的别名符合 SQL92 标准。
(41).delete、INSERT、replace和update 返回有多少行被改变(受影响)。
(42).函数名不会与表或列名冲突。例如ABS是一个有效的列名字。对函数调用的唯一限制是函数名与随后的“(”不能有空格。详见7.31 MySQL对保留字很挑剔吗?。
(43).所有MySQL程序可以用选项--help或-?获得联机帮助。
(44).服务器能为客户提供多种语言的出错消息,详见9.1 MySQL支持哪些语言?。
(45).客户端使用TCP/IP 连接或Unix套接字(socket)或NT下的命名管道连接MySQL。
(46).MySQL特有的SHOW命令可用来检索数据库、表和索引的信息,EXPLAIN命令可用来确定优化器如何解决一个查询。
(3). 数据库保护
不对数据库进行保护的常见原因是由于这一工作“麻烦”而“复杂”。这确实是事实,但如果你应用MySQL,就可以使用一些方便的功能来显著减少面临的风险。下面列出了六项功能:
A. 删除授权表中的通配符
MySQL访问控制系统通过一系列所谓的授权表运行,从而对数据库、表格或栏目级别的用户访问权利进行定义。但这些表格允许管理员为一名用户设定一揽子许可,或一组应用通配符的表格。这样做会有潜在的危险,因为黑客可能会利用一个受限的账户来访问系统的其他部分。由于这一原因,在设置用户特权时要谨慎,始终保证用户只能访问他们所需的内容。在给个别用户设定超级特权时要尤其小心,因为这种级别允许普通用户修改服务器的基本配置,并访问整个数据库。
建议:对每个用户账户应用显示特权命令,以审查授权表,了解应用通配符许可是否恰当。
B. 要求使用安全密码
用户账号的安全与用来保护它们的密码密切相关。因此,在安装MySQL时第一件事就应该设置MySQL根账号的密码(默认为空)。修复这一漏洞后,接下来就应要求每个用户账号使用一个密码,且不要使用生日、用户名或字典中的单词这些容易识别的启发式密码。
建议:应用MySQL-安全-授权选项避免使用旧的,不大安全的MySQL密码格式。
C. 检查配置文件许可
一般来说,要使服务器连接更为快速方便,单个用户和服务器管理员必须把他们的用户账号密码存储在单用户MySQL选项文件中。但是,这种密码是以纯文本形式存储在文件中的,很容易就可以查阅。因此,必须保证这样的单用户配置文件不被系统中的其他用户查阅,且将它存储在非公共的位置。理想情况下,你希望单用户配置文件保存在用户的根目录,许可为0600.
D. 加密客户与服务器之间数据传送
MySQL(及其它)客户与服务器构架的一个重要问题就是通过网络传送数据时的安全问题。如果客户与服务器间的交互以纯文本形式发生,黑客就可能“嗅出” 被传送的数据包,从而获得机密信息。你可以通过激活MySQL配置中的SSL,或应用一个OpenSSH这样的安全应用来为传送的数据建立一个安全的加密 “通道”,以关闭这一漏洞。以这种形式加密客户与服务器连接可使未授权用户极难查阅往来的数据。
E. 禁止远程访问
如果用户不需要远程访问服务器,你可以迫使所有MySQL连接通过UNIX插槽文件来完成,从而大大减少网络受攻击的风险。这一过程可通过跳过网络选项启动服务器来完成。这样可以阻止TCP/IP网络连接到MySQL上,保证没有用户可以远程连接系统。
建议:可以在MySQL服务器配置中添加捆绑地址127.0.0.1指令来增强这一功能,迫使MySQL捆绑当地机器的IP地址来保证只有同一系统中的用户可以连接到MySQL.
F. 积极监控MySQL访问记录
MySQL带有许多不同的日志文件,它们记录客户连接,查询和服务器错误。其中,最重要的是一般查询日志,它用时间标签记录每名客户的连接和中断时间,并记录客户执行的每个查询。如果你怀疑发生了不寻常的行为,如网络入侵,那么监控这个日志以了解行为的来源是个好方法。
3. 使用SQL语句建立第三章的学生—课程数据库
(1) 建立数据库
mysql> ccreate database edu; 建立新的数据库
mysql> show databases; 查看已存在的数据库
mysql> use edu; 选择数据库
mysql> create table Course (Cno integer(5), Cname varchar(10), Cpno integer(5),Ceredit integer(5));
建立新的表
mysql> create table SC (Sno integer(10), Cno integer(5), Grade integer(5));
mysql> create table Student (Sno integer(10), Sname varchar(10), Ssex integer(2),Sage integer(3),Sdept varchar(5));
(2) 建立表
再查看我们刚才建立的表的结构,
mysql> show columns from 表名;
或 mysql> desc 表名;
(3) 插入数据
mysql> INSERT INTO `SC` ( `Sno` , `Cno` , `Grade` ) VALUES ('95001', '1', '92');
查看SC表里的内容
mysql> select * from SC;
查看Course表里的内容
mysql> select * from Course;
查看Student表里的内容
mysql> select * from Student;
4. 实验中的问题及解决办法。
(1) 卸载 MYSQL
如果是RPM包安装的,可以这样卸载:
#rmp -e RPM_FILE_NAME
如果出现dependency的问题,可用
#rpm -e --force --nodeps RPM_FILE_NAME来强行删除。
如果是原代码编译安装的,直接删除安装目录就可以
(2) 设置密码
>set password for root@localhost=password('test');
(3) 显示中文
在建立数据时,可以设定语言,这样就不会乱码了
mysql> set names 'gbk';
mysql> CREATE DATABASE `edu` DEFAULT charACTER SET gbk COLLATE gbk_chinese_ci;