从一台机器上备份的文件拷贝回开发机器上恢复出现
SQL0970N The system attempted to write to a read-only file. SQLSTATE=55009 的错误提示信息。
执行多个命令
restore database test from /home/db2inst1
restore database test rebuild with all tablespaces in database token at 2010...
网上的资料说,是表空间的问题。
但是我在家里用两台机器做实验,源机器上创建一个表空间,使用在目的机器上没有的路径上。进行备份恢复发现
恢复的时候出现提示信息,说明表空间不存在并不提示SQL0970N的错误,请各位大侠指教!!!
原机器配置
Suse enterprise server 9 SP2
DB2 v8.1
目的机器
Suse enterprise server 10 SP4
db2 v9.7
分不够,可加分!
------解决方案--------------------------------------------------------
最后重定向一下表空间
------解决方案--------------------------------------------------------
不需要去查看,在restore之后可以通过list tablespaces show detail和list tablespace containers for ID show detail命令来查看表空间容器
------解决方案--------------------------------------------------------
一:在源数据库上的操作:(本例为solaris9)
#su – db2inst1
$pwd
/ export/home2/db2inst1
$mkdir cws3
$db2pd –db cws3 (查看cws3数据库的配置信息,例如表空间的位置,日值的位置等等)
$ db2 get dbm cfg (查看原来cws3数据库的建库信息,如库的编码,区域等)
说明:数据库restore时对于不存在的数据库会新建一个,但是其codeset和地区,以及codepage都是使用默认的,当备份的数据库与你默认的配置不同时,就会发生错误。因此可以先在目标数据库上新建一个与源数据库相同的数据库,使其codeset和地区,codepage都跟你备分的一样,再执行restore就ok了。
$db2 db2stop(或者db2 db2stop force)
$db2 db2start
说明:在用backup db备份db2数据库时,外部不能有连接,因此要stop db2,然后在start db2。
$db2 backup db cws3 to
/export/home2/db2inst1/cws3(指定备份的介质,只要是一个可写的目录即可,backup命令会自动把备份出来的文件放到/export/home2/db2inst1/cws3下面).
备份完成后,系统会自动生成一个备份的时间戳,例如:
Backup successful. The timestamp for this backup image is : 20060608160538
同时会在指定的介质(或者是目录)下生成一个类似如下的文件:
CWS3.0.db2inst1.NODE0000.CATN0000.20060608160538.001
这样db2的基本备份就完成了。
然后可以把备份出来的数据文件拷贝的目标数据库的任意目录(这个目录很重要,以后要用到,本例是备份到目标数据库/db2data/db2inst1/cws3下),接下来就可以在目标数据库上进行操作。
二:在目标数据库上操作(本例为AIX5.1)
1:建立目标数据库:
由于两个数据库在编码以及库配置方面的不同,因此建议在目标数据库上先建立一个和源数据库配置相同的数据库。
#su – db2inst1
$pwd
/db2data/db2inst1
$mkdir cws3
本例假设备份的数据库文件拷贝到了/db2data/db2inst1/cws3下。
$ CREATE DATABASE cws3 ON /db2data/db2inst1 USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM
这样就在/db2data/db2inst1目录下产生一个以登陆实例为名称的目录,本例为
/db2data/db2inst1/db2inst1
由于两台数据库备份的目录以及在目标数据库上恢复的目录可能不同,并且backup db命令备份的数据文件默认记录所有与备份环境相关的信息,例如备份路径等,因此要利用db2的重定向方式恢复数据。
2:重定向恢复数据库:
接下来根据上面在源数据库上查到的源数据库配置信息,主要是数据库几个缺省表空间,例如系统表空间,用户表空间,临时表空间等等,根据这些信息,进行数据库的重定向恢复。
$ db2 restore db from /export/home2/db2inst1/cws3 to /db2data/db2inst1/cws3 into cws3 redirect
$ db2 "set tablespace containers for 0 using (path '/db2data/db2inst1/db2inst1/NODE0000/SQL00001/SQLT0000.0')"
$ db2 "set tablespace containers for 1 using (path '/db2data/db2inst1/db2inst1/NODE0000/SQL00001/SQLT0001.0')"
$ db2 "set tablespace containers for 2 using (path '/db2data/db2inst1/db2inst1/NODE0000/SQL00001/SQLT0002.0')"
$ db2 "set tablespace containers for 3 using (path '/db2data/db2inst1/db2inst1/usercontainer3')"
$ db2 "set tablespace containers for 4 using (path '/db2data/db2inst1/db2inst1/usercontainer4')"
注意, 在给恢复数据库上的tablespace设置redirect container时候,设置必须和原来的tablespace type一致,如原来是SMS,则使用PATH container,原来是DMS,则使用FILE/DEVICE container。如果是DMS,上面使用格式变为:
db2 "set tablespace containers for 5 using (file '/db2data/db2inst1/db2inst1/data1' 2000000)"
然后进行:
$db2 restore db cws3 continue
至此db2重定向恢复完成。