DB2备份重点笔记

–主要EDU
backup and restore buffer manipulator (db2bm)
backup and restore media controller (db2med)

–加速备份时间
考虑加大util_heap_sz
其它影响速度的几个东东:
WITH num-buffers BUFFERS
PARALLELISM n
BUFFER buffer-size

备份是先写到BUFFER里边,然后BUFFER再写到内存里。这个类似于文件系统中的块。一次写的最小单位是一个BUFFER,所以加大BUFFER有利于提高速度,但是对于一些小型库来说,很有可能会的使得备份出来的介质大了许多。原因就在于最后一次WRITE操作的时候,哪怕那个BUFFER没有写满,也会的全部flush到磁盘上。
感觉PARALLELISM用于指定预取的线程个数,每个预取线程对应一个表空间。BUFFER会用来填EXTENT大小的数据,并且如果一个BUFFER填了一个EXTENT后不够了,那么这个BUFFER剩下的空间应该就会的被浪费,造成备份介质的变大。

对于backup buffer size参数来说,理想的备份缓冲区大小是表空间扩展数据块大小的倍数加一页。如果有多个扩展数据块大小不同的表空间,那么将值指定为扩展数据块大小的公倍数加一页。如果BUFFER指定的过大,那么可能会的造成备份介质的过大,因为一些BUFFER中只能包含一个较小的EXTENT数据,剩下的BUFFER由于无法再继续写入一个完整的EXTENT所以就浪费了,会的被直接flush如磁盘。如果BUFFER指定的过小,那么对速度肯定会有影响。

对于number of buffers来说,建议至少是目标磁盘个数的总和的两倍。这样当数据从BUFFER写入磁盘的时候,备份线程可以往另一个BUFFER里写。并且由于上面的BUFFER SIZE已经设置为EXTENT的公倍数+1PAGE了,所以所有表空间应该可以共同的往同一个BUFFER里写数据。

PARALLELISM 参数的话建议设置的和TABLESPACE的个数一样。一个PARALLELISM 的线程一次负责一个TABLESPACE,一个TABLESPACE一次也只能被一个PARALLELISM 的线程使用,所以如果PARALLELISM 大于了TABLESPACE的个数那么其实多出来的PARALLELISM 线程就是用不到的。

另外,建议使用多个目标磁盘,这样可以加快备份的速度。

官方文档:
优化备份性能
执行备份操作时,DB2? 将自动为缓冲区个数、缓冲区大小和并行性设置选择最佳值。这些值根据可用实用程序堆内存的数量、可用处理器数和数据库配置而定。因此,根据系统上可用的存储量,应考虑通过增大 UTIL_HEAP_SZ 配置参数来分配更多内存。目的是最大程度上减少完成备份操作所需的时间。除非显式地输入以下 BACKUP DATABASE 命令参数的值,否则 DB2 将为它们选择一个值:
WITH num-buffers BUFFERS
PARALLELISM n
BUFFER buffer-size
如果未指定缓冲区数和缓冲区大小而导致 DB2 设置这些值,那么对大型数据库的影响应该最低。但是,对于小型数据库来说,会导致备份映像大幅增大。即使写入磁盘的最后一个数据缓冲区只包含很少数据,也会将整个缓冲区写入映像。在小型数据库中,这表示相当一部分的映像可能为空。

还可以选择执行以下任何操作来缩短完成一次备份操作所需的时间:

指定表空间备份。
使用指定了TABLESPACE 选项的 BACKUP DATABASE 命令,可以备份(继而恢复)部分数据库。这样便于对表数据、索引和单独表空间中的长字段或大对象 (LOB) 数据进行管理。

增大 BACKUP DATABASE 命令上 PARALLELISM 参数的值,以使它反映正在备份的表空间数。
PARALLELISM 参数定义在压缩备份操作期间从数据库读取数据和压缩数据时,已启动的进程或线程数。将每个进程或线程分配给特定表空间,因此,为 PARALLELISM 参数指定的值大于要备份的表空间数并无益处。备份完此表空间后,它会请求另一个表空间。但是应注意:每个进程或线程都需要内存和 CPU 开销。

增加备份缓冲区大小。
理想的备份缓冲区大小是表空间扩展数据块大小的倍数加一页。如果有多个扩展数据块大小不同的表空间,那么将值指定为扩展数据块大小的公倍数加一页。

增加缓冲区的数量。
使用的缓冲区至少是备份目标(或会话)的两倍,以确保备份目标设备无需等待数据。

使用多个目标设备。

–加速还原时间
考虑加大util_heap_sz
其它影响速度的几个东东:
WITH num-buffers BUFFERS
PARALLELISM n
BUFFER buffer-size

restore buffer size:这个值需要是在备份时候设置的BUFFER SIZE倍数。如果指定的不是那个倍数,那么系统会的自动把这个调小,直到成为倍数。
BUFFER buffer-num size:这个值需要是在备份时候设置的BUFFER NUMBER倍数。如果指定的不是那个倍数,那么系统会的自动把这个调小,直到成为倍数。
PARALLELISM 这个越大备份线程就越多。个人觉得可以设置的和表空间个数一样

官方文档:
优化复原性能
需要执行部分操作来改善复原操作的速度。

执行复原操作时,DB2? 将自动为缓冲区个数、缓冲区大小和并行性设置选择最佳值。这些值根据可用实用程序堆内存的数量、可用处理器数和数据库配置而定。因此,根据系统上可用的存储量,应考虑通过增大 util_heap_sz 配置参数来分配更多内存。目的是将完成复原操作所用的时间降至最少。除非显式地输入以下 RESTORE DATABASE 命令参数的值,否则 DB2 将为它们选择一个值:
WITH num-buffers BUFFERS
PARALLELISM n
BUFFER buffer-size
对于复原操作,始终使用备份操作所使用的缓冲区大小的倍数。在发出 RESTORE DATABASE 命令时可以指定缓冲区大小,但需要确保其大小是备份缓冲区大小的倍数。
还可以选择执行以下任何操作来缩短完成一次复原操作所需的时间:

增加复原缓冲区大小。
复原缓冲区大小必须是在备份操作期间指定的备份缓冲区大小的正整数倍数。如果指定了不正确的缓冲区大小,那么分配的缓冲区将是最小的可接受大小。

增加缓冲区的数量。
您指定的值必须是用于备份的缓冲区大小的倍数,否则它将向下舍入至最接近的备份缓冲区大小倍数。

增加 PARALLELISM 参数的值。
这将增加将用来在复原操作期间写至数据库的缓冲区操纵程序 (BM) 的数目。

增加实用程序堆大小
这将增大可由其他实用程序同时使用的内存。

–如果前滚提示失败,那么试试:
先还原日志到某个目录
然后前滚的时候指定下overflow path为这个目录,加上noretrieve
db2 rollforward db teps to end of backup overflow log path(/home/db2inst1/backup/logs/) noretrieve

–前滚如果时间过长,可以Ctrl + C杀掉。不要直接啥进程!

–必须指定logtarget才会的在restore的时候还原include的log
nohup db2 restore db warehous from /nimbackup/ on /opt/IBM/db2/db2inst1/warehous dbpath on /opt/IBM/db2/db2inst1/warehous logtarget /opt/IBM/db2/db2inst1/warehous/logs_20 &

–后台备份
nohup db2 “backup db warehous online to /nimbackup/ compress include logs” &

–查看需要前滚的日志(其实这里有一些是多余的,建议看下面的那个)
[db2inst1@localhost ~]$ db2ckbkp -a SAMPLE.3.db2inst1.DBPART000.20130511092710.001 | grep “File Number”

–备份前滚需要的日志
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
— — —————— —- — ———— ———— ————–
B D 20131015072456001 N D S0000254.LOG S0000260.LOG
—————————————————————————-
Contains 5 tablespace(s):

00001 SYSCATSPACE
00002 USERSPACE1
00003 IBMDB2SAMPLEREL
00004 IBMDB2SAMPLEXML
00005 SYSTOOLSPACE
—————————————————————————-
Comment: DB2 BACKUP SAMPLE ONLINE
Start Time: 20131015072456
End Time: 20131015072505
Status: A
—————————————————————————-
EID: 273 Location: /home/db2inst1

其中的Earliest Log确实包含了第一个活动日志,而Current Log则是备份结束后被截断的那个日志。一般我们prune的时候可以prune Earliest Log。前滚的时候一般前滚到Current Log就OK了。如果指定了include logs,那么include的logs也就只有Earliest 到 Current Log的,如:
[db2inst1@DB2_97 ~]$ db2 restore db sample logs from /home/db2inst1/ logtarget /home/db2inst1/log_archive
[db2inst1@DB2_97 log_archive]$ ls
S0000254.LOG S0000255.LOG S0000256.LOG S0000257.LOG S0000258.LOG S0000259.LOG S0000260.LOG

而db2ckbkp -a SAMPLE.0.db2inst1.NODE0000.CATN0000.20131015072456.001 | grep -i file看到的那些日志则包含了第一个活动日志到当前分配的最后一个日志。其中有一些日志只是被分配了,但是没有被使用。

–检查备份介质是否可用(如果有多个备份介质,则依次用空格隔开)
C:\Users\administrator.COPR\Desktop>db2ckbkp INFODMSD.0.DB2INST1.NODE0000.CATN0000.20140217031557.001 INFODMSD.0.DB2INST1.NODE0000.CATN0000.20140217031557.002

–查看最近一天的备份历史
[db2inst1@localhost ~]$ db2 “select substr(comment,1,30) as comment,timestamp(start_time) as start_time,timestamp(end_time) as end_time,substr(firstlog,1,25) as firstlog,substr(lastlog,1,25) as lastlog,seqnum,location from sysibmadm.db_history where operation=’B’ and timestamp(start_time) > current_timestamp – 24 hours and sqlcode is null”

–查看备份进度
[db2inst1@localhost ~]$ db2 list utilities show detail

–数据库内部的时间用的是UTC,前滚的时候默认也是要这个。
–但是数据库备份的介质和restore的taken at的那个时间一般是计算机当地时间的。包括List history看到的也是当地时间

–前滚时间
CST:中国标准时间,比UTC快8个小时
UTC:格林尼治时间
PST:美国冬令时,比UTC慢8个小时
PDT:美国夏令时,比UTC慢7个小时
数据库默认前滚用的是UTC。如果要用CST(或备份机器的当地时间),使用:db2 rollforward db sample to XXX using local time

–查看前滚表空间需要的最小时间点
[db2inst1@localhost ~]$ db2 “select substr(tablespace_name,1,15) as tablespace_name,min_recovery_time from table(snapshot_tbs_cfg(‘SAMPLE’,-1))”

–查看前滚的最小恢复时间
db2 list history,然后看backup操作的end time

–打开归档日志,需要backup
[db2inst1@localhost ~]$ db2 update db cfg for sample using logarchmeth1 disk:/home/db2inst1/sam/log_archive/
[db2inst1@localhost ~]$ db2 backup db sample to /home/db2inst1/sam/backup/

–打开增量备份开关。需要备份一次。注意,如果新增了表空间,也得备份一次
[db2inst1@localhost ~]$ db2 update db cfg for creatdb using trackmod on

–进行离线备份
[db2inst1@localhost ~]$ db2 backup db sample to /home/db2inst1/sam/backup/

–如果要强制关闭BACKUP PENDING状态,尝试:
db2dart sample /CHST /WHAT /DBBP OFF –《运筹帷幄DB2》P294

–可以设置FAILARCHPATH,这个配置参数保证在默认的离线归档目录不能使用时,把归档日志放在这里,防止活动日志目录爆掉
[db2inst1@localhost ~]$ db2 get db cfg for sample | grep -i failarchpath

–进行在线备份
[db2inst1@localhost ~]$ db2 backup db sample online to /home/db2inst1/sam compress include logs

–在线备份表空间
[db2inst1@localhost ~]$ db2 “backup db creatdb tablespace(userspace1) online to /home/db2inst1/tbs/ include logs”

–在线还原表空间。注意,由于syscat中可能有不一致的信息,所以需要rollforward。最小时间点用list tablespaces show detail查看
[db2inst1@localhost ~]$ db2 “restore db creatdb tablespace(userspace1) from /home/db2inst1/tbs/”
[db2inst1@localhost ~]$ db2 “rollforward db creatdb to end of logs and stop tablespace(userspace1)”
db2 rollforward db sample to 1998-04-03-14.21.56 and stop tablespace(TBS2, TBS3) online

–还原离线备份
db2 restore db XXX from / taken at XXX
[db2inst1@localhost C0000009]$ db2 restore db creatdb from /home/db2inst1 taken at 20130505021318 on /home/db2inst1/bbbbb dbpath on /home/db2inst1/aaaaa

–只还原日志
[db2inst1@localhost ~]$ db2 restore db creatdb logs from /home/db2inst1/log_archive/ logtarget /home/db2inst1/log_archive/

–重定向还原
重定向还原的时候注意几个路径:DBPATH:这个是数据库目录,用于存放配置文件的,ON:这个是自动存储目录,LOGARCHMETHX:这个用于看归档路径,LOGTARGET:用于指定日志解压目录
db2 restore db creatdb from /home/db2inst1/log_archive/ redirect generate script re.clp –生成重定向脚本
–修改重定向脚本,这个脚本起始就是普通的执行语句,大部分是注释
–修改好后,执行对应的语句:
db2 -tvf re.clp

–前滚注意事项!!!!!
–前滚只要完成(stop或complete),那么会的生成新的日志链,这个时候时间点之后的数据就再也无法恢复!哪怕restore后在to end of logs也不可能恢复!

–前滚日志
[db2inst1@localhost ~]$ db2 “rollforward db creatdb to end of logs overflow log path(/home/db2inst1/logarchive/)”
[db2inst1@localhost ~]$ db2 “rollforward db creatdb stop overflow log path(/home/db2inst1/logarchive/)”

–增备:增备的话就是Incremental,含义是增备参考最近一次full备份
–delta备份:delta备份的话就是参考最近一次成功的备份,这个备份可以使增备的

–增量备份(记得打开开关)前,需要进行一次全备
[db2inst1@localhost ~]$ db2 “backup db creatdb online incremental to /home/db2inst1/incremental_backup”

–delta备份
[db2inst1@localhost ~]$ db2 backup db creatdb online incremental delta to /home/db2inst1/incremental_backup/

—————-
–增备还原的时候,如果不使用automatic,那么restore里都需要加上incremental
–必须先还原到要还原到的那个时间点,然后在从全备开始,按照具体情况来
—————-
–还原01(没有history file)
在线全备:20130504105754
增备01:20130504105853
增备02:20130504105929
1.先还原要恢复到的那个镜像(这里再复杂一点,要重定位,如果不要重定位,那么不用redirect就行)
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/incremental_backup/ taken at 20130504105929 redirect generate script re.clp
2.完成复原:
[db2inst1@localhost ~]$ db2 -tvf re.clp
3.恢复到全备镜像:
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/backup_online/
4.恢复到要恢复的时间点:
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/incremental_backup/ taken at 20130504105929
5.前滚到想要的时间:
[db2inst1@localhost ~]$ db2 rollforward db creatdb to end of logs and stop

–还原02(没有history file)
在线全备:20130504105754
增备01:20130504105853(非delta)
增备02:20130504105929(非delta)
增备03:20130504112035(delta)
1.先还原要恢复到的那个镜像(这里再复杂一点,要重定位,如果不要重定位,那么不用redirect就行)
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/incremental_backup/ taken at 20130504112035 redirect generate script re.clp
2.完成复原:
[db2inst1@localhost ~]$ db2 -tvf re.clp
3.恢复到全备镜像:
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/backup_online/
4.恢复到要恢复的时间点:
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/incremental_backup/ taken at 20130504105929 –非delta
[db2inst1@localhost ~]$ db2 restore db creatdb incremental from /home/db2inst1/incremental_backup/ taken at 20130504112035 –delta
5.前滚到想要的时间:
[db2inst1@localhost ~]$ db2 rollforward db creatdb to end of logs and stop

–还原(有history file)
[db2inst1@localhost ~]$ db2 restore db creatdb incremental automatic from /home/db2inst1/incremental_backup/ taken at 20130504105929
[db2inst1@localhost ~]$ db2 rollforward db creatdb to end of backup and stop

–还原误删除的表(只还原一张表的话,速度会的比相对于还原整个数据库来说快很多)
前提条件:
1.创建表空间时候,使用了DROPPED TABLE RECOVERY
2.开启归档模式
3.保留删除前表空间一级的备份
[db2inst1@localhost ~]$ db2 list history dropped table all for creatdb –查看被删除的表。注意Backup ID这一列
[db2inst1@localhost ~]$ db2 “restore db creatdb tablespace (dmsts) from /home/db2inst1/drtbs/” –使用备份的表空间还原
[db2inst1@localhost ~]$ db2 rollforward db creatdb to end of logs and stop recover dropped table 000000000000154200040004 to /home/db2inst1/drtbs/ –执行特殊的rollforward。这个时候数据就会的保存到drtbs中
[db2inst1@localhost NODE0000]$ db2 connect to creatdb
[db2inst1@localhost NODE0000]$ db2 create table dr\(id int\)
[db2inst1@localhost NODE0000]$ db2 import from /home/db2inst1/drtbs/NODE0000/data of del insert into db2inst1.dr

–保存实例参数
[db2inst1@localhost C0000009]$ db2cfexp inst.conf backup

–恢复实例参数
[db2inst1@localhost C0000009]$ db2cfimp inst.conf

–恢复历史文件
[db2inst1@localhost hh]$ db2 restore db sample history file from /home/db2inst1/ taken at 20130511082956

–rollforward时间测试
测试中一律使用local time前滚
back up end time的时间点用db2 list history查看:db2 list history backup all for XXX
1.指定一个早于back up end time的时间点,会的报错:
SQL1275N The stop time passed to the rollforward utility must be greater than
or equal to timestamp “2013-06-04-04.46.12.000000 Local”, because database
“BCK” on nodes “0” contains information later than the specified time.

2.指定一个等于back up end time的时间点,会的报错(怀疑可能有两个原因:1.是end time晚于备份中包含的日志,也就是说这个end time不是归档日志的时间,而是备份真正结束的时间。2.这里的rollforward指定的时间是最后一次commit的时间,而不是任意的时间。原因应该是1,理由见6):
SQL4970N Rollforward recovery stopped on the database named “BCK” because the
rollforward utility cannot reach the specified stop point (end-of-log or
point-in-time) on the following database partitions: “0”.

3.指定一个时间,这个时间等价于“指定一个早于back up end time的时间点”给出的提示时间:
成功

4.指定一个时间,这个时间早于“指定一个早于back up end time的时间点”给出的提示时间前1秒:
报错,错误同1

5.指定一个时间,这个时间晚于“指定一个早于back up end time的时间点”给出的提示时间后1秒:
报错,错误同2

6.数据库执行一段时间的命令,期间多次归档,然后restore和rollforward:
指定一个早于back up end time的时间点,报错,给出最小的时间。
前滚到最小时间,没有问题。
再次前滚到最小时间后面一会的时间,没有问题(并且这个时间不需要是commit的时间)。这里的时间也不能大于或等于list history里看到的最后一个归档的end time,要比那个end time稍小。理由应该和2差不多。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*