二、使用BBED
使用bbed 需要使用parfile和listfile
1 PARFILE:参数文件记录以下参数:
此文件主要记录
BLOCKSIZE:数据库的标准块大小
MODE: BBED的运行模式:browse或者edit
SILENT:控制操作的输出(Y/N)
SPOOL:将输出内容spool到 bbed.log (Y/N)
LISTFILE:被编辑的文件列表的名字
CMDFILE:执行命令的集合的文件名
BIFILE :undo 文件的名称
LOGFILE:用户日志文件默认为:log.bbd
一般使用的参数:
BLOCKSIZE=8192
LISTFILE=/home/oracle/filelinux.txt
MODE=edit
2 listfile.txt (文件名随意)
LISTFILE 文件中的格式为:文件号 路径名称 大小,使用如下sql语句可以得到listfile的内容:
select file#||’ ‘||name||’ ‘||bytes from v$datafile;
BBED 主要使用的命令及其作用:
show 查看当前的环境参数,跟sqlplus的同名命令类似。
dump 列出指定block的内容
find 在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量–offset,偏移量就是在block中的字节数
modify 修改指定block的指定偏移量的值,可以在线修改。
copy 把一个block的内容copy到另一个block中
verify 检查当前环境是否有坏块
sum 计算block的checksum,modify之后block就被标识为坏块,current checksum与reqired checksum不一致,sum命令可以计算出新的checksum并应用到当前块。
undo 回滚当前的修改操作,如果误操作,执行undo 命令,便可以恢复到以前的状态。
revert 回滚所有之前的修改操作,意思就是undo all
BBED> help all
设置当前要修改的数据块,格式:文件号,数据块号
1 SET DBA [ dba | file#, block# ]
例如:
set dba 3,632
如果成功,将返回数据块的RDBA(relative data block address)
BBED>set dba 3,632
DBA 0x00c00278 (12583644 3,632)
2 SET FILENAME ‘filename’
指定某个文件,filename必须是有效的oracle 数据文件而且必须被单引号’filename’ 包含。
BBED> set filename ‘/opt/oracle/oradata/rac/users01.dbf’
FILENAME /opt/oracle/oradata/rac/users01.dbf
3 SET FILE file#
设定当前文件为指定文件号的文件。该编号必须是在数据库启动参照的文件列表里面。
BBED> set file 2
FILE# 2
4 SET BLOCK [+/-]block#
设置当前的数据块,次数据块必须是属于已经指定的fileanme或者file的。使用set block命令可以指定绝对的block,也可以使用+ -指定相对偏移的block
比如 设置了当前的block为15,
BBED> set block 15
BLOCK# 15
BBED> set block +15
BLOCK# 30 相对当前15号块偏移量为15的块:数据块 30
5 SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
与设置块类似,使用此命令必须先指定数据块。绝对或者相对偏移量都可以指定。
BBED> set offset 28
OFFSET 28
BBED> set offset +12
OFFSET 30
6 SET BLOCKSIZE bytes
指定数据块的大小,次数据块大小必须和已经指定的文件中的数据块大小一致,否则会报错。
BBED> set blocksize 8192
BLOCKSIZE 8192
7 SET LIST[FILE] ‘filename’
如果在参数文件/命令行中没有指定listfile,可以使用此命令指定listfile。listfile必须使用 ” 包含。
BBED> set listfile /home/oracle/filelinux.txt
LISTFILE /home/oracle/filelinux.txt
8 SET WIDTH character_count
设置屏幕字符宽度,默认为80个字符宽度。
9 SET COUNT bytes_to_display
设置dump 命令显示数据块 bytes的大小,默认512,比如查看一个8Kb 大小的数据块,需要dump 8次 偏移量分别为 0,512,1024,1536,2048,2560,3092,3604。
设置的值越高,dump的次数越多,设置的值越小,dump的次数就越少。
10 SET IBASE [ HEX | OCT | DEC ]
设置内部数据编码,默认为10进制,当然也可以设置为16进制或者8进制。也允许set block,set file,set offset 命令使用可选的进制到10进制
BBED>set ibase hex
IBASE Hex
BBED> set block +A
BLOCK# 11
11 SET OBASE [ HEX | OCT | DEC ]
未知的命令
12 SET MODE [ BROWSE | EDIT ]
设置bbed 的模式:浏览模式或者编辑模式。浏览模式不允许任何更改操作,在编辑模式可以对数据库进行修改
13 SET SPOOL [ Y | N ]
此命令无效
14 SHOW [| ALL ]
显示 当前的所有设置
15 INFO
列出正在被查看或者编辑的文件列表
16 MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]
此命令可以显示当前数据块的内部图。和参数 /v 命令一起可以显示更加详细的信息。此图可以显示整个数据块的偏移量,其中包含了块头部,数据块头部和数据行信息
如果set命令还没设置一个当前的block,或者用户想指定一个其他的block而保留当前的block,可以使用map 命令指定文件名,文件号,数据块,DBA而不影响当前的block的指定。
通过使用map命令,可以检查或着修改数据块中的数据。
如下事例为一个blocksize为8k的数据块的map信息。
BBED> map /v dba 4,440
File: /u02/oradata/xhdb/users01.dbf (4)
Block: 440 Dba:0x010001b8
————————————————————
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0 <-- Block Header Structure
ub1 type_kcbh @0 <-- block的类型,详见下面列表
ub1 frmt_kcbh @1 <-- block format 1=oracle 7,2=ORACLE 8+
ub1 spare1_kcbh @2 <-- 未使用
ub1 spare2_kcbh @3 <-- 未使用
ub4 rdba_kcbh @4 <-- RDBA-relative data block address
ub4 bas_kcbh @8 <-- SCN base
ub2 wrp_kcbh @12 <-- SCN wrap
ub1 seq_kcbh @14 <-- 队列值,对于同一个SCN,每次对数据块的改变而增加。
ub1 flg_kcbh @15 <-- 标记位:
0x01 新数据块
0x02 延迟logging 变更delayed logging change advanced SCN/seq
0x04 check value saved-block XOR's to zero
0x08 临时数据块
ub2 chkval_kcbh @16 <-- 可选的,块的校验和 (如果 DB_BLOCK_CHECKSUM=TRUE)
ub2 spare3_kcbh @18 <-- 未使用
struct ktbbh, 72 bytes @20 <-- Transaction Fixed Header Structure
ub1 ktbbhtyp @20 <-- 数据块类型: 1=DATA 2=INDEX
union ktbbhsid, 4 bytes @24 <-- 段/对象ID
struct ktbbhcsc, 8 bytes @28 <-- 块最后清除时的SCN
b2 ktbbhict @36 <-- ITL 槽的个数
ub1 ktbbhflg @38 <-- 0=on the freelist
ub1 ktbbhfsl @39 <-- ITL TX freelist 槽
ub4 ktbbhfnx @40 <-- freelist上下一个块的DBA
struct ktbbhitl[2], 48 bytes @44 <-- ITL 列表索引
struct kdbh, 14 bytes @100 <-- Data Header Structure
ub1 kdbhflag @100 <-- N=pctfree hit(clusters);F=do not put on freelist;K=flushable cluster keys
b1 kdbhntab @101 <-- Number of tables (>1 in clusters)
b2 kdbhnrow @102 <-- Number of rows
sb2 kdbhfrre @104 <-- First free row entry index: -1= 你必须添加一个
sb2 kdbhfsbo @106 <-- Freespace begin offset
sb2 kdbhfseo @108 <-- Freespace end offset
b2 kdbhavsp @110 <-- Available space in the block
b2 kdbhtosp @112 <-- Toatal available space when all TXs commit
struct kdbt[1], 4 bytes @114 <-- Table Directory Entry Structure
b2 kdbtoffs @114 <--
b2 kdbtnrow @116 <--
sb2 kdbr[14] @118 <-- Row Directory
ub1 freespace[7475] @146 <-- Free Space
ub1 rowdata[567] @7621 <-- Row Data
ub4 tailchk @8188 <-- 见下面详解

Header Block 类型:
01:undo 段头
02:undo 数据块
03:保留的undo 头
04:保留的undo 数据块
05:数据段头 (temp,index,data 等等)
06:KTB managed data block (with ITL)
07: 临时表的数据块(没有 ITL)
08: sort key
09: sort run
10: 段自由列表
11: 数据文件头
TAIL CHECKS
oracle 所有的数据块的最后4个字节存放的是 tail check(校验)信息,下面以oracle 9i为例介绍其结构:
数据块尾 是由一连串的两个字节的SCN,块类型和SCN序列值组成,比如 SCN base number 是0x00020117,块类型为:06 ,SCN 序列值为:0x04
tail check 的值就是:0x01170604
SCN base Type SCN seq
0117 06 04
尽管尾部校验值是由三个部分组成,但是oracle将其看为一个存储在4个bytes的无符号整数,在小字节序、低字节序的平台上,值是以低字节排序的。因此如果尾部校验被正规的块编辑器或者
dump 命令检查,字节显示的顺序可能不同。比如0x01170604 存储在小字节排序的平台上会被写为:“04061701”

17 DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
dump 命令可以转储数据块的内容。 使用/v 选项可以输出详细的内容。有上面的提示可以看出,dump命令可以指定DBA,FILENAME,FILE,BLOCK,OFFSET,COUNT参数。
如果没有指定当前的文件, 可以根据dump命令中指定的block和offset值转储数据块,dump的大小有count决定,默认为512bytes 或者选择指定其他的值。
BBED> dump file 4 block 420
File: /u01/app/ora10g/oradata/orcl/users01.dbf (4)
Block: 420 Offsets: 0 to 511 Dba:0x010001a4
————————————————————————
06a20000 a4010001 a67c1000 00000306 9aee0000 01000000 f1d00000 577c1000
00000000 02003200 a1010001 04001000 5c010000 13008000 92011f00 01200000
a67c1000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00010100 ffff1400 8f1f7b1f 7b1f0000 01008f1f 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>
我们可以利用前面介绍的block header structure的知识来解释上面的信息:
Type Format Unused RDBA SCN Base SCN Wrap Seq Flag
06 a2 0000 a4010001 a67c1000 0000 03 06
18 PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
print 命令可以输出数据块的结构,和dump一样可以指定DBA,FILE,FILENAME,BLOCK,OFFSET;

BBED> set dba 4,440
DBA 0x010001b8 (16777656 4,440)
BBED> set offset 0
OFFSET 0
查看kcbh –Block Header Structure
BBED> p
kcbh.type_kcbh
————–
ub1 type_kcbh @0 0×06
BBED>
当print打印一个数据块的结构时,输出的格式为:
Unit Size* | Name | Offset | Value
Unit Size* 显示为bytes并且标明value的值是带符号的或者不带符号的。
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0×06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0×00
ub1 spare2_kcbh @3 0×00
ub4 rdba_kcbh @4 0x010001b8
ub4 bas_kcbh @8 0×00404938
ub2 wrp_kcbh @12 0×0000
ub1 seq_kcbh @14 0×10
ub1 flg_kcbh @15 0×06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x619d
ub2 spare3_kcbh @18 0×0000
BBED>
查看 kdbh –Data Header Structure
BBED> p kdbh
ub1 kdbhflag @100 0×00 (NONE)
b1 kdbhntab @101 1
b2 kdbhnrow @102 14 <-- 有14行数据
sb2 kdbhfrre @104 -1
sb2 kdbhfsbo @106 46
sb2 kdbhfseo @108 7521
b2 kdbhavsp @110 7475
b2 kdbhtosp @112 7475
BBED>
查看这个数据块里有多少行数据:
BBED> p kdbhnrow
b2 kdbhnrow @102 14
BBED>
作为显示指定数据块的信息的补充,使用* 前缀,print的命令也可以显示数据结构指定位置所包含的信息。如下例子:
显示块行信息:
从这里,我们可以观察到这个块一共有14行数据(emp表总共有14行数据)。每一行指针需要2个bytes,他们从偏移量118开始到144存储在这个数据块中
BBED> p kdbr
sb2 kdbr[0] @118 8050
sb2 kdbr[1] @120 8007
sb2 kdbr[2] @122 7964
sb2 kdbr[3] @124 7923
sb2 kdbr[4] @126 7878
sb2 kdbr[5] @128 7837
sb2 kdbr[6] @130 7796
sb2 kdbr[7] @132 7756
sb2 kdbr[8] @134 7718
sb2 kdbr[9] @136 7675
sb2 kdbr[10] @138 7637
sb2 kdbr[11] @140 7599
sb2 kdbr[12] @142 7560
sb2 kdbr[13] @144 7521
BBED>
BBED> p *kdbr[0]
rowdata[529]
————
ub1 rowdata[529] @8150 0x2c
从上面的信息可以看到第0行开始的位置在偏移量8150,dump出这一起始处的信息:
BBED> d /v dba 4,440 offset 8150 count 16
File: /u02/oradata/xhdb/users01.dbf (4)
Block: 440 Offsets: 8150 to 8165 Dba:0x010001b8
——————————————————-
2c010803 c24a4605 42656376 7805434c l ,….JF.Becvx.CL
<16 bytes per line>
BBED>
2.print行数据信息
尽管print不能像dump命令那样提供count选项,但是它也能够打印出 offset,如 下所示:
Switch Display Format
/x Hex
/d signed decimal
/u unsigned decimal
/o Octal
/c Character
/n Oracle Number
/t Oracle Date
/i Oracle ROWID
根据相关的计算得知,数字7369实际存储于数据库16进制的值如下所示:
7369 c2 4a 46
BBED> d /v dba 4,440 offset 8150 count 16
File: /u02/oradata/xhdb/users01.dbf (4)
Block: 440 Offsets: 8150 to 8165 Dba:0x010001b8
——————————————————-
2c010803 c24a4605 42656376 7805434c l ,….JF.Becvx.CL
<16 bytes per line>
print命令打印绝对偏移量的信息
BBED> p offset 8150
rowdata[529]
————
ub1 rowdata[529] @8150 0x2c
BBED>
以字符显示偏移量 为8150的值:
BBED> p /c offset 8150
rowdata[529]
————
ub1 rowdata[529] @8150 ,
BBED>
以数字显示偏移量处的值:
BBED> p /n offset 8154
rowdata[533]
————
ub1 rowdata[533] @8154 194
BBED> p /n offset 8155
rowdata[534]
————
ub1 rowdata[534] @8155 74
BBED> p /n offset 8156
rowdata[535]
————
ub1 rowdata[535] @8156 70
BBED>
SQL> select dump(7369) from dual;
DUMP(7369)
———————-
Typ=2 Len=3: 194,74,70
SQL>
19 E(X)AMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]:
e(x)amine的命令选项:examine 命令可以根据一下转换格式翻译数据块中的数据
N – a number which specifies a repeat count.
u – a letter which specifies a unit size:
b – b1, ub1 (byte)
h – b2, ub2 (half-word)
w – b4, ub4(word)
r – Oracle table/index row
f – a letter which specifies a display format:
x – hexadecimal
d – decimal
u – unsigned decimal
o – octal
c – character (native)
n – Oracle number
t – Oracle date
i – Oracle rowid
与print不同之处在与examine命令不能将数据块中的存储的内容翻译成我们能够看懂的信息。但是它可以显示行信息。结合row的数据类型信息,examine可以被用来从数据块中重新得到行信息。
examine命令允许以下这些指定的转换符进行数据的转义,比如如果我们想要翻译一个oracle表中的数据行,第一个字段是字符,第二,三个字段是数值,我们可以这样执行命令:
x /rcnn
下面的例子显示了print和examine命令,显示第1行的数据信息:
select * from emp ; 输出的第一行数据如下所示:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
—— ———– ——— ———- ———— ———- ———- ———-
7369 Becvx CLERK 7902 02-JUN-10 900 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
字段的依次类型为:nccntnnn
BBED> p *kdbr[0] –显示第一行的信息
rowdata[529]
————
ub1 rowdata[529] @8150 0x2c
BBED> x /r –显示原始存储数据格式
rowdata[529] @8150
————
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0×01
cols@8152: 8
col 0[3] @8153: 0xc2 0x4a 0×46
col 1[5] @8157: 0×42 0×65 0×63 0×76 0×78
col 2[5] @8163: 0×43 0x4c 0×45 0×52 0x4b
col 3[3] @8169: 0xc2 0×50 0×03
col 4[7] @8173: 0×78 0x6e 0×06 0×02 0×14 0x0c 0x1f
col 5[2] @8181: 0xc2 0x0a
col 6[0] @8184: *NULL*
col 7[2] @8185: 0xc1 0×15
BBED> x /rnccntnnn –指定转换格式,出现我们能够看懂的值。
rowdata[529] @8150
————
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0×01
cols@8152: 8
col 0[3] @8153: 7369
col 1[5] @8157: Becvx
col 2[5] @8163: CLERK
col 3[3] @8169: 7902
col 4[7] @8173: 02-JUN-10
col 5[2] @8181: 900
col 6[0] @8184: *NULL*
col 7[2] @8185: 20
BBED>
直接显示第10行数据:
BBED> x /rnccntnnn *kdbr[9]
rowdata[154] @7775
————
flag@7775: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7776: 0×01
cols@7777: 8
col 0[3] @7778: 7844
col 1[6] @7782: TURNER
col 2[8] @7789: SALESMAN
col 3[3] @7798: 7698
col 4[7] @7802: 08-SEP-81
col 5[2] @7810: 1500
col 6[1] @7813: 0
col 7[2] @7815: 30
BBED>
连续显示3个数据行的值:
注意:可以看到后两个没有数据的输出,所以要先print 行的值
BBED> x /3rnccntnnn
rowdata[529] @8150
————
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0×01
cols@8152: 8
col 0[3] @8153: 7369
col 1[5] @8157: Becvx
col 2[5] @8163: CLERK
col 3[3] @8169: 7902
col 4[7] @8173: 02-JUN-10
col 5[2] @8181: 900
col 6[0] @8184: *NULL*
col 7[2] @8185: 20
tailchk @8188
——-
flag@8188: 0×10 (KDRHFD)
lock@8189: 0×06
cols@8190: 0
tailchk @8188
——-
flag@8190: 0×38 (KDRHFF, KDRHFD, KDRHFH)
lock@8191: 0×49
cols@8192: 0
BBED>
解决办法:
BBED> p *kdbr[0] *kdbr[1] *kdbr[2]
rowdata[443]
————
ub1 rowdata[443] @8064 0x2c
BBED> x /3rnccntnnn
rowdata[443] @8064
————
flag@8064: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8065: 0×01
cols@8066: 8
col 0[3] @8067: 7521
col 1[4] @8071: WARD
col 2[8] @8076: SALESMAN
col 3[3] @8085: 7698
col 4[7] @8089: 22-FEB-81
col 5[3] @8097: 1250
col 6[2] @8101: 500
col 7[2] @8104: 30
rowdata[486] @8107
————
flag@8107: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8108: 0×01
cols@8109: 8
col 0[3] @8110: 7499
col 1[5] @8114: ALLEN
col 2[8] @8120: SALESMAN
col 3[3] @8129: 7698
col 4[7] @8133: 20-FEB-81
col 5[2] @8141: 1600
col 6[2] @8144: 300
col 7[2] @8147: 30
rowdata[529] @8150
————
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0×01
cols@8152: 8
col 0[3] @8153: 7369
col 1[5] @8157: Becvx
col 2[5] @8163: CLERK
col 3[3] @8169: 7902
col 4[7] @8173: 02-JUN-10
col 5[2] @8181: 900
col 6[0] @8184: *NULL*
col 7[2] @8185: 20
BBED>
注意:oracle向数据块填充数据的时候是有底向上的,因此设置第一行的偏移量会阻止重复操作。比如:当前是第三行,并且hang 2 被指定了,因此,行3和行2 都会被显示。如果
当前行是7,并且指定了 行4 ,那么 行 7,6,5,4都会被显示。
20 FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
转换符:
x – hexadecimal
d – decimal
u – unsigned decimal
o – octal
c – character (native)
定位数据在数据块中的位置。命令允许寻找十六进制,字符串,数字的数。使用TOP 关键字可以直接从数据块的顶部查找,或者使用CURR关键字从当前的位置查找。
21 COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
copy 命令可以将数据块从一个位置拷贝到另外一个位置。配合其他命令如filename,file和offset的指定,或者直接指定DBA。
22 MODIFY[/x|d|u|o|c] numeric/character string
[ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
modify 命令可以对数据块内的数据进行修改的。可以指定DBA,FILE,FILENAME,BLOCK,OFFSET等参数。如果没有指定当前的file,block,和offset,
执行该命令的时候会修改。可选地,一个符号或者指针可以在执行此命令的时候指定。
23 ASSIGN [/x|d|u|o]=: [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]: [ value |]
24 SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
SUM 命令用来检查和设置数据块的校验和,执行sum命令是可以指定DBA,FILENAME,FILE,BLOCK 和OFFSET参数。
25 PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]/POP
PUSH/POP 命令用来将一个file,block和地址偏移量迁移到一个备份过的内存栈中,然后取用的时候POP命令可以从内存栈中取出之前push进去的对象。
这样可以使当前正在被修改的对象临时被存储,与此同时其他的对象可以被修改或者检查。
26 REVERT [ DBA | FILE | FILENAME | BLOCK ]
相当于undo all 操作,可以修复file,filename,block 或者dba 到使用bbed编辑的初始状态。
27 UNDO
回滚之前的操作。
28 HELP [| ALL ]
帮助命令。。
29 VERIFY [ DBA | FILE | FILENAME | BLOCK ]
检查数据块的一致性。它执行和dbferify 类似的功能。
31 CORRUPT [ DBA | FILE | FILENAME | BLOCK ]
corrupt 命令指定blocks 为坏块。
BBED>corrupt dba 4,13
Block marked media corrupt
注意:undo命令不能回退corrupt操作,然而revert命令可以。

Trackback

no comment untill now

Add your comment now

切换到手机版