第 3 部分:DBMS 实例和存储对象
命令
dbschema 命令不仅允许 DBA 查看在数据库中运行什么 SQL 语句来创建对象,它还允许通过一种简单的方法在数据库中创建对象。
到目前为止,我们讨论的所有对象都带有一个简单的 DROP 语句,该语句用于从数据库删除对象及其所有引用。
DROP TABLE customer; DROP INDEX cust_idx; DROP VIEW cust_view; DROP SEQUENCE cust_seq; DROP TRIGGER cust_ins_trigger; DROP SYNONYM cust_syn;
|
DROP SQL 语句执行完毕之后,对象就不再存在,并且不留下任何能够表示它曾经存在的痕迹。要取回对象,必须使用 CREATE SQL 语句再次创建该对象。
如果重新创建对象的人和第一次创建该对象的人不是同一个人,会发生什么情况呢?他们是不是不知道最初使用过的 CREATE 语句?或者时间太长了,忘记以前的 CREATE 语句什么样的了?
答案是 dbschema 命令。dbschema 命令允许 DBA 请求曾经用于从数据库创建对象的 SQL 语句,包括整个数据库以及它包含的所有对象。
dbschema 命令是一个可以从命令行执行的命令;它不是 SQL 语句。
下面的清单(清单 37 - 41)显示了 dbschema 命令的不同选项。这里仅显示了其中的 4 个选项;这些选项不会相互排斥,因此您可以在同一个 dbschema 命令中使用所有这些命令。dbschema 命令的唯一一个非可选选项是 -d database-name 选项。
清单 37 中的例子仅指定了 -d 选项和数据库名 testdb。这个例子将找回数据库中的所有对象,包括表、视图、同义词、限制、权限和触发器等。
dbschema –d testdb
|
清单 38 中的例子使用可选的 -t tablename 选项和数据库名输出一个表的信息。
dbschema –d testdb –t customer
|
清单 39 显示了这个命令的输出:
DBSCHEMA Schema Utility INFORMIX-SQL Version 11.50.FC4
{ TABLE "informix".customer row size = 69 number of columns = 4 index size = xx } create table "informix".customer ( ssn char(11), lname char(50), age integer, birthday date );
revoke all on "informix".customer from "public" as "informix";
|
清单 40 中的例子实际使用了 tablename,并且要求输出在 UPDATE STATISTICS 运行期间为表生成的柱状图。这些柱状图根据对表最后一次运行 UPDATE STATISTICS 使用的值显示数据在表中的分布。
dbschema –d testdb –hd customer
|
清单 41 中的例子使用 -f routine-name 选项输出 ins_mailing_list 存储过程:
dbschema -d testdb -f ins_mailing_list
|
注意:必须在删除对象之前运行 dbschema 命令。一旦删除对象之后,数据库中将不包含任何与该对象相关的东西,包括 dbschema 输出对象所需的定义。
有一些对象不能通过 dbschema 命令单独输出。没有选项能够输出单独的索引、触发器或限制,因为它们都属于表的。要输出它们,必须先输出表。
dbschema –d testdb –t customer
|
DBSCHEMA Schema Utility INFORMIX-SQL Version 11.50.FC4
{ TABLE "informix".customer row size = 69 number of columns = 4 index size = xx } create table "informix".customer ( ssn char(11), lname char(50), age integer, birthday date , unique (lname) constraint "informix".uniq_lname, check ((age > 0 ) AND (age < 125 ) ) );
revoke all on "informix".customer from "public" as "informix";
create index "informix".cust_idx on "informix".customer (ssn) using btree ;
create trigger "informix".cust_ins_trigger insert on "informix" .customer referencing new as new for each row when ((new.birthday < DATE ('01/01/2000' ) ) ) ( execute procedure "informix".ins_mailing_list(new.lname ,new.birthday ));
|
清单 42 和 43 中的例子不包含任何关于输出的对象的特定于服务器的信息。特定于服务器的信息包括表锁模式、表区段大小和表片段等等。要获得特定于服务器的信息,您必须在命令行指定 –ss 选项。
dbschema –d testdb –t customer –ss
|
DBSCHEMA Schema Utility INFORMIX-SQL Version 11.50.FC4
{ TABLE "informix".customer row size = 69 number of columns = 4 index size = xx } create table "informix".customer ( ssn char(11), lname char(50), age integer, birthday date, unique (lname) constraint "informix".uniq_lname, check ((age > 0 ) AND (age < 125 ) ) ) extent size 100 next size 50 lock mode row; alter fragment on table "informix".customer init fragment by round robin in dbs1 , dbs2 ;
revoke all on "informix".customer from "public" as "informix";
create index "informix".cust_idx on "informix".customer (ssn) using btree ;
create trigger "informix".cust_ins_trigger insert on "informix" .customer referencing new as new for each row when ((new.birthday < DATE ('01/01/2000' ) ) ) ( execute procedure "informix".ins_mailing_list(new.lname ,new.birthday ));
|
注意区段大小、锁模式和片段模式是如何列出在语句中的。–ss 语句能够重新创建数据库或表的完整(而不是类似)副本。
dbschema 命令易于理解和使用。在设备中,dbschema 命令和定期备份一般都是灾难恢复计划的一部分。当某人删除了一个表,并且不记得该表是否带有索引、触发器或限制时(因为他们在删除之前忘记执行检查),dbschema 命令的最近输出就十分有用。
您一定要熟悉该命令及其各个选项。
>dbschema --
USAGE:
dbschema [-q] [-t tabname] [-s user] [-p user] [-r rolename] [-f procname] [-hd tabname] -d dbname [-w passwd] [-seq sequence] [-l [num]] [-u [ia] udtname [all]] [-it [Type]] [-ss [-si]] [filename] [-sl length]
-q Suppress the db version from header
-t table name or "all" for all tables
-s synonyms created by user name or "all" for all users
-p permissions granted to user name or "all" for all users
-r create and grant of the role or "all" for all roles :Not a valid option for SE
-f SPL routine name or "all" for all SPL routines
-hd Histograms of the distribution for columns of of a specified table, a specific table column, or "all" for all tables.
-d database name
-w database password
-seq generate sequence specific syntax
-u Prints the definitions of user-defined data types
-ui Prints the definitions of user-defined data types, including type inheritance
-ua Prints the definitions of user-defined data types, including all functions and casts defined over a type
-u all Directs dbschema to include all the tables in the display of distributions
-it Type of isolation can be DR, CR, CS or RR
-l set lock mode to wait [number] optional
-ss generate server specific syntax
-si excludes the generation of index storage clauses for non-fragmented tables
-sl the maximum length (in bytes) of unformatted CREATE TABLE and ALTER FRAGMENT statements.
filename is the name of file that the SQL script goes in.
|
注意:dbschema 命令仅输出对象的定义,与储存在对象中的数据毫无关系。复制表中的数据需要用到另一种方法,比如 SQL 语句 UNLOAD/LOAD。
创建和配置数据库储存对象
IBM Informix Dynamic Server 提供两个数据存储选项:
遵循以下步骤准备一个可供 IDS 使用的原始设备:
要创建原始设备,请参考 UNIX 系统的系统管理手册。
如果您要对现有的磁盘进行重新分区,建议您在卸载设备之前存档数据,然后在执行重新分区。
以千字节为单位表示每个原始设备的大小。您在创建块(chunk)时需要使用该信息。
要准备在数据库服务器中使用的原始设备,请按照以上的步骤 2、3 和 4 中的命令设置权限、归属和组。
注意:不要执行 mount 命令,它将装载设备并指示操作系统与设备进行交互。另外,也不要使用 mkfs 命令,它将在设备上构造一个文件系统。如果您在 IDS 正在使用的原始设备上运行 mkfs,那么将损坏数据库信息。
要在原始设备上划分块时,请通过链接为设备分配一个更具描述性的名称(例如,/dev/ifmx-raw-001)。这将有助于记住对每个块使用的设备名,更重要的是,这样做允许您在遇到磁盘设备失败时为新的设备重新定义一个链接。
清单 7 提供一个示例会话,其中准备了一个用作 Dynamic Server 块的原始设备:
$ ln /dev1/rxy0f /dev/informix-raw-001 or: ln -s /dev1/rxy0f /dev/informix-raw-001 $ chmod 660 /dev/informix-raw-001 $ chgrp Informix /dev/informix-raw-001 $ chown Informix /dev/informix-raw-001 $ ls -lg /dev/informix-raw-001 crw-rw---- 2 informix informix 9, 5 Jan 1 12:00 /dev/informix-raw-001 |
遵循以下步骤创建可供 IDS 使用的 cooked 文件:
我们不推荐对块使用 UNIX 文件,尤其是您的系统可以利用内核 AIO 时。不过,设置 cooked 文件非常容易,并且不需要了解磁盘设备的可用性。如果您希望对块使用 UNIX (cooked) 文件,则必须为块设置一个文件。
使用以上步骤 1 的命令,将 filename 替换为 cooked 文件的名称。然后,使用步骤 2、3 和 4 中的命令更改文件的权限和归属。
清单 8 提供了一个示例会话,其中创建了一个 cooked 文件:
$ touch /dev/informix-cooked-001 $ chmod 660 /dev/informix-cooked-001 $ chgrp informix /dev/informix-cooked-001 $ chown informix /dev/informix-cooked-001 $ ls -lg /dev/informix-cooked-001 -rw-rw---- 1 informix informix 0 Jan 1 12:00 /dev/informix-cooked-001 |
在初始化之前,出现在组名之后的 length 字段显示的值为 0。
到目前为止,您不需要为该文件分配空间。当您把块分配给服务器并指定块的大小时,服务器将 cooked 文件的大小增加到您指定的大小,从而给该块分配空间。
服务器不使用 UNIX 文件系统进行磁盘空间管理,它使用自己的机制管理磁盘空间 —— 这些机制更适合用于数据库管理。
必须让服务器可以使用物理空间。分配空间的单位为块。
块是分配给服务器使用的连续磁盘空间单元;服务器在块中管理空间的使用。块可以是一个 UNIX 原始设备,或是 UNIX cooked 文件。
通常通过一些项来唯一地识别块:
它可以是:
它被指定了以千字节为单位的大小,并且由服务器在内部进行管理。
在 Windows 系统上,块可以是 NTFS 文件或原始磁盘空间。它由服务器在内部进行管理。我们不推荐在 Windows 上使用原始磁盘(未格式化分区),因为不希望在 Windows 系统上使用原始磁盘的用户可能错误地对其执行格式化操作。
当给数据库服务器分配了块之后,块将被分成更小的单元页。页是 IDS I/O 的最基本单元。服务器上的所有数据都储存在页上。例如,如果您要储存数据库表的一个行,那么就要把该行的数据储存在页上。页具有内部结构,并且有多个不同类型的页。
页是对磁盘执行读写操作的最小 I/O 单元。当将数据从磁盘读取到共享内存的缓存时,储存数据的整个页都被读取到缓存中。
在 IDS 10.0 之前,服务器系统的页大小由在特定计算机上建立的端口决定。最常见的页大小为 2KB,尽管有些系统使用 4KB 的页。
在 IDS 10.0 之后,您可以为新的非根 dbspaces 指定非默认的页大小。页大小的范围是 2K 到 16K,并且必须是所在平台的默认页大小的倍数。
dbspace 是块的逻辑集合。每个 dbspace 最初至少必须包含一个块。
在必要时,可以给 dbspace 分配多个块。如果特定的 dbspace 的空间耗尽了(因为分配给它的所有块都填满数据了),还可以向它添加额外的块。
可以在特定的 dbspace 中创建数据库和表。这意味着数据库和表的最大大小不能超过它们所在的 dbspace 的可用空间。您不能控制在哪个块中创建数据库或表。如果您想要确保在特定物理设备上创建表或数据库,那么您必须将位于该设备中的块分配给 dbspace。
注意:每个服务器系统至少必须有一个 dbspace —— 根 dbspace。根 dbspace 用于储存所有控制服务器的重要系统信息。
tblspace 是为特定的表分配的所有页的逻辑集合。否则,如果表储存在多个 dbspace 时,表的片段被分散在 dbspace 中。
tblspace 表示的空间不一定是相邻的;页可以分布在一个块中,或者某个表的页可以分布在不同的块中。
您可以将 dbspace 和 tblspace 看作物理空间的逻辑分组。
简单大对象是指任意值和任意长度的字节流。一个简单的大对象可能是数字化图像或音频,或者是对象模块或源代码文件。
能够在计算机的文件系统储存的东西都可以储存在简单大对象中。简单大对象的理论极限是 2GB;这个大小基于 4 个字节的整数能够容纳的最大值。
有两种类型的简单大对象:TEXT 和 BYTE。TEXT 数据类型用于储存可打印的 ASCII 文本,比如源代码和脚本。BYTE 数据类型用于存储任何二进制数据,比如保存的电子表格、程序加载模块和数字化图像或音频。
blobspace 是一种特殊的 dbspace,用于储存简单简单大对象。它具有以下特征:
智能大对象包括:
subspace 是块的逻辑集合。它有以下特征:
与 Informix Dynamic Server 中的其他存储空间一样,subspace 由一个或多个块组成。不过,subspace 的主块的架构更加复杂。该架构将在后面的模块中描述。
subspace 有时用于储存称为智能 LO 或智能 blob 的智能大对象。
可以使用 onspaces 实用程序从系统命令行在服务器中创建 dbspace、blobspace、sbspace 或临时 dbspace。
表 4 列出了使用 onspaces 实用程序创建 dbspace 的参数:
表 4. 使用 onspaces 实用程序创建 dbspace 的参数
参数 |
操作 |
-c |
创建一个 dbspace |
-d spacename |
创建 dbspace 的名称 |
-k pagesize |
新的 dbspace 的非默认页大小(必须在 2K 至 16K 之间,并且必须是默认页大小的倍数) |
-m pathname offset |
映像路径名和偏移量 |
-o offset |
设备占用初始块的偏移量,以千字节为单位 |
-p pathname |
初始块的磁盘分区或设备名 |
-s size |
初始块的大小,以千字节为单位 |
-t |
表示创建的 dbspace 是一个临时 dbspace |
下面的示例命令为第一个块创建一个大小为 2GB 名为 dbspace3 的 dbspace,其偏移量为 100,000 千字节:
onspaces -c -d dbspace3 -p /dev/rdsk/device1 -o 100000 -s 2000000 |
要创建大小为 800,000KB 并且包含 100,000 千字节偏移量的名为 tempdbs1 的 dbspace,可以使用以下命令:
onspaces -c -t -d tempdbs1 -p /dev/rdsk/device9 -o 100000 -s 800000 |
表 5 列出了使用 onspaces 实用程序创建 blobspace 的参数:
表 5. 使用 onspaces 实用程序创建 blobspace 的参数
参数 |
操作 |
-c |
创建一个 blobspace 或 dbspace |
-b spacename |
将要创建的 blobspace 的名称 |
-g blobpagesize |
blobpage 的大小,以磁盘的页数为单位 |
-m pathname offset |
映像路径名和偏移量 |
-o offset |
初始块的偏移量,以千字节为单位 |
-p pathname |
初始块的设备或文件名 |
-s size |
初始块的大小,以千字节为单位 |
以下示例命令创建一个大小为 1GB 名为 blobspace2 的 blobspace,其偏移量为 100,000KB,blobpage 为 1000KB(2K 系统页面大小):
onspaces -c -b blobspace2 -g 500 -p /dev/rdsk/device8 -o 100000 -s 1000000 |
表 6 列出了使用 onspaces 实用程序创建 sbspace 的参数:
表 6. 使用 onspaces 实用程序创建 sbspace 的参数
参数 |
操作 |
-c |
创建一个 sbspace |
-S spacename |
将要创建的 sbspace 的名称 |
-m pathname offset |
映像路径名和偏移量 |
-o offset |
初始块的偏移量,以千字节为单位 |
-t |
将 sbspace 创建为临时 sbspace |
-p pathname |
初始块的设备或文件名 |
-s size |
初始块的大小,以千字节为单位 |
-Ms metasize |
sbspace 元数据区域的大小,以千字节为单位 |
-Mo metaoffset |
sbspace 中的元数据区域的偏移量,以千字节为单位 |
-Df options |
为储存在 sbspace 中的智能大对象指定不同的默认储存特征和其他属性 |
以下示例命令创建一个大小为 5GB 名为 sbspace4 的映像 sbspace,针对主块和映像块的偏移量为 300,000KB,元数据大小为 150,000KB 并且带有 10,000KB 的偏移量,以及包含一个大小为 32KB 的智能 blob:
onspaces -c -S sbspace4 -p /dev/rdsk/device5 -o 300000 -s 5000000 -m /dev/rdsk/device6 300000 -Ms 150000 -Mo 10000 -Df "AVG_LO_SIZE=32" |
可以使用 onspaces 实用程序从命令行删除 dbspace、临时 dbspace、blobspace 或 sbspace。
删除不再使用的 dbspace、blobspace 或 sbspace。
在删除 dbspace 之前,您必须先删除在该 dbspace 中创建的所有数据库和表。
在删除 blobspace 之前,您必须先删除包含引用 blobspace 的 TEXT 和 BYTE 列的所有表。
要删除 dbspace dbspace3,发出以下命令:
onspaces -d dbspace3 |
要删除包含数据的 sbspace,使用 -f (force) 选项:
onspaces -d sbspace2 -f |
您可以使用 onspaces 向 dbspace 或 blobspace 添加块。表 7 列出了使用 onspaces 实用程序向 dbspace 或 blobspace 添加块的参数:
表 7. 使用 onspaces 实用程序向 dbspace 或 blobspace 添加块的参数
参数 |
操作 |
-a spacename |
向指定的 dbspace 或 blobspace 添加块 |
-m pathname offset |
映像路径名和偏移量 |
-o offset |
初始块的偏移量,以千字节为单位 |
-p pathname |
块的设备或文件名 |
-s size |
块的大小,以千字节为单位 |
以下的示例命令为 dbspace1 添加大小为 5GB 的映像块,针对主块的偏移量大小为 500,000KB,针对映像块的偏移量大小为 200,000KB:
onspaces -a dbspace1 -p /dev/rdsk/device2 -o 500000 -s 5000000 -m /dev/rdsk/device5 200000 |
表 8 列出了使用 onspaces 实用程序向 sbspace 添加块的参数:
表 8. 使用 onspaces 实用程序向 sbspace 添加块的参数
参数 |
操作 |
-a spacename |
向指定的 sbspace 添加块 |
-m pathname offset |
映像路径名和偏移量 |
-o offset |
新块的偏移量,以千字节为单位 |
-p pathname |
新块的设备或路径名 |
-s size |
新块的大小,以千字节为单位 |
-Ms metasize |
在新块中分配的 sbspace 元数据区域的大小,以千字节为单位 |
-Mo metaoffset |
新块的元数据区域的偏移量,以千字节为单位 |
-U |
表示新块仅包含用户数据 |
以下示例命令为名为 sbspace6 的 sbspace 添加一个大小为 7GB 的映像块,针对主块和映像块的偏移量都为 50,000KB,元数据的大小为 10,000KB 并且带有 5000KB 的偏移量:
onspaces -a sbspace6 -p /dev/rdsk/chunk7 -o 50000 -s 7000000 -m /dev/rdsk/chunk6 50000 -Ms 10000 -Mo 5000 |
要让该块仅用于储存用户数据,请指定 -U 选项(省略 -Ms 或 -Mo 选项)。
可以使用 onspaces 实用程序删除 dbspace、sbspace 或 blobspace 中的块。表 9 列出了使用 onspaces 实用程序删除块的参数:
表 9. 使用 onspaces 实用程序在存储空间中删除块的参数
参数 |
操作 |
-d space_name |
删除指定的 dbspace、blobspace 或 sbspace 中的块 |
-o offset |
块的偏移量,以千字节为单位 |
-p pathname |
块设备或文件的路径名 |
您可以使用 onspaces 删除任何 dbspace、sbspace 或 blobspace 中的非初始块。
以下命令从 dbspace2 删除偏移量大小为 15,000KB 的块:
onspaces -d dbspace2 -p /dev/rdsk/chunk3 -o 15000 |
注意,不能以这种方式删除 dbspace、sbspace 或 blobspace 中的初始块。您必须删除存储空间本身。
如果您正在重新组织现有的 dbspace 或觉得有必要更改 dbspace 的名称,那么可能希望重命名标准的 dbspace。重命名 dbspace 操作仅更改 dbspace 的名称,不会重新组织数据。
重命名 dbspace 时,服务器必须处于 quiescent 模式。
不能重命名关键的 dbspace,比如根 dbspace 或包含物理或逻辑日志的 dbspace。
在重命名 dbspace 之后,您应该执行 level-0 存档。
您可以使用以下语法重命名 dbspace:
onspaces -ren old_dbspacename -new new_dbspacename |
您可以使用 OpenAdmin Tool for IDS (OAT) 管理储存空间。
使用 OAT 添加 dbspace、blobspace 或 sbspace
您可以使用 OAT 添加 dbspace、临时 dbspace、blobspace 或 sbspace。
为此,导航到 Space Administration > DBSpaces。输入空间名、路径、偏移量、大小、类型(DBSpace、Temp DBSpace、Blobspace 或 SBSpace)和页大小,然后单击Create:
(查看图 15 的 大图)。
您可以使用 OAT 向现有的 dbspace、blobspace 或 sbspace 添加块。
为此,导航到 Space Administration > DBSpaces。单击需要向其添加块的 dbspace、blobspace 或 sbspace 的名称。单击 Admin 选项卡,从这里可以看到用于添加块的选项:
(查看图 16 的 大图)。
导航到 Space Administration > DBSpaces。单击需要删除的 dbspace、blobspace 或 sbspace 的名称。单击 Admin 选项卡,从这里可以看到删除空间的选项:
(查看图 17 的 大图)。
OpenAdmin Tool 是一个开源产品,可以在线下载(参见 参考资料)。
使用 SQL Administration API 管理空间
SQL Administration API 允许您使用内置的 admin() 和 task() 函数远程执行管理任务,它是通过模拟各种 IDS 管理命令行实用程序的 EXECUTE FUNCTION SQL 语句来完成的。
task() 和 admin() 函数提供相同的功能;它们的唯一区别是返回代码不同。task() 函数返回描述命令的结果的字符串。admin() 函数返回一个整数。
您可以使用 admin() 函数创建 dbspace。
以下示例命令创建了一个名为 mydbspace 的 dbspace,其大小为 30000KB,块偏移量为 0:
execute function admin("create dbspace","mydbspace","/space/ifmx/11.50.UC5_CDR1/my_chunk", "30000","0"); |
您可以使用 admin() 函数创建 blobspace。
以下示例命令创建了一个名为 myblobspace 的 blobspace,其大小为 10,000KB,偏移量为 0,带有一个大小为 4 页的 blob 页:
execute function admin("create blobspace","myblobspace","/space/ifmx/11.50.UC5_CDR1/my_blobchunk", "10000","0","4"); |
您可以使用 admin() 函数创建 sbspace。
以下示例命令创建一个名为 mysbspace 的 sbspace,其大小为 15,000KB,块偏移量为 100KB:
execute function admin("create sbspace","mysbspace","/space/ifmx/11.50.UC5_CDR1/my_sbchunk", "15000","100"); |
使用 admin() 函数向 dbspace、blobspace 或 sbspace 添加块
您可以使用 admin() 函数向 dbspace、blobspace 或 sbspace 添加块。
使用该函数添加块受到以下限制:
以下示例命令向名为 data1space 的 dbspace 添加了一个大小为 10,000KB 偏移量为 0 的块:
execute function admin("add chunk","data1space","/space/ifmx/11.50.UC5_CDR1/datachunk2","10000","0"); |
使用 admin() 函数删除块、dbspace、blobspace 或 sbspace
您可以使用 admin() 函数删除块、dbspace、blobspace 或 sbspace。
以下示例命令删除一个名为 myblobspace 的 blobspace:
execute function admin("drop blobspace","myblobspace");
|
以下示例命令仅从名为 data1space 的 dbspace 删除路径名为 /space/ifmx/11.50.UC5_CDR1/datachunk2、偏移量为 0 的块:
execute function admin("drop chunk","data1space","/space/ifmx/11.50.UC5_CDR1/datachunk2","0"); |
系统数据库和系统目录表
数据库服务器第一次上线时,将创建 sysmaster、sysutils、sysuser 和 sysadmin 数据库。
这些是 IDS 使用的系统或内部数据库。
像用户创建的数据库一样,这些数据库包含系统目录表。
系统目录表跟踪数据库对象,比如:
数据库中的系统目录表之一就是 systables 表。这个表列出数据库中包含的所有表。systables 表中包含的每个表都是使用唯一 tabid 标识的。每个系统目录表都有一个小于 99 的 tabid。
要查看数据库中的系统目录表,可以运行以下 SQL 语句:
database stores_demo; select * from systables where tabid < 99; |
sysadmin、sysutils 和 sysuser 数据库
sysadmin 数据库包含储存任务属性的表。它允许数据库管理员调度管理任务的运行。
sysutils 数据库包含 ON-Bar 备份和恢复实用程序使用的表。
sysuser 数据库用于服务器之间通信的 PAM(Pluggable Authentication Module)身份验证。
sysmaster 数据库
如果不能够创建 sysmaster 数据库,数据库服务器将在每次上线时尝试创建它。
sysmaster 数据库包含执行共享内存结构的数据词典信息。sysmaster 数据库中的表称为 SMI (system-monitoring interface) 表。
系统监控接口 (SMI) 表是由包含关于数据库服务器状态的动态信息的数据库服务器管理的特殊表。
大部分 SMI 表都不包含数据;SMI 表的数据词典结构指向共享内存。
当在一个常规表上执行 SELECT 语句时,服务器将为表读取数据词典信息,以查找该表的分区号和其他信息。如果相关信息不在缓冲池中的话,服务器将从磁盘读取数据。
当在 SMI 表上执行 SELECT 语句时,服务器仍然为 SELECT 列出的表读取数据词典信息。SMI 表有一个特殊的分区号(分区号中的 dbspace 号为 0)。当服务器检测到特殊的分区号时,它将根据查询从共享内存读取一组特定的数据。
因为 SELECT 语句从共享内存读取实时数据,所以两个 SMI 表之间的数据可能没有同步。
所有用户都有权限查询 sysmaster 数据库中受支持的表,除了用于审计操作的表之外。
使用 SMI 表受到以下限制:
Database has pseudo tables - can't build schema. |
sysmaster 数据库由 50 个以上的表组成。IBM Informix 仅支持这些表的一小部分(并提供文档),以及使用这些表的一些视图。为了安全起见,请在查询中仅使用受支持的表和视图,因为不受支持的表可能在各个版本之间发生变化。支持的表和视图包括:
IDS 使用逻辑日志为日志数据库记录数据操作语言(data manipulation language,DML)条目(INSERT、UPDATE 和 DELETE),以及为所有数据库记录数据定义语言(data definition language,DDL)语句和检查点活动。
如果您没有启用数据库日志,当出现故障时服务器将不能完全恢复数据库,因此您也不能使用事务。
您可以使用 ondblog 实用程序为一个或多个数据库更改日志模式。
如果您为一个数据库更改日志模式,必须在更改生效之前执行 level-0 备份。
使用以下命令在 stores7 日志数据库上更改缓存状态:
ondblog unbuf stores7 ondblog buf stores7 |
要终止日志记录,使用以下命令:
ondblog nolog stores7 |
要为 “mydbfile” 文件中的一组数据库终止日志记录,使用以下命令:
ondblog nolog -f mydbfile |
使用以下命令让数据库遵从 ANSI 标准:
ondblog ansi stores7 |
您可以在创建 level-0 备份的同时使用 ontape 实用程序为数据库添加日志记录。
例如,要使用 ontape 向名为 stores_demo 的数据库缓存日志,请使用以下命令:
ontape -s -B stores_demo |
要使用 ontape 向名为 stores_demo 的数据库添加非缓存日志记录,请执行以下命令:
ontape -s -U stores_demo |
除了打开事务日志之外,这些命令还创建整个系统的存储空间备份。当 ontape 提示您选择备份级别时,请指定 level-0 备份。
注意:使用 ontape 时,必须对所有存储空间执行 level-0 备份。
要使用 ontape 终止名为 stores_demo 的数据库的日志记录,请执行以下命令:
ontape -N stores_demo |
要使用 ontape 在名为 stores_demo 的数据库上将缓存模式从缓存日志更改为非缓存日志,并且不需要创建存储空间备份,请执行以下命令:
ontape -U stores_demo |
要使用 ontape 在名为 stores_demo 的数据库上将缓存模式从非缓存日志更改为缓存日志,并且不需要创建存储空间备份,请执行以下命令:
ontape -B stores_demo |
要使用 ontape 将名为 stores_demo 的数据库(已经使用缓存或非缓存的事务日志)更改为遵从 ANSI 标准,请执行以下命令:
ontape -A stores_demo |
要使用 ontape 将名为 stores_demo 的数据库(未使用事务日志)更改为遵从 ANSI 标准,请执行以下命令:
ontape -s -A stores_demo |
除了使数据库遵从 ANSI 标准之外,这个命令同时创建了一个存储空间备份。当提示您选择备份级别时,请指定 level-0 备份。
注意:将日志模式更改为遵循 ANSI 标准之后,就不能再轻易更改它了。要更改遵循 ANSI 标准的数据库日志模式,必须卸载数据,使用新的日志模式创建数据库,然后重新装载数据。
要创建数据库并指定日志模式,需要使用 CREATE DATABASE 语句。
清单 9 提供了该语句的语法:
>>-CREATE DATABASE--database--+-------------+-------------------> '-IN--dbspace-'
>--+-----------------------------+----------------------------->< '-WITH--+-+----------+--LOG-+-' | '-BUFFERED-' | '-LOG MODE ANSI-----' |
以下示例命令在 dbspace2 中创建一个名为 my_db 的数据库,并指定其日志记录模式为非缓存日志:
create database my_db in dbspace2 with log; |
清单 10 中的命令确认数据库的日志状态,并在 sysmaster 数据库中查询 sysdatabases 表:
清单 10. 通过查询 sysdatabases 表确认日志状态
database sysmaster; select * from sysdatabases where name='my_db';
name my_db partnum 1049131 owner informix created 07/20/2009 is_logging 1 is_buff_log 0 is_ansi 0 is_nls 0 flags -12287
|
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。