第十六章 数据库系统
16.1 概论
电子商务的兴起让数据库的应用更受到大家的瞩目。在信息科学的应用上,数据库可以说是最历久弥坚的领域。近来,数据产生和数据收集方面的技术有非常快速的进展。许多商业产品广泛使用了条形码、许多企业和政府的交易皆已计算机化,这使得计算机成为数据收集的主要工具。同时,数以百万计的数据库正被使用在企业管理、政府管理、科学和工程的数据管理和许多其它的应用上。
我们可以安装一套数据库系统,并经由一个接口自行开发程序来使用它。数据库的好处有很多,相信对数据库稍有涉入的人都知道,例如数据存取快速、不重复、权限控制、数据独立性等等。以写一个简单的留言版程序而言,传统上使用档案做为留言的记录,若要删除一笔数据,必须对整个档案一行一行的比对;但数据库只需指定该留言的编号即可。不过,如果把数据库系统局限于留言版也太大才小用了。
我们将介绍在 FreeBSD 上使用数据库,因为目前网页数据库使用情形十分风行,尤其在网页开发上使用 MySQL+PHP 更是绝配,所以我以 MySQL 为主介绍它的用法。为什么选用 MySQL 而不选择其它的数据库,因为它简单、免费、功能强大、具有多平台、多执行绪、且参考文件多。你可以到 MySQL 的网站上参观 http://www.mysql.com。除了 MySQL 外,还有另一套不错的数据库 Postgre SQL 也不错,和 MySQL 比较起来,其最大的优点就是支持 transaction。
所谓的 transaction 就是将一连串的 SQL 指令做为一个执行单位,当其中一个指令失败,在同一个 transaction 所执行过的命令都取消。Transaction 对于程序开发的应用十分重要,例如,当我们要新增处理一笔订单时,我们会先将订单输入数据库中,再将金额输入应收帐款中。如果我们在新增应收帐款时出现错误,而订单却已输入数据库,是不正确的做法。有了支援 transaction 的数据库,我们可以将订单的输入和应收帐款的输入做为一个执行单位,如果其中一个执行失败,则取消先前先做的动作,如此一来便可以确保数据的正确性。由于 transaction 十分重要,因此在做为商业上的应用时,我会选择 PostgreSQL。所以除了 MySQL 外,我们也会介绍如何在 FreeBSD 上安装及使用 PostgreSQL。在这一章中,我们不再介绍如何安装 MySQL,您可以参考第十章网页服务器中关于安装 MySQL 的说明。
在使用数据库之前,我们必须先了解一些简单而基本的数据库理论。基本上数据库的结构有下列几个特点:
例如我们有一个数据库名称是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 我们可以去 studnet 的数据表中找到学生的数据。
有了这些观念就足以让我们开发出许多数据库的程序了。
16.2 SQL 语法介绍
SQL (Structured Query Language) 语法十分简单,它是关系型数据库的标准语言,虽然在某些不同数据库系统上有些许的差异,但基本上都遵循一定的标准。
我们可以在命令列下进入 MySQL 来练习 SQL 的语法:
# /usr/local/mysql/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.0.18 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 每个细节都有详细的描述,例如字段的名称限制、规则等,我们不会在这里提及。我们只介绍几个简单而常用的指令。 我们以建立一个学生数据表来说明这些语法。
16.2.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) |
16.2.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; |
16.2.3 DROP
删除数据库:DROP DATABASE db_name
删除数据表:DROP TABLE table_bame
我们可以使用 DROP 指令来删除不要的资料。例如我们要删除 STUDENT 这一个资料表的话,可以使用下列指令:
mysql> DROP TABLE STUDENT; |
16.2.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 会自动帮我们依序指定。
16.2.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 指定就够我们做一般的应用了。
16.2.6 UPDATE
我们可以使用 UPDATE 指令来更新记录。例如我们要将所有记录的部门数据为 MIS 者都改成 CSIE,可以使用下列指令:
mysql> UPDATE STUDENT SET DEPARTMENT='CSIE' WHERE DEPARTMENT='MIS'; |
16.2.7 DELETE
DELETE 指令可以让我们删除一笔或多笔数据。例如我们要删除 STUDENT 数据表中姓名为 JACK 的记录:
mysql> DELETE FROM STUDENT WHRE NAME='JACK'; |
如果我们要删除姓名为 JACK 且部门为 MIS 的数据:
mysql> DELETE FROM STUDENT WHERE NAME='JACK' AND DEPARTMENT='MIS'; |
16.2.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/mysql/bin/mysql -u root -p < ncu.sql
输入使用者 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/mysql/bin/mysql -u root -p NCU <ncu.sql
在网络上有许多 PHP 程序可以下载,下载后要安装数据库时,大多是以这种方式来使用。
16.3 MySQL 管理
16.3.1 维护密码安全
当我们要使用 MySQL 时,必须输入密码。输入密码的方式有很多种,第一种也是最不安全的一个方式是直接在命令列打指令时就输入:
# /usr/local/mysql/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
16.3.2 备份数据库
数据库的数据要定时备份,这样才不会在失手时或系统有问题时产生困扰。在 MySQL 中提供一个备份程序 msqyldump。
假设我们有一个数据库名为 WWW,我们可以使用下列指令来备份整个数据库:
# /usr/local/mysql/bin/mysqldump -u root -p WWW > www.sql
这样就可以把数据库的数据存在 www.sql 这个档案中了。日后要回复时只要使用下列指定就可以把资料存回:
# /usr/local/mysql/bin/mysql -u root -p WWW < www.sql
我们要注意的是备份出来的档案应该要放在不同的计算机中,而且要注意权限的控制。由于该文件是文字文件,任何人都可以读,所以要特别注意。
我们可以利用 crontab 这个指令来定时备份数据库。我们先建立一个 shell script 档,名为 backupsql.sh,内容如下:
/usr/local/mysql/bin/mysqldump -uroot WWW>/home/www.sql chmod 600 /home/www.sql |
接着将该档权限改成只有拥有人可以读、写、执行,其它人都不行:
# chmod 700 backupsql.sh
然后建立 ~/.my.cnf 档案内容如下:
[client] password=your_passowrd |
接着要把 .my.cnf 的权限改成只有档案拥有者才可以读写:
# chmod 600 ~/.my.cnf
接着要让它能定时执行,命令列打 crontab -e 来进入文字编辑,加入下列内容:
#每天 3:05 备份网页数据库 5 3 * * * /root/backupsql.sh |
16.3.3 使用者管理
MySQL 对于使用者的权限控制存放在名为 mysql 数据库中的 user 数据表内。user 数据表内有下列几个字段:
字段名称 | 权限 | 说明 |
Host | 使用者来源主机。 | |
User | 使用者名称。 | |
Password | 密码。 | |
Select_priv | select | 对 table 做 select 动作。 |
Insert_priv | insert | 对 table 做 insert 动作。 |
Update_priv | update | 对 table 做 update 动作。 |
Delete_priv | delete | 对 table 做 delete 动作。 |
Index_priv | index | 对 table 做 index 动作。 |
Alter_priv | alter | 对 table 做 alter 动作。 |
Create_priv | create | 对 table 、indexs 或 database 做 create 动作。 |
Drop_priv | drop | 对 table 或 database 做 drop 动作。 |
Grant_priv | grant | 对 table 或 database 做 grant 动作。 |
References_priv | references | 对 table 或 database 做 references 动作。 |
Reload_priv | reload | 系统管理,权限拥有者可以执行 reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables。 |
Shutdown_priv | shutdown | 系统管理,权限拥有者可以执行 shutdown。 |
Process_priv | process | 系统管理,权限拥有者可以执行 processlist, kill。 |
File_priv | file | 对系统上的档案有存取权限。 |
我们在新增一个 MySQL 使用者时,有二种方式。比较差的方式是使用 INSERT 指令:
# /usr/local/mysql/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.0.18 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> insert into user values ('host','user', password('密码'), 'y','y','y','y','y','y','y','y','y','y','y','y','y','y'); Query OK, 0 row affected (0.00 sec) |
上面 mysql 指令中的 host 就是要予许联机的主机,如果是本机则输入 localhost;而 user 是使用者名称;密码是该使用者的密码,要使用 password() 函数来将它加密;接下来的一堆 'Y' 就是对上表中的权限是否要开放,如果不开放则填 'N'。
第二种方式是使用 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) |
16.3.4 如何更改使用者密码
我们可以使用下列指令来更改自己的密码:
# /usr/local/mysql/bin/mysqladmin -u root -p password newpwd
上面指令中的使用者是 localhost 的 root ,新的密码是 newpwd。在输入指令后,会先询问你旧的密码。
我们也可以使用具有管理使用者权限的 mysql 使用者登入 MySQL 后,使用 UPDATE 指令来更改密码:
# /usr/local/mysql/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.0.18 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> UPDATE user set password=password('新密码') where user='使用者' and host='主机'; |
16.4 PostgreSQL 安装设定
您可以选择使用 ports 或 package 来安装 PostgreSQL,我们以 ports 安装为例:
# cd /usr/ports/databases/postgresql7 # make install
执行了 make install 之后,您将看到一个提示讯息,要求你先行备份原本的数据库。如果您是第一次安装 PostgreSQL,可以直接略过。
安装完成后,我们就可以开始做数据库的初始化了。我们使用下列指令来初始化数据库:
# su -l pgsql -c initdb
这个指令的意思是以使用者 pgsql 的身份执行 initdb 并设定预设的编码方式为 SQL_ASCII。PostgreSQL 安装时会自动建立一个使用者及群组 pgsql,这是 PostgreSQL 预设最高使用者的账号,您可以使用 vipw 来修改该使用者的数据。由于 pgsql 预设使用的 shell 是 sh,笔者习惯使用 tcsh,所以我将该使用者的数据修改如下:
pgsql:*:70:70::0:0:PostgreSQL Daemon:/usr/local/pgsql:/bin/tcsh |
初始化数据库后还有一些后续的设定。一开始 PostgreSQL 只允许让 pgsql 这个使用者经由本机联机存取数据库,如果您希望其它使用者可以经由其它机器联机,您必须先修改 ~pgsql/data/postgresql.conf 这个档案。找出 tcpip_socket 的部份,并修改如下:
tcpip_socket = true |
postgresql.conf 这个档案记录着 PostgreSQL 的其本设定,其中使用 "#" 为首的是批注。
接着我们要设定从别的机器联机所使用的认证方式,请编辑 ~pgsql/data/pg_hba.conf,在文件最下方加入下列设定:
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD local all all trust host all all 127.0.0.1 255.255.255.255 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 ,以下为启动数据库服务的指令:
# /usr/local/etc/rc.d/010.pgsql.sh start
因为 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 这个使用者从远程登入了。
16.5 PostgreSQL 管理指令
PostgreSQL 和 MySQL 在指令的应用上有所不同,它将许多管理数据库的指令独立成一个个的执行文件,其中有些指令是使用 psql 为基础所写成的 scripts。例如新增、删除数据库或使用者等指令,都可以直接在命令列执行。以下为常用的指令列表:
指令 | 用途 |
createdb | 建立一个新的数据库。 |
dropdb | 删除数据库。 |
createuser | 建立数据库使用者。 |
dropuser | 删除数据库使用者。 |
pg_dump | 备份一个数据库。 |
pg_dumpall | 备份所有数据库。 |
psql | 交互式的 SQL 指令工具。 |
16.5.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 是不被允许的。
16.5.2 建立及删除数据库
在使用数据库之前,我们必须先建立一个数据库。假设我们要建立的数据库名称为 MYDB,您可以使用下列指令加以建立:
% createdb MYDB
在 UNIX 的世界中,大小写是有分别的,在 PostgreSQL 中也是一样。因此,不论是在建立数据库,数据表或其字段时,都要注意大小写。建议您除了数据库名称外,最好全部使用小写。
同样的,如果你要删除一个数据库,只要使用 dropdb 这个指令:
% dropdb MYDB
16.5.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=#
在这里,我们可以使用 16.2 所列出的一些标准的 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 列出该数据库的所有数据表。
如果您觉得这种命令列的接口不好使用,我们在下一节将会介绍如何在 FreeBSD 及 MS Windows 使用图形化接口的管理工具。
16.5.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
16.6 PostgreSQL 图形化管理工具介绍
许多人可能不太习惯使用命令列来管理数据库,还好 PostgreSQL 提供了许多图形接口的管理工具。您可以在 MS Windows 执行的 pgAdmin,另外也有 ODBC 接口可供使用。由于这些图形接口操作上比较容易,只要您多试几次,就可以熟悉它们的使用,因此,我们不会深入介绍每个功能的用法。
15.6.1 pgAdmin
如果您习惯使用 MS Windows,您可以使用 pgAdmin 在 MS Windows 上管理数据库。对于初学者而言,使用 pgAdmin 会比在命令列中输入来得容易。您可以自 http://pgadmin.postgresql.org 下载最新版本的 pgAdmin,或者您也可以在本书光盘二 /wintools 目录中找到 pgadmin3-1_0_2.zip。您只要将它解压缩,即可安装。
接着我们打开 pgAdmin,按了左上角的图示后即出现联机设定的窗体。请输入您数据库服务器的位置及账号密码,如图 16-1 所示:
图 16-1
请注意,您必须先将 PostgreSQL 的 TCP/IP 联机打开,而且在 pg_hba.conf 中必须允许使用 pgAdmin 的这台主机登入。您可以参考 16.4 中的说明来设定 pg_hba.conf。输入联机数据后,即可开始使用。以建立一个新的数据库为例,我们先在左边的窗口中,对着数据库按右键,再选取 [新物件]->[新建数据库] 如图 16-2 所示:
图 16-2
接着我们可以输入数据库名称、编码方式等,如图 16-3:
图 16-3
其它建立资料表等操作也都大同小异,您可以每一个功能都试试看。
16.6.2 ODBC
许多人习惯在 MS Windows 上做程序开发,透过 ODBC 存取数据库。PostgreSQL 也有提供 ODBC 驱动程序,你可以自 http://odbc.postgresql.org 下载,也可以在本书光盘二 wintools 目录中取得 psqlodbc-07_02_0005.zip。解压缩并安装后,您就可以开始做 ODBC 设定。
如果您使用的是 Windows NT、Windows 2000、或 Windows XP,请执行 [控制台] -> [系统管理工具] -> [资料来源]。如果你使用的是 Windows 98、Windows ME,请执行 [控制台] -> [资料来源]。
图 16-4
我们接着点选 [档案数据来源] -> [新增],然后会出现以下画面:
图 16-5
我们选择 PostgreSQL 为数据来源后,将出现图 16-6 的画面:
图 16-6
我们为它取一个名字并决定储存地点后,按下一步即完成。完成后会出现图 16-7 的画面让您输入认证的数据,全部输入后即完成 PostgreSQL ODBC 的安装。
图 16-7