##数据库和表空间恢复
#数据库恢复

下面是 RESTORE 命令的语法:


RESTORE DATABASE source-database-alias { restore-options | CONTINUE | ABORT }

restore-options:
  [USER username [USING password]] [{TABLESPACE [ONLINE] |
  TABLESPACE (tblspace-name [ {,tblspace-name} ... ]) [ONLINE] |
  HISTORY FILE [ONLINE]}] [INCREMENTAL [AUTOMATIC | ABORT]]
  [{USE {TSM | XBSA} [OPEN num-sess SESSIONS] |
  FROM dir/dev [ {,dir/dev} ... ] | LOAD shared-lib
  [OPEN num-sess SESSIONS]}] [TAKEN AT date-time] [TO target-directory]
  [INTO target-database-alias] [NEWLOGPATH directory]
  [WITH num-buff BUFFERS] [BUFFER buffer-size]
  [DLREPORT file-name] [REPLACE EXISTING] [REDIRECT] [PARALLELISM n]
  [WITHOUT ROLLING FORWARD] [WITHOUT DATALINK] [WITHOUT PROMPTING]


让我们研究一个示例。要执行 sample 数据库的恢复,请使用以下命令:


(1)RESTORE DATABASE sample
(2)  FROM  C:\DBBACKUP
(3)  TAKEN AT 20030314131259
(4)  WITHOUT ROLLING FORWARD
(5)  WITHOUT PROMPTING


让我们更仔细地研究该命令:

指明要恢复的数据库映像的名称。
指定要从什么位置读取输入备份文件。
如果目录中有多个备份映像,那么该选项将根据时间戳记(它是备份名称的一部分)确定特定的备份。
如果为数据库启用了归档日志记录,那么当恢复该数据库时,它将自动被置于前滚暂挂状态。这行告诉 DB2 不要使数据库处于前滚暂挂状态。
在执行 RESTORE 时,不会提示您。
请注意,语法中没有关键字 OFFLINE,因为这是缺省方式。事实上,对于 RESTORE 实用程序,这是数据库允许的唯一方式。

#表空间恢复

表空间恢复需要相当仔细的规划,因为比较容易犯错,这会使数据处于不一致状态。

下面是表空间 RESTORE 命令的示例:


(1)RESTORE DATABASE sample
(2)  TABLESPACE ( mytblspace1 )
(3)  ONLINE
(4)  FROM /db2tbsp/backup1, /db2tbsp/backup2


让我们更仔细地研究该命令:

指明要恢复的数据库映像的名称。
指出这是表空间 RESTORE,并指定要恢复的一个或多个表空间的名称。
指出这是联机恢复。注:对于用户表空间,既允许联机恢复也允许脱机恢复。正如前面所提到的那样,对于数据库,只允许脱机恢复。
指定输入备份文件所在的位置。
表空间恢复注意事项

恢复表空间之后,它将始终处于前滚暂挂状态。要使表空间可访问并复位该状态,必须至少将表空间前滚到最小的时间点
(point in time,PIT)。该最小的 PIT 确保表空间和日志与系统目录中的内容保持一致。

请考虑下面的示例:

假设在时间 t1 您执行了完全数据库备份,该备份包括了表空间 mytbls1
在时间 t2,您在表空间 mytbls1 中创建了表 myTable。这会将表空间 mytbs1 恢复的最小 PIT 设置为 t2。
在时间 t3,您决定仅从在 t1 进行的完全数据库备份恢复表空间 mytbls1。
恢复完成之后,表空间 mytbls1 将处于前滚暂挂状态。如果允许前滚到最小 PIT 之前的某一点,则表空间 mytbls1 将失去表 myTable;然而,系统目录将显示该表确实存在于 mytbls1 中。因此,为了避免类似的不一致,DB2 会在您恢复表空间时强制您至少前滚到最小 PIT。
当针对表空间或表空间中的表运行 DDL 语句时,会更新最小的 PIT。为了确定表空间恢复的最小 PIT,可以使用下列两种方法之一:

使用 LIST TABLESPACES SHOW DETAIL 命令
通过 GET SNAPSHOT FOR TABLESPACE ON db_name 命令获取表空间快照。
另外,系统目录表空间(SYSCATSPACE)必须前滚到日志的末尾并处于脱机方式。

#重定向恢复
我们前面提到过备份文件包括有关表空间和容器的信息。如果过去存在的容器在进行备份时不再存在时,会发生什么情况?如果 RESTORE 实用程序找不到该容器,那么您将得到一个错误。

如果您不想在这个位置恢复该备份,而想在别的位置进行恢复,但在那个地方又使用了其它配置,该怎么办?同样,在该情况下恢复备份将会产生问题。

重定向恢复解决了这些问题。重定向恢复的恢复备份过程只有四个步骤:

获取记录在输入备份中的、有关容器和表空间的信息。通过将 REDIRECT 关键字包含在 RESTORE 命令中就能完成这一任务。例如:

RESTORE DATABASE DB2CERT FROM C:\DBBACKUP
        INTO NEWDB REDIRECT WITHOUT ROLLING FORWARD

不需要事先产生数据库NEWDB
下面是该命令的输出:


SQL1277N  Restore has detected that one or more table space containers are
inaccessible, or has set their state to 'storage must be defined'.
DB20000I  The RESTORE DATABASE command completed successfully.

注意:此时已经创建了数据库NEWDB。

复查来自(部分)恢复数据库 newdb 的表空间信息:

LIST TABLESPACES SHOW DETAIL
表空间还没有产生。

为每个表空间设置新容器。表空间有一个标识,可以从 LIST TABLESPACES 命令的输出获取这个标识。如下使用该标识:

SET TABLESPACE CONTAINERS FOR 0 USING (FILE "d:\newdb\cat0.dat" 5000)
SET TABLESPACE CONTAINERS FOR 1 USING (FILE "d:\newdb\cat1.dat" 5000)
...
SET TABLESPACE CONTAINERS FOR n USING (PATH "d:\newdb2")

上面命令将产生表空间。

在上面的示例中,n 表示备份中某一个表空间的标识。另外请注意,对于重定向恢复,不能更改表空间的类型;即,如果表空间是 SMS,那么就不能将它更改为 DMS。

通过将关键字 CONTINUE 包含在 RESTORE 命令中,开始将数据本身恢复到新容器中,如下所示:

RESTORE DATABASE DB2CERT CONTINUE
现在,您已经了解了重定向恢复是如何工作的。也可以将它用于为 SMS 表空间添加容器。如果您阅读过本系列的第二篇教程,那么您应该知道在大多数情况下不能对 SMS 表空间进行修改以添加容器。重定向恢复为这一限制提供了一种变通方法。

分区数据库的恢复::

In the following example, the database WSDB is defined on all 4 partitions,
numbered 0 through 3. The path /dev3/backup is accessible from all
partitions. The following offline backup images are available from
/dev3/backup:
wsdb.0.db2inst1.NODE0000.CATN0000.20020331234149.001
wsdb.0.db2inst1.NODE0001.CATN0000.20020331234427.001
wsdb.0.db2inst1.NODE0002.CATN0000.20020331234828.001
wsdb.0.db2inst1.NODE0003.CATN0000.20020331235235.001
To restore the catalog partition first, then all other database partitions of the
WSDB database from the /dev3/backup directory, issue the following
commands from one of the database partitions:

db2_all ’<<+0< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331234149
INTO wsdb REPLACE EXISTING’
db2_all ’<<+1< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331234427
INTO wsdb REPLACE EXISTING’
db2_all ’<<+2< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331234828
INTO wsdb REPLACE EXISTING’
db2_all ’<<+3< db2 RESTORE DATABASE wsdb FROM /dev3/backup
TAKEN AT 20020331235235
INTO wsdb REPLACE EXISTING’


##数据库和表空间前滚
#数据库前滚
在上一章中,我们简要地讨论了 ROLLFORWARD 命令。在本章中,我们将更详细地讨论它。ROLLFORWARD 命令允许恢复到某一时间点;
这意味着该命令将让您遍历 DB2 日志,并重做或撤销记录在日志中的操作直到某个特定的时间点。虽然可以将数据库或表空间前滚到最小
PIT 之后的任何时间点,但不能保证您选择前滚到的结束时间将使所有数据保持一致。

我们将不在本教程中讨论 QUIESCE 命令。然而,值得提一下的是:可以在常规数据库操作期间使用该命令来设置一致性点。通过设置
这些一致性点,您可以始终执行至其中任何一点的时间点恢复,并保证数据同步。

一致性点和许多其它信息一起被记录在 DB2 历史记录文件中,可以使用 LIST HISTORY 命令来查看该文件。

在前滚处理期间,DB2 将:

在当前日志路径中查找必需的日志文件。
如果找到该日志,重新从日志文件应用事务。
如果在当前路径中找不到该日志文件,并且使用了 OVERFLOWLOGPATH 选项,那么 DB2 将在该选项指定的路径中搜索并且将使用该位置中的
日志。
如果在当前路径中找不到该日志文件并且没有使用 OVERFLOWLOGPATH 选项,则调用用户出口来检索归档路径中的日志文件。
仅当前滚完全数据库恢复并且启用了用户出口时,才会调用用户出口来检索日志文件。
一旦日志在当前日志路径或 OVERFLOWLOGPATH 中,就将重新应用事务。
执行 ROLLFORWARD 命令需要 SYSADM、SYSCTRL 或 SYSMAINT 权限。

下面是 ROLLFORWARD 命令的语法:


ROLLFORWARD DATABASE database-alias [USER username [USING password]]
[TO {isotime [ON ALL DBPARTITIONNUMS] [USING LOCAL TIME] | END OF LOGS
[On-DbPartitionNum-Clause]}] [AND {COMPLETE | STOP}] |
{COMPLETE | STOP | CANCEL | QUERY STATUS [USING LOCAL TIME]}
[On-DbPartitionNum-Clause] [TABLESPACE ONLINE | TABLESPACE (tblspace-name
[ {,tblspace-name} ... ]) [ONLINE]] [OVERFLOW LOG PATH (log-directory
[{,log-directory ON DBPARTITIONNUM db-partition-number} ... ])] [NORETRIEVE]
[RECOVER DROPPED TABLE dropped-table-id TO export-directory]

On-DbPartitionNum-Clause:
  ON {{DBPARTITIONNUM | DBPARTITIONNUMS} (db-partition-number
  [TO  db-partition-number] , ... ) | ALL DBPARTITIONNUMS [EXCEPT
  {DBPARTITIONNUM | DBPARTITIONNUMS} (db-partition-number
  [TO db-partition-number] , ...)]}


让我们研究一个示例。要执行样本数据库的前滚,可以使用下列任意一条语句:


(1)ROLLFORWARD DATABASE sample TO END OF LOGS AND COMPLETE
(2)ROLLFORWARD DATABASE sample TO timestamp AND COMPLETE
(3)ROLLFORWARD DATABASE sample TO timestamp USING LOCAL TIME AND COMPLETE


让我们仔细地研究每一条语句:

在该示例中,我们将前滚到日志的结尾,这意味着将遍历所有归档和活动日志。最终它将完成前滚并通过回滚任何未提交的事务来除去
前滚暂挂状态。
对于该示例,DB2 将前滚到指定的时间点。使用的时间戳记形式必须是 CUT(全球标准时间,Coordinated Universal Time),这可以通
过从当前时区减去本地时间来计算。
该示例类似于上一个示例,但可以用本地时间表示时间戳记。
请注意,语法中没有关键字 OFFLINE,因为这是缺省方式。事实上,对于 ROLLFORWARD 命令,这是数据库允许的唯一方式。

#表空间前滚 第 2 页(共4 页)


表空间前滚通常可以联机或脱机。但系统目录表空间(SYSCATSPACE)是例外,它只能进行脱机前滚。

下面是一个表空间前滚示例:

ROLLFORWARD DATABASE sample
  TO END OF LOGS AND COMPLETE
  TABLESPACE ( userspace1 ) ONLINE


上面示例中的选项已经在数据库前滚一章中说明过了。这里唯一的新选项是 TABLESPACE,它指定要前滚的表空间。

表空间前滚考虑事项

如果启用注册表变量 DB2_COLLECT_TS_REC_INFO,则只处理恢复表空间所需的日志文件;ROLLFORWARD 命令将跳过不需要的日志文件,这可以加快恢复时间。
ROLLFORWARD 命令的 QUERY STATUS 选项可用于列出 DB2 已经前滚的日志文件、下一个需要的归档日志文件以及自前滚处理开始以来最后一次提交的事务的时间戳记。例如:
ROLLFORWARD DATABASE sample QUERY STATUS USING LOCAL TIME
在表空间时间点前滚操作完成后,表空间处于备份暂挂状态。必须对表空间或数据库进行备份,因为在表空间恢复到的时间点和当前时间之间对它所做的所有更新都已经丢失。

##索引的重新创建
#重建索引

如果由于一些硬件或操作系统原因而使数据库崩溃,那么在数据库重新启动阶段一些索引可能被标记为无效。配置参数 INDEXREC 确定 DB2 何时将试图重建无效索引。

INDEXREC 在数据库管理器和数据库配置文件中都进行了定义。该参数有三个可能的设置:

SYSTEM:只能在数据库配置文件中指定该值。当将 INDEXREC 设置为该值时,DB2 将查找在数据库管理器配置文件中指定的 INDEXREC 设置,并使用该值。
ACCESS:这意味着在第一次访问索引时重建无效索引。
RESTART:这意味着在数据库重新启动期间重建无效索引。


###管理服务器
get admin cfg
update admin cfg using <p> <v>


备份表空间
BACKUP DATABASE SAMPLE TABLESPACE ( USERSPACE1 ) ONLINE TO "d:\db2\" WITH 1 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;

生成表的DDL
db2look -d SAMPLE -t  MY_EMPLOYEE  -a -e  -l  -x  -c ;
包括表的统计信息的DDL
db2look -d SAMPLE -t  MY_EMPLOYEE  -a -e  -l  -x  -m  -r  -c ;

svmon

5.1 maintrcie 4
db2 fixpak 2

## 数据库空间需求
# 系统目录表的空间需求  3.5MB

# 用户表数据的空间需求
每页面255行 
4KB页面 68字节用于管理开销,4028用于数据,行长度不能超过4005字节,最多500列。
8,16,32KB 页面                                     8101,16293,32677     1012列
       估计大小公式4KB:
          (4028/(AVERAGE ROW SIZE + 10)) = RECORDS_PER_PAGE
          (NUMBER_OF_RECORDS/RECORDS_PER_PAGE)*1.1 = NUMBER_OF_PAGES
  长型字段数据的空间需求
存储在单独的表对象中。数据存储在大小为32KB的区域中。
  大对象数据的空间需求
#索引的空间的需求
(平均索引键大小+9)×行数×2
  创建索引的临时空间需求
         (平均索引键大小+9)×行数×3.2
对每个叶子页的平均键数的粗略估计是
#日志文件的空间需求
(logprimary + logsecond)*(logfilesiz+2)*4096
如果以对数据库启用了无限记录(logsecond 设置为-1),则必须启用userexit配置参数。
#临时空间需求
 
##分区数据库验证
  select distinct dbpartitionnum(empno) from employee;
#分区键
未指定则使用主键的第一列,无主键则使用第一个非长类型列。
选择能否使数据分布均匀及经常使用的列,可以用列的组合但不能超过16列,列越少,性能越好。
分区键不能更改,任何唯一键或主键必须包含分区键列

#表并置
需要经常进行关联的表在指定分区键时,每个分区键中对应列的数据类型必须是分区兼容的,并称为表并置
具有相同值但有不同类型的两个变量会安相同的分区算法映射至同一个分区号。
        如:INTEGER,SMALLINT,BIGINT
    REAL,FLOAT
    CHAR,VARCHAR

#隔离级别
  隔离级确定了在数据被访问时,如何锁定数据或将数据与其它进程隔离。您可以在应用程序预编译或在
  静态 SQL 程序中绑定到数据库时指定隔离级,或者也可以将它指定为连接或语句选项。
  选择的隔离级可同时影响 DB2 选择的锁定策略和 S 行锁定可以由应用程序持有的时间。
  隔离级只应用于被读取的行。对于更改的行,应用程序需要获取一个 X 或 W 锁。无论应用程序的隔离级是什么,
  X 或 W 锁在回滚或提交之前不被释放。