歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 直接修改master設備改變master數據庫狀態(win和UNIX)

直接修改master設備改變master數據庫狀態(win和UNIX)

日期:2017/2/27 12:12:50   编辑:Linux文化

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


Copyright © Linux教程網 All Rights Reserved