流浪者家园


逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:23  资料  个人空间  短消息  加为好友  QQ

第十九章 数据库系统
现在许多的商业应用、网页程序都必须使用数据库来存放数据。例如,网站上的留言版、讨论区、购物网站等,全部都是使用数据库来存放重要的数据。本章中,我们将介绍二种常见的数据库:MySQL 及 PostgreSQL。
本章包含了数据库的安装、设定、语法、及各种操作方式的介绍,读完本章后,您将可以了解下列主题:
如何安装、设定 MySQL。
如何安装、设定 PostgreSQL。
如何使用 MySQL 的图形化管理工具。
如何使用 PostgreSQL 的图形化管理工具。
基本的数据库语法介绍。
如何备份、回存数据库。
这些信息将有助您建立一个功能强大的网站,并对于日后安装数据库相关应用时更加得心应手。
19.1 概论
电子商务的兴起让数据库的应用更受到大家的瞩目。在信息科学的应用上,数据库可以说是最历久弥坚的领域。近来,数据产生和数据收集方面的技术有非常快速的进展。许多商业产品广泛使用了条形码、许多企业和政府的交易皆已计算机化,这使得计算机成为数据收集的主要工具。同时,数以百万计的数据库正被使用在企业管理、政府管理、科学和工程的数据管理和许多其它的应用上。
我们可以安装一套数据库系统,并经由一个接口自行开发程序来使用它。数据库的好处有很多,相信对数据库稍有涉入的人都知道,例如数据存取快速、不重复、权限控制、数据独立性等等。以写一个简单的留言版程序而言,传统上使用档案做为留言的记录,若要删除一笔数据,必须对整个档案一行一行的比对;但数据库只需指定该留言的编号即可。不过,如果把数据库系统局限于留言版也太大才小用了。
我们将介绍在 FreeBSD 上使用数据库,因为目前网页数据库使用情形十分风行,尤其在网页开发上使用 MySQL 或 PostgreSQL 数据库加 PHP 更是绝配。目前 Open Source 的数据库中,最常用、最有名的就是 PostgreSQL 及 MySQL,因此,本章将先介绍这二个数据库系统的安装及使用。
至于 PostgreSQL 及 MySQL 这二个数据库系统有什么差别?到底应该选哪一个呢?在 MySQL 3.x 以前,如果您问我这个问题,我一定说 PostgreSQL,因为 MySQL 3.x 不支援 transaction。所谓的 transaction 就是将一连串的 SQL 指令做为一个执行单位,当其中一个指令失败,在同一个 transaction 所执行过的命令都取消。Transaction 对于程序开发的应用十分重要,例如,当我们要新增处理一笔订单时,我们会先将订单输入数据库中,再将金额输入应收帐款中。如果我们在新增应收帐款时出现错误,而订单却已输入数据库,是不正确的做法。有了支援 transaction 的数据库,我们可以将订单的输入和应收帐款的输入做为一个执行单位,如果其中一个执行失败,则数据库会自动取消先前先做的动作,如此一来便可以确保数据的正确性。由于 transaction 十分重要,因此在做为商业上的应用时,我会选择 PostgreSQL。
不过 MySQL 4.x 后已经加入 transaction 的支持,只是功能还是没有 PostgreSQL 那么完整。那么除此之外,这二个数据库的差别是什么?PostgreSQL 是一个功能强大的数据库系统,它的威力不下于商业用的数据库。而 MySQL 的特性是对于简单 SQL 指令处理快速,大部份的日常简单操作,MySQL 的速度会比 PostgreSQL 快一点。以下我们列出它们在功能上的主要差异:
功能
MySQL 3.x
MySQL 4.1.x
PostgreSQL
版权宣告
GPL
GPL
BSD
Sub-Selects
No
Yes
Yes
Views
No
No
Yes
Foreign Key relationships
No
Yes
Yes
Foreign Key constraints
No
No
Yes
Triggers
No
No
Yes
Indexing on non trivial types
No
No
Yes
Sequences
Some
Some
Yes
Transactions
No
Yes
Yes
OO (Inheritance of tables)
No
No
Yes
Async Notifications
No
No
Yes
Constraints
No
No
Yes
SELECT INTO
No
Yes
Yes
Stored Procedures
No
No
Yes
Row level locking
Yes
Yes
Yes
Table level locking
Yes
Yes
Yes
Multi version Concurrency Control
No
No
Yes
我们可以看到 PostgreSQL 功能真的强大很多,如果您必须设计功能强大又复杂的系统,PostgreSQL 是不二之选。而 MySQL 4.x 以后的重要功能都很齐全,速度也很快,比较适合简单的网页应用,所以目前大部份网页应用软件使用 MySQL 比较多。不过呢,笔者认为 PostgreSQL 及 MySQL 都使用 Transaction 时,二者的效能表现差不多,就网页应用而言,我的首选还是 PostgreSQL。
19.2 安装 MySQL
MySQL 和 FreeBSD 一样也有多种版本同时开发,例如 3.x、4.0.x、4.1.x、5.x 等,其中 4.1.x 是目前较稳定的版本。
您可以自行到
http://www.mysql.com
取得最新版的 MySQL Source Package 来安装,不过安装上比较麻烦。所以我们使用 ports 来安装 MySQL:# cd /usr/ports/databases/mysql41-server
# make WITH_CHARSET=big5 WITH_XCHARSET=all install clean
我们指定 MySQL 预设的字集为 Big5,并另外支持所有的字集。接下来请修改 /etc/rc.conf 并加入下列这一行,以让开机时启动 MySQL:
mysql_enable="yes"
接着您就可以使用下列指令启动 MySQL 了:# /usr/local/etc/rc.d/mysql-server.sh start
启动 MySQL 后,我们就可以使用下列指令进入 MySQL 交互式命令列了:# /usr/local/bin/mysql mysql
若安装成功,你将看到以下画面:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
MySQL 刚安装完成时,并未设定 root 的密码,因此我们接着要设定 root 的密码并实时更新设定:
mysql> UPDATE user SET password=password('你的密码') where user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2  Changed: 0  Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
以上指令及 MySQL 更详细的设定说明,我们会在下一小节中加以说明。最后请以 exit; 来离开 MySQL。
如果您有其它使用者要加入也可以加入,最好不要让使有人都有对所有数据库有全部的权限。使用命令列的方式新增使用者有点麻烦,我们等一下再使用其它图形化接口进入新增使用者。
建议您以后使用 MySQL 的图形化接口管理工具「MySQL Administrator」及「MySQL Query Browser」来管理 MySQL,我们会再后续章节中说明如何使用这些管理工具。
19.3 SQL 语法介绍
在使用数据库之前,我们必须先了解一些简单而基本的数据库理论。如果您对于数据库 SQL 语法已经很熟悉了,您可以跳过这一个小节。
基本上数据库的结构有下列几个特点:
一个数据库系统中可以有多个独立数据库。
数据库是由许多数据表 (table) 所组成。
数据表中包含许多记录 (record)。
每一笔记录中的字段数目都一样。
每一个字段储存一种分类过的数据。
例如我们有一个数据库名称是NCU,其中有多个数据表,其中一个资料表名为 student 内容如下:
STUDENT_ID
LAST_NAME
FIRST_NAME
DEPARTMENT
1
Chang
Jack
MIS
2
Wang
Alex
BA
在数据表中有许多字段 (column),每个字段都有一个名称,也就是第一列 (row) 中的 STUDENT_ID、LAST_NAME、FIRST_NAME、DEPARTMENT。接着我们将数据存入,每一笔记录我们都可以看成一列 (row),每一个记录都有一个「唯一的 ID (编号)」。唯一的 ID 十分重要,它是我们在存取数据库时的依据。在新增资料时,以 MySQL 而言,我们可以自行指定 ID 或是由系统自行取得。
另一个观念是关系型数据库。关系型数据库的意义就是每一个资料表间可以存在关系,例如我们在 NCU 的数据库中有另一个数据表名为 score,内容如下:
SCORE_ID
STUDENT_ID
CHINESE
ENGLISH
1
2
99
90
2
1
89
87
score 数据表中存放学生的成绩,我们不需在该数据表中存放学生的信息,只要在该数据表中存放一个字段名为 STUDENT_ID,经由这一个唯一的 ID 我们可以去 student 的数据表中找到学生的数据。
有了这些观念就足以让我们开发出许多数据库的程序了。
SQL (Structured Query Language) 语法十分简单,它是关系型数据库的标准语言,虽然在某些不同数据库系统上有些许的差异,但基本上都遵循一定的标准。
我们可以在命令列下进入 MySQL 来练习 SQL 的语法:# /usr/local/bin/mysql -u root -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 202 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
下完指令后会要求输入密码,请输入您之前设定的密码。登入后你就可以直接在出现的命令列 mysql> 之后输入 SQL 的语法了。
关于 MySQL 详细的语法,你可以参考 MySQL 中文参考手册,该文件可以在
http://www.freebsd.org.hk/html/mysqldoc/
中找到。该文件中对于 MySQL 每个细节都有详细的描述,例如字段的名称限制、规则等,我们不会在这里提及。我们只介绍几个简单而常用的指令。 我们以建立一个学生数据表来说明这些语法。
CREATE
ALTER
DROP
INSERT
SELECT
UPDATE
DELETE
制成 script 档
19.3.1 CREATE
建立数据库:CREATE DATABASE db_name
建立数据表:CREATE TABLE tbl_name [(create_definition,...)] [options]
我们先建立一个名为 NCU 的数据库:
mysql> CREATE DATABASE NCU;
请注意,每一个指令皆以 ";" 为结尾,如果没有 ";" 就算换行也是代表同一条指令的延续。
我们可以使用下列指令 show 来列出系统中已存在的数据库有哪些:
mysql> show databases;
+-----------+
| Database  |
+-----------+
| mysql     |
| test      |
| NCU       |
+-----------+
3 rows in set (0.01 sec)
接着用 USE 这个指令来使用 NCU 数据库:
mysql> USE NCU;
接着建立一个放置学生数据的数据表,名为 STUDENT,内容为编号(STUDENT_ID)、姓名 (NAME)、科系 (DEPARTMENT):
mysql> CREATE TABLE STUDENT (
STUDENT_ID int(10) DEFAULT '0' NOT NULL AUTO_INCREMENT,
NAME varchar(50),
DEPARTMENT varchar(10),
PRIMARY KEY (STUDENT_ID) );
在上面的指令中,我们定义学生编号为十位数的整数(int),内定值是 0,不可以是空的 (NOT NULL),数字自动增加 (AUTO_INCREMENT)。姓名是最长为五十个字节的字符串(VARCHAR),科系为最长十个字节的字符串。最后定义主要的 id 是 STUDENT_ID,也就是该数据表中的唯一 ID。
我们可以看到在建立数据表时,我们会顺便划分各个字段所要储存的数据长度及其格式,常用的字段格式请参考 MySQL 中文参考手册。
如果要看现在使用的数据库中有哪些数据表,一样可以使用指令 show 来查看:
mysql> show tables;
+--------------------+
| Tables_in_NCU      |
+--------------------+
| STUDENT            |
+--------------------+
4 rows in set (0.00 sec)
19.3.2 ALTER
建立了数据表后,如果发现数据表的字段不符需求,我们不必将数据表删除重建,可以使用 ALTER 指令来修改数据表的格式。另如我们要新增一个姓别字段,内容只可以是 "男" 或 "女",我们可以使用下面的指令:
mysql> ALTER TABLE STUDENT
ADD SEX ENUM('男','女') DEFAULT '女';
我们增加了一个字段 SEX,使用 ENUM 的格式,指定内容只能为 "男" 或 "女",且默认值是 "女"。
如果我们要将 SEX 字段改名为 DISTINCTION,并将格式改为 VARCHAR:
mysql> ALTER TABLE STUDENT
CHANGE SEX DISTINCTION VARCHAR(4);
如果我们只是要将 SEX 字段格式改为 VARCHAR,但不更改名称,只要将上面的指令中 DISTINCTION 改成 SEX 即可。
如果我们要删除整个 DISTINCTION 字段及该字段的数据:
mysql> ALTER TABLE STUDENT DROP DISTINCTION;
19.3.3 DROP
删除数据库:DROP DATABASE db_name
删除数据表:DROP TABLE table_bame
我们可以使用 DROP 指令来删除不要的资料。例如我们要删除 STUDENT 这一个资料表的话,可以使用下列指令:
mysql> DROP TABLE STUDENT;
19.3.4 INSERT
使用 INSERT 指令可以让我们一笔一笔增加数据。
STUDENT_ID
NAME
DEPARTMENT
1
Jack
MIS
假设我们的数据表中的字段如上表,我们要新增一笔数据,姓名是 JACK、部门是 MIS:
mysql> INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('JACK', 'MIS');
由于我们在指定 STUDENT_ID 的格式时,加了参数 AUTO_INCREMENT,所以我们不需指定值,mysql 会自动帮我们依序指定。
19.3.5 SELECT
我们可以使用 SELECT 来看数据表中的数据,还可以依自己给定的条件来过滤数据。
假设我们要看 STUDENT 数据表中的所有数据的话,可以使用下列指令:
mysql> SELECT * FROM STUDENT;
假设我们只要看 NAME 及 DEPARTMENT 字段的话,我们可以使用下列指令:
mysql> SELECT NAME, DEPARTMENT FROM STUDENT;
假设我们只要看 NAME 字段,而且所属部门为 MIS 的人:
mysql> SELECT NAME FROM STUDENT
WHERE DEPARTMENT='MIS';
假设我们要看 MIS 部门中的人所有字段,而且输出结果时要依 STUDENT_ID 来排序:
mysql> SELECT * FROM STUDENT
WHERE DEPARTMENT='MIS'
ORDER BY STUDENT_ID DESC;
最后的 DESC 表示递减 (descending),由大到小排序。也可以使用 ASC 来表示递增 (ascending)。
除了这些之外,在 MySQL 中还有一些可以使用的函式,例如我们可以使用 count() 这个函式来计算出有多少笔记录:
mysql> SELECT count(*) FROM STUDENT WHERE DEPARTMENT='MIS';
+----------+
| count(*) |
+----------+
| 5        |
+----------+
1 row in set (0.00 sec)
上述结果表示部门为 MIS 的记录有五笔。
会了这些基本的 INSERT 指定就够我们做一般的应用了。
19.3.6 UPDATE
我们可以使用 UPDATE 指令来更新记录。例如我们要将所有记录的部门数据为 MIS 者都改成 CSIE,可以使用下列指令:
mysql> UPDATE STUDENT SET DEPARTMENT='CSIE'
WHERE DEPARTMENT='MIS';
19.3.7 DELETE
DELETE 指令可以让我们删除一笔或多笔数据。例如我们要删除 STUDENT 数据表中姓名为 JACK 的记录:
mysql> DELETE FROM STUDENT WHRE NAME='JACK';
如果我们要删除姓名为 JACK 且部门为 MIS 的数据:
mysql> DELETE FROM STUDENT
WHERE NAME='JACK' AND DEPARTMENT='MIS';
19.3.8 制成 script 档
我们可以将要执行的指定制成档案,以利管理。例如我们写了一个程序,需要先在数据库中建立一些数据,我们可以将对数据库的规划做成一个档案来管理。这样可以使用们要安装程序时更快速方便。
假设我们要建立一个数据库 NCU,该数据库中有一个数据表 STUDENT,数据表中要先建有以下记录:
STUDENT_ID
NAME
DEPARTMENT
1
Jack
MIS
2
Mary
CSIE
我们先建立一个文件名为 ncu.sql,内容如下:
CREATE DATABASE NCU;
USE NCU;
CREATE TABLE STUDENT (
STUDENT_ID int(10) DEFAULT '0' NOT NULL AUTO_INCREMENT,
NAME varchar(50),
DEPARTMENT varchar(10),
PRIMARY KEY (STUDENT_ID) );
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('JACK', 'MIS');
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('MARY', 'CSIE');
接着使用下列指令来快速建立数据库:# /usr/local/bin/mysql -u root -p
输入使用者 root 的密码后就完成建立了。
如果我们在数据库中早就有一个数据库名为 NCU,而我们要新增上述数据表及记录,我们只要将原本 ncu.sql 的内容最前面二行删除,改成下列内容:
CREATE TABLE STUDENT (
STUDENT_ID int(10) DEFAULT '0' NOT NULL AUTO_INCREMENT,
NAME varchar(50),
DEPARTMENT varchar(10),
PRIMARY KEY (STUDENT_ID) );
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('JACK', 'MIS');
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('MARY', 'CSIE');
之后再以下列指令来在 NCU 数据库中建立数据表:# /usr/local/bin/mysql -u root -p NCU
在网络上有许多 PHP 程序可以下载,下载后要安装数据库时,大多是以这种方式来使用。
19.4 MySQL 管理
19.4.1 维护密码安全
当我们要使用 MySQL 时,必须输入密码。输入密码的方式有很多种,第一种也是最不安全的一个方式是直接在命令列打指令时就输入:# /usr/local/bin/mysql -u root -pmypwd
上面这种方法会让别的使用者使用 ps 指令就可以看到你在执行的指定及密码。因此绝对不要使用这种方法,请改用下列方式输入:# /usr/local/myqsl/bin/mysql -u root -p
接着会要求你输入密码时再输入即可。
另一个方式是在你的家目录下建立一个存放密码的档案,文件名为 .my.cnf,当 mysql 需要使用密码时会自动去读取。该档的内容如下:
[client]
password=your_passowrd
接着要把 .my.cnf 的权限改成只有档案拥有者才可以读写:# chmod 600 ~/.my.cnf
19.4.2 备份数据库
数据库的数据要定时备份,这样才不会在失手时或系统有问题时产生困扰。在 MySQL 中提供一个备份程序 mysqldump。
假设我们有一个数据库名为 WWW,我们可以使用下列指令来备份整个数据库:# /usr/local/bin/mysqldump -u root -p WWW > www.sql
这样就可以把数据库的数据存在 www.sql 这个档案中了。日后要回复时只要使用下列指定就可以把资料存回:# /usr/local/bin/mysql -u root -p WWW
我们要注意的是备份出来的档案应该要放在不同的计算机中,而且要注意权限的控制。由于该文件是文字文件,任何人都可以读,所以要特别注意。
我们可以利用 crontab 这个指令来定时备份数据库。我们先建立一个 shell script 档,名为 backupsql.sh,内容如下:
/usr/local/bin/mysqldump -uroot WWW>/home/www.sql
chmod 600 /home/www.sql
接着将该档权限改成只有拥有人可以读、写、执行,其它人都不行:# chmod 700 backupsql.sh
为了要让执行 backupsql.sh 时可以不必输入密码,我们必须先将密码存在 ~/.my.cnf ,请先建立 ~/.my.cnf 档案内容如下:
[client]
password=your_passowrd
接着要把 .my.cnf 的权限改成只有档案拥有者才可以读写:# chmod 600 ~/.my.cnf
接着要让它能定时执行,命令列打 crontab -e 来进入文字编辑,加入下列内容:
#每天 3:05 备份网页数据库
5        3        *        *        *        /root/backupsql.sh
19.4.3 使用者管理
如果您要新增可以联机到 MySQL 的使用者,可以在 MySQL 交互式接口串使用 GRANT 指令来新增使用者。GRANT 在设定使用者权限时,如果使用者存在则更新其权限,如果不存在则新增该使用者。
用法:GRANT 权限 ON 数据库(或表) TO user@host IDENTIFIED BY '密码';
范例一:
新增一个本机的使用者 admin,并开放所有权限,密码为 mypwd:
mysql> GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY 'mypwd';
Query OK, 0 row affected (0.00 sec)
范例二:
新增一个来自 www.mydomain.com 的使用者 www,并设定只能对 www 数据库中所有数据表执行 SELECT, INSERT, UPDATE, DROP, CREATE, DELETE, INDEX,密码为 mypwd:
mysql> GRANT SELECT, INSERT, UPDATE, DROP, CREATE, DELETE,
INDEX ON www.* TO www@www.mydomain.com IDENTIFIED BY 'mypwd';
Query OK, 0 row affected (0.00 sec)
如果要删除使用者上述新增的使用者 www,可以使用下列指令:
mysql> DELETE FROM user WHERE user='www' and host='www.mydomain.com';
Query OK, 1 rows affected (0.01 sec)
在新增或删除使用者后,离开 MySQL 之前都必须指行下列指令来让它生效:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
19.4.4 如何更改使用者密码
我们可以使用下列指令来更改自己的密码:# /usr/local/bin/mysqladmin -u root -p password newpwd
上面指令中的使用者是 localhost 的 root ,新的密码是 newpwd。在输入指令后,会先询问你旧的密码。
我们也可以使用具有管理使用者权限的 mysql 使用者登入 MySQL 后,使用 UPDATE 指令来更改密码:# /usr/local/bin/mysql -u root -p mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 202 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> UPDATE user set password=password('新密码')
where user='使用者' and host='主机';
19.5 MySQL 图形化管理工具介绍
MySQL 有许多图形化的管理工具,我们在此介绍二个官方的工具「MySQL Administrator」及「MySQL Query Browser」。MySQL Administrator 是用来管理 MySQL Server 用的,您可以查看目前系统状态、新增使用者等。而 MySQL Query Browser 可以用来查看数据库内容。
我们可以在一台 Windows 的机器上使用图形化的管理工具,或者是在本机的 XWindow 中执行也可以。如果要从另一台计算机联机到 MySQL,则在使用这些工具连到 MySQL 之前,您必须先新增具有权限从远方联机到 MySQL 的使用者。假设我们要新增一个使用者 root,它可以从 192.168.0.2 这台机器联机到 MySQL,而密码为 mypasswd,则可以使用下列指令:
mysql> GRANT ALL on *.* to root@192.168.0.2 IDENTIFIED BY 'mypasswd';
Query OK, 1 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
19.5.1 MySQL Administrator
请先到 MySQL 网站下载 MySQL Administrator,并执行安装,安装后请执行 MySQL Administrator。执行后,您会看到下列画面:
图 19-1

请在 Server Host 字段中输入 MySQL Server 的 IP,并输入使用者名称及密码。登入后的第一页,您可以看到目前 MySQL 的状态。如果您的 Server 和 MySQL Administrator 是在同一台机器上,则可以对 MySQL 进行更多的控制,例如停用 MySQL 等。
MySQL Administrator 的管理界面使用上很容易,您可以自已点点看有什么功能,这里我们只介绍如何使用它来新增使用者。首先,请在右边选单中选取「User Administration」,接着在下图标示 2 的地方按鼠标右键,然后选择「Add new User」。
图 19-2

然后您就可以在 MySQL User 字段中输入使用者名称,并输入密码。输入完后请按「Apply changes」以套用设定。
接下来我们可以再进一步设定使用者 john 设定权限。假设我们希望设使用者 john 只可以对数据库 www 进行 SELECT、INSERT、UPDATE、及 DELETE 的指令,则可以点选「Schema Privileges」标签,并选取好权限后,按下图 3 的按钮以新增权限。最后请点选「Apply changes」以套用设定。
图 19-3

最后,我们要设定使用者可以从什么地方联机到 MySQL Server,请对着该使用者按右键,并选择「Add Host From Which The User Can Connect」,接着输入 IP 即可。
图 19-4

如果您要删除使用者,只要对着使用者按右键,并选取「Delete User」即可。
19.5.2 MySQL Query Browser
MySQL Query Browser 一样可以从 MySQL 官方网站下载。下载并安装后,就可以执行 MySQL Query Browser 了。执行 Query Browser 后,会出现一个要求登入的窗口,同样的,您必须输入账号、密码及所要联机的主机。
如果您已经安装了 MySQL Administrator,您可以直接从 MySQL Administrator 中执行 Query Browser,而且不必再输入账号密码:
图 19-5

在 MySQL Query Browser 中,我们可以建立删除数据库、数据表、查询数据库中的数据。如果您要建立一个新的数据库,请对着下图中 1 的位置按鼠标右键,再点选「Create New Schema」,最后输入数据库名称即可。
图 19-6

建立了数据库后,我们可以再建资料表。请对着我们刚建立的数据库按鼠标右键,再点选「Create New Table」即出现下列窗口:
图 19-7

请在「Table Name」中输入表格名称,并在上图 2 的部份输入每一个字段的类别,最后按「Apply Changes」即可。建立数据库后,您就可以在 Query Browser 中输入、检视数据库中的数据。只要对着刚才建立的表格点二下,并点选「Execute」即可查看数据库中的数据。如果您要新增一笔数据,请点选下图中 3 的位置,并选择「Edit」即可进行编辑。
图 19-8

MySQL 图形化接口的使用相当直觉,您只要多试几次就可以明白各种使用方法了。

小提示
如果您想要使用网页接口的 MySQL 管理工具,您可以到
http://www.phpmyadmin.net/
下载 phpMyAdmin。phpMyAdmin 的设定十分简单,您可以在网络上搜寻到很多相关文件。
19.6 PostgreSQL 安装设定
另一个好用的数据库为 PostgreSQL,这是笔者偏好的数据库,比起 MySQL,它的设定更简单、功能更强大。
我们同样使用 port 来安装 PosgreSQL:# cd /usr/ports/databases/postgresql80-server
# make install clean
执行了 make install 之后,会出现一个进阶设定的窗口,我们使用预设的设定即可。接着,您将看到一个提示讯息,要求你先行备份原本的数据库。如果您是第一次安装 PostgreSQL,可以直接略过。
安装完成后,我们就可以开始做数据库的初始化了。我们使用下列指令来初始化数据库:# su -l pgsql -c initdb
这个指令的意思是以使用者 pgsql 的身份执行 initdb。PostgreSQL 安装时会自动建立一个使用者及群组 pgsql,这是 PostgreSQL 预设最高使用者的账号,您可以使用 vipw 来修改该使用者的数据。由于 pgsql 预设使用的 shell 是 sh,笔者习惯使用 tcsh,所以我将该使用者的数据修改如下:
pgsql:*:70:70::0:0ostgreSQL Daemon:/usr/local/pgsql:/bin/tcsh
初始化数据库后还有一些后续的设定。一开始 PostgreSQL 只允许让 pgsql 这个使用者经由本机联机存取数据库,如果您希望其它使用者可以经由其它机器联机,您必须先修改 ~pgsql/data/postgresql.conf 这个档案。找出 listen_addresses  的部份,并修改如下:
listen_addresses = '*'
listen_addresses 是表示您所要允许联机的 IP 地址,我们填入 * 表示允许任何联机。如果您安装的 PostgreSQL 是 7.x 的版本,您要修改的是这下列一行:
tcpip_socket = true
postgresql.conf 这个档案记录着 PostgreSQL 的其本设定,其中使用 "#" 为首的是批注。其内容包括可以设定所要使用的连接埠、最大联机数量等,不过我们通常没有必要修改它。
接着我们要设定从别的机器联机所使用的认证方式,请编辑 ~pgsql/data/pg_hba.conf,在文件最下方加入下列设定:
# "local" is for Unix domain socket connections only
local   all         all                               trust
host    all         all         127.0.0.1/32          trust
host    all         all         ::1/128               trust
host    all         all         192.168.0.1   255.255.255.0     md5
这里的设定除了第一行是批注外,第二、三、四行表示信任来自本机的联机,只要使用者存在于数据库中就不需要密码,这三行预设就存在于 pg_hba.conf 中。最后一行表示网域 192.168.0.1~192.168.0.255 的联机都要使用 md5 验证密码。
如果您希望在开机时就启动 PostgreSQL,请修改 /etc/rc.conf 并加入下列这一行:
postgresql_enable="YES"
在我们新增其它使用者之前,必须先启动 PostgreSQL ,以下为启动数据库服务的指令:# /usr/local/etc/rc.d/010.pgsql.sh start
如果您没有在 rc.conf 中加入启动 PostgreSQL 的设定,则上述指令并不会启动 PostgreSQL。
因为 010.pgsql.sh 这支 script 放在 /usr/local/etc/rc.d ,所以在一开机时,系统就会自动执行它来启动 PostgreSQL,如果您要停止 PostgreSQL,只要执行下列指令:# /usr/local/etc/rc.d/010.pgsql.sh stop
接着我们就可以增加一个可以使用远程联机的使用者:# su -l pgsql
% createuser -P
Enter name of user to add: alex
Enter password for user "alex":
Enter it again:
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER
如此一来我们就可以使用 alex 这个使用者从远程登入了。
19.7 PostgreSQL 管理指令
PostgreSQL 和 MySQL 在指令的应用上有所不同,它将许多管理数据库的指令独立成一个个的执行文件,其中有些指令是使用 psql 为基础所写成的 scripts。例如新增、删除数据库或使用者等指令,都可以直接在命令列执行。以下为常用的指令列表:
指令
用途
createdb
建立一个新的数据库。
dropdb
删除数据库。
createuser
建立数据库使用者。
dropuser
删除数据库使用者。
pg_dump
备份一个数据库。
pg_dumpall
备份所有数据库。
psql
交互式的 SQL 指令工具。
19.7.1 建立及删除使用者
因为 PostgreSQL 安装完毕时只有一个使用者 pgsql,如果您要使用其它使用者登入,您必须先以 pgsql 这个使用者来新增其它使用者账号。首先,我们先将身份切换成 pgsql:# su -l pgsql
我们使用 su 加上参数 -l 表示模拟使用者真正 login 的情形,也就是会将工作目录切换到 /usr/local/pgsql,并加载该目录中的 .cshrc 等档案。接着我们就可以使用下列指令来建立一个新的使用者了,假设我们要为 root 建立一个账号:% createuser root
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER
如此一来,root 也具有存取数据库的权限了。但因为 PostgreSQL 内定没有密码的使用者不可以使用远程登入,如果您希望所新增的使用者可以使用远程登入,您必须在 createuser 指令加上参数 -P 以输入密码,请注意 P 是大写喔。如果你要从数据库中删除一个使用者账号,只要使用 dropuser 这个指令即可:% dropuser root
值得注意的是,您无法使用删除你正在使用中的账号,例如以 root 身份来删除 root 是不被允许的。
如果您要修改某个使用者的密码,可以使用下列指令:# su -l pgsql
% psql template1
Welcome to psql 8.0.3, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
template1=# ALTER USER pgsql WITH PASSWORD 'mypass';
ALTER USER
template1=# quit
我们先切换身份为 psql 以确保具有权限修改使用者密码,接着我们使用 psql 进入预设的数据库,并使用 ALTER USER 来修改使用者 pgsql 的密码,将密码设为 mypass。最后使用 quit 离开数据库。
19.7.2 建立及删除数据库
在使用数据库之前,我们必须先建立一个数据库。假设我们要建立的数据库名称为 MYDB,您可以使用下列指令加以建立:% createdb MYDB
在 UNIX 的世界中,大小写是有分别的,在 PostgreSQL 中也是一样。因此,不论是在建立数据库,数据表或其字段时,都要注意大小写。建议您除了数据库名称外,最好全部使用小写。
同样的,如果你要删除一个数据库,只要使用 dropdb 这个指令:% dropdb MYDB
19.7.3 交互式 SQL 指令
PostgreSQL 的 client 端指令中,功能最强大的莫过于 psql 这个指令了。psql 可以除了让我们进入交互式的 SQL statement 环境外,也可以加上一些参数变成一个直接响应的指令。例如,我们想要查看目前有哪些数据库:% psql -l
List of databases
Name | Owner | Encoding
-----------+-------+-----------
MYDB | root | SQL_ASCII
template0 | pgsql | SQL_ASCII
template1 | pgsql | SQL_ASCII
(3 rows)
加上 -l 这个参数后,就可以列出所有数据库名称了。除了您所建立的数据库外,还有二个 templateX 的数据库,该数据库存放着 PostgreSQL 的设定,不可以删除。接下来让我们选定一个数据库以进入交互式的窗口:% psql MYDB
Welcome to psql, the PostgreSQL interactive terminal.
Type:        \copyright for distribution terms
        \h for help with SQL commands
        \? for help on internal slash commands
        \g or terminate with semicolon to execute query
        \q to quit
MYDB=#
在这里,我们可以使用 19.3 所列出的一些标准的 SQL statement 来存取数据库,例如 create、drop、delete、update、insert、alter 等。建议您进一步至 PostgreSQL 网站参考其使用手册,PostgreSQL 官方网站是
http://www.postgresql.org
。您也可以在下列网址中找到中文的使用手册:
http://www.freebsd.org.hk/html/pgsqldoc-7.0c/postgres.htm

在交互式的接口中,您可以使用 \h 及 \? 来查询可以使用的指令。其中 \h 为查询 SQL statement ,而 \? 则是常询 PostgreSQL 特有的反斜线指令,我们最常用的反斜线指令有 \q 离开交互式接口,及 \d 列出该数据库的所有数据表。
如果您觉得这种命令列的接口不好使用,我们在下一节将会介绍如何在 MS Windows 使用图形化接口的管理工具。
19.7.4 数据库备份及回复
定期备份数据库是十分重要的一件事,我们一定要养成备份的习惯。在 PostgreSQL 中,备份十分容易,假设我们要备份的数据库是 MYDB,您可以使用下列指令:% pg_dump MYDB > MYDB.sql
如此一来,你就可以把 MYDB 这个数据库 dump 出来了。然而,数据库的数据往往十分庞大,动辄数十 MB 至数百 MB,为了节省空间,您可以在备份时顺便压缩数据库。以上述指令而言,我们只要将输出导向到 gzip 即可进行同步压缩:% pg_dump MYDB | gzip > MYDB.sql.gz
我们一般从数据库 dump 出来的数据都是文字文件,所以使用 gzip压缩可以得到很高的压缩比。假设不压缩所备份出来的档案有五十 MB,使用 gzip压缩后大约只剩六百多 KB。因此,我习惯都会加上 gzip压缩。
pg_dump 这个指令只能用来备份单一的数据库,如果您要将所有的数据库中都备份起来,您可以使用 pg_dumpall 来备份:% pg_dumpall |gzip > ALLDB.sql.gz
有了备份,自然也要回存。由于我们使用 pg_dump 所备份出来的数据库实际上是将一堆数据以 SQL statement 的方式存起来,如果您将该备份的档案以文书编辑器打开,您可以看到它其实是先存放数据库中所有数据表的信息,再将存放数据。所以我们只要将这些指令导向到 psql 来执行即可。首先,请先建立要回存的数据库名称,假设我们要将 MYDB 所备份出来的数据存放在 NEWDB 这个数据库中,我们要先建立一个名为 NEWDB 的数据库:% createdb NEWDB
接着再使用下列指令来将数据回存:% cat MYDB.sql | psql NEWDB
如果您备份出来的数据有经过压缩,则需改以下列指令回存:% gunzip -c MYDB.sql.gz | psql NEWDB
或是% cat MYDB.sql.gz | gunzip | psql NEWDB
如果您要回存的档案是经由 pg_dumpall 所备份出来的数据,则必须使用 pgsql 这个使用者来执行下列指令:% gunzip -c ALLDB.sql.gz | psql -e template1
19.8 PostgreSQL 图形化管理工具介绍
许多人可能不太习惯使用命令列来管理数据库,还好 PostgreSQL 提供了许多图形接口的管理工具。您可以在 MS Windows 执行的 pgAdmin。由于这些图形接口操作上比较容易,只要您多试几次,就可以熟悉它们的使用,因此,我们不会深入介绍每个功能的用法。
对于初学者而言,使用 pgAdmin 会比在命令列中输入来得容易。您可以自
http://www.pgadmin.org/
下载最新版本的 pgAdmin。
安装完成后,我们打开 pgAdmin,按了左上角的图示后即出现联机设定的窗体。请输入您数据库服务器的位置及账号密码,如图 19-9 所示:
图 19-9

请注意,您必须先将 PostgreSQL 的 TCP/IP 联机打开,而且在 pg_hba.conf 中必须允许使用 pgAdmin 的这台主机登入。您可以参考 19.6 中的说明来设定 pg_hba.conf。输入联机数据后,即可开始使用。以建立一个新的数据库为例,我们先在左边的窗口中,对着数据库按右键,再选取 [新物件]->[新建数据库] 如图 19-10 所示:
图 19-10

接着我们可以输入数据库名称、编码方式等,如图 19-11:
图 19-11

我们输入了数据库名称为 test,并指定使用 UNICODE 的编码方式。接下来您可以看到在管理窗口中多了一个数据库「test」,我们可以在此数据库中再建立数据表。请先点选数据库「test」,再选择「模式」->「public」->「数据表」,并对着数据表按右键选择「新建数据表」。
图 19-12

接下来,您就可以输入资料表名称,再选取「资料行」以设定本数据表的字段数据。
图 19-13

在 pgAdmin 的主画面中,最上方有几个功能键,可以让我们手动输入 SQL 指令或是查看数据表内容,建议您可以每一个功能都试试看,以熟悉 pgAdmin 的使用接口。基本上 pgAdmin 十分容易上手,而且也功能十分齐全。

小提示
如果您想要使用网页接口的 PostgreSQL 管理工具,您可以到
http://phppgadmin.sourceforge.net/
下载 phpPgAdmin。phpPgAdmin 的设定和 phpMyAdmin 一样十分容易,只要您已经安装好网页服务器,就可以使用 phpPgAdmin。

顶部
逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:26  资料  个人空间  短消息  加为好友  QQ

第十九章 数据库系统
现在许多的商业应用、网页程序都必须使用数据库来存放数据。例如,网站上的留言版、讨论区、购物网站等,全部都是使用数据库来存放重要的数据。本章中,我们将介绍二种常见的数据库:MySQL 及 PostgreSQL。
本章包含了数据库的安装、设定、语法、及各种操作方式的介绍,读完本章后,您将可以了解下列主题:
如何安装、设定 MySQL。
如何安装、设定 PostgreSQL。
如何使用 MySQL 的图形化管理工具。
如何使用 PostgreSQL 的图形化管理工具。
基本的数据库语法介绍。
如何备份、回存数据库。
这些信息将有助您建立一个功能强大的网站,并对于日后安装数据库相关应用时更加得心应手。
19.1 概论
电子商务的兴起让数据库的应用更受到大家的瞩目。在信息科学的应用上,数据库可以说是最历久弥坚的领域。近来,数据产生和数据收集方面的技术有非常快速的进展。许多商业产品广泛使用了条形码、许多企业和政府的交易皆已计算机化,这使得计算机成为数据收集的主要工具。同时,数以百万计的数据库正被使用在企业管理、政府管理、科学和工程的数据管理和许多其它的应用上。
我们可以安装一套数据库系统,并经由一个接口自行开发程序来使用它。数据库的好处有很多,相信对数据库稍有涉入的人都知道,例如数据存取快速、不重复、权限控制、数据独立性等等。以写一个简单的留言版程序而言,传统上使用档案做为留言的记录,若要删除一笔数据,必须对整个档案一行一行的比对;但数据库只需指定该留言的编号即可。不过,如果把数据库系统局限于留言版也太大才小用了。
我们将介绍在 FreeBSD 上使用数据库,因为目前网页数据库使用情形十分风行,尤其在网页开发上使用 MySQL 或 PostgreSQL 数据库加 PHP 更是绝配。目前 Open Source 的数据库中,最常用、最有名的就是 PostgreSQL 及 MySQL,因此,本章将先介绍这二个数据库系统的安装及使用。
至于 PostgreSQL 及 MySQL 这二个数据库系统有什么差别?到底应该选哪一个呢?在 MySQL 3.x 以前,如果您问我这个问题,我一定说 PostgreSQL,因为 MySQL 3.x 不支援 transaction。所谓的 transaction 就是将一连串的 SQL 指令做为一个执行单位,当其中一个指令失败,在同一个 transaction 所执行过的命令都取消。Transaction 对于程序开发的应用十分重要,例如,当我们要新增处理一笔订单时,我们会先将订单输入数据库中,再将金额输入应收帐款中。如果我们在新增应收帐款时出现错误,而订单却已输入数据库,是不正确的做法。有了支援 transaction 的数据库,我们可以将订单的输入和应收帐款的输入做为一个执行单位,如果其中一个执行失败,则数据库会自动取消先前先做的动作,如此一来便可以确保数据的正确性。由于 transaction 十分重要,因此在做为商业上的应用时,我会选择 PostgreSQL。
不过 MySQL 4.x 后已经加入 transaction 的支持,只是功能还是没有 PostgreSQL 那么完整。那么除此之外,这二个数据库的差别是什么?PostgreSQL 是一个功能强大的数据库系统,它的威力不下于商业用的数据库。而 MySQL 的特性是对于简单 SQL 指令处理快速,大部份的日常简单操作,MySQL 的速度会比 PostgreSQL 快一点。以下我们列出它们在功能上的主要差异:
功能
MySQL 3.x
MySQL 4.1.x
PostgreSQL
版权宣告
GPL
GPL
BSD
Sub-Selects
No
Yes
Yes
Views
No
No
Yes
Foreign Key relationships
No
Yes
Yes
Foreign Key constraints
No
No
Yes
Triggers
No
No
Yes
Indexing on non trivial types
No
No
Yes
Sequences
Some
Some
Yes
Transactions
No
Yes
Yes
OO (Inheritance of tables)
No
No
Yes
Async Notifications
No
No
Yes
Constraints
No
No
Yes
SELECT INTO
No
Yes
Yes
Stored Procedures
No
No
Yes
Row level locking
Yes
Yes
Yes
Table level locking
Yes
Yes
Yes
Multi version Concurrency Control
No
No
Yes
我们可以看到 PostgreSQL 功能真的强大很多,如果您必须设计功能强大又复杂的系统,PostgreSQL 是不二之选。而 MySQL 4.x 以后的重要功能都很齐全,速度也很快,比较适合简单的网页应用,所以目前大部份网页应用软件使用 MySQL 比较多。不过呢,笔者认为 PostgreSQL 及 MySQL 都使用 Transaction 时,二者的效能表现差不多,就网页应用而言,我的首选还是 PostgreSQL。
19.2 安装 MySQL
MySQL 和 FreeBSD 一样也有多种版本同时开发,例如 3.x、4.0.x、4.1.x、5.x 等,其中 4.1.x 是目前较稳定的版本。
您可以自行到
http://www.mysql.com
取得最新版的 MySQL Source Package 来安装,不过安装上比较麻烦。所以我们使用 ports 来安装 MySQL:# cd /usr/ports/databases/mysql41-server
# make WITH_CHARSET=big5 WITH_XCHARSET=all install clean
我们指定 MySQL 预设的字集为 Big5,并另外支持所有的字集。接下来请修改 /etc/rc.conf 并加入下列这一行,以让开机时启动 MySQL:
mysql_enable="yes"
接着您就可以使用下列指令启动 MySQL 了:# /usr/local/etc/rc.d/mysql-server.sh start
启动 MySQL 后,我们就可以使用下列指令进入 MySQL 交互式命令列了:# /usr/local/bin/mysql mysql
若安装成功,你将看到以下画面:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
MySQL 刚安装完成时,并未设定 root 的密码,因此我们接着要设定 root 的密码并实时更新设定:
mysql> UPDATE user SET password=password('你的密码') where user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2  Changed: 0  Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
以上指令及 MySQL 更详细的设定说明,我们会在下一小节中加以说明。最后请以 exit; 来离开 MySQL。
如果您有其它使用者要加入也可以加入,最好不要让使有人都有对所有数据库有全部的权限。使用命令列的方式新增使用者有点麻烦,我们等一下再使用其它图形化接口进入新增使用者。
建议您以后使用 MySQL 的图形化接口管理工具「MySQL Administrator」及「MySQL Query Browser」来管理 MySQL,我们会再后续章节中说明如何使用这些管理工具。
19.3 SQL 语法介绍
在使用数据库之前,我们必须先了解一些简单而基本的数据库理论。如果您对于数据库 SQL 语法已经很熟悉了,您可以跳过这一个小节。
基本上数据库的结构有下列几个特点:
一个数据库系统中可以有多个独立数据库。
数据库是由许多数据表 (table) 所组成。
数据表中包含许多记录 (record)。
每一笔记录中的字段数目都一样。
每一个字段储存一种分类过的数据。
例如我们有一个数据库名称是NCU,其中有多个数据表,其中一个资料表名为 student 内容如下:
STUDENT_ID
LAST_NAME
FIRST_NAME
DEPARTMENT
1
Chang
Jack
MIS
2
Wang
Alex
BA
在数据表中有许多字段 (column),每个字段都有一个名称,也就是第一列 (row) 中的 STUDENT_ID、LAST_NAME、FIRST_NAME、DEPARTMENT。接着我们将数据存入,每一笔记录我们都可以看成一列 (row),每一个记录都有一个「唯一的 ID (编号)」。唯一的 ID 十分重要,它是我们在存取数据库时的依据。在新增资料时,以 MySQL 而言,我们可以自行指定 ID 或是由系统自行取得。
另一个观念是关系型数据库。关系型数据库的意义就是每一个资料表间可以存在关系,例如我们在 NCU 的数据库中有另一个数据表名为 score,内容如下:
SCORE_ID
STUDENT_ID
CHINESE
ENGLISH
1
2
99
90
2
1
89
87
score 数据表中存放学生的成绩,我们不需在该数据表中存放学生的信息,只要在该数据表中存放一个字段名为 STUDENT_ID,经由这一个唯一的 ID 我们可以去 student 的数据表中找到学生的数据。
有了这些观念就足以让我们开发出许多数据库的程序了。
SQL (Structured Query Language) 语法十分简单,它是关系型数据库的标准语言,虽然在某些不同数据库系统上有些许的差异,但基本上都遵循一定的标准。
我们可以在命令列下进入 MySQL 来练习 SQL 的语法:# /usr/local/bin/mysql -u root -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 202 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
下完指令后会要求输入密码,请输入您之前设定的密码。登入后你就可以直接在出现的命令列 mysql> 之后输入 SQL 的语法了。
关于 MySQL 详细的语法,你可以参考 MySQL 中文参考手册,该文件可以在
http://www.freebsd.org.hk/html/mysqldoc/
中找到。该文件中对于 MySQL 每个细节都有详细的描述,例如字段的名称限制、规则等,我们不会在这里提及。我们只介绍几个简单而常用的指令。 我们以建立一个学生数据表来说明这些语法。
CREATE
ALTER
DROP
INSERT
SELECT
UPDATE
DELETE
制成 script 档
19.3.1 CREATE
建立数据库:CREATE DATABASE db_name
建立数据表:CREATE TABLE tbl_name [(create_definition,...)] [options]
我们先建立一个名为 NCU 的数据库:
mysql> CREATE DATABASE NCU;
请注意,每一个指令皆以 ";" 为结尾,如果没有 ";" 就算换行也是代表同一条指令的延续。
我们可以使用下列指令 show 来列出系统中已存在的数据库有哪些:
mysql> show databases;
+-----------+
| Database  |
+-----------+
| mysql     |
| test      |
| NCU       |
+-----------+
3 rows in set (0.01 sec)
接着用 USE 这个指令来使用 NCU 数据库:
mysql> USE NCU;
接着建立一个放置学生数据的数据表,名为 STUDENT,内容为编号(STUDENT_ID)、姓名 (NAME)、科系 (DEPARTMENT):
mysql> CREATE TABLE STUDENT (
STUDENT_ID int(10) DEFAULT '0' NOT NULL AUTO_INCREMENT,
NAME varchar(50),
DEPARTMENT varchar(10),
PRIMARY KEY (STUDENT_ID) );
在上面的指令中,我们定义学生编号为十位数的整数(int),内定值是 0,不可以是空的 (NOT NULL),数字自动增加 (AUTO_INCREMENT)。姓名是最长为五十个字节的字符串(VARCHAR),科系为最长十个字节的字符串。最后定义主要的 id 是 STUDENT_ID,也就是该数据表中的唯一 ID。
我们可以看到在建立数据表时,我们会顺便划分各个字段所要储存的数据长度及其格式,常用的字段格式请参考 MySQL 中文参考手册。
如果要看现在使用的数据库中有哪些数据表,一样可以使用指令 show 来查看:
mysql> show tables;
+--------------------+
| Tables_in_NCU      |
+--------------------+
| STUDENT            |
+--------------------+
4 rows in set (0.00 sec)
19.3.2 ALTER
建立了数据表后,如果发现数据表的字段不符需求,我们不必将数据表删除重建,可以使用 ALTER 指令来修改数据表的格式。另如我们要新增一个姓别字段,内容只可以是 "男" 或 "女",我们可以使用下面的指令:
mysql> ALTER TABLE STUDENT
ADD SEX ENUM('男','女') DEFAULT '女';
我们增加了一个字段 SEX,使用 ENUM 的格式,指定内容只能为 "男" 或 "女",且默认值是 "女"。
如果我们要将 SEX 字段改名为 DISTINCTION,并将格式改为 VARCHAR:
mysql> ALTER TABLE STUDENT
CHANGE SEX DISTINCTION VARCHAR(4);
如果我们只是要将 SEX 字段格式改为 VARCHAR,但不更改名称,只要将上面的指令中 DISTINCTION 改成 SEX 即可。
如果我们要删除整个 DISTINCTION 字段及该字段的数据:
mysql> ALTER TABLE STUDENT DROP DISTINCTION;
19.3.3 DROP
删除数据库:DROP DATABASE db_name
删除数据表:DROP TABLE table_bame
我们可以使用 DROP 指令来删除不要的资料。例如我们要删除 STUDENT 这一个资料表的话,可以使用下列指令:
mysql> DROP TABLE STUDENT;
19.3.4 INSERT
使用 INSERT 指令可以让我们一笔一笔增加数据。
STUDENT_ID
NAME
DEPARTMENT
1
Jack
MIS
假设我们的数据表中的字段如上表,我们要新增一笔数据,姓名是 JACK、部门是 MIS:
mysql> INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('JACK', 'MIS');
由于我们在指定 STUDENT_ID 的格式时,加了参数 AUTO_INCREMENT,所以我们不需指定值,mysql 会自动帮我们依序指定。
19.3.5 SELECT
我们可以使用 SELECT 来看数据表中的数据,还可以依自己给定的条件来过滤数据。
假设我们要看 STUDENT 数据表中的所有数据的话,可以使用下列指令:
mysql> SELECT * FROM STUDENT;
假设我们只要看 NAME 及 DEPARTMENT 字段的话,我们可以使用下列指令:
mysql> SELECT NAME, DEPARTMENT FROM STUDENT;
假设我们只要看 NAME 字段,而且所属部门为 MIS 的人:
mysql> SELECT NAME FROM STUDENT
WHERE DEPARTMENT='MIS';
假设我们要看 MIS 部门中的人所有字段,而且输出结果时要依 STUDENT_ID 来排序:
mysql> SELECT * FROM STUDENT
WHERE DEPARTMENT='MIS'
ORDER BY STUDENT_ID DESC;
最后的 DESC 表示递减 (descending),由大到小排序。也可以使用 ASC 来表示递增 (ascending)。
除了这些之外,在 MySQL 中还有一些可以使用的函式,例如我们可以使用 count() 这个函式来计算出有多少笔记录:
mysql> SELECT count(*) FROM STUDENT WHERE DEPARTMENT='MIS';
+----------+
| count(*) |
+----------+
| 5        |
+----------+
1 row in set (0.00 sec)
上述结果表示部门为 MIS 的记录有五笔。
会了这些基本的 INSERT 指定就够我们做一般的应用了。
19.3.6 UPDATE
我们可以使用 UPDATE 指令来更新记录。例如我们要将所有记录的部门数据为 MIS 者都改成 CSIE,可以使用下列指令:
mysql> UPDATE STUDENT SET DEPARTMENT='CSIE'
WHERE DEPARTMENT='MIS';
19.3.7 DELETE
DELETE 指令可以让我们删除一笔或多笔数据。例如我们要删除 STUDENT 数据表中姓名为 JACK 的记录:
mysql> DELETE FROM STUDENT WHRE NAME='JACK';
如果我们要删除姓名为 JACK 且部门为 MIS 的数据:
mysql> DELETE FROM STUDENT
WHERE NAME='JACK' AND DEPARTMENT='MIS';
19.3.8 制成 script 档
我们可以将要执行的指定制成档案,以利管理。例如我们写了一个程序,需要先在数据库中建立一些数据,我们可以将对数据库的规划做成一个档案来管理。这样可以使用们要安装程序时更快速方便。
假设我们要建立一个数据库 NCU,该数据库中有一个数据表 STUDENT,数据表中要先建有以下记录:
STUDENT_ID
NAME
DEPARTMENT
1
Jack
MIS
2
Mary
CSIE
我们先建立一个文件名为 ncu.sql,内容如下:
CREATE DATABASE NCU;
USE NCU;
CREATE TABLE STUDENT (
STUDENT_ID int(10) DEFAULT '0' NOT NULL AUTO_INCREMENT,
NAME varchar(50),
DEPARTMENT varchar(10),
PRIMARY KEY (STUDENT_ID) );
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('JACK', 'MIS');
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('MARY', 'CSIE');
接着使用下列指令来快速建立数据库:# /usr/local/bin/mysql -u root -p
输入使用者 root 的密码后就完成建立了。
如果我们在数据库中早就有一个数据库名为 NCU,而我们要新增上述数据表及记录,我们只要将原本 ncu.sql 的内容最前面二行删除,改成下列内容:
CREATE TABLE STUDENT (
STUDENT_ID int(10) DEFAULT '0' NOT NULL AUTO_INCREMENT,
NAME varchar(50),
DEPARTMENT varchar(10),
PRIMARY KEY (STUDENT_ID) );
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('JACK', 'MIS');
INSERT INTO STUDENT (NAME, DEPARTMENT)
VALUES ('MARY', 'CSIE');
之后再以下列指令来在 NCU 数据库中建立数据表:# /usr/local/bin/mysql -u root -p NCU
在网络上有许多 PHP 程序可以下载,下载后要安装数据库时,大多是以这种方式来使用。
19.4 MySQL 管理
19.4.1 维护密码安全
当我们要使用 MySQL 时,必须输入密码。输入密码的方式有很多种,第一种也是最不安全的一个方式是直接在命令列打指令时就输入:# /usr/local/bin/mysql -u root -pmypwd
上面这种方法会让别的使用者使用 ps 指令就可以看到你在执行的指定及密码。因此绝对不要使用这种方法,请改用下列方式输入:# /usr/local/myqsl/bin/mysql -u root -p
接着会要求你输入密码时再输入即可。
另一个方式是在你的家目录下建立一个存放密码的档案,文件名为 .my.cnf,当 mysql 需要使用密码时会自动去读取。该档的内容如下:
[client]
password=your_passowrd
接着要把 .my.cnf 的权限改成只有档案拥有者才可以读写:# chmod 600 ~/.my.cnf
19.4.2 备份数据库
数据库的数据要定时备份,这样才不会在失手时或系统有问题时产生困扰。在 MySQL 中提供一个备份程序 mysqldump。
假设我们有一个数据库名为 WWW,我们可以使用下列指令来备份整个数据库:# /usr/local/bin/mysqldump -u root -p WWW > www.sql
这样就可以把数据库的数据存在 www.sql 这个档案中了。日后要回复时只要使用下列指定就可以把资料存回:# /usr/local/bin/mysql -u root -p WWW
我们要注意的是备份出来的档案应该要放在不同的计算机中,而且要注意权限的控制。由于该文件是文字文件,任何人都可以读,所以要特别注意。
我们可以利用 crontab 这个指令来定时备份数据库。我们先建立一个 shell script 档,名为 backupsql.sh,内容如下:
/usr/local/bin/mysqldump -uroot WWW>/home/www.sql
chmod 600 /home/www.sql
接着将该档权限改成只有拥有人可以读、写、执行,其它人都不行:# chmod 700 backupsql.sh
为了要让执行 backupsql.sh 时可以不必输入密码,我们必须先将密码存在 ~/.my.cnf ,请先建立 ~/.my.cnf 档案内容如下:
[client]
password=your_passowrd
接着要把 .my.cnf 的权限改成只有档案拥有者才可以读写:# chmod 600 ~/.my.cnf
接着要让它能定时执行,命令列打 crontab -e 来进入文字编辑,加入下列内容:
#每天 3:05 备份网页数据库
5        3        *        *        *        /root/backupsql.sh
19.4.3 使用者管理
如果您要新增可以联机到 MySQL 的使用者,可以在 MySQL 交互式接口串使用 GRANT 指令来新增使用者。GRANT 在设定使用者权限时,如果使用者存在则更新其权限,如果不存在则新增该使用者。
用法:GRANT 权限 ON 数据库(或表) TO user@host IDENTIFIED BY '密码';
范例一:
新增一个本机的使用者 admin,并开放所有权限,密码为 mypwd:
mysql> GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY 'mypwd';
Query OK, 0 row affected (0.00 sec)
范例二:
新增一个来自 www.mydomain.com 的使用者 www,并设定只能对 www 数据库中所有数据表执行 SELECT, INSERT, UPDATE, DROP, CREATE, DELETE, INDEX,密码为 mypwd:
mysql> GRANT SELECT, INSERT, UPDATE, DROP, CREATE, DELETE,
INDEX ON www.* TO www@www.mydomain.com IDENTIFIED BY 'mypwd';
Query OK, 0 row affected (0.00 sec)
如果要删除使用者上述新增的使用者 www,可以使用下列指令:
mysql> DELETE FROM user WHERE user='www' and host='www.mydomain.com';
Query OK, 1 rows affected (0.01 sec)
在新增或删除使用者后,离开 MySQL 之前都必须指行下列指令来让它生效:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
19.4.4 如何更改使用者密码
我们可以使用下列指令来更改自己的密码:# /usr/local/bin/mysqladmin -u root -p password newpwd
上面指令中的使用者是 localhost 的 root ,新的密码是 newpwd。在输入指令后,会先询问你旧的密码。
我们也可以使用具有管理使用者权限的 mysql 使用者登入 MySQL 后,使用 UPDATE 指令来更改密码:# /usr/local/bin/mysql -u root -p mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 202 to server version: 4.1.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> UPDATE user set password=password('新密码')
where user='使用者' and host='主机';
19.5 MySQL 图形化管理工具介绍
MySQL 有许多图形化的管理工具,我们在此介绍二个官方的工具「MySQL Administrator」及「MySQL Query Browser」。MySQL Administrator 是用来管理 MySQL Server 用的,您可以查看目前系统状态、新增使用者等。而 MySQL Query Browser 可以用来查看数据库内容。
我们可以在一台 Windows 的机器上使用图形化的管理工具,或者是在本机的 XWindow 中执行也可以。如果要从另一台计算机联机到 MySQL,则在使用这些工具连到 MySQL 之前,您必须先新增具有权限从远方联机到 MySQL 的使用者。假设我们要新增一个使用者 root,它可以从 192.168.0.2 这台机器联机到 MySQL,而密码为 mypasswd,则可以使用下列指令:
mysql> GRANT ALL on *.* to root@192.168.0.2 IDENTIFIED BY 'mypasswd';
Query OK, 1 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
19.5.1 MySQL Administrator
请先到 MySQL 网站下载 MySQL Administrator,并执行安装,安装后请执行 MySQL Administrator。执行后,您会看到下列画面:
图 19-1

请在 Server Host 字段中输入 MySQL Server 的 IP,并输入使用者名称及密码。登入后的第一页,您可以看到目前 MySQL 的状态。如果您的 Server 和 MySQL Administrator 是在同一台机器上,则可以对 MySQL 进行更多的控制,例如停用 MySQL 等。
MySQL Administrator 的管理界面使用上很容易,您可以自已点点看有什么功能,这里我们只介绍如何使用它来新增使用者。首先,请在右边选单中选取「User Administration」,接着在下图标示 2 的地方按鼠标右键,然后选择「Add new User」。
图 19-2

然后您就可以在 MySQL User 字段中输入使用者名称,并输入密码。输入完后请按「Apply changes」以套用设定。
接下来我们可以再进一步设定使用者 john 设定权限。假设我们希望设使用者 john 只可以对数据库 www 进行 SELECT、INSERT、UPDATE、及 DELETE 的指令,则可以点选「Schema Privileges」标签,并选取好权限后,按下图 3 的按钮以新增权限。最后请点选「Apply changes」以套用设定。
图 19-3

最后,我们要设定使用者可以从什么地方联机到 MySQL Server,请对着该使用者按右键,并选择「Add Host From Which The User Can Connect」,接着输入 IP 即可。
图 19-4

如果您要删除使用者,只要对着使用者按右键,并选取「Delete User」即可。
19.5.2 MySQL Query Browser
MySQL Query Browser 一样可以从 MySQL 官方网站下载。下载并安装后,就可以执行 MySQL Query Browser 了。执行 Query Browser 后,会出现一个要求登入的窗口,同样的,您必须输入账号、密码及所要联机的主机。
如果您已经安装了 MySQL Administrator,您可以直接从 MySQL Administrator 中执行 Query Browser,而且不必再输入账号密码:
图 19-5

在 MySQL Query Browser 中,我们可以建立删除数据库、数据表、查询数据库中的数据。如果您要建立一个新的数据库,请对着下图中 1 的位置按鼠标右键,再点选「Create New Schema」,最后输入数据库名称即可。
图 19-6

建立了数据库后,我们可以再建资料表。请对着我们刚建立的数据库按鼠标右键,再点选「Create New Table」即出现下列窗口:
图 19-7

请在「Table Name」中输入表格名称,并在上图 2 的部份输入每一个字段的类别,最后按「Apply Changes」即可。建立数据库后,您就可以在 Query Browser 中输入、检视数据库中的数据。只要对着刚才建立的表格点二下,并点选「Execute」即可查看数据库中的数据。如果您要新增一笔数据,请点选下图中 3 的位置,并选择「Edit」即可进行编辑。
图 19-8

MySQL 图形化接口的使用相当直觉,您只要多试几次就可以明白各种使用方法了。

小提示
如果您想要使用网页接口的 MySQL 管理工具,您可以到
http://www.phpmyadmin.net/
下载 phpMyAdmin。phpMyAdmin 的设定十分简单,您可以在网络上搜寻到很多相关文件。
19.6 PostgreSQL 安装设定
另一个好用的数据库为 PostgreSQL,这是笔者偏好的数据库,比起 MySQL,它的设定更简单、功能更强大。
我们同样使用 port 来安装 PosgreSQL:# cd /usr/ports/databases/postgresql80-server
# make install clean
执行了 make install 之后,会出现一个进阶设定的窗口,我们使用预设的设定即可。接着,您将看到一个提示讯息,要求你先行备份原本的数据库。如果您是第一次安装 PostgreSQL,可以直接略过。
安装完成后,我们就可以开始做数据库的初始化了。我们使用下列指令来初始化数据库:# su -l pgsql -c initdb
这个指令的意思是以使用者 pgsql 的身份执行 initdb。PostgreSQL 安装时会自动建立一个使用者及群组 pgsql,这是 PostgreSQL 预设最高使用者的账号,您可以使用 vipw 来修改该使用者的数据。由于 pgsql 预设使用的 shell 是 sh,笔者习惯使用 tcsh,所以我将该使用者的数据修改如下:
pgsql:*:70:70::0:0ostgreSQL Daemon:/usr/local/pgsql:/bin/tcsh
初始化数据库后还有一些后续的设定。一开始 PostgreSQL 只允许让 pgsql 这个使用者经由本机联机存取数据库,如果您希望其它使用者可以经由其它机器联机,您必须先修改 ~pgsql/data/postgresql.conf 这个档案。找出 listen_addresses  的部份,并修改如下:
listen_addresses = '*'
listen_addresses 是表示您所要允许联机的 IP 地址,我们填入 * 表示允许任何联机。如果您安装的 PostgreSQL 是 7.x 的版本,您要修改的是这下列一行:
tcpip_socket = true
postgresql.conf 这个档案记录着 PostgreSQL 的其本设定,其中使用 "#" 为首的是批注。其内容包括可以设定所要使用的连接埠、最大联机数量等,不过我们通常没有必要修改它。
接着我们要设定从别的机器联机所使用的认证方式,请编辑 ~pgsql/data/pg_hba.conf,在文件最下方加入下列设定:
# "local" is for Unix domain socket connections only
local   all         all                               trust
host    all         all         127.0.0.1/32          trust
host    all         all         ::1/128               trust
host    all         all         192.168.0.1   255.255.255.0     md5
这里的设定除了第一行是批注外,第二、三、四行表示信任来自本机的联机,只要使用者存在于数据库中就不需要密码,这三行预设就存在于 pg_hba.conf 中。最后一行表示网域 192.168.0.1~192.168.0.255 的联机都要使用 md5 验证密码。
如果您希望在开机时就启动 PostgreSQL,请修改 /etc/rc.conf 并加入下列这一行:
postgresql_enable="YES"
在我们新增其它使用者之前,必须先启动 PostgreSQL ,以下为启动数据库服务的指令:# /usr/local/etc/rc.d/010.pgsql.sh start
如果您没有在 rc.conf 中加入启动 PostgreSQL 的设定,则上述指令并不会启动 PostgreSQL。
因为 010.pgsql.sh 这支 script 放在 /usr/local/etc/rc.d ,所以在一开机时,系统就会自动执行它来启动 PostgreSQL,如果您要停止 PostgreSQL,只要执行下列指令:# /usr/local/etc/rc.d/010.pgsql.sh stop
接着我们就可以增加一个可以使用远程联机的使用者:# su -l pgsql
% createuser -P
Enter name of user to add: alex
Enter password for user "alex":
Enter it again:
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER
如此一来我们就可以使用 alex 这个使用者从远程登入了。
19.7 PostgreSQL 管理指令
PostgreSQL 和 MySQL 在指令的应用上有所不同,它将许多管理数据库的指令独立成一个个的执行文件,其中有些指令是使用 psql 为基础所写成的 scripts。例如新增、删除数据库或使用者等指令,都可以直接在命令列执行。以下为常用的指令列表:
指令
用途
createdb
建立一个新的数据库。
dropdb
删除数据库。
createuser
建立数据库使用者。
dropuser
删除数据库使用者。
pg_dump
备份一个数据库。
pg_dumpall
备份所有数据库。
psql
交互式的 SQL 指令工具。
19.7.1 建立及删除使用者
因为 PostgreSQL 安装完毕时只有一个使用者 pgsql,如果您要使用其它使用者登入,您必须先以 pgsql 这个使用者来新增其它使用者账号。首先,我们先将身份切换成 pgsql:# su -l pgsql
我们使用 su 加上参数 -l 表示模拟使用者真正 login 的情形,也就是会将工作目录切换到 /usr/local/pgsql,并加载该目录中的 .cshrc 等档案。接着我们就可以使用下列指令来建立一个新的使用者了,假设我们要为 root 建立一个账号:% createuser root
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER
如此一来,root 也具有存取数据库的权限了。但因为 PostgreSQL 内定没有密码的使用者不可以使用远程登入,如果您希望所新增的使用者可以使用远程登入,您必须在 createuser 指令加上参数 -P 以输入密码,请注意 P 是大写喔。如果你要从数据库中删除一个使用者账号,只要使用 dropuser 这个指令即可:% dropuser root
值得注意的是,您无法使用删除你正在使用中的账号,例如以 root 身份来删除 root 是不被允许的。
如果您要修改某个使用者的密码,可以使用下列指令:# su -l pgsql
% psql template1
Welcome to psql 8.0.3, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
template1=# ALTER USER pgsql WITH PASSWORD 'mypass';
ALTER USER
template1=# quit
我们先切换身份为 psql 以确保具有权限修改使用者密码,接着我们使用 psql 进入预设的数据库,并使用 ALTER USER 来修改使用者 pgsql 的密码,将密码设为 mypass。最后使用 quit 离开数据库。
19.7.2 建立及删除数据库
在使用数据库之前,我们必须先建立一个数据库。假设我们要建立的数据库名称为 MYDB,您可以使用下列指令加以建立:% createdb MYDB
在 UNIX 的世界中,大小写是有分别的,在 PostgreSQL 中也是一样。因此,不论是在建立数据库,数据表或其字段时,都要注意大小写。建议您除了数据库名称外,最好全部使用小写。
同样的,如果你要删除一个数据库,只要使用 dropdb 这个指令:% dropdb MYDB
19.7.3 交互式 SQL 指令
PostgreSQL 的 client 端指令中,功能最强大的莫过于 psql 这个指令了。psql 可以除了让我们进入交互式的 SQL statement 环境外,也可以加上一些参数变成一个直接响应的指令。例如,我们想要查看目前有哪些数据库:% psql -l
List of databases
Name | Owner | Encoding
-----------+-------+-----------
MYDB | root | SQL_ASCII
template0 | pgsql | SQL_ASCII
template1 | pgsql | SQL_ASCII
(3 rows)
加上 -l 这个参数后,就可以列出所有数据库名称了。除了您所建立的数据库外,还有二个 templateX 的数据库,该数据库存放着 PostgreSQL 的设定,不可以删除。接下来让我们选定一个数据库以进入交互式的窗口:% psql MYDB
Welcome to psql, the PostgreSQL interactive terminal.
Type:        \copyright for distribution terms
        \h for help with SQL commands
        \? for help on internal slash commands
        \g or terminate with semicolon to execute query
        \q to quit
MYDB=#
在这里,我们可以使用 19.3 所列出的一些标准的 SQL statement 来存取数据库,例如 create、drop、delete、update、insert、alter 等。建议您进一步至 PostgreSQL 网站参考其使用手册,PostgreSQL 官方网站是
http://www.postgresql.org
。您也可以在下列网址中找到中文的使用手册:
http://www.freebsd.org.hk/html/pgsqldoc-7.0c/postgres.htm

在交互式的接口中,您可以使用 \h 及 \? 来查询可以使用的指令。其中 \h 为查询 SQL statement ,而 \? 则是常询 PostgreSQL 特有的反斜线指令,我们最常用的反斜线指令有 \q 离开交互式接口,及 \d 列出该数据库的所有数据表。
如果您觉得这种命令列的接口不好使用,我们在下一节将会介绍如何在 MS Windows 使用图形化接口的管理工具。
19.7.4 数据库备份及回复
定期备份数据库是十分重要的一件事,我们一定要养成备份的习惯。在 PostgreSQL 中,备份十分容易,假设我们要备份的数据库是 MYDB,您可以使用下列指令:% pg_dump MYDB > MYDB.sql
如此一来,你就可以把 MYDB 这个数据库 dump 出来了。然而,数据库的数据往往十分庞大,动辄数十 MB 至数百 MB,为了节省空间,您可以在备份时顺便压缩数据库。以上述指令而言,我们只要将输出导向到 gzip 即可进行同步压缩:% pg_dump MYDB | gzip > MYDB.sql.gz
我们一般从数据库 dump 出来的数据都是文字文件,所以使用 gzip压缩可以得到很高的压缩比。假设不压缩所备份出来的档案有五十 MB,使用 gzip压缩后大约只剩六百多 KB。因此,我习惯都会加上 gzip压缩。
pg_dump 这个指令只能用来备份单一的数据库,如果您要将所有的数据库中都备份起来,您可以使用 pg_dumpall 来备份:% pg_dumpall |gzip > ALLDB.sql.gz
有了备份,自然也要回存。由于我们使用 pg_dump 所备份出来的数据库实际上是将一堆数据以 SQL statement 的方式存起来,如果您将该备份的档案以文书编辑器打开,您可以看到它其实是先存放数据库中所有数据表的信息,再将存放数据。所以我们只要将这些指令导向到 psql 来执行即可。首先,请先建立要回存的数据库名称,假设我们要将 MYDB 所备份出来的数据存放在 NEWDB 这个数据库中,我们要先建立一个名为 NEWDB 的数据库:% createdb NEWDB
接着再使用下列指令来将数据回存:% cat MYDB.sql | psql NEWDB
如果您备份出来的数据有经过压缩,则需改以下列指令回存:% gunzip -c MYDB.sql.gz | psql NEWDB
或是% cat MYDB.sql.gz | gunzip | psql NEWDB
如果您要回存的档案是经由 pg_dumpall 所备份出来的数据,则必须使用 pgsql 这个使用者来执行下列指令:% gunzip -c ALLDB.sql.gz | psql -e template1
19.8 PostgreSQL 图形化管理工具介绍
许多人可能不太习惯使用命令列来管理数据库,还好 PostgreSQL 提供了许多图形接口的管理工具。您可以在 MS Windows 执行的 pgAdmin。由于这些图形接口操作上比较容易,只要您多试几次,就可以熟悉它们的使用,因此,我们不会深入介绍每个功能的用法。
对于初学者而言,使用 pgAdmin 会比在命令列中输入来得容易。您可以自
http://www.pgadmin.org/
下载最新版本的 pgAdmin。
安装完成后,我们打开 pgAdmin,按了左上角的图示后即出现联机设定的窗体。请输入您数据库服务器的位置及账号密码,如图 19-9 所示:
图 19-9

请注意,您必须先将 PostgreSQL 的 TCP/IP 联机打开,而且在 pg_hba.conf 中必须允许使用 pgAdmin 的这台主机登入。您可以参考 19.6 中的说明来设定 pg_hba.conf。输入联机数据后,即可开始使用。以建立一个新的数据库为例,我们先在左边的窗口中,对着数据库按右键,再选取 [新物件]->[新建数据库] 如图 19-10 所示:
图 19-10

接着我们可以输入数据库名称、编码方式等,如图 19-11:
图 19-11

我们输入了数据库名称为 test,并指定使用 UNICODE 的编码方式。接下来您可以看到在管理窗口中多了一个数据库「test」,我们可以在此数据库中再建立数据表。请先点选数据库「test」,再选择「模式」->「public」->「数据表」,并对着数据表按右键选择「新建数据表」。
图 19-12

接下来,您就可以输入资料表名称,再选取「资料行」以设定本数据表的字段数据。
图 19-13

在 pgAdmin 的主画面中,最上方有几个功能键,可以让我们手动输入 SQL 指令或是查看数据表内容,建议您可以每一个功能都试试看,以熟悉 pgAdmin 的使用接口。基本上 pgAdmin 十分容易上手,而且也功能十分齐全。

小提示
如果您想要使用网页接口的 PostgreSQL 管理工具,您可以到
http://phppgadmin.sourceforge.net/
下载 phpPgAdmin。phpPgAdmin 的设定和 phpMyAdmin 一样十分容易,只要您已经安装好网页服务器,就可以使用 phpPgAdmin。

顶部
逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:27  资料  个人空间  短消息  加为好友  QQ

第二十章 SAMBA 网络芳邻
使用 MS Windows 的人大概都知道我们可以经由「网络上的芳邻」看到网络中的计算机,并经由共享数据夹来分享档案、打印机。而在 FreeBSD 中,我们也可以安装一些软件来让 Windows、FreeBSD 的使用者经由网络上的芳邻共享 FreeBSD 机器中的档案。使用 FreeBSD 来做为档案服务器,可以让家中、公司的计算机轻易的交换信息,可以说是非常方便。
本章将介绍如何使用 FreeBSD 架设网络芳邻,并使用 FreeBSD 去存取 Windows 网络芳邻的数据。读完本章后,您将了解下列主题:
网络芳邻的运作原理。
安装及设定 Samba。
使用网页管理 Samba 的设定档。
如何在 Windows 及 FreeBSD 中使用网络芳邻。
20.1 网络芳邻简介
20.1.1 SMB 协定简介
MS Windows 可以说是目前桌上型计算机中市占率最高的操作系统,许多人使用 Windows 来进行日常工作。而在 Windows 平台上,使用者可以经由「网络上的芳邻」来看到不同计算机,并经由设定「共享数据夹」来分享档案及打印机。Windows 的网络芳邻其实是使用 SMB/CIFS 通讯协议。
SMB (Server Message Block) 通讯协议最早是在 1980 年代由 IBM 所发展出来,这个通讯协议可以让不同的计算机共享档案、打印机、及其它装置。SMB 最早是运作在 NetBIOS 的网络协上,一开始 IBM 设计了 NetBIOS 只是为了让网络中少数的计算机可以彼此互相沟通。所以 NetBIOS 的功能比较阳春,在使用上有一些限制。例如,只能使用在局域网络中、跨不过路由器。后来又出现了 NetBEUI (NetBIOS Extend User Interface),也是 IBM 针对 NetBIOS 的改良版。后来又有 NetBIOS over TCP/IP,使得 SMB 协议也可以跑在 TCP/IP 上,并可以经由因特网存取。在使用 NetBIOS 在存取远程计算机时,我们可以使用计算机名称如「\\alex-pc」来存取,而 TCP/IP 只能使用「\\192.168.0.1」这种方式来存取。所以 NetBIOS 也不是一无是处,它提供了比较简单而易懂的方式。
Microsoft 在 1996 年为了市场考量,将 SMB 改名为 CIFS (Common Internet File System),名称看起来比较容易了解,顾名思义就是可以在因特网上使用的档案系统。所以我们其实不应该称呼网络上的芳邻为「网络芳邻」,而是 SMB/CIFS 通讯协议,就好像我们称呼 HTTP、FTP 一样。在 Windows 的世界里,人们可以使用 SMB/CIFS 来共享档案。而在 UNIX 的世界里使用的是 NFS (Network File System);Mac 的世界中则是使用 AppleTalk。我们可以看到不同的操作系统环境中,都有自己的一套方法,不过我们还是可以经由安装软件来达成不同平台共享档案的功能。
20.1.2 Samba 简介
在 1991 年,澳洲的一位个大学生 Andrew Tridgell 为了要让 DOS 的机器和 UNIX 的机器可以共享档案,就在 UNIX 系统中写了一套 SMB 协议的软件。经过了一段时间的发展,他想要为这套软件取一个名字,但又不能直接使用 SMB 这个名字。所以他就翻翻字典,最后找到一个和 SMB 很像的字 Samba。最后 Samba 就开始有长足的发展,加入了许多有志之士。而今,Samba 已经成为 UNIX 世界中 SMB/CIFS 协议的代名词了。
但为什么我们要在 UNIX 中使用 Samba 而不直接使用 Windows 的机器来分享档案呢?以笔者的使用经验,由于我的 FreeBSD 服务器是 24 小时开机,在上面安装了 Samba 之后,网络上的所有计算机都可以使用这台服务器共享档案,而不必另外再开一台 Windows 机器。而且,我在编辑网页、写程序时,会使用 Samba 将我的网页数据、程序直接分享出来,再由 Windows 上的文书编辑软件来进行编辑。存盘后,我不必再使用 FTP 上传档案,而是可以直接使用浏览器看到编辑的结果,很棒吧。
Samba 的功能可不只有档案分享,它还可以让我们使用 UNIX 加入 Windows 的 Domain、ADS,以使用 Windows 的 Domain 使用者权限控管。更多的功能,请参考 Samba 网站的数据。
20.2 安装设定 Samba
Samba 目前有二个主要的版本:2.2.12 及 3.0.x。2.2.12 已经发展很久了,目前已进入停滞状态。和 3.0 比较起来,速度稍快、功能较简单。最大的不同在于 Samba 2.2.12 只支援 code page,而 Samab 3.0 支援 Unicode。Unicode 的支持可以让我们同时在一个目录中存放中文、日文、简体中文等多国语的档名。所以,笔者建议您安装 Samab 3.0。
20.2.1 安装 Samba
Samba 的安装设定很简单,我们可以使用 ports 来安装:# cd /usr/ports/net/samba3
# make install clean
接着,将出现下列画面,让您做一些偏好设定:
图 20-1

我们维持原本的设定即可,接下来就可以选 OK 继续编译了。
20.2.2 基本的设定档说明
Samba 的设定文件位置为 /usr/local/etc/smb.conf。在安装完后,设定文件的模板会放在 /usr/local/etc/smb.conf.default,您可以直接复制它来加以修改。
Samba 的设定档中,一个以中括号括起来的部份就是一个区段,如:[区段名称] 。除了 [global] 区段外,每一个区段都是一个分享资源的设定。在 [global] 区段中,决定了 Samba 服务器的主要设定,而其它区段则是不同分享资源的权限设定。[分享资源] 区段可以是打印机或是共享数据夹,我们可以针对不同的目录设定不同的权限。除了设定的数据外,在 smb.conf 档案中行首为 ";" 或 "#" 都是批注。
以下为 smb.conf 的主要的设定说明:
#===================== Global Settings =========================
[global]
# workgroup 就是设定计算机的工作群组。
   workgroup = Workgroup
# 要使用哪一种安全模式。如果设定为 share,就是任何人都可以存取,无需使用账号密码;
# 而设为 user 则是要输入使用者名称及密码。如果我们设为 user,必须要再设定使用者
# 使用者及密码。我们会在下一小节中做更详细的说明。
   security = user
# Windows 98 及 WinNT SP3 以上会将密码加密,我们必须将它设为 yes。
   encrypt passwords = yes
# 设定可以使用 Samba 的网络接口,可以是 IP/netmask 或是网络卡名称。
   interfaces = fxp1
# 设定新建档案时的权限为何。Samba 的权限除了看数据夹的权限设定外,还会看 UNIX 的
# 权限。我们将新建档案的权限设为 0666,新建目录设为 0777,以让不同使用者所建立的
# 可以让有权存取该共享数据夹的使用者存取。
   create mask = 0666
   directory mask = 0777
# 在下载档案时,我们使用 FreeBSD 的系统呼叫 sendfile() 以提高下载速度。使用
# sendfile() 可以提高效能近一倍喔!
   use sendfile = yes
#========================== Share Definitions ==============
# 这个区段是用来设定我们要分享的数据来。在这个区断中,有几个设定的范例可以让我们参考
# 。以下的范例为设定分享的目录是 /home/mp3,设定该目录的分享名称为 "music",只有
# wheel 群组的使用者才可以写入。
#
[music]
   path = /home/mp3
   write list = @wheel
# 另一个范例,假设我们要设定一个上传区,分享路径为 /home/upload,具有写入权限的帐
# 号是 alex 及 wheel 群组,而 samba 群组的使用者只有只读的权限。当 security
# 设为 user 时,我们必需先在系统中建立该真实使用者,再使用 smbpasswd 来建立
# Samba 的密码。必须要注意的是,当您设定某一个使用者对某个目录具有写入权限时,该使
# 用者在系统中对于该目录的 UNIX 权限也必须要有写入权限才可以喔。
[upload]
    path = /home/upload
    write list = alex,@wheel
    valid users = @samba
上述设定档中,在全域设定方面,您大概只需要修改「interfaces」部份即可。接下来的设定重点在于各个共享数据夹的设定。共享数据夹可以让我们分享系统中的某个目录,分享的名称以中括号括起来。例如,我们想要分享系统中的 /home/mp3,而使用者连进来后,看到的数据夹名称为「music」,则我们必须要设定一个区段名为 [music]。在共享资料夹权限设定方面,我们可以使用下列参数:
path:设定该共享数据夹在系统中的真正路径。
invalid users:设定不可以使用此数据夹的使用者。如果是群组名称,则必须在名称之前加上 @。有多个使用者及群组时,可以使用逗号分开。
write list:设定具有读写权限的使用者及群组。如果是群组名称,则必须在名称之前加上 @。有多个使用者及群组时,可以使用逗号分开。
valid users:设定具有读取权限的使用者。如果是群组名称,则必须在名称之前加上 @。有多个使用者及群组时,可以使用逗号分开。
browseable:设定该资料夹是不是要在使用者浏览有哪些资料夹时显示出来。可以设为 yes 或 no。如果设为 no,则该数据夹在浏览时并不会出现,而只能直接使用 \\ip\share 来进入该数据夹 (假设名称为 share)。
当我们联机到一个 Samba 服务器时,如果「security」模式设为 user,Samba 会先讯问使用者名称及密码。接下来,要进入一个共享数据夹时,会经过下列检查:
检查使用者是否在「invalid users」中,如果有,则不可以存取。
检查使用者是否在「valid users」中,如果有则可以存取。如果使用者不在「invalid users」及「valid users」中,则表示可以存取。
检查使用者是否在「write list」中,如果有,则具有读写权限。
基于上述规则,建议您先在「invalid users」中加入不可以使用 Samba 资源的群组,再设定可以读写的使用者即可。
您必须特别注意的是,由于 Samba 3.0 支持 Unicode (UTF-8),如果您要将共享数据夹名称设定为中文,请使用支持 UTF-8 的文书编辑器来编辑 smb.conf,并在存盘时将档案存成 UTF-8 的纯文字格式。Windows 支持 UTF-8 的文书编辑器如 Word、UltraEdit、EmEditor,在存盘时,必须使用 UNIX 的换行格式。以 Word 为例,在存盘时,我们将档案存成纯文字文件 (txt),接下来会出现下列选单:
图 20-2

接下来,您可以就可以将该档案放到 FreeBSD 中,并将扩展名 .txt 移除,更名为 smb.conf。还有一点,由于 Windows 的文书编辑软件会在档案最开头加入三个 Unicode 的辨识字符,当您以 ee 打开该档时,可能看到下列这样的内容:
嚜璟global]
workgroup = Workgroup
server string = FreeBSD
interfaces = lnc0
security = user
encrypt passwords = Yes
create mask = 0777
我们可以看到档案第一行的开头有乱码,这时候,请使用 ee 删除开始的三个字符,让第一行变成 [global] 即可。

小提示
支援 Unicode 的好处是您可以同时使用中文、日文、韩文等多国语。但在共享数据夹名称中使用中文时,设定会比较麻烦一点。不过您一定要记得,当共享数据夹要设为中文时,smb.conf 一定要存成 UTF-8 格式,否则数据夹名称会看不到或是变乱码喔。
对于分享的数据夹除了要在 Samba 设定你想要的权限外,对于该目录在 UNIX 系统上的读写权限也要配合。如果你在 Samba 中的设定都正确,却发现无法对该数据来写入,很可能是在系统中的权限没有正确设定,必须以 chmod 来加以修改。也就是说,如果您设定要分享 /home/mp3,而使用者 alex 登入后无法写入,可能是 Samba 的权限设定不对,或是该使用者在系统中对于该数据夹本来就没有写入权限。这时候,您必须使用 chmod 将 /home/mp3 的权限设为 777,这样该使用者才可以写入该目录。关于更详细的分享目录权限,请参考下一小节的说明。
修改完 smb.conf 之后,我们可以使用指令 testparm 来查看我们的设定有没有语法上的错误。
设定完 smb.conf 后,在启动 Samba 之前,我们必须先增加可以使用 Samba 的使用者密码。假设我们要新增使用者 alex,请先确定使用者 alex 是 FreeBSD 中的系统账号,接下来才可以请使用下列指令来设定它的 Samba 密码:# smbpasswd -a alex
New SMB password:
Retype new SMB password:
我们在 smbpasswd 中使用了参数 -a,表示新增使用者。如果您只是要修改使用者密码,则不需要使用参数 -a。一般使用者也可以使用 smbpasswd 来修改自己的密码。不过一般使用者在修改密码时,密码长度一定要大于五个字符喔。其它关于删除使用者、停用使用者账号的设定,请参考后续小节的说明。
Samba 会将使用者账号密码存放在 /usr/local/private/smbpasswd 中,您可以使用文书编辑器打开该档案,以查看目前有哪些使用者。

小提示
可以使用 Samba 资源的使用者一定要是系统中的使用者,而且必须先使用 smbpasswd 设定该使用者的密码喔。
20.2.3 启动 Samba
完成了设定之后,我们可以启动 Samba 了。请先编辑 /etc/rc.conf,并加入下列设定:
nmbd_enable="YES"
smbd_enable="YES"
我们在 /etc/rc.conf 设定启用 nmbd 及 smbd, smbd 这支程序是用来做分享数据的 daemon,而 nmbd 则是用来做名称服务的 daemon。如果没有跑 nmbd,您只能使用 IP 连到 Samba。例如,\\192.168.0.1;而有 nmbd 后,您可以使用主机名称 (hostname) 连到 Samba,例如,\\freebsd (假设您的主机名称是 freebsd.twbsd.org)。
接下来,请先将 Samba 的启动程序更名:# cp /usr/local/etc/rc.d/samba.sh.sample /usr/local/etc/rc.d/samba.sh
最后,我们就可以使用下列指令启动 Samba 了:# /usr/local/etc/rc.d/samba.sh start
现在您就可以从 Windows 端联机到 Samba 了,您可以在档案总管的网址列输入 \\ip 或 \\hostname 来使用联机资源。
20.3 smb.conf 设定说明
Samba 的设定档中有很多细项可以让我们进行微调,建议您可以浏览一遍,以了解有什么是您需要的设定。以下我们就针对比较常用的项目分别说明。
20.3.1 global 区段的基本设定
fstype
我们可以使用 Windows 的联机网络磁盘驱动器功能,将一个共享数据夹变成系统中的网络硬盘。例如,将共享数据夹变成 Z: 磁盘驱动器。如果您点选该网络磁盘驱动器,并查看内容,您会看到它的档案系统格式为 NTFS,如下图所示:
图 20-3

您可以经由设定 fstype 以改变设定。例如,下列设定是将档案系统变成 UFS2:
fstype = UFS2
netbios name
netbios name 就像是 Windows 中的计算机名称一样,如果您检示工作群组中的计算机,您可以看到预设的是您的 hostname。您可以修改 netbios name 为其它名称,如 snoopy,这样一来您就可以使用 \\snoopy 来连到该计算机。
pid directory
设定用来放 smbd 及 nmbd process id 的档案路径。预设是 /var/run。
server string
在我们查看网络上的芳邻时,除了可以看到计算机名称外,在计算机名称后还会加入一串计算机描述。预设的描述是 Samba + 版本名称。您可以任意设定这个字符串。在设定时,如果您使用 %v,则 %v 会被取代成为 Samba 的版本名称。而 %h 则会被取代成为主机名称。
workgroup
设定工作群组。
20.3.2 global 区段的安全性设定
admin users
设定管理者账号。预设的管理者账号为 root。在管理者账号中的使用者,Samba 不会去检查该使用者在 UNIX 系统中的权限,而会一律以 root 的身份执行删除档案、建立新档案等动作。预设并没有设定管理者账号,也就是没有其它使用者被设定为具有 root 的权限。如果您要设定使用者 alex 具有管理者账号的权限,可以加入下列这一行:
admin users = alex
available
available 可以让我们设定是否要停用 Samba 服务。如果 available 设为 no,则会禁止使用者登入,而且所有登入的动作都会被记录下来。
create mask
设定新建档案时的权限为何。Samba 的权限除了看数据夹的权限设定外,还会看 UNIX 的权限。例如,如果我们将 /home/music 设定让使用者 alex 及 john 都有写入的权限,当使用者 alex 建立了一个档案后,而 john 要去删除该档案时,因为该档案的拥有者不是 john,如果档案的权限是 644,则 john 会无法删除档案。我们可以将新建档案的权限设为 0666,这样一来,john 也可以删除使用者 alex 所建立的档案。这样设计的好处是我们可以让所有权限的控制都交由 Samba 的数据夹权限控制,而非 UNIX 权限。
directory mask
这是用来设定新建目录时权限为何。它的作用和 create mask 差不多,只是会用在目录的权限上。
encrypt passwords
设定是否要使用加密过的密码。Windows 98 及 WinNT SP3 以上会将密码加密,我们必须将它设为 yes。
follow symlinks
设定是否要允许使用者取得、进入 symbolic link 的真的目录及档案。预设是 yes,在设为 yes 的情况下,如果您分享了 /home/music,但在该目录中有一个 symbolic link 指向 /usr/local,则使用者也可以进入到 /usr/local 目录中。这样的设定比较危险。例如,如果使用者可以进入系统中对 /home/music 做 symbolic link,则他可以建一个连结到 /etc/master.passwd,这样使用者就可以从共享数据夹中去存取 master.passwd 这个档了。
guest account
设定 guest 账号,预设是 nobody。当我们在共享数据夹权限中设定了 guest ok 为 yes 时,使用者可以使用这个账号去存取该数据夹,而不需任何密码。这个使用者一定要是系统中的使用者。
map to guest
是否要将登入错误的使用者对映到 guest 使用者而登入,预设是 Never。这个设定只有在 security 不是 share 时才有用。在设定时可以有下列三种模式:
Never:不会自动将登入失败的使用者变成 guest 使用者登入。
Bad User:只有在使用者名称正确,但密码错误时才会自动将使用者身份变成我们在 guest account 中设定的使用者。
Bad Password:只要密码错误就自动转成 guest。
使用自动对映到 guest 使用者的好处是,一般使用者不需要记得自己的密码就可以登入。但缺点是如果使用者登入失败,其身份会自动变成 guest,他有可能会无法使用原本自己账号该有的权限去存取档案。
null passwords
是否允许使用空白密码。预设是 no。
security
这个项目可以说是 Samba 设定文件中最重要的项目,它控制了使用者的登入行为及使用者认证的方法。我们可以将 security 设定为 share、user、server、或 domain,分别说明如下:
share:不需要密码就可以使用 Samba,所有的使用者会被当作 guest 账号。
user:使用者必须要使用合法的账号密码才可以登入。合法的使用者必须是系统中的使用者,而且有使用 smbpasswd 加入 Samba  的密码文件中。
domain:使用 Windows Domain Server 进行身份认证。使用者必须同时是系统中的真实使用者,并且在 Windows Domain Server 中存在才可以登入。
server:设定使用另一台 SMB 主机作身份认证。SMB 主机可以是另一台 Samba 服务器或是 NT Server。
关于 security 的设定相当复杂,建议您使用 user 的模式。如果您有需要使用其它模式,请参考 Samba 网站上关于 smb.conf 的说明。
20.3.3 global 区段的效能调校设定
max open files
设定同时最多可以开启多少档案,预设是 10000。我们通常不需要修改它。
socket options
这个项目控制了开启网络连结 (socket) 时,要设定的选项。预设只有 TCP_NODELAY。如果您有需要调校,请 man setsocopt。
use sendfile
设定下载档案时是否要使用 sendfile()。当设为 yes 时,在下载档案时,会使用 sendfile() 这个系统呼叫,而非传统的读写动作。传统的读写动作必须由 kernel 读取数据,送数据到 Samba,再由 Samba 将资料写到 Kernel,接着才由 Kernel 送到网络上。而使用 sendfile 时,会变成由 kernel 读出档案数据后,直接送到网络上。如此一来,可以大大的提高效率。
20.3.4 global 区段的记录文件及除错设定
log file
设定要将 Samba 记录文件存成什么文件名。我们可以设定针对不同的使用者、不同的来源存成不同的记录文件。例如,我们可以设定 log file 为 /var/log/samba/log.%m,表示将记录文件依不同的来源主机存放,%m 会被取代成为主机名称。您还可以使用 %d 表示 process id,%l 表示客户端的 IP,还有更多代号请 man smb.conf。
log level
设定记录的等级,等级可以设等级的数字可以是 0 到 10。设定为 0 时的记录最少,设定为 10 的记录内容最详细。这个设定值会影响到系统效能,如果等级设得越高,则要记录的东西越多,自然速度会越慢。
max log size
设定记录文件最大的大小,预设是 5000。如果设为 0 表示不限制。在记录文件超出设定值时,Samba 会将该档案更名为 .old 文件,并建立新的记录文件。
20.3.5 global 区段的网络资源设定
deadtime
设定当客户端联机多久没有动作则自动断线并离开子程序。当有客户端联机时,smbd daemon 会产生一支新的子程序来处理客户联机,但是如果客户端一直没有动作,这个子程序的存在只是占用了内存。我们可以设定一段时间没有动作则自动断线,以节省资源。而一般的客户端在断线后,如果有需要在使用资源,会自动联机,使用者不会有任何感觉。预设并没有设定自动断线。
domain master
在 SMB 协议中,同一个 workgroup 的所有计算机中,通常开机最久的计算机会被当做 master browser。当工作群组中的计算机要查询群组中的主机名称时,会到该计算机上查询。如果我们将 domain master 设为 yes,则 nmbd 会告诉工作群组中的计算机这台 Samba 服务器是 master browser,而 Samba 就会将工作群组中的计算机清单存下来,以供客户端查询。建议您将这个项目设为 no,以免占用系统资源。
hosts allow
设定可以使用 Samba 服务的客户端来源。预设并没有设定 host allow,也就是允许任何人联机。以下是几个设定的范例:
host allow = 150.233. except 150.233.1.1:表示允许除了 150.233.1.1 外的其它 150.233.x.x 的机器联机。
host allow = 192.168.0.0/255.255.0.0:表示允许所有 192.168.x.x 联机。
hosts deny
这个项目和 host allow 类似,只是它是用来设定不可以使用 Samba 服务的来源。
interfaces
设定 Samba 只提供服务给此接口的网络卡。如果您有二张网络卡,一张对内,一张对外,则可以设定只允许内部使用 Samba。这个设定可以是网络卡代号、IP/Mask、IP。如果您设定为 fxp*,则表示 fxp0、fxp1 都可以使用。
bind interfaces only
如果没有将 bind interfaces only 设为 yes,则 Samba 只会限制 smbd 只提供档案服务给上列 interface 的网卡。而还是允许其它网卡使用 nmbd 服务进行广播。
max connections
设定最多同时联机的数目,预设是 0 表示没有限制。
wins support
设定是否支持 wins 服务器。由于 SMB 名称查询是使用广播的方式。当有不同的子网域时,需要有 wins 服务器才可以查询到不同子网域的数据。所以如果您有不同子网域时,您可以设定使用 wins 服务器,否则不需设定。
wins server
设定 wins 服务器的 IP。
20.3.6 分享权限设定
本小节将说明分享资料夹时,我们可以对资料夹设定什么权限。每一个数据夹都是一个独立的区段,我们可以分别对不同的数据夹设定不同的权限。例如,是否要允许使用者 A 存取、读写权限为何等等。
browseable
这个项目设定当使用者连到本服务器时,在列出所有共享数据夹时,是否要列出这个资料夹。如果设为否,则使用者联机到本机时,不会列出此目录。但是使用者还是可以使用 \\xxx\share 来直接进入该数据夹。
这项设定的好处是,您可以隐藏不想让使用者看到的共享数据夹,只有知道路径的人才可以存取它。
comment
设定数据夹批注。在使用者从网络芳邻中浏览数据夹时,这个批注会出现在数据夹名称后面。
guest ok
是否允许 guest 账户使用本共享数据夹。
hide dot files
是否要将档名为 . 开头的档案当成隐藏档,预设是 yes。
invalid users
设定不可以使用本共享数据夹的使用者。这个项目可以是一堆用逗号分开的使用者、群组清单。如果是群组名称,则必须在名称之前加上 @。
path
设定此共享数据夹在系统中的绝对路径。
valid users
设定可以使用本共享数据夹的使用者。这个项目可以是一堆用逗号分开的使用者、群组清单。如果是群组名称,则必须在名称之前加上 @。如果使用者同时出现在 invalid users 及 valid users,则不可以存取本数据夹。
write list
设定可以对本共享资料夹进入写入动作的使用者。这个项目可以是一堆用逗号分开的使用者、群组清单。如果是群组名称,则必须在名称之前加上 @。
20.4 使用网页设定 Samba
除了使用文字编辑软件来修改 smb.conf 并用命令列工具设定使用者数据外,我们可以使用 Samba 内建的网页接口工具来进行设定。我们在编辑 smb.conf 时,如果要使用中文数据夹名称时,由于数据夹名称是 Unicode,我们必须使用 Word 来编辑。但如果我们使用 Samba 的网页接口工具,预设就是 UTF-8 了,在设定上会容易许多。
首先编辑 /etc/inetd.conf,将最下方 swat 的批注拿掉:
swat stream tcp nowait.400 root /usr/local/sbin/swat swat
最后重新启动 inetd:# kill -1 `cat /var/run/inetd.pid`
然后就可以使用浏览器以 port 901 连到 Samba Server了。假设 Samba 的 ip 是 192.168.0.1,则输入 http://192.168.0.1:901,被要求输入账号密码时,请输入 root 及 root 在系统中的密码。请注意 root 一定要有密码,否则无法登入。接着出现下列画面:
图 20-4

在 swat 的首面中,有很多说明文件的连结供您参考。
接下来,我们选GLOBALS来看全域设定:
图 20-5

这里的每一个选项,我们都可以参考上一小节中的说明来设定,设定完后记得要 「Commit Changes」来使设定生效。
如果要开放一个新的目录,我们可以选 SHARES 来设定分享的资料夹:
图 20-6