简介
数据库可能会因为软件或硬件故障而不可用,可能会遇到存储问题、断电、应用程序故障或误操作等各种需要采取不同恢复措施的故障情况。本文重点介 绍使用了DB2® V9 的自动存储功能,不允许增量备份的数据库如何进行重定向还原。由于使用自动存储器功能的数据库在还原方面和以往有了很大区别,客户在实际使用的过程中容易 出现各种问题,所以本文对自动存储功能会有详细的阐述。
自动存储特性最初是在DB2 V8.2.2中引入的,DB2 V9扩展了这一特性,使用自动存储功能可以帮助您简化表空间的存储管理,新创建的使用自动存储功能的表空间,其容器和空间分配完全由 DB2数据库管理器确定。
自动存储管理
自动存储器跨磁盘和文件系统自 动增大数据库大小。因此,在保持数据库管理的存储器性能和灵活性的同时,不再需要管理存储器容器。在DB2 V9.1中,已对多分区数据库增加了自动存储器支持。如果您使用的是带DPF(Data Partitioning Feature,数据库分区功能)的企业服务器版,那您可以使用支持自动存储器功能的多分区数据库。在DB2 V9中创建新数据库的时候,默认启用自动存储功能,主要目的是简化表空间的存储管理,使用自动存储功能的数据库有一个或多个相关联的存储器路径,在创建表 空间的时候不用指定存储的路径等特性。对使用自动存储器功能的数据库,其表空间可以使用自动存储管理,也可以不使用自动存储管理。对于不使用自动存储器功 能的数据库,则其表空间不能使用自动存储管理。
自动存储器简化了存储管理,它使您能够指定用于数据库管理器存放表空间数据以及为各种用途分配空间的存储路径。另外,在创建和填充表空间 时,DB2 将管理这些表空间的容器和空间分配。如果不需要使用自动存储器,则必须通过运行 CREATE DATABASE 命令并将 AUTOMATIC STORAGE 选项设置为NO,或通过使用 sqlecrea API 并将 SQLEDBDESCEXT 参数设置为 SQL_AUTOMATIC_STORAGE_NO 来创建数据库。
自动存储器功能只能在创建数据库时指定,不能对已经创建的未使用自动存储器功能的数据库启用自动存储器;同样,对创建数据库时启用自动存储器的 数据库也不能禁用自动存储器,变通的方法就是在创建表空间的时候可以指定是否使用自动存储器,即虽然数据库启用了自动存储器功能,但可以创建不使用自动存 储器功能的表空间。
由于对多分区配置引入了自动存储器数据库,所以更改了 db2look 命令。现在在发出 db2look 命令之前,必须确保所有数据库分区都是活动的。如果有任何数据库分区处于不活动状态,则会发出警告消息,该消息说明无法生成表空间的DDL。此 db2look 命令更改会影响所有表空间类型。
接下来,我们将通过示例的方式分别解释如何在创建数据库的时候使用自动存储器功能。
示例1:创建不使用自动存储器的DB2数据库DB2TEST1
CREATE DATABASE DB2TEST1 AUTOMATIC STORAGE NO ON /db2/databases/db2test1 |
如果在实际过程中不需要使用自动存储功能,则必须在创建数据库时将 AUTOMATIC STORAGE 选项设置为 NO,否则,将创建使用自动存储器功能的数据库。
示例2:创建使用自动存储器的DB2数据库DB2TEST2
CREATE DATABASE DB2TEST2 |
因为在DB2 V9中创建新数据库的时候,默认启用自动存储功能,我们在创建数据库的时候没有显式将指定AUTOMATIC STORAGE 选项设置为NO,所以新创建的数据库DB2TEST2 将自动启用自动存储功能,其数据库路径是使用 dftdbpath 数据库管理器配置参数来确定,其存储器路径也是使用 dftdbpath 数据库管理器配置参数来确定。
默认创建了3个表空间:SYSCATSPACE、TEMPSPACE1和USERSPACE1,都是使用自动存储管理。需要注意的是,对USERSPACE1表空间,和其在DB2 V8相比其表空间类型由常规变成了大型。
表空间所使用的存储器类型
表空间用来存储表,抽象物理存储,由一个或多个容器组成,也就是说表空间可以分布在一个或多个物理设备上。有4k、8k、16k、32k的四种页面大小的 表空间。为了提高性能,可以将一个表的索引存储到另一个表空间,将大对象存储到第三个表空间,任何表的数据都循环存储在表空间的所有容器中;默认的表空间 有:SYSCATSPACE(4K,存储系统目录和表)、TEMPSPACE1(4K,临时表空间)、USERSPACE1(4K,用户表空间)。
表空间的类型有四种:REGULAR(如USERSPACE1)、SYSTEM TEMPORARY(如TEMPSPACE1)、LARGE(用来存储LOB数据)、USER TEMPORARY(用来存储用户临时表)。
表空间按管理方式分为系统管理表空间(SMS:system manage space)和数据库管理表空间(DMS)。对于SMS表空间,每个容器都是操作系统的文件空间中的一个目录,由操作系统的文件管理器控制存储空间。对于DMS 表空间,每个容器或者是固定大小的预分配文件,或者是物理设备(例如,磁盘),由数据库管理器控制存储空间。
SMS表空间,其容器是文件系统的目录,是非预分配的,大小的限制为文件目录的大小,容器的个数在创建的时候决定,不能修改;如果使用SMS表空间,用户数据不能分开存储,也就是不能把用户数据分别存储在数据、索引、大数据表空间中。DMS表空间,其容器可是是file或raw devices ,其容器可以增加,修改,或改变大小;如果使用DMS表空间,用户数据可以分开存储,也就是可以把用户数据分别存储在INDEX,TABLE和LOB表空间中。
缓冲池是指从磁盘读取高速缓存表和索引数据页时或修改它们时分配给它们的主存储器。缓冲池的目的是改进系统性能。从内存访问数据要比从磁盘访问数据快得多,因此,数据库管理器需要读写磁盘(I/O)的次数越少,性能也越好。可以创建多个缓冲池,虽然在大多数情况下只需要一个,建议对每一种页大小的表空间分别建一个缓冲池。
缓冲池用来进行表或索引的缓存,一个数据库至少要有一个缓冲池 ,缓冲池的页大小可以是4k,8k,16k或32k; 表空间的页面大小要和缓冲池保持一致,缓冲池的目的是用来减少直接的I/O访问,提高I/O访问速度。默认的缓冲池为IBMDEFAULTBP(4K)。
在DB2 V9中如果想让数据库管理器自动调整缓冲池,首先数据库参数SELF_TUNING_MEM需要设置为ON,其次,缓冲池在创建的时候需要指定AUTOMATIC属性,比如创建缓冲池BP1,可以使用如下命令创建:
CREATE BUFFERPOOL "BP1" IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 4 K ; |
对已经创建好的缓冲池如果也想让数据库管理器自动调整,可以用ALTER BUFFERPOOL命令修改,比如修改IBMDEFAULTBP缓冲池:
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE SIZE 250 AUTOMATIC; |
容器是物理存储设备。可以用目录名、设备名或文件名来标识它。
可以为表空间分配容器,单个表空间可以横跨多个容器,但每个容器只能属于一个表空间。
对自动存储器数据库,创建表空间时,有两种存储器类型可以选择:
(1)DB2管理存储器(自动存储器)
(2)手工管理存储器
如果新建的表空间使用DB2管理存储器(自动存储器),根据要创建的表空间类型不同,其空间管理会有所区别,当其表空间类型是常规或者大型时, 将自动创建成数据库管理空间(DMS), 当其表空间类型是系统临时或者用户临时时,将自动创建成系统管理空间(SMS)。使用自动存储,就不再需要担心如何添加容器以及监控容器的增长等,自动存 储会自动增加表空间在磁盘和文件系统上的大小。
如果新建的表空间是使用手工管理存储器,其空间管理又分系统管理空间(SMS)和数据库管理空间(DMS)两种方式。对于使用自动存储功能的表 空间,其容器和空间管理完全由DB2数据库管理器确定,因此,系统管理空间(SMS)和数据库管理空间(DMS)只在使用手工管理存储器的表空间中会直接 用到,在使用自动存储器功能的表空间中不会直接用到。同样,容器的定义和管理也只在使用手工管理存储器的表空间中会直接用到,在使用自动存储器功能的表空 间其容器完全由DB2数据库管理器确定。
使用自动存储管理
接下来我们通过例子来具体看一下如何使用自动存储管理,具体步骤如下:
1. 创建一个使用自动存储器的数据库DB2TEST1修改其数据库配置参数,使其使用归档日志,然后对数据库做一次全备。
2. 分别创建使用自动存储器功能的常规表空间TABLESPACE1和不使用自动存储器功能的大型表空间TABLESPACE2。
3. 对测试数据库DB2TEST1做一次全备,以便将来可以恢复到此时的状态。
4. 创建示例表 "DB2INST1"."EMPLOYEE"。
5. 对测试数据库DB2TEST1再做一次全备,以便将来可以恢复到此时的状态。
6. 利用全量备份还原测试数据库DB2TEST1。
7. 非增量定向还原测试数据库DB2TEST1。
创建测试数据库
我们首先创建使用自动存储功能的测试数据库DB2TEST1,打开 DB2 命令窗口,发出CREATE DATABASE语句,创建数据库,如 清单 1所示:
--清单 1. 创建自动存储器DB2数据库
CREATE DATABASE DB2TEST1 on /db2/databases/db2test1/auto_storage
DBPATH ON /db2/databases/db2test1
这样我们创建了一个自动存储器数据库DB2TEST1,其数据库路径是/db2/databases/db2test1,自动存储路径是 /db2/databases/db2test1/auto_storage,默认创建了3个表空间:SYSCATSPACE、TEMPSPACE1、 USERSPACE1,都是使用自动存储管理。创建好数据库后,连接数据库DB2TEST1,我们需要把数据库的日志管理模式改为归档,具体如清单2所 示。
--清单 2. 更改数据库参数
UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 LOGRETAIN IMMEDIATE
建议大家使用LOGARCHMETH1,此参数指定已归档日志的主要目标的介质类型,不要继续使用LOGRETAIN或USEREXIT参数。 LOGARCHMETH1参数缺省值为OFF,取值范围可以是 LOGRETAIN、 USEREXIT、 DISK、TSM或VENDOR,各自的含义如下:
l OFF
指定不使用日志归档方法。如果 logarchmeth1 和 logarchmeth2 都设置为 OFF,那么认为数据库正在使用循环日志记录,且不可前滚恢复。这是缺省值。
l LOGRETAIN
此值仅可用于 logarchmeth1,且等价于将 logretain 配置参数设置为 RECOVERY。 如果指定此值,将自动更新 logretain 配置参数。
备份测试数据库
现在我们来备份测试数据库,好方便我们在下面的例子中可以恢复到此时的状态,如清单10所示。
--清单 10.备份数据库
BACKUP DATABASE DB2TEST1 TO /db2/databases/backup/ |
命令执行完后,显示如下:
备份成功。此备份映像的时间戳记是:20070911175125
创建示例表
接下来我们创建示例表,在/home/db2inst1/目录下我们编写脚本employee.sql,内容如清单11所示。
--清单 11. employee.sql内容
CREATE TABLE "DB2INST1"."EMPLOYEE" ( "EMPNO" CHAR(6) NOT NULL , "FIRSTNME" CHAR(12) NOT NULL , "MIDINIT" CHAR(1) , "LASTNAME" CHAR(15) NOT NULL , "PHOTO" BLOB (10 M ) NOT NULL LOGGED NOT COMPACT, "WORKDEPT" CHAR(3) , "PHONENO" CHAR(4) , "HIREDATE" DATE , "JOB" CHAR(8) , "EDLEVEL" SMALLINT NOT NULL , "SEX" CHAR(1) , "BIRTHDATE" DATE , "SALARY" DECIMAL(9,2) , "BONUS" DECIMAL(9,2) , "COMM" DECIMAL(9,2) ) IN "TABLESPACE1" LONG IN "TABLESPACE2"; |
接下来执行employee.sql脚本:
$db2 –tvf /home/db2inst1/employee.sql |
执行成功后,表DB2INST1.EMPLOYEE的用户数据存放在TABLESPACE1,大型字段存放在TABLESPACE2中,其中TABLESPACE1是使用自动存储器,TABLESPACE2是使用的非自动存储器。
再次备份测试数据库
现在我们来再次备份测试数据库,好方便我们在下面的例子中可以恢复到此时的状态,如清单12所示。