当前位置:Linux教程 - Linux文化 - 直接修改master设备改变master数据库状态(win和UNIX)

直接修改master设备改变master数据库状态(win和UNIX)


windows平台解决方法: dbcc traceon(3604) go dbcc tablealloc(sysdatabases) 或  select first from sysindexes where id = object_id("sysdatabases" and indid=1\\找到数据页(pageno) go dbcc page(master,pageno,1,0)  \\从硬盘上拿这页内容详细内容 go master的如下: Offset 202 - row ID=0 row length=84 # varlen cols=10 215690CA (     0):  0a000100 01000000 00800001 d3090000  ................ 215690DA (    16):  8f960000 11db0401 8f960000 f3730501  .............s.. 215690EA (    32):  c4fbbb20 00085400 6d617374 65720081  ... ..T.master.. 215690FA (    4:  00000000 00000000 00000000 00000000  ................ 2156910A (    64):  00000000 00000000 0b484440 40403c38  .........HD@@@<8 2156911A (    80):  34302e28                             40.( 上面00800001中的80代表-32768,拷贝这些代码,用一个16进制编辑器编辑你的master文件,查找这些代码,把00800001改为00000001,重启sybase,master库正常,可以使用了 在sybase ase 12.5.2+windows 2003上通过。 当时我认为unix下如果裸设备可能比较麻烦(果然相当麻烦),dd精确定位复制有可能行,后RS9000弟兄问UNIX如何处理,因为要考IBM 222认证,所以就耽误下来,过了222,有时间,现把过程和方法贴出 环境: iBM aix 4.3和sybase11.9 只有这环境 master设备/dev/rlvsybmaster1 前面还是一样看page内容: dbcc traceon(3604) go dbcc tablealloc(sysdatabases) 或  select first from sysindexes where id = object_id("sysdatabases" and indid=1\\找到数据页(pageno) go dbcc page(master,pageno,1,0)  \\从硬盘上拿这页内容详细内容 go master的如下: Offset 266 - 3256210a:  02000001 00010000 80000001 000008a1  ................ 3256211a:  00000000 00000000 00009179 00fe9caa  ...........y.... 3256212a:  0005adda 00120034 6d617374 65728000  .......4master.. 3256213a:  03302e28                             .0.(. 用od命令定位(od命令真好) #od -H /dev/lvsybmaster1 |grep '02000001 00010000 80000001 000008a1' 报找不到,郁闷,仔细看看dbcc page用法1(print page header, data rows and row offset table), 2 (print page header and hex dump of data page) 。改用dbcc page(master,pageno,2,0) 结果如下:不只这些,择了master的 32562110:  00008000 00010000 08a10000 00000000  ................ 32562120:  00000000 917900fe 9caa0005 adda0012  .....y.......... 32562130:  00346d61 73746572 80000330 2e280201  .4master...0.(.. 32562140:  00030001 00000000 00010000 01e00000  ................ 32562150:  00000000 00000000 917900fd acd60013  .........y...... 32562160:  9866001e 00336d6f 64656c80 00032f2d  .f...3model.../- 原来是顺序不同,怪不得grep找不到,再来: #od -H /dev/lvsybmaster1 |grep '00008000 00010000 08a10000 00000000' 结果 2024420  00008000 00010000 08a10000 00000000  找到,注意这的偏移量是8进制的 找到如何改呢?知道应该用dd,叨咕半天,不行,上网求助,在liveunix看到“炸鸡”高人的帖子,给了一个sh如下 cat chvgid.sh #!/usr/bin/ksh vgid=$1 disk=$2 set -A a `echo $vgid|\ awk '{     for (f=1; f <= length($0); f=f+2) {          print "ibase=16\nobase=8\n"toupper(substr($0,f,2))     } }'|bc 2>/dev/null` /usr/bin/echo "\0"${a[0]}"\0"${a[1]}"\0"${a[2]}"\0"${a[3]}"\c"|dd bs=1 seek=3600 of=/dev/$disk 原来他是要直接改VGID的信息,看来能改的东西真不少。 到现在这个sh我还是看不很明白,但是用没问题,自己改了改如下 #cat chfile.sh #!/usr/bin/ksh dstatus=$1 filename=$2 offset=$3 set -A a `echo $dstatus|\ awk '{     for (f=1; f <= length($0); f=f+2) {          print "ibase=16\nobase=8\n"toupper(substr($0,f,2))     } }'|bc 2>/dev/null` /usr/bin/echo "\0"${a[0]}"\0"${a[1]}"\0"${a[2]}"\0"${a[3]}"\c"|dd bs=1 seek=$offset of=$filename conv=notrunc 加了$3偏移量,还有注意加conv=notrunc,要不你在修改点后的数据可能都没了。这的偏移量可是10进制的 od -Ad -H /dev/lvsybmaster1 |grep '00008000 00010000 08a10000 00000000' 找10进制偏移 0534800  00008000 00010000 08a10000 00000000 停sybase 改master设备 #chfile.sh 00000000 /dev/lvsybmaster1 534800 4+0 records in. 4+0 records out. 就是要把00008000 改为00000000 重启sybase ok 多说几句: 1 这种问题最好的方法是rebuildmaster,bcp out old sysdatabase,sysusages等systable, bcp in newmaster .这里只是一个办法。 2 问题的关键是BYPASS RECOVERY mode下无法正常执行事物,bcp out可以,in不行。dbcc delete_row删除记录没有问题,当时好像只能删和看,dbcc bytes,dbcc buffer等都只能看,照理应该有命令可以改dbcc bytes出来的东东,找遍dbcc未果,哪位大大知道请赐教,问了sybase,无法dbcc改。 3 原以为改master文件后会启动是不是会再做什么一致性校验,但改了就ok了,总认为不会这么简单,--贱 4 在hp11+sybase12环境中试了一下,一是hp的od不支持长16位显示,只能od -x master|grep "0000 8000 0001 0000 08a1 0000 000 0000" 定位;二是改裸设备时dd好象不能按字节写入,可能要改sh,不想搞了。 5 除了master状态还能改点什么,一时也想不到。 6 写完后感觉花这么长时间折腾好累,但毕竟学到好多知识。

摘自:chinaunix.net