技术分享
关于备份、还原、迁移整理
2021-07-06
也叫冷备份。又叫脱机备份。就是停掉数据库服务。
首先确保没有用户使用DB2;停掉数据库并重新启动,以便断掉所有连接,执行备份命令:(使用TSM作为备份的介质),检查备份成功,如果是多节点需要首先对主节点(catalog表空间在的节点)执行备份命令,再对另外的节点也做这个操作。
1.1.2 操作步骤1.1.2.1 首先确保没有用户使用DB2$db2 list applications for db sample
1.1.2.2 停掉数据库并重新启动,以便断掉所有连接db2stop force
db2start
1.1.2.3 执行备份命令(可以使用TSM作为备份的介质)db2 backup db sample (use tsm)
备份成功,将会返回一个时间戳。
1.1.2.4 检查备份成功Db2 list history backup all for sample ,可以看到多了这个备份的纪录。
Db2adutl query命令也可以看到返回值。
1.2 在线备份(热备份)1.2.1 介绍在线备份。什么在线备份,就是数据库在运行的时候一种物理备份。(如果是逻辑的不能叫在线备份。)数据库要能热备份。都需要开启数据库归档模式。并设置归档路径。
首先打开一下支持在线备份的数据库配置参数,执行在线备份,察看备份纪录,同样,对每个节点都做这个操作。
1.2.2 操作步骤1.2.2.1 打开支持在线备份的数据库配置参数db2 update db cfg for sample using userexit on
--启用用户出口
db2 update db cfg for sample using logretain on
--启用归档日志
db2 update db cfg for sample using trackmod on
--启用增量备份功能
(需要各个Node都分别做设置)
1.2.2.2 离线全备份开启这些参数后,数据库处于backup pending状态,要求做数据库的离线全备份。做一下离线全备份,命令如下:
db2 backup db sample (use tsm)
1.2.2.3 在线备份命令db2 backup db sample online (use tsm)
备份成功,返回一个时间戳。
1.2.2.4 查看备份纪录Db2 list history backup all for sample
1.3 在线增量备份(热备份)1.3.1 介绍在线意味者备份的时候,允许其他的连接,而不用停掉数据库,增量意味着,不需要每次备份一个超大的数据库;同时意味着你可以将数据库恢复到崩溃前的状态,而不是你最后一次备份时的状态,最大可能的减少数据损失。
说明:
backup incremental是自上次完整备份以来的增量备份
incremental delta是自上次成功备份(可以是完整或者增量)以来的增量备份
1.3.2 操作步骤1.3.2.1 打开支持在线备份的数据库配置参数db2 update db cfg for sample using userexit on
--启用用户出口
db2 update db cfg for sample using logretain on
--启用归档日志
db2 update db cfg for sample using trackmod on
--启用增量备份功能
(需要各个Node都分别做设置)
通常应该再设置mirrorlogpath以备份db2日志
db2 update db cfg using mirrologpath 路径
db2 update db cfg using NEWLOGPATH 路径
db2 update db cfg using OVERFLOWLOGPATH 路径
1.3.2.2 离线全备份
开启这些参数后,数据库处于backup pending状态,要求做数据库的离线全备份。做一下离线全备份,命令如下:
db2 backup db sample (use tsm)
1.3.2.3 在线增量备份命令backup db sample online incremental to 备份路径(增量备份)
backup db sample online incremental delta to 备份路径(delta备份)
备份成功,返回一个时间戳。
1.3.2.4 察看备份纪录Db2 list history backup all for sample
1.4 迁移(逻辑备份)1.4.1 介绍
逻辑备份是使用软件技术从数据库中提取数据并将结果写入一个输出文件,逻辑备份因为灵活性受到开发人员的青睐。一般一个完整的备份是一个点另一个点(终止点)的连续发生。逻辑备份是不可能记录连续发生的事情的过程的。
逻辑备份优点与缺点:
优点:方便,灵活,不受操作系统,数据库版本等限制。适合处理小数据量,特别适合开发人员迁移数据库。
缺点:有数据库丢失。不能实时。速度慢。
注意:由于某些表数据违反了唯一约束。外键约束可能会有错误出现。不过出错没有关系。可以把出错的表单独处理。
如果要使用该方式还原数据库,则需要定时执行下面的步骤做为实时数据的增量(全数据)备份。否则存在数据丢失情况。
1.4.2 常用方法Db2 的数据迁移,最常用的就是导入导出功能
DEL:界定的ASCII文件,行分隔符和列分隔符将数据分开。
ASC:定长的ASCII文件,行按照行分割符分开,列定长。
PC/IXF:只能用来在db2之间导数据,根据类型数字值被打包成十进制或者二进制,字符被保存为ASCII,只保存变量已经使用了的长度,文件中包括表的定义和表的数据。
WSF:工作表方式导入导出,这种格式的文件类型用的比较少。
Db2中对不同的数据导入导出方式,支持不同的文件类型,这里个人觉得很有必要注意的。
文件类型 Import export load
-------------------------------------------------------
定界 支持 支持 支持
非定界 支持 不支持 支持
Ixf 支持 支持 支持
Wsf工作表 支持 支持 不支持
关于3种导入导出操作进行简单的介绍:
export:导出数据,支持IXF,DEL或WSF
import:导入数据,可以向表中导入数据,支持上面提到的4种文件类型。
load:导入数据,功能和import基本相同。支持以上说的几种文件类型。
1.4.2.1关于Export一般命令:export to filename of filetype select x from xx where ;
需要注意的是:
关于不同字符集的导出
MODIFIED BY CODEPAGE=
Exprot to filename.del for del MODIFIED BY CODEPAGE=1386 select … from …where …;
数据从数据库倒出来的时候就会做一个数据库代码页的转换
2.时间字段格式化的
MODIFIED BY TIMESTAMPFORMAT="yyyy-mm-dd hh:mm:ss tt"
例:Exprot to filename.del for del MODIFIED BY TIMESTAMPFORMAT="yyyy-mm-dd hh:mm:ss tt" select … from …where …;
1.4.2.2关于Import
1.Import模式的介绍
CREATE/INSERT/INSERT_UPDATE/REPLACE/REPLACE_CREATE
CREATE :首先创建目标表和它的索引,然后将数据导入到新表中。该选项惟一支持的文件格式是 PC/IXF。还可以指定新表所在表空间的名称
INSERT :将导入的数据插入表中。目标表必须已经存在。
INSERT_UPDATE :将数据插入表中,或者更新表中具有匹配主键的行。目标表必须已经存在,并且定义了一个主键。
REPLACE :删除所有已有的数据,并将导入的数据插入到一个已有的目标表中。
REPLACE_CREATE :如果目标表已经存在,则导入实用程序删除已有的数据,并插入新的数据,就像 REPLACE 选项那样。如果目标表还没有定义,那么首先创建这个表以及它的相关索引,然后再导入数据。正如您可能想像的那样,输入文件必须是 PC/IXF 格式的文件,因为那种格式包含对导出表的结构化描述。如果目标表是被一个外键引用的一个父表,那么就不能使用 REPLACE_CREATE。
1. 批量提交
COMMITCOUNT,保证insert的数据在COMMITCOUNT以后进行一次commit,这对于大数据量的导入文件来说是一个不错的方法,
例:Import from filename of del COMMITCOUNT 50000 insert into tabname;
2. 批量插入
MODIFIED BY COMPOUND把文件中的 COMPOUND 行记录作为一组一起导入,这个操作可以和上边的批量提交一起使用,比较理想。
例:Import from filename of del MODIFIED BY COMPOUND =50 insert into tabname;
3. 导入记录限制
ROWCOUNT:只导入rowcount 条数据,有时候,业务逻辑需要只导入部分数据,那么ROWCOUNT是一个不错的选择,只是在我的测试中ROWCOUNT一直没有起过作用,呵呵,谁熟悉这里,帮我完善下。
例:Import from filename of del ROWCOUNT 10000 insert into tabname;
4. 导入起点
RESTARTCOUNT:从导入文件的第RESTARTCOUNT条记录开始导入
例:Import from filename of del RESTARTCOUNT 55 ROWCOUNT 10000 insert into tabname;--从55条开始,导入10000条数据
5. 有警告数据的条数限制
WARNINGCOUNT:当导入的数据中,有警告或错误(例如类型不匹配,列不对应等造成的)并且条数超过WARNINGCOUNT是就会停止import。
例:Import from filename of del WARNINGCOUNT 10 insert into tabname;
6. 禁止发出行警告
MODIFIED BY NOROWWARNINGS
例:Import from filename of del MODIFIED BY NOROWWARNINGS WARNINGCOUNT 10 insert into tabname;
7. LOB 文件
LOBS FROM :指出LOB的路径
例:Import from filename of del LOBS FROM ‘/home’ MODIFIED BY NOROWWARNINGS WARNINGCOUNT 10 insert into tabname;
8. 对于自增序列(GENERATED ALWAYS)
建议不要对自增序列的表进行import操作,因为import对于自增序列,只有MODIFIED BY IDENTITYIGNORE和MODIFIED BY IDENTITYMISSING的2中操作,这2中操作都会改变自增序列的原值,这样如果导出表和表之间有基于自增序列的关联关系的话,就失去了数据本身的意义,所以建议尽量少用基于import的自增表的操作,那该怎么做?可以用load老代替import,我们下来在load的操作中会讲到!
1.4.2.3 关于Load1. 字符串间隔,列间隔,小数点表示
CHARDEL/COLDEL/DECPT
例:LOAD CLIENT FROM 'F:s1.del' OF DEL MODIFIED BY CHARDEL(COLDEL= DECPT? INSERT INTO "DB2ADMIN"."ZXTABLES"
2.数据库记录中存在换行符,导致数据无法装入的情况
MODIFIED BY DELPRIORITYCHAR
Db2默认load优先级策略为,record delimiter, character delimiter, column delimiter,这样record delimiter得优先级最高,所以原始文件如果有换行的话load就认为是新的record,如果用户在某些情况下行里面包含了换行符(比如论坛里面的一条帖子,不可能把换行符删掉的),就必须用delprioritychar改变默认的优先级别,确保""之间的数据不管有没有换行符都被认为是同一条记录
例:LOAD CLIENT FROM 'F:s1.del' OF DEL MODIFIED BY DELPRIORITYCHAR INSERT INTO DB2ADMIN.ZXTABLES
3.load后表空间暂挂的处理
Copy YES/ NONRECOVERABLE
对于DMS表空间,load默认为copy NO 模式,此模式下,load完成后,表空间会处于暂挂状态,这时候只能查表中的数据,需要对表空间进行一次备份,才可以对表进行update、insert等操作,那么我们可以使用如上2个命令,对于Copy YES,load完成以后会自动进行一次备份操作;NONRECOVERABLE 指出load不可恢复,此命令符不会产生表空间暂挂,也不会自动进行表空间备份,但是他有一个缺点就是,不能恢复,当数据库进行回滚的时候,不能还原,危险等级还是比较高一点,不过个人觉得也NONRECOVERABLE比较实用。
例:LOAD CLIENT FROM 'F:s1.del' OF DEL INSERT INTO DB2ADMIN.ZXTABLES NONRECOVERABLE
LOAD CLIENT FROM 'F:s1.del' OF DEL INSERT INTO DB2ADMIN.ZXTABLES COPY YES
4. load IXF类型文件到多分区数据库
partitioned db configmode load_only_verify_part part_file_location
当数据在2个不同数量节点的数据库之间移动,如果还想使用load来进行IXF的数据装载就比较棘手了,当时查遍IBM的官方文档均无所获,正郁郁不安时,狼出现了,给支了一招,现分享给大家。
首先,把ixf文件复制和分区数量相同的文件,并后缀.000(分区号),
比如,2个分区,那么我需要把原来的a.ixf,拷贝2个,并命名为a.ixf.000以及a.ixf.001
然后,load from staff.ixf of ixf replace into t1 partitioned db configmode load_only_verify_part part_file_location xxxx(part_file_location为a.ixf.000所在的目录),当然如果在unix下的话,可以通过ln –s 来做一个连接也行。
5. 对于自增序列(GENERATED ALWAYS)
MODIFIED BY IDENTITYOVERRIDE:此参数可以理解为,采用文件load文件中的自增值做为表自增序列的值,这样就能保证对于自增序列有业务意义,或者关联逻辑(主外键关联)的情况下保证数据的一致,个人对此命令屡试不爽
例: LOAD CLIENT FROM 'F:s1.del' OF DEL MODIFIED BY IDENTITYOVERRIDE INSERT INTO DB2ADMIN.ztables;
6. 对于自增序列(GENERATED by default)
GENERATED by default可以直接通过一般的导入方式加载数据,不过有时候会有一点点小问题,自增序列没有进行分配,也就是说,原来表有50条记录,自增序列的下一次分配值为50,当你已经导入了1000条记录进去了,然后发现自增序列的下一次分配值还是为50,这种事不经常发生,但是偶尔会发生一次,比较郁闷的是,当表继续插入数据的时候,下一次分配就会发生冲突,尤其是如果自增建为主键的时候,会违反唯一约束。
解决办法:首先找到这个序列分配的最大值,select max(id) from tablea;
然后用下边这个命令,alter table tablea alter column restart with max(id)+1
7.ROWCOUNT/WARNINGCOUNT
这个同IMPORT
8.terminate,restart
如果load的过程中出了点故障,比如连接被force掉了等,这时连接查询表数据会报错SQL0668N,原因码3,这时可以通过带有terminate的load命令来进行处理!
LOAD CLIENT FROM 'F:s1.del' OF DEL terminate INTO DB2ADMIN.ztables;
9. set integrity 命令
如果表上有约束,那么给表load数据以后,一般连接表的时候都会报错,SQL0668N,原因码1,这说明该表处于“设置完整性暂挂无访问”状态,那么需要如下命令来操作。
Set integrity for schema.tablename immediate checked;
10.提高导入导出速度的数据库参数
CONFIGURATION:应用程序堆大小,该参数指示可由Backup,restore,load及装入恢复应用程序同事使用的最大内存量,看帖子上有介绍,这个值可以设置为10000*cpu数量。
DB2 UPDATE DATABASE CONFIGURATION USING UTIL_HEAP_SZ 113486
1.4.3 操作步骤1.4.3.1 备份文件1.4.3.1.1 创建备份文件存放路径Mkdir –p /db2home/idsinst1/db2backup
1.4.3.1.2 执行备份命令备份数据库配置信息
db2look -d LDAPDB -f -fd -o LDAPDB config.out
备份数据库存储信息
db2look -d LDAPDB -l -o LDAPDB storage.out
备份DDL信息
db2look -d LDAPDB -e -a -x -i idsinst1 -w lsidsinst1 -o LDAPDB Tables.sql
导出表数据
db2move LDAPDB export -u idsinst1 -p lsidsinst1
1.4.3.1.3 压缩备份文件tar -cvf 2011021 LDAPDB.tar /db2home/idsinst1/db2backup
按照表空间的备份和恢复类似,加子句TABLESPACE tablespace-name 即可。表空间级别的备份/恢复操作要求数据库处于归档日志和启用增量备份模式下。
2.1 备份恢复2.1.1 常规恢复要求恢复环境目录大小大于等于备份份环境目录大小。
2.1.1.1 查看备份文件的时间点,并验证是否可用db2ckbkp -h 备份文件
2.1.1.2 让db2告诉你进行恢复的命令序列db2ckrst -d SAMPLE -r database -t 20050529210521
2.1.1.3 执行上个命令给出的命令序列将会将数据库还原到备份的时刻,之后应该执行日志前滚(此时数据库处于前滚暂挂状态,将无法使用)
rollforward db SAMPLE to end of logs and complete
当然如果你认为不需要前滚(这样将丢失最后一次备份之后的更改),也可以rollforward db testdb stop
2.1.2 按照表空间的备份和恢复2.1.2.1 创建实例DB2数据库实例用户仍在主机上,不需要重新创建,直接利用即可。需要重新创建数据库实例。需要将.profile文件备份
2.1.2.1.1 创建实例分别在主机上创建如下实例:
/opt/IBM/db2/V9.5/instance/db2icrt -a SERVER -u appfenc appinst
2.1.2.1.2 /etc/services确认DB2 实例services中端口号。
2.1.2.1.3 将dbm中的SVCENAME名更新#su – appinst
$db2 get dbm cfg | grep SVCENAME
看一下,然后运行下列命令
$db2 update dbm cfg using SVCENAME DB2_appinst
2.1.2.1.4 设置DB2通信方式为TCPIP$db2set DB2COMM=tcpip
2.1.2.1.5 刷新数据库$db2stop
$db2start
2.1.2.2 还原数据库2.1.2.2.1 收集数据库全备文件确认在备份路径下存在类似如下备份文件,大小正常(查看文件大小命令du –h –s 文件名),
EFINANCE.0.appinst.NODE0000.CATN0000.2011XXXXXXXXXX.001
2.1.2.2.2 建立相应路径 并赋予相应权限XX系统 表空间路径/data/db2/XXXXXX
数据库路径/ef/实例名
2.1.2.2.3 执行restore命令db2 restore db XXXXXXX incremental from /db2bakHa/backup201101/eFinance taken at 2011XXXXXXXXXX on /ef/实例名 into EFINANCE logtarget /ef/实例名 redirect generate script restore2011XXXXXXXXXX.clp
2.1.2.2.4 修改restore文件.clp文件中表空间路径
核实还原脚本restore2011XXXXXXXXXX.clp中表空间路径是否与操作前一致
2.1.2.2.5 执行命令 db2 -tvfdb2 -tvf restore2011XXXXXXXXXX.clp
2.1.2.2.6 移动日志文件在logtarget /ef/实例名下会出现日志文件S0001034.LOG、S0001035.LOG等,将前滚时间点需要的日志文件拷贝到该路径下
将需要的日志文件S0001034.LOG。。。S0001042.LOG拷贝到路径/ef/实例名/log..
db2 list db directory
db2 connect to 数据库名
2.2 迁移恢复2.2.1.1 安装DB2具体见安装步骤
2.2.1.2 安装DB2补丁如果需要则按如下步骤执行:
解压文件,执行installFixPack即可
执行完毕,查看DB2版本db2level
mkdir -p /home/idsinst1
2.2.1.3.2 添加实例用户useradd -u 505 -g db2iadm1 -s /bin/bash -m -d /home/idsinst1 idsinst1
2.2.1.3.3 修改密码passwd idsinst1
2.2.1.3.4 创建实例/opt/ibm/db2/V9.5/instance/db2icrt -a SERVER -u db2fenc1 idsinst1
创建完成后如果不能执行db2命令,按照提示执行
Add the following line to the .profile file or the .login file:
. /home/idsinst1/sqllib/db2profile to the .profile file, or
source /home/idsinst1/sqllib/db2cshrc to the .login file
拷贝已有实例登录配置文件进行修改
chown -R idsinst1:db2iadm1 .bash_history
chown -R idsinst1:db2iadm1 .bash_logout
chown -R idsinst1:db2iadm1 .bash_profile
chown -R idsinst1:db2iadm1 .bashrc
chown -R idsinst1:db2iadm1 .emacs
chown -R idsinst1:db2iadm1 .zshrc
2.2.1.3.5 更新数据库配置db2 update dbm cfg using SVCENAME DB2_idsinst1
db2set DB2COMM=tcpip
2.2.1.3.6 重启数据库Db2 terminate
Db2start
2.2.1.4 获取生产数据备份文件2.2.1.4.1 通过FTP(BIN)方式下载到目标Linux注意尽量采用机器之间FTP方式,否则可能出现无操作权限的问题
ftp 原机器(AIX)XXX.XXX.XXX.XXX
输入用户名、密码
LCD到本地路径
CD到tar文件路径
Bin进入binary传输模式
Get *******.tar即可
2.2.1.5 执行还原操作实例用户登陆LIUNIX。
2.2.1.5.1 解压数据库备份文件tar -xvf 20110217 LDAPDB.tar
2.2.1.5.2 创建数据库db2 CREATE DB LDAPDB using codeset UTF-8 territory us PAGESIZE 8192;
2.2.1.5.3 还原数据库配置信息db2 -tf LDAPDBconfig.out
2.2.1.5.4 还原数据存储信息db2 -tf LDAPDBstorage.out
2.2.1.5.5 还原数据库DDL(表、索引等)db2 -tf LDAPDBTables.sql
2.2.1.5.6 还原数据db2move LDAPDB import -io replace -u db2inst1 -p db2admin
2.2.1.6 验证
执行db2 connect to LDAPDB
Select * from table(实际表)
备份还原执行一些注意事项。
3.1 多节点数据库问题一定要对每个节点进行上述操作
3.2 DB2迁移问题由于某些表数据违反了唯一约束。外键约束可能会有错误出现。不过出错没有关系。可以把出错的表单独处理。
3.3 关于将DB2备份文件备份到磁带问题需要借助备份工具,例如Legato NetWorker软件
- 标签:
-
云计算