磁盘空间不够,DB2数据库恢复出错。
4月7日15点,发现数据库服务器空间使用了100%。
这是做了两个操作:(这里做这两部时,服务都没有停掉。)
1).全备数据库,联机。db2 backup database mydb online
2).取下db2inst2/NODE0000/SQL00001/SQLOGDIR/s0000***.LOG(全部),并删除
4月10日下午15点过,数据库突然报错。
连接数据库发现:
db2 => connect to mydb
SQL1036C 当存取数据库时发生 I/O 错误。 SQLSTATE=58030
restart DB2
db2 => connect to mydb
SQL1042C 发生意外的系统错误。 SQLSTATE=58004
重启数据库后:
$ db2 restore database mydb from /tmp/dbbacktmp taken at 20060407150620
SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。
想要继续吗?(y/n) y
DB20000I RESTORE DATABASE 命令成功完成。
db2 => connect to mydb
SQL1117N 由于 ROLL-FORWARD PENDING,不能连接或激活数据库 "mydb"。
SQLSTATE=57019
将之前删除的db2inst2/NODE0000/SQL00001/SQLOGDIR/s0000***.LOG全部上传。(比较奇怪,删除后系统没有自动重新生成呢?)
db2 => rollforward database mydb to 2006-04-07-15.3000
SQL1262N 为前滚数据库 "mydb" 指定的时间点无效。
db2 => rollforward database mydb to 2006-04-07-15.0620
SQL1262N 为前滚数据库 "mydb" 指定的时间点无效。
db2 => restore database mydb from /tmp/dbbacktmp without rolling forward
SQL2537N “复原”后必需前滚。
$ db2 rollforward database mydb to end of logs and complete
SQL4970N 由于在节点 "0" 上丢失了日志文件,所以数据库 "mydb"
的前滚恢复不能达到指定的停止点(日志末尾或时间点)。
$ db2 rollforward database mydb to 2006-04-01-02.1302 and stop
SQL1262N 为前滚数据库 "mydb" 指定的时间点无效。
$ db2 rollforward database mydb to 2006-04-01-02.13.02.000000 and stop
SQL1274N 数据库 "mydb" 要求前滚恢复并且时间点必须到达日志末尾。
最后不得已,重新建了一个同样的数据库。导入了之前取下的数据。
经过检查,最后一个s0000***.LOG由于没有空间,只记到了4月7日早上7点多的数据。也就是本身s0000***.LOG日志可能就是不完整的。
我现在有几个疑问,想得到大家的帮助:
1). db2inst2/NODE0000/SQL00001/SQLOGDIR/s0000***.LOG日志可以联机删除吗?是不是最后一个日志应该保留呢?
2). 我在做恢复时,没有选择without rolling forward,这时恢复后必须要前滚。前滚是更具s0000***.LOG来的吗?
3). 在我删除db2inst2/NODE0000/SQL00001/SQLOGDIR/s0000***.LOG后,系统没有重新生成LOG。这时空间是足够的,为什么呢?
4). 会不会是我的最后一个s0000***.LOG日志只到了4月7日早上7点多的数据,而我全备的时间点是下午3点多,所以会有"SQL4970N 由于在节点 "0" 上丢失了日志文件,所以数据库 "mydb"的前滚恢复不能达到指定的停止点(日志末尾或时间点)。"这个错误?
5). 我有一个全备的文件,理论上应该可以恢复的,现在我做了一次恢复,现在需要前滚,但又无法前滚,请问有什么办法通过这个全备文件恢复吗?
6). 在现在这个情况下,能让数据库不需要回滚吗?
7). 为什么删除s0000***.LOG后将近几天数据库才出错呢?