第 3 部分 Informix IDS 11.5 DBMS 实例和存储对象

 

第 3 部分:DBMS 实例和存储对象

 

命令

dbschema 命令不仅允许 DBA 查看在数据库中运行什么 SQL 语句来创建对象,它还允许通过一种简单的方法在数据库中创建对象。

到目前为止,我们讨论的所有对象都带有一个简单的 DROP 语句,该语句用于从数据库删除对象及其所有引用。


清单 36. 示例 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。这个例子将找回数据库中的所有对象,包括表、视图、同义词、限制、权限和触发器等。


清单 37. -d 选项

                                     

dbschema –d testdb

                        

 

清单 38 中的例子使用可选的 -t tablename 选项和数据库名输出一个表的信息。


清单 38. -t tablename 选项

                                     

dbschema –d testdb –t customer

                        

 

清单 39 显示了这个命令的输出:


清单 39. -t tablename 选项的输出

                                     

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 使用的值显示数据在表中的分布。


清单 40. 请求柱状图

                                     

dbschema –d testdb –hd customer

                        

 

清单 41 中的例子使用 -f routine-name 选项输出 ins_mailing_list 存储过程:


清单 41. -f routine-name 选项

                                     

dbschema -d testdb -f ins_mailing_list

                        

 

注意:必须在删除对象之前运行 dbschema 命令。一旦删除对象之后,数据库中将不包含任何与该对象相关的东西,包括 dbschema 输出对象所需的定义。

有一些对象不能通过 dbschema 命令单独输出。没有选项能够输出单独的索引、触发器或限制,因为它们都属于表的。要输出它们,必须先输出表。


清单 42. 在 customer 表上定义多个对象的例子

                                     

dbschema –d testdb –t customer                      

                



清单 43. 命令返回

                                     

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 选项。


清单 44. –ss 选项

                                     

dbschema –d testdb –t customer –ss        

              



清单 45. 命令返回

                                       

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 命令的最近输出就十分有用。

您一定要熟悉该命令及其各个选项。


清单 46. 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 提供两个数据存储选项:

  • 原始设备,这是一个允许数据库服务器使用非缓冲磁盘访问的特殊设备。
  • cooked 文件,这是一个由操作系统管理的常规文件。当数据库服务器控制该文件的内容时,它必须向操作系统发出 I/O 请求。

准备原始设备

遵循以下步骤准备一个可供 IDS 使用的原始设备:

  1. 在磁盘上创建一个新的(或使用一个空闲的)分区。
  2. 将文件权限设置为 660 (rw-rw----):chmod 660 device_name。
  3. 将文件的组设置为 informix:chgrp informix device_name。
  4. 将文件的所有者设置为 informix:chown informix device_name。

要创建原始设备,请参考 UNIX 系统的系统管理手册。

如果您要对现有的磁盘进行重新分区,建议您在卸载设备之前存档数据,然后在执行重新分区。

以千字节为单位表示每个原始设备的大小。您在创建块(chunk)时需要使用该信息。

要准备在数据库服务器中使用的原始设备,请按照以上的步骤 2、3 和 4 中的命令设置权限、归属和组。

注意:不要执行 mount 命令,它将装载设备并指示操作系统与设备进行交互。另外,也不要使用 mkfs 命令,它将在设备上构造一个文件系统。如果您在 IDS 正在使用的原始设备上运行 mkfs,那么将损坏数据库信息。

要在原始设备上划分块时,请通过链接为设备分配一个更具描述性的名称(例如,/dev/ifmx-raw-001)。这将有助于记住对每个块使用的设备名,更重要的是,这样做允许您在遇到磁盘设备失败时为新的设备重新定义一个链接。

清单 7 提供一个示例会话,其中准备了一个用作 Dynamic Server 块的原始设备:


清单 7. 准备原始设备的示例会话

$ 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

 


回页首

创建 cooked 文件

遵循以下步骤创建可供 IDS 使用的 cooked 文件:

  1. 创建一个文件以供使用:touch filename。
  2. 将该文件的权限设置为 660 (rw-rw----):chmod 660 filename。
  3. 将该文件的组设置为 informix:chgrp informix filename。
  4. 将文件的所有者设置为 informix:chown informix filename。

我们不推荐对块使用 UNIX 文件,尤其是您的系统可以利用内核 AIO 时。不过,设置 cooked 文件非常容易,并且不需要了解磁盘设备的可用性。如果您希望对块使用 UNIX (cooked) 文件,则必须为块设置一个文件。

使用以上步骤 1 的命令,将 filename 替换为 cooked 文件的名称。然后,使用步骤 2、3 和 4 中的命令更改文件的权限和归属。

清单 8 提供了一个示例会话,其中创建了一个 cooked 文件:


清单 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 文件。

通常通过一些项来唯一地识别块:

  • 绝对路径名
  • 偏移量

它可以是:

  • 原始磁盘
  • cooked 文件

它被指定了以千字节为单位的大小,并且由服务器在内部进行管理。


图 8. 块


在 Windows 系统上,块可以是 NTFS 文件或原始磁盘空间。它由服务器在内部进行管理。我们不推荐在 Windows 上使用原始磁盘(未格式化分区),因为不希望在 Windows 系统上使用原始磁盘的用户可能错误地对其执行格式化操作。


回页首

磁盘组件 - 页

当给数据库服务器分配了块之后,块将被分成更小的单元页。页是 IDS I/O 的最基本单元。服务器上的所有数据都储存在页上。例如,如果您要储存数据库表的一个行,那么就要把该行的数据储存在页上。页具有内部结构,并且有多个不同类型的页。

页是对磁盘执行读写操作的最小 I/O 单元。当将数据从磁盘读取到共享内存的缓存时,储存数据的整个页都被读取到缓存中。

在 IDS 10.0 之前,服务器系统的页大小由在特定计算机上建立的端口决定。最常见的页大小为 2KB,尽管有些系统使用 4KB 的页。

在 IDS 10.0 之后,您可以为新的非根 dbspaces 指定非默认的页大小。页大小的范围是 2K 到 16K,并且必须是所在平台的默认页大小的倍数。


图 9. 页



回页首

磁盘组件 - dbspace

dbspace 是块的逻辑集合。每个 dbspace 最初至少必须包含一个块。

在必要时,可以给 dbspace 分配多个块。如果特定的 dbspace 的空间耗尽了(因为分配给它的所有块都填满数据了),还可以向它添加额外的块。


图 10. dbspace


可以在特定的 dbspace 中创建数据库和表。这意味着数据库和表的最大大小不能超过它们所在的 dbspace 的可用空间。您不能控制在哪个块中创建数据库或表。如果您想要确保在特定物理设备上创建表或数据库,那么您必须将位于该设备中的块分配给 dbspace。

注意:每个服务器系统至少必须有一个 dbspace —— 根 dbspace。根 dbspace 用于储存所有控制服务器的重要系统信息。


回页首

磁盘组件 - tblspace

tblspace 是为特定的表分配的所有页的逻辑集合。否则,如果表储存在多个 dbspace 时,表的片段被分散在 dbspace 中。

tblspace 表示的空间不一定是相邻的;页可以分布在一个块中,或者某个表的页可以分布在不同的块中。


图 11. tblspace


您可以将 dbspace 和 tblspace 看作物理空间的逻辑分组。

  • dbspace 是物理块的逻辑分组。块可以位于不同的磁盘上,尽管它们都属于相同的 dbspace。
  • tblspace 是区段的逻辑分组。tblspace 中的区段可以位于不同的块上(因此也可以位于不同的磁盘上)。

图 12. 逻辑分组:dbspace 和 tblspace




回页首

特殊数据类型 —— 简单大对象

简单大对象是指任意值和任意长度的字节流。一个简单的大对象可能是数字化图像或音频,或者是对象模块或源代码文件。

能够在计算机的文件系统储存的东西都可以储存在简单大对象中。简单大对象的理论极限是 2GB;这个大小基于 4 个字节的整数能够容纳的最大值。

有两种类型的简单大对象:TEXT 和 BYTE。TEXT 数据类型用于储存可打印的 ASCII 文本,比如源代码和脚本。BYTE 数据类型用于存储任何二进制数据,比如保存的电子表格、程序加载模块和数字化图像或音频。


回页首

磁盘组件 – blobspace

blobspace 是一种特殊的 dbspace,用于储存简单简单大对象。它具有以下特征:

  • 仅能用于储存简单大对象的磁盘池。
  • 至少包含一个块。
  • 可以包含多个块。
  • 可以包含来自任意列、表和数据库的简单大对象。


图 13. blobspace



回页首

特殊数据类型 —— 智能大对象

智能大对象包括:

  • CLOB 和 BLOB 内置类型:CLOB 和 BLOB 类型是用户定义的用于储存大量数据的数据类型。这些类型在数据库中自动创建,并存储在 sysxtdtypes 目录中。
  • 第三方索引:第三方应用程序可能使用智能大对象来为索引储存数据。该索引仅能由创建它的 DataBlade 模块操作。
  • 用户定义数据类型(UDT):智能大对象为大型的用户定义数据类型提供理想的储存方法。

回页首

磁盘组件 - sbspace

subspace 是块的逻辑集合。它有以下特征:

  • 它是一个磁盘空间池,服务器创建的表可以使用它储存智能大对象。
  • 至少包含一个块。
  • 可以包含多个块。


图 14. subspace


与 Informix Dynamic Server 中的其他存储空间一样,subspace 由一个或多个块组成。不过,subspace 的主块的架构更加复杂。该架构将在后面的模块中描述。

subspace 有时用于储存称为智能 LO 或智能 blob 的智能大对象。


回页首

使用命令行创建存储对象

可以使用 onspaces 实用程序从系统命令行在服务器中创建 dbspace、blobspace、sbspace 或临时 dbspace。

使用 onspaces 创建 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

 

使用 onspaces 创建 blobspace

表 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

 

使用 onspaces 创建 sbspace

表 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 删除空间

可以使用 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

 

向 dbspace 或 blobspace 添加块

您可以使用 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

 

向 sbspace 添加块

表 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 删除块

可以使用 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 的名称,不会重新组织数据。

重命名 dbspace 时,服务器必须处于 quiescent 模式。

不能重命名关键的 dbspace,比如根 dbspace 或包含物理或逻辑日志的 dbspace。

在重命名 dbspace 之后,您应该执行 level-0 存档。

您可以使用以下语法重命名 dbspace:

onspaces -ren old_dbspacename -new new_dbspacename

 


回页首

使用 OpenAdmin Tool 管理空间

您可以使用 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


(查看图 15 的 大图)。

使用 OAT 添加块

您可以使用 OAT 向现有的 dbspace、blobspace 或 sbspace 添加块。

为此,导航到 Space Administration > DBSpaces。单击需要向其添加块的 dbspace、blobspace 或 sbspace 的名称。单击 Admin 选项卡,从这里可以看到用于添加块的选项:


图 16. 使用 OAT 添加块


(查看图 16 的 大图)。

使用 OAT 删除 dbspace

导航到 Space Administration > DBSpaces。单击需要删除的 dbspace、blobspace 或 sbspace 的名称。单击 Admin 选项卡,从这里可以看到删除空间的选项:


图 17. 使用 OAT 删除空间


(查看图 17 的 大图)。

OpenAdmin Tool 是一个开源产品,可以在线下载(参见 参考资料)。


回页首

使用 SQL Administration API 管理空间

SQL Administration API 允许您使用内置的 admin() 和 task() 函数远程执行管理任务,它是通过模拟各种 IDS 管理命令行实用程序的 EXECUTE FUNCTION SQL 语句来完成的。

task() 和 admin() 函数提供相同的功能;它们的唯一区别是返回代码不同。task() 函数返回描述命令的结果的字符串。admin() 函数返回一个整数。

使用 admin() 函数创建 dbspace

您可以使用 admin() 函数创建 dbspace。

以下示例命令创建了一个名为 mydbspace 的 dbspace,其大小为 30000KB,块偏移量为 0:

execute function

admin("create dbspace","mydbspace","/space/ifmx/11.50.UC5_CDR1/my_chunk",

"30000","0");

 

使用 admin() 函数创建 blobspace

您可以使用 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

您可以使用 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 添加块。

使用该函数添加块受到以下限制:

  • 块的大小必须大于等于 1000KB,并且必须是页大小的倍数。
  • 开始偏移量和块大小之和不能超过块的最大大小。
  • 最大偏移量为 4TB。

以下示例命令向名为 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 表受到以下限制:

  • 不能锁定非持久化 SMI 表或使用隔离级别。因为这些表仅使用共享内存结构,所以传统的关系 SQL 锁机制无效。
  • 不能对非持久化 SMI 表执行 INSERT、UPDATE 和 DELETE 语句。
  • 不能在 sysmaster 数据库上使用 dbschema 和 dbexport 实用程序。如果使用它们将收到以下错误:

Database has pseudo tables - can't build schema.

 

  • 在 SELECT 语句中使用 rowid 将返回不一致的结果。

sysmaster

sysmaster 数据库由 50 个以上的表组成。IBM Informix 仅支持这些表的一小部分(并提供文档),以及使用这些表的一些视图。为了安全起见,请在查询中仅使用受支持的表和视图,因为不受支持的表可能在各个版本之间发生变化。支持的表和视图包括:

  • sysdatabases 表,它列出数据库、所有者和数据库特征。
  • systabnames 表,它包含服务器中的所有表的名称。
  • syscheckpoint 和 sysckptinfo 表,它们是版本 11 新添加的,用于列出检查点。
  • syslogs 视图,它包含关于逻辑日志的信息。您可以使用 syslogs 确定是否需要备份日志。
  • sysdbspaces 视图,它包含关于 dbspace 的信息。
  • syschunks 视图,它包含服务器中的块。nfree 列显示块中空闲的页的数量。
  • syslocks 视图,它列出所有活动的锁。
  • sysvpprof 视图,它包含所有活动的虚拟处理器。
  • syssessions 视图,它列出关于每个会话的信息。
  • syssesprof 视图,它包含关于每个会话的更详细信息。
  • sysextents 视图,它列出在服务器中分配的区段。
  • syschkio 视图,它包含块的 I/O 统计数据。
  • sysptprof 视图,它列出 tblspace 在任意时间点的信息。该视图仅列出正在使用的表。当最后的用户关闭了表之后,共享内存中的 tblspace 结构将被释放,接着将丢失所有配置文件统计数据。
  • sysprofile 视图,它列出服务器中的某个事件,例如磁盘读、磁盘写、回滚和检查点等。每个行包含一个配置事件及其值。
  • sysadtinfo 表,它包含关于服务器的审计配置的信息。仅有用户 informix 能够从该表获取信息。
  • sysaudit 表,它包含每个已定义审计掩码的十六进制表示。要列出、修改或添加审计掩码,必须使用 onaudit 实用程序。仅有用户 informix 能够从 sysaudit 获取信息。
  • sysconfig 表,它描述配置参数的有效值、原始值和默认值。
  • sysdri 表,它提供数据库服务器的数据复制状态的信息。
  • sysseswts 表,它提供用户等待各种数据库对象的时间的信息。

回页首

数据库日志模式

IDS 使用逻辑日志为日志数据库记录数据操作语言(data manipulation language,DML)条目(INSERT、UPDATE 和 DELETE),以及为所有数据库记录数据定义语言(data definition language,DDL)语句和检查点活动。

如果您没有启用数据库日志,当出现故障时服务器将不能完全恢复数据库,因此您也不能使用事务。

使用 ondblog 实用程序改变数据库的日志模式

您可以使用 ondblog 实用程序为一个或多个数据库更改日志模式。

如果您为一个数据库更改日志模式,必须在更改生效之前执行 level-0 备份。

使用以下命令在 stores7 日志数据库上更改缓存状态:

ondblog unbuf stores7

ondblog buf stores7

 

要终止日志记录,使用以下命令:

ondblog nolog stores7

 

要为 “mydbfile” 文件中的一组数据库终止日志记录,使用以下命令:

ondblog nolog -f mydbfile

 

使用以下命令让数据库遵从 ANSI 标准:

ondblog ansi stores7

 

使用 ontape 实用程序更改数据库的日志模式

您可以在创建 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 提供了该语句的语法:


清单 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

               

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值