当DB2数据库出现异常后,可以使用db2dart或inspect命令查看整个数据库的一致性。db2dart命令可以用来验证数据库以及相关的数据库对象是否正确,是否存在问题;还可以用来显示数据库控制文件的内容,以便在重建数据库时从其他情况下无法访问的表中抽取数据。
如果想查看使用db2dart命令的相关语法,可以在当前DB2 CLP窗口中,执行db2dart命令(不带任何参数),就可以看到其相关选项了。db2dart的基本语法是"db2dart < database name > [ action ] [ options . . . ] ",默认情况下,db2dart实用程序将创建一个"数据库名.RPT"的报告文件。db2dart实用程序直接从磁盘中读取数据库中的数据和元数据,而不是通过DB2数据库管理器来进行访问。
使用db2dart实用程序时,需要注意,要保证该数据库上没有活动的数据库连接(也就是说如果不取消激活数据库,那么db2dart将产生不可靠的结果)。如果您在当前DB2 CLP窗口中,先连接示例数据库SAMPLE,然后再执行"db2dart sample /db"命令,那么会有FYI提示信息,告诉你现在SAMPLE数据库上有一个活动的连接,请停掉所有的连接后再次执行db2dart命令,具体过程和提示信息如下所示:
- C:\> db2 connect to sample 数据库连接信息
- 数据库服务器 = DB2 / NT 9.5.0
- SQL 授权标识 = DB2ADMIN
- 本地数据库别名 = SAMPLE
- C:\> db2dart sample /db
- FYI: An active connection to the database has been detected .
- False errors may be reported .
- Deactivate all connections and re-run to verify .
- Warning : The database state is not consistent .
- Warning : Errors reported about reorg rows may
- be due to the inconsistent state of the database .
- DB2DARTDB2DART Processing completed with warning ( s ) !
- Complete DB2DARTDB2DART report found in :
- C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\DART0000\SAMPLE.RPT
遇到这种情况,正确的做法是在当前DB2CLP窗口中,发出"force applications all"命令,断开所有的数据库连接,然后执行"db2dart sample /db"命令,具体过程如下所示:
- C:\> db2 force applications all
- DB20000I FORCE APPLICATION 命令成功完成。
- DB21024I 此命令为异步的,可能未能立即生效。
- C:\> db2 list applications
- SQL1611W "数据库系统监视器"没有返回任何数据。
- C:\> db2dart sample /db
- The requested DB2DART processing has completed successfully!
- Complete DB2DART report found in:
- :\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\DART0000\SAMPLE.RPT
db2dart命令成功完成,db2dart执行结果显示正常,如果有错误的话,会提示有ERROR存在,所有的结果都会存储在SAMPLE.RPT中。打开SAMPLE.RPT文件,可以看到数据库诊断的详细信息,由于篇幅有限,这里只列示了部分信息,如下所示:
- DART (V9.5) Report :
- 2008-04-02-23.28.24.531000
- Database Name : SAMPLE
- Report name : SAMPLE.RPT
- Old report back-up : SAMPLE.BAK
- Database Subdirectory : C:\DB2\NODE0000\SQL00002
- Operational Mode : Database Inspection Only ( INSPECT )
- Action option : DB
- Connecting to Buffer Pool Services . . .
- Database inspection phase start .
- Tablespace file inspection phase start .
- Loading tablespace files .
- Inspecting next tablespace and associated containers .
- Inspecting next tablespace and associated containers .
- Inspecting next tablespace and associated containers .
- Inspecting next tablespace and associated containers .
- Inspecting next tablespace and associated containers .
- Inspecting next tablespace and associated containers .
- Inspecting next tablespace and associated containers .
- 7 tablespaces were identified and their containers checked .
- Tablespace file inspection phase end .
- SYSBOOT inspection phase start .
- Data inspection phase start . Data obj : 1 In pool : 0
- Data inspection phase end .
- SYSBOOT inspection phase end .
- SYSTABLES inspection phase start .
- Data inspection phase start . Data obj : 5 In pool : 0
- Data inspection phase end .
- SYSTABLES inspection phase end .
- Bufferpool file report phase start .
- 1 bufferpools were identified .
- Bufferpool file report phase end .
- Tablespace inspection phase start . Pool : 0
- Tablespace-info inspection phase start .
- Checking Table space ID : 0
- Name = SYSCATSPACE
- Extent size = 4
- # of containers = 1
- ----------------略----------------------------
- Table inspection end .
- Tablespace inspection phase end .
- Tablespace inspection phase start . Pool : 6
- This is a temporary table space . Nothing to inspect .
- Tablespace inspection phase end .
- Database inspection phase end .
- ----------------略----------------------------
我们在数据库的日常维护过程中,经常使用的 db2dart命令的选项主要有:
/DB (默认值):检查整个数据库。
/T:检查单个表。
/TSF:只检查表空间文件和容器。
/TSC:检查一个表空间的结构,但不包含它所属的那些表。
/TS:检查一个单独的表空间和它所属的那些表。
/DI:转储(DUMP)索引页结构。
利用db2dart查找停顿(quiesce)表空间的用户
在我们执行quiesce命令停顿一张表期间,该表所在的表空间无法被其他应用访问,要查找停顿表空间的用户,我们可以使用DB2 LIST TABLESPACES SHOW DETAIL命令。下面借助 db2dart工具产生的报告,我们可以查询到发出quiesce命令的原始用户。具体执行步骤如下:
(1) 停止DB2实例:db2stop force。
(2) 产生db2dart的报告:db2dart sample /dtsf。
(3) 从报告中查找发出停顿命令的用户:根据命令执行结果的提示,找到db2dart产生的报告文件。打开该文件,对于停顿的表空间,可以在文件中找到信息如下所示:
- Information for Tablespace ID: 2
- -------------------------------------
- Tablespace name: USERSPACE1
- Table space flags (HEX): 0101
- Table space type: System Managed Space (SMS)
- Page size: 4096
- Extent size: 32
- Prefetch size: 32
- Version: 9
- Tablespace state: 2
- Number of quiescers: 1
- Userid of quiescer: DB2INST1
- Quiesce state: 2--注:16进制表示的表空间状态,可执行db2tbst 0x2命令查看16进制
- 的表空间状态的详细描述,命令输出结果:Quiesced Update
- Tbspace ID of quiesced object: 2--注:表空间ID,对应SYSCAT.TABLES表中的
- TBSPACEID Table ID of quiesced object: 15--注:表ID,对应SYSCAT.TABLES表中
- 的TABLEID字段
- EDU ID: 0
- ......
定位表空间的ID和表的ID后,执行下面的SQL语句找出是哪个表:
- db2 select tabname from syscat.tables where tbspaceid=2 and tableid=15
- TABNAME
- ------------------------------------------------------------------------
- STAFF
- 1 条记录已选择。
使用查找到的用户DB2INST1登录后,执行重置命令:
- db2 quiesce tablespaces for table db2inst1.staff reset
命令执行成功后连接数据库,验证表空间状态正常。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-614497/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13165828/viewspace-614497/