##db2move
db2move 是一个数据移动工具,可以用来在 DB2 数据库之间移动大量的表。该命令中支持的操作有 EXPORT、IMPORT 和 LOAD。
db2move 的语法可以象下面那样简单:
db2move database_name action options
该工具先从系统目录表中抽取用户表列表,接着以 PC/IXF 格式导出每个表。然后,可以将这些 PC/IXF 文件导入或装入到另一个
DB2 数据库。
以下是一些示例。下面这条命令用指定的用户标识和密码以 REPLACE 方式导入 sample 数据库中的所有表:
db2move sample import -io replace -u userid -p password
而下面这条命令则以 REPLACE 方式装入 db2admin 和 db2user 模式下的所有表:
db2move sample load -sn db2admin, db2user -lo REPLACE
##db2look 是一个方便的工具,可以从命令提示符或控制中心对其进行调用。该工具可以:
从数据库对象抽取数据库定义语言(DDL)语句
生成 UPDATE 语句来更新数据库管理器和数据库配置参数
生成 db2set 命令来设置 DB2 概要文件注册表
抽取和生成数据库统计报告
生成 UPDATE 语句来复制有关数据库对象的统计信息
类似 LOAD 的实用程序都要求存在目标表。您可以使用 db2look 来抽取表的 DDL,对目标数据库运行该 DLL,然后调用装入操作。如同下面
的示例所演示的那样,db2look 使用起来非常方便。下面这条命令为(来自数据库 department 的)peter 所创建的所有对象生成 DDL 语句,
同时将输出存储在 alltables.sql 中。
db2look -d department -u peter -e -o alltables.sql
接下来这条命令生成:
数据库 department 中所有对象的 DLL(由选项 -d、-a 和 -e 指定)。
复制数据库中所有表和索引的统计信息的 UPDATE 语句(由选项 -m 指定)。
GRANT 授权语句(由选项 -x 指定)。
用于数据库管理器和数据库配置参数的 UPDATE 语句,以及用于概要文件注册表的 db2set 命令(由选项 -f 指定)。
db2look -d department -a -e -m -x -f -o db2look.sql
##RUNSTATS 实用程序
DB2 利用一个完善的、基于成本的优化器来确定如何访问数据。其决策在很大程度上受到了一些统计信息的影响,这些统计信息是关于数据库
表和索引的大小的。因此,要时刻使数据库统计信息保持最新状态,以便能够选择有效的数据存取方案,这一点十分重要。RUNSTATS 实用程
序用于更新表的物理特征及其相关索引的统计信息。这些特征包括记录数(基数)、页数和平均记录长度等。
让我们用一些示例来演示此实用程序的用法。下面的命令收集表 db2user.employee 的统计信息。在计算统计信息期间允许阅读器和记录器访
问该表:
RUNSTATS ON TABLE db2user.employee ALLOW WRITE ACCESS
以下命令用分布式统计收集表 db2user.employee 以及列 empid 和 empname 的统计信息。在此命令运行期间,该表只能用于只读请求。
RUNSTATS ON TABLE db2user.employee WITH DISTRIBUTION ON COLUMNS ( empid, empname )
ALLOW READ ACCESS
以下命令收集表 db2user.employee 的统计信息及其全部索引的详细统计信息:
RUNSTATS ON TABLE db2user.employee AND DETAILED INDEXES ALL
##REORG 和 REORGCHK 实用程序
从数据库增删的数据在物理上可能并不是按顺序放置的。在这种情况下,DB2 必须执行额外的读操作来访问数据。通常,这意味着需要更多的
磁盘 I/O 操作,而我们都知道进行这类操作的代价是昂贵的。在这种情况下,您应该考虑根据索引对表进行物理上的重组,以便相关数据相
互之间靠得更近一些,从而尽可能地减少 I/O 操作。
REORG 是一个为表和/或索引重组数据的实用程序。虽然在物理上对数据进行了重新安排,但 DB2 却提供了联机或脱机执行该操作的选项。
在缺省情况下,脱机 REORG 允许其他用户读取该表。您可以通过指定 ALLOW NO ACCESS 选项来限制表访问。联机 REORG(也称为现场 REORG)
不支持对表的读访问或写访问。由于重新安排了数据页,因此并发应用程序可能必须等待 REORG 完成当前页。您可以使用适当的选项来轻松
地停止、暂停或重新开始重组过程:
下面的示例都是非常容易看懂的:
REORG TABLE db2user.employee INDEX db2user.idxemp INPLACE ALLOW WRITE ACCESS
REORG TABLE db2user.employee INDEX db2user.idxemp INPLACE PAUSE
REORGCHK 是另一个数据维护实用程序,它有一个选项可以用来检索当前的数据库统计信息或更新数据库统计信息。它还会生成带有 REORG
指示符的统计信息报告。REORGCHK 根据统计规则在需要 REORG 的地方用星号(*)标记表或索引。
让我们考虑一些示例。下面这条命令生成当前(关于运行时授权标识拥有的全部表的)统计信息的报告:
REORGCHK CURRENT STATISTICS ON TABLE USER
下面的命令更新统计信息,然后生成在模式 smith 下创建的全部表的报告:
REORGCHK UPDATE STATISTICS ON SCHEMA smith
##REBIND 实用程序和 FLUSH PACKAGE CACHE 命令
在执行数据库应用程序或任何 SQL 语句之前,必须先由 DB2 对它们进行预编译,并生成一个包。包是一种数据库对象,其中含有应用程序
源文件中所使用的已编译 SQL 语句。DB2 使用该包来访问 SQL 语句中引用的数据。DB2 优化器如何为这些包选择数据存取方案呢?它依靠
包创建时的数据库统计信息。
对于静态 SQL 语句,包在编译时创建,并且被绑定到数据库上。如果对统计信息进行了更新,以反映物理数据库特征,那么也应该更新现有
的包。REBIND 实用程序允许您重新创建包,以便可以利用当前的数据库统计信息。命令十分简单:
REBIND PACKAGE package_name
不过,如果您要更改应用程序源代码,那么就得显式地删除现有的相关包,然后重新创建包。REBIND 实用程序不用于这一目的。这里,
我们之所以就此对您加以提醒,是因为 DBA 经常误解了 REBIND 的用法。
对于动态 SQL 语句,它们是在运行时预编译的,而且被存储在包高速缓存中。如果更新了统计信息,那么您可能会刷新高速缓存,以便
重新编译动态 SQL 语句,从而获取更新的统计信息。命令类似下面的样子:
FLUSH PACKAGE CACHE DYNAMIC
##数据库维护过程
RUNSTATS -- REORGCHK--YES--REORG
| |
| |
NO |----- RUNSTATS
|----|---------|
REBIND FLUSH PACKAGE CACHE
| |
APPLICATION EXECUTION
##DB2性能顾问程序
1,图形化工具CONFIGURATION ADVISOR
2,CLP AUTOCONFIGURE USING mem_percent 60 workload_type complex num_stmts 20 APPLY DB AND DBM
##DB2 设计顾问程序
设计顾问程序可以帮您找到 SQL 语句的最佳索引。它使用 DB2 优化器、数据库统计信息和解释(Explain)
机制来为特定查询或一组 SQL 语句(也称为工作负载)生成推荐索引。您可以从命令行用 db2advis 加上必要的输入启动该顾问程序。
下面的示例使用输入文件
input.sql 对 sample 数据库执行设计顾问程序,该输入文件含有一组 SQL 语句。然后将输出存储在 output.out 中。
db2advis -d sample -i input.sql -o output.out
图形化工具:desigen Advisor
### 备份与恢复
##数据库恢复概念
系统故障,事务故障,介质故障,灾难。
#恢复策略
问题:可以再次从另一个来源装入数据吗?能够承受丢失多少数据?
能化多少时间来恢复数据库?哪些存储资源可用于存储备份和日志?
#恢复类型
崩溃恢复(系统崩溃,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)
循环日志记录仅支持崩溃和版本恢复,而归档日志记录支持所有类型的恢复:崩溃恢复、版本恢复和前滚恢复。
用户出口
我们在前几章中多次提到用户出口。用户出口是允许将联机归档日志移到另一个目录(非活动日志目录)或另一个介质的程序。当为完全数据库
恢复进行 ROLLFORWARD 操作期间需要脱机归档日志时,用户出口还会将它们检索到活动日志目录中。要启用用户出口,将 USEREXIT 数据库配置参
数设置为 ON。一旦启用,DB2 将根据需要自动调用用户出口程序。需要将该程序命名为 db2uext2,在 Windows 中,应该将它存储在 sqllib\bin
目录中,在 UNIX 中,应该将它存储在 sqllib/bin 目录中。
## 数据库和表空间备份
#数据库备份 第 2 页(共6 页)
数据库备份是数据库的完整副本。除了数据外,备份副本还会包含有关表空间、容器、数据库配置、日志控制文件以及恢复历史记录文件的信息。注:备份将不存储数据库管理器配置文件或注册表变量。只备份数据库配置文件。
要执行备份,需要 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’