原创链接:http://blog.csdn.net/hanxin1987216/article/details/4506012
系统故障,事务故障,介质故障,灾难。
问题:可以再次从另一个来源装入数据吗?能够承受丢失多少数据?
能化多少时间来恢复数据库?哪些存储资源可用于存储备份和日志?
崩溃恢复(系统崩溃,DB2重新启动执行回滚)
版本恢复(使用从BACKUP命令获取的备份中恢复先前的数据库版本)
前滚恢复(通过使用完全数据库备份,结合日志文件来扩展版本恢复,要求使用归档日志记录)
db2采用先写日志后写磁盘数据库的方式。
主日志文件是在首次数据库连接时或数据库激活时直接分配的。
辅助日志文件需要时每次动态地分配一个。
有几个与日志记录相关的数据库配置参数。其中一些参数是:
LOGPRIMARY:该参数确定要分配的主日志文件数。
LOGSECOND:该参数确定可分配的辅助日志文件的最大数目。(最大254)
LOGFILSIZ:该参数用于指定日志文件的大小(用 4 KB 页为单位)。
让我们考虑一个示例。假设数据库配置文件中有下列值:
Log file size (4 KB) (LOGFILSIZ) = 250
Number of primary log files (LOGPRIMARY) = 3
Number of secondary log files (LOGSECOND) = 2
Path to log files = C:/mylogs/
一旦首次建立与数据库的连接,就分配三个主日志文件,它们均由 250 个 4 KB 页组成。DB2 将填满第一个日志,然后继续填满第二个和第三个日志。填满第三个日志文件后,没有更多的主(预分配的)日志文件,因此 DB2 将动态地分配第一个辅助日志文件,因为 LOGSECOND 大于零。一旦这个日志文件被填满,DB2 将继续分配另一个辅助日志文件,并将重复该过程,直到达到 LOGSECOND 日志文件数目的最大值为止。对于该示例,当 DB2 尝试分配第三个辅助日志文件时,它将返回一个错误,指出已经达到事务满条件。此时,将回滚该事务。
要允许无限的活动日志记录:
将 USEREXIT 数据库配置参数设置为 ON。
将 LOGSECOND 设置为值 -1。
活动日志:
如果满足下面两个条件中的任何一个,则认为该日志是活动的:
它包含有关还未提交或回滚的事务的信息。
它包含有关已经提交但其更改还未被写入数据库磁盘(外部化)的事务的信息。
联机归档日志:
这种类型的日志包含已提交的且已外部化的事务的信息。这种日志被保存在与活动日志相同的目录中。
脱机归档日志:
是指已经从活动日志目录移动到另一个目录或介质的归档日志。可以手工或使用用户出口(userexit)
的自动过程来完成这个移动。
循环日志类型:
循环日志记录是 DB2 的缺省日志记录方式。从其名称可以知道,这种类型的日志记录以循环方式重用日志。例如,如果有四个主日志文件,那么 DB2 将以如下顺序使用它们:Log #1,Log #2,Log #3,Log #4,Log #1,Log #2 等。只要日志仅包含有关已经提交的且被外部化到数据库磁盘的事务的信息,就可以用循环日志记录方式重用它。换言之,如果日志仍是一个活动日志,则不能重用它。采用上面的示例,如果一个长期运行的事务使用五个日志,那么将发生什么情况呢?在这种情况下,DB2 将分配另一个日志文件 — 辅助日志文件。
归档日志记录:
同样,可以从其名称知道,当使用归档日志记录时,将归档(保留)日志。在循环日志记录中,要覆盖已提交且已外部化的事务,而在归档日志记录中,将保存它们。例如,如果有四个主日志,DB2 可能以如下顺序使用它们:Log #1,Log #2,Log #3,Log #4,(如果 Log #1 的所有事务都已被提交且外部化,则将其归档),Log #5,(如果 Log #2 的所有事务都已被提交且外部化,则将其归档),Log #6 等。正如您从上面的示例所看到的那样,DB2 将使四个主日志文件保持可用,并且将不重用那些已经用某些事务填满的日志文件,这些事务已经被提交且外部化。换言之,它不会覆盖已变成归档日志的日志。
注:在使用归档日志记录之前,需要启用它。要启用它,必须同时打开下列参数或打开其中的任意一个:
LOGRETAIN (db2 update db cfg for database_name using LOGRETAIN ON)
USEREXIT (db2 update db cfg for database_name using USEREXIT ON)
循环日志记录仅支持崩溃和版本恢复,而归档日志记录支持所有类型的恢复:崩溃恢复、版本恢复和前滚恢复。
数据库备份是数据库的完整副本。除了数据外,备份副本还会包含有关表空间、容器、数据库配置、日志控制文件以及恢复历史记录文件的信息。
注:备份将不存储数据库管理器配置文件或注册表变量,只备份数据库配置文件;要执行备份,需要 SYSADM、SYSCTRL 或 SYSMAINT 权限。
下面是用于这种备份的 BACKUP 命令实用程序的语法:
BACKUP DATABASE database-alias [USER username [USING password]]
[TABLESPACE (tblspace-name [ {,tblspace-name} ... ])] [ONLINE]
[INCREMENTAL [DELTA]] [USE {TSM | XBSA} [OPEN num-sess SESSIONS]] |
TO dir/dev [ {,dir/dev} ... ] | LOAD lib-name [OPEN num-sess SESSIONS]]
[WITH num-buff BUFFERS] [BUFFER buffer-size] [PARALLELISM n]
[WITHOUT PROMPTING]
要使用其它备份选项来执行数据库“sample”的完全脱机备份,可以使用以下命令:
(1) BACKUP DATABASE sample
(2) TO /db2backup/dir1, /db2backup/dir2
(3) WITH 4 BUFFERS
(4) BUFFER 4096
(5) PARALLELISM 2
让我们更仔细地研究该命令:
指明要备份的数据库的名称(或别名)。
指定用来存储备份的一个或多个位置。
确定在备份操作期间可以使用内存中的多少缓冲区。使用多个缓冲区可以改善性能。
确定每个缓冲区的大小。
确定使用多少个介质阅读器/记录器进程/线程来执行备份。
注:语法中没有关键字 OFFLINE,因为这是缺省方式。要执行 sample 数据库的完全联机备份,必须指定关键字 ONLINE,如下所示:
BACKUP DATABASE sample
ONLINE
TO /dev/rdir1, /dev/rdir2
我们先前提到过:联机备份允许其他用户在备份数据库时对它进行访问。这些用户所做的一些更改很可能在备份时没有存储在备份副本中。因此,恢复时需要联机备份和一组完整的归档日志。此外,联机备份一完成,DB2 就强制当前的活动日志关闭;结果,将归档该日志。
注:联机备份要求为数据库启用归档日志记录。 DB CFG: LOGHEAD指向活动的最低编号的日志,小于LOGHEAD的日志是归档日志且可以移动。可以使用ARCHIVE LOG 命令来对日志进行归档。
在只有一些表空间有相当大更改的数据库中,可以选择不备份整个数据库,而只备份特定表空间。
要执行表空间备份,请使用以下语法:
(1) BACKUP DATABASE sample
(2) TABLESPACE ( syscatspace, userspace1, userspace2 )
(3) ONLINE
(4) TO /db2tbsp/backup1, /db2tbsp/backup2
通常,您想要将相关的表空间备份在一起,如数据,索引,LOB或定义了表间引用约束的表的表空间
注意:此备份方式只能用于ARCHIVAL LOGGIN 环境中。
有两种类型的增量备份:
增量:DB2 备份自上次完全数据库备份以来所更改的所有数据。
delta:DB2 将只备份自上一次成功的完全、增量或差异备份以来所更改的数据。
注意:要执行增量备份,DB CFG中的TRACKMOD必须设置为 YES(跟踪表空间中发生变化的页面) 在控制中心执行备份。
磁盘上的 DB2 备份文件的命名约定包含下列几项:
数据库别名
表示备份类型的数字(0 表示完全数据库备份,3 表示表空间备份,4 表示来自 LOAD 的副本)
实例名
数据库节点(对于单一分区数据库始终是 NODE0000)
目录节点号(对于单一分区数据库始终是 CATN0000)
备份的时间戳记
映像序列号
分区数据库的备份:
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. Partition 0 is the catalog partition, and needs to be backed-up
separately since this is an offline backup. To perform an offline backup of all
the WSDB database partitions to /dev3/backup, issue the following
commands from one of the database partitions:
db2_all ’<<+0< db2 BACKUP DATABASE wsdb TO /dev3/backup’
db2_all ’|<<-0< db2 BACKUP DATABASE wsdb TO /dev3/backup’
下面是 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 命令,这是数据库允许的唯一方式。
表空间前滚通常可以联机或脱机。但系统目录表空间(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
备份表空间
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 锁在回滚或提交之前不被释放。