Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101935570
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935571
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935572
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935573
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935574
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935575
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935576
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935577
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935578
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935579
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935580
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935581
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935582
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935583
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935574
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935585
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935586
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935587
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935588
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935589
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935590
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935592
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935593
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935594
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935595
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935596
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935597
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935598
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935589
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935600
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935601
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935602
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935603
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935604
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935605
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935606
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935607
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935608
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935609
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935610
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935611
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935612
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935613
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935604
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935615
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935616
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935617
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935618
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935619
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935620
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935621
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 6 部分: 高可用性:备份和恢复(8)-sdccf-ChinaUnix博客
  • 博客访问: 101935622
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:43:54

developerWorks



数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20507) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20505) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20504) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20502) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20501) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20498) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20497) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20496) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20495) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20494) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20493) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20492) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20491) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20490) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20488) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20486) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20485) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20484) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20483) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20482) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20480) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20479) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20477) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20476) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20475) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20474) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20472) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20471) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20470) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20466) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20465) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20464) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20463) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20462) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20457) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


数据库重建

数据库重建功能是由恢复实用程序提供的。它允许使用一组备份镜像重建一个全新的数据库。您可以选择重建整个数据库,或者重建一个只包含原来数据库中部分表空间的数据库。数据库重建过程取决于数据库是可恢复的还是不可恢复的。在后面的小节中我们将先后谈到这两种场景。

对于可恢复数据库,重建实用程序允许只使用表空间备份重建整个数据库。这里不需要完整数据库备份。完整数据库备份可能需要更大的维护窗口,对于高可用性环境,这样会增加调度的难度。使用表空间备份重建数据库的能力对于可用性和可恢复性来说是个很好的增强。

假设您有一个名为 TEST 的可恢复数据库。某天夜里,出现了一次停电事故。数据库所在的磁盘遭到了损坏。数据库再也不能访问了,于是您想恢复数据库。该数据库有以下表空间:

  • SYSCATSPACE(系统编目)
  • USERSPACE1(用户数据表空间)
  • USERSPACE2(用户数据表空间)
  • USERSPACE3(用户数据表空间)

您可以用的还有:

  • 所有日志文件。由于日志与数据库存储在不同的磁盘上,因此它们能够幸免于难。
  • 没有 任何数据库级的备份,但是有以下表空间备份:
    • TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 —— SYSCATSPACE 和 USERSPACE1 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 —— USERSPACE2 和 USERSPACE3 的备份
    • TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 —— USERSPACE3 的备份

如果我们使用恢复和前滚方法(前面的小节中有过讨论)将数据库恢复到最近的一个时间点,那么我们需要恢复一个数据库备份,然后将数据库前滚到日志的最后。不幸的是,在这种情况下,这是不可能实现的,因为我们没有数据库备份。我们只有表空间备份。如果在任何一个表空间备份上运行一个常见的 RESTORE 命令,那么将得到以下错误:

db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database for a restore 
from a table space level backup.

有了数据库重建功能,现在可以只用表空间备份和日志重建 TEST 数据库。要重建一个数据库,可以在 RESTORE DATABASE 命令中指定 REBUILD 选项。

下面的步骤将 TEST 数据库重建到最近的时间点。

  1. REBUILD 选项发出 RESTORE DATABASE 命令:
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
    

    重建过程中的第一步是识别重建目标镜像。重建目标镜像应该是要在重建操作中使用的最近的备份镜像。之所以称之为目标镜像,是因为它定义了要重建的数据库的结构,包括可以恢复的表空间、数据库配置和日志序号。它可以是任何类型的备份(完整备份、表空间备份、增量备份、在线或离线备份)。在这个例子中,最近的备份镜像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们使用它作为重建操作的目标镜像。

    在这个命令成功执行之后,TEST 数据库的结构被恢复。我们可以得到数据库配置和它的历史之类的信息。如果发出一个 LIST HISTORY 命令(例如 db2 list history all for test),那么我们将得到以下输出:

    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107001   F                                 20060517135208
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE3
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121108
        Status: A
    ---------------------------------------------------------------------------
     EID: 7 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121108001   F                                 20060515135047
    ---------------------------------------------------------------------------
     Contains 2 tablespace(s):
     00001 USERSPACE1
     00002 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121108
      End Time: 20060519121113
        Status: A
    ---------------------------------------------------------------------------
     EID: 8 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  P  20060519121113001   F                                 20060516135136
    ---------------------------------------------------------------------------
     Contains 1 tablespace(s):
     00001 USERSPACE2
    ---------------------------------------------------------------------------
       Comment: RESTORE TEST WITH RF
    Start Time: 20060519121113
      End Time: 20060519121114
        Status: A
    ---------------------------------------------------------------------------
     EID: 9 Location:
    
    
    Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
    -- --- ------------------ ---- --- ------------ ------------ --------------
     R  D  20060519121107      R       S0000001.LOG S0000003.LOG 20060518135208
    ---------------------------------------------------------------------------
     Contains 4 tablespace(s):
     00001 USERSPACE3
     00002 USERSPACE2
     00003 USERSPACE1
     00004 SYSCATSPACE
    ---------------------------------------------------------------------------
       Comment: REBUILD TEST WITH RF
    Start Time: 20060519121107
      End Time: 20060519121115
        Status: A
    ---------------------------------------------------------------------------
     EID: 10 Location:
    

    上面显示的 LIST HISTORY 命令输出中有四个条目。它们都与重建操作有关。

    第一个条目是 EID: 7,它表明是备份镜像 20060517135208 上的一个恢复操作,被恢复的表空间为 USERSPACE3。(还记得吗,这个备份镜像只包含 USERSPACE3。)但是,我们需要使用 ALL TABLESPACES 选项恢复所有表空间,所以数据库中剩下的表空间也要恢复。这一点反映在 LIST HISTORY 输出中剩下的部分。

    通过使用备份恢复文件中的信息,恢复实用程序发现要恢复的所有表空间的备份镜像,并恢复它们。在恢复之后,表空间被置于 roll-forward pending 状态。您可以看看 LIST HISTORY 输出中的注释行,每个表空间都标上了 'WITH RF',表明在恢复之后要执行前滚。

    要进行恢复,所有备份镜像都必须已经存在,并存储在历史文件中。否则就会返回一个错误,说明恢复实用程序不能发现所需的镜像。

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
    

    在恢复了所有表空间之后,这些表空间被置于 rollforward pending 状态。我们需要前滚数据库,使数据库回到正常状态。

    要在重建操作期间前滚数据库,最早备份镜像与最近备份镜像之间的所有日志文件都必须能够为前滚实用程序所用。如果您想前滚到比最近备份更近的时间点上,那么这个备份之后的所有日志文件也必须可用。

    在我们的例子中,所有日志仍然完好无损,它们仍然存在于 LOGPATH 数据库配置参数指定的日志路径中。前滚实用程序将在那里找到它们。正因为如此,我们不需要在 ROLLFORWARD 命令中指定日志文件的路径。如果日志文件被存储在其他地方,那么就必须使用 ROLLFORWARD 命令中的 OVERFLOW LOG PATH 选项指定日志文件的位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
    

    至此,TEST 数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







如前一个例子所演示的那样,数据库重建功能让我们可以只使用表空间备份和日志来重建一个完整的数据库。这个实用程序是如此的健壮,我们不需要所有的表空间备份就能重建一个数据库。我们可以只用一部分表空间就能重建一个数据库。

再次使用前面的例子,假设 USERSPACE1 和 USERSPACE2 中的数据对于用户来说非常重要。在停电事故发生后,我们必须尽快恢复这两个表空间。USERSPACE3 则不太重要,而且它很大。如果恢复所有表空间,那么就要花很长的时间。如果可以只用其中的 USERSPACE1 和 USERSPACE2 重建一个可连接的数据库,那就很好了,这样用户很快就可以使用数据库。如果时间允许,可以再来恢复 USERSPACE3。下面的步骤展示了如何使用数据库重建实用程序来完成这一任务。

  1. REBUILD 选项发出一个 RESTORE DATABASE 命令,指定只恢复部分表空间:
    db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2) taken 
    at 20060516135136
        

    虽然我们只想恢复 USERSPACE1 和 USERSPACE2,但是还必须恢复 SYSCATSPACE,因为这个表空间中存放着所有系统信息。没有它,DB2 就不知道关于这个数据库的结构的任何信息。

    在上面的例子中指定的目标镜像是包含 USERSPACE2 和 USERSPACE3 的镜像。这是包含我们要恢复的表空间的最近的备份。虽然 20060517135208 是三个备份当中最近的备份,但是我们不能使用它,因为它不包含 USERSPACE1、USERSPACE2 或 SYSCATSPACE。

    下面的命令效果是一样的:

    db2 restore db test rebuild with all tablespaces in database except tablespace 
       (USERSPACE3) taken at 20060516135136
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test to end of logs
        

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
        

    您可以选择前滚到另外一个时间点,而不是前滚到日志的最后。您所选择的时间点必须大于恢复中使用的备份镜像的时间戳。

至此,TEST 数据库已经可以连接,并且除了 USERSPACE3 之外的所有表空间都处于 NORMAL 状态。USERSPACE3 处于 RESTORE PENDING 状态。

您可以在以后通过一个常规的表空间恢复(不带 REBUILD 选项)来恢复 USERSPACE3:

  1. 发出一个 RESTORE DATABASE 命令,并指定要恢复的表空间:
      
    db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定要前滚的表空间:
    db2 rollforward db test to end of logs tablespace (USERSPACE3)
       

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

现在,TEST 数据库的所有四个表空间都处于 NORMAL 状态。

在生产环境中,或者在像前面那样的恢复场景中,只让一部分表空间在线是很有用的。在测试环境中这样做也有用处,您可以只恢复感兴趣的那部分表空间。







当重建一个可恢复数据库时,可以使用数据库备份,也可以使用表空间备份。备份可以是在线的,也可以是离线的。

如果您有一个包含日志文件的在线备份镜像,并且想使用这些日志来前滚数据库,那么可以使用 RESTORE DATABASE 命令的 LOGTARGET 选项从镜像中获取日志。

再次使用 TEST 数据库作为例子,假设备份镜像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 是一个包含日志的在线备份镜像。要使用表空间备份和存储在备份镜像中的日志恢复整个数据库:

  1. LOGTARGET 选项发出一个 RESTORE DATABASE 命令。在恢复期间,这些日志被提取到 LOGTARGET 指定的位置。
        
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
       logtarget /logs
        

  2. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令,并指定日志的位置:
    db2 rollforward db test to end of logs overflow log path (/logs)
       

    注意,OVERFLOW LOG PATH 选项用于指定日志位置。

  3. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       







增量备份镜像也可以用于重建数据库。当重建过程中涉及增量镜像时,默认情况下恢复实用程序会尝试为所有增量镜像使用自动增量恢复。如果没有使用 RESTORE DATABASE 命令的 INCREMENTAL AUTOMATIC 选项,但是目标镜像是一个增量备份镜像,那么恢复实用程序将使用自动增量恢复发出重建操作。

如果目标镜像不是一个增量镜像,但是另一个需要的镜像是增量镜像,那么恢复实用程序也将确保使用自动增量恢复来恢复那些增量镜像。不管是否指定了 INCREMENTAL AUTOMATIC 选项,恢复实用程序的行为是一样的。

如果指定 INCREMENTAL 选项而没有指定 AUTOMATIC 选项,那么需要手动执行整个重建过程。恢复实用程序只是从目标镜像中恢复初始的元数据,就像在常规的手动增量恢复中一样。然后还需要使用所需的增量恢复链(见 增量恢复)完成目标镜像的恢复。然后,为了重建数据库,还需要恢复剩下的镜像。这个过程可能比较冗长。

建议使用自动增量恢复来重建数据库。只有在恢复失败的情况下,才应该尝试通过手动方式重建数据库。







由于重建功能是恢复实用程序的一部分,因此可以使用重定向方法重建数据库,就像在重定向恢复中那样。下面使用 REDIRECT 选项将整个 TEST 数据库重建到最近的时间点:

  1. REBUILDREDIRECT 选项发出一个 RESTORE DATABASE 命令:
           
    db2 restore db test rebuild with all tablespaces in database taken at 20060517135208 
       redirect 
            

  2. 对要为之重新定义容器的每个表空间发出一个 SET TABLESPACE CONTAINERS 命令。例如:
    db2 set tablespace containers for 3 using (file '/newuserspace2' 10000)
    db2 set tablespace containers for 4 using (file '/newuserspace3' 15000)
        

  3. CONTINUE 选项发出一个 RESTORE DATABASE 命令:
    db2 restore db test continue
       

  4. TO END OF LOGS 选项发出一个 ROLLFORWARD DATABASE 命令。(假设日志路径目录中所有日志都是可以访问的;否则,需要使用 OVERFLOW LOG PATH 选项来指定备选日志路径。)
    db2 rollforward db test to end of logs 
       

  5. STOP 选项发出一个 ROLLFORWARD DATABASE 命令:
    db2 rollforward db test stop
       

至此,这个数据库已经可以连接,并且所有表空间都处于 NORMAL 状态。







到目前位置,我们讨论的所有重建方法都同样适用于不可恢复数据库。惟一的区别是:

  • 如果一个数据库是不可恢复的,那么在重建操作中只能使用一个数据库备份作为目标镜像,因为对于不可恢复数据库没有可用的表空间备份。
  • 当恢复完成时,马上就可以连接到数据库 —— 不需要前滚操作。但是,任何尚未恢复的表空间都被置于 drop pending 状态,并且它们再也不能被恢复。

让我们看一个例子。假设有一个不可恢复的数据库 MYDB。MYDB 有三个表空间:SYSCATSPACE、USERSP1 和 USERSP2。在 20060521130000 做了一个完整数据库备份。

为了只使用 SYSCATSPACE 和 USERSP1 重建数据库:

db2 restore db mydb rebuild with tablespace (SYSCATSPACE, USERSP1) taken at 
   20060521130000
   

在恢复之后,马上就可以连接数据库了。如果发出 LIST TABLESPACES 命令,您将看到 SYSCATSPACE 和 USERSP1 处于 NORMAL 状态,而 USERSP2 则处于 DROP PENDING 状态。现在,可以使用处于 NORMAL 状态的那两个表空间。

如果要做一个数据库备份,那么首先必须使用 DROP TABLESPACE 命令删除 USERSP2,否则备份会遭到失败。







重建数据库的能力使恢复实用程序更加强大。但是,这方面也有一些限制:

  • 重建的表空间中必须包括 SYSCATSPACE。

  • 不能使用 Control Center GUI 工具执行重建操作。您只能要么使用命令行处理器(CLP)发出命令,要么使用相应的应用程序编程接口(API)。

  • 对于 9.1 版本之前的目标镜像,除非这个镜像是离线数据库备份,否则不能使用 REBUILD 选项。如果目标镜像是一个离线数据库备份,那么只有这个镜像中的表空间可以用于重建。在重建操作成功完成之后,需要迁移数据库。如果使用 9.1 版本之前的其他类型的目标镜像进行重建,那么将导致错误。

  • 除非目标镜像是一个完整数据库备份,否则,如果目标镜像与被恢复的数据库在不同的操作系统中,那么不能对目标镜像发出 REBUILD 选项。如果目标镜像是一个完整数据库备份,那么只有这个镜像中的表空间可用于重建。
阅读(20456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~