ITPub博客

首页 > 数据库 > Oracle > [20201221]KTFB Bitmapped File Space Header的恢复.txt

[20201221]KTFB Bitmapped File Space Header的恢复.txt

原创 Oracle 作者:lfree 时间:2020-12-21 15:33:35 0 删除 编辑

[20201221]KTFB Bitmapped File Space Header的恢复.txt

--//上个星期测试了数据文件OS头的修复,链接:http://blog.itpub.net/267265/viewspace-2743415/
--//数据文件第1块就是数据文件头,更新检查点就是写这块信息,比如执行alter system checkpoint;命令。
--//第2块为type: 0x1d=KTFB Bitmapped File Space Header
--//第3块为type: 0x1e=KTFB Bitmapped File Space Bitmap
...
--//第127块为type: 0x1e=KTFB Bitmapped File Space Bitmap

--//数据文件头的恢复我以前有链接如下:
--//链接http://blog.itpub.net/267265/viewspace-2128309/=>20161111]数据库文件头的修复.txt
--//里面有一点点问题,就是时间戳要按照链接计算http://blog.itpub.net/267265/viewspace-2222414/

--//本测试仅仅涉及第2块为type: 0x1d=KTFB Bitmapped File Space Header。

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//建立表空间脚本如下:
CREATE TABLESPACE TEA DATAFILE
  '/mnt/ramdisk/book/tea01.dbf' SIZE 40M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;

CREATE TABLESPACE SUGAR DATAFILE
  '/mnt/ramdisk/book/sugar01.dbf' SIZE 40M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;

2.对比第2块为type: 0x1d=KTFB Bitmapped File Space Header(从0开始计数):

SCOTT@book> select * from v$dbfile order by 1;
     FILE# NAME
---------- ----------------------------------------
         1 /mnt/ramdisk/book/system01.dbf
         2 /mnt/ramdisk/book/sysaux01.dbf
         3 /mnt/ramdisk/book/undotbs01.dbf
         4 /mnt/ramdisk/book/users01.dbf
         5 /mnt/ramdisk/book/example01.dbf
         6 /mnt/ramdisk/book/tea01.dbf
         7 /mnt/ramdisk/book/sugar01.dbf
7 rows selected.

SCOTT@book> @ bbvi 6 2
BVI_COMMAND
----------------------------------------------------------------------------------------------------
bvi -b 16384 -s 8192 /mnt/ramdisk/book/tea01.dbf
xxd -c16 -g 2 -s 16384 -l 8192 /mnt/ramdisk/book/tea01.dbf
dd if=/mnt/ramdisk/book/tea01.dbf bs=8192 skip=2 count=1 of=6_2.dd conv=notrunc 2>/dev/null
od -j 16384 -N 8192 -t x1 -v /mnt/ramdisk/book/tea01.dbf
hexdump -s 16384 -n 8192 -C -v /mnt/ramdisk/book/tea01.dbf
alter system dump datafile '/mnt/ramdisk/book/tea01.dbf' block 2;

alter session set events 'immediate trace name set_tsn_p1 level 8';
alter session set events 'immediate trace name buffer level 25165826';
9 rows selected.

 $ od -j 16384 -N 8192 -t x1  /mnt/ramdisk/book/tea01.dbf
0040000 1d a2 00 00 02 00 80 01 fa 00 55 17 03 00 02 04
                    ~~~~~~~~~~~
0040020 59 40 00 00 06 00 00 00 08 00 00 00 00 14 00 00
                    ~~~~~
0040040 09 00 00 00 80 00 00 00 fe ff 3f 00 7e 00 00 00
0040060 ff 13 00 00 00 00 00 00 70 02 00 00 f9 00 55 17
0040100 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040120 80 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00
0040140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0057760 00 00 00 00 00 00 00 00 00 00 00 00 02 1d fa 00
0060000

$ od -j 16384 -N 8192 -t x1  /mnt/ramdisk/book/sugar01.dbf
0040000 1d a2 00 00 02 00 c0 01 e7 58 40 19 03 00 01 04
                    ~~~~~~~~~~~
0040020 80 9b 00 00 07 00 00 00 08 00 00 00 00 14 00 00
                    ~~~~~
0040040 09 00 00 00 80 00 00 00 fe ff 3f 00 7e 00 00 00
0040060 ff 13 00 00 00 00 00 00 70 02 00 00 3f d5 96 17
0040100 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0057760 00 00 00 00 00 00 00 00 00 00 00 00 01 1d e7 58
0060000


$ diff -Nur <(od -j 16384 -N 8192 -t x1 -w2 /mnt/ramdisk/book/tea01.dbf) <(od -j 16384 -N 8192 -t x1  -w2 /mnt/ramdisk/book/sugar01.dbf)
--- /dev/fd/63  2020-12-21 09:14:21.111743334 +0800
+++ /dev/fd/62  2020-12-21 09:14:21.111743334 +0800
@@ -1,14 +1,14 @@
 0040000 1d a2
 0040002 00 00
 0040004 02 00
-0040006 80 01     =>dba地址的一部分
-0040010 fa 00     =>scn的一部分,可以看下面的转储。
-0040012 55 17     =>scn的一部分,可以看下面的转储。
+0040006 c0 01     =>dba地址的一部分
-------------------------------------------------
BBED> set dba 6,2
        DBA             0x01800002 (25165826 6,2)

BBED> set dba 7,2
        DBA             0x01c00002 (29360130 7,2)
----------------------------------------------
+0040010 e7 58
+0040012 40 19
 0040014 03 00
-0040016 02 04
-0040020 59 40     => 检查和。   
+0040016 01 04
+0040020 80 9b
 0040022 00 00
-0040024 06 00     =>文件号6
+0040024 07 00     =>文件号7
 0040026 00 00
 0040030 08 00
 0040032 00 00
@@ -27,16 +27,11 @@
 *
 0040070 70 02
 0040072 00 00
-0040074 f9 00    =>scn的一部分,可以看下面的转储。
-0040076 55 17    =>scn的一部分,可以看下面的转储。
+0040074 3f d5
+0040076 96 17
 0040100 03 00
 0040102 00 00
 *
-0040120 80 00
-0040122 00 00
-0040124 08 00
-0040126 00 00
-*
-0057774 02 1d    ->tailchk
-0057776 fa 00    ->tailchk
+0057774 01 1d  
+0057776 e7 58
 0060000

SCOTT@book> alter system dump datafile '/mnt/ramdisk/book/tea01.dbf' block 2;
System altered.

Start dump data block from file /mnt/ramdisk/book/tea01.dbf minblk 2 maxblk 2
 V10 STYLE FILE HEADER:
    Compatibility Vsn = 186647552=0xb200400
    Db ID=1337401710=0x4fb7216e, Db Name='BOOK'
    Activation ID=0=0x0
    Control Seq=314109=0x4cafd, File size=5120=0x1400
    File Number=6, Blksiz=8192, File Type=3 DATA
Dump all the blocks in range:
buffer tsn: 7 rdba: 0x01800002 (6/2)
scn: 0x0003.175500fa seq: 0x02 flg: 0x04 tail: 0x00fa1d02
frmt: 0x02 chkval: 0x4059 type: 0x1d=KTFB Bitmapped File Space Header
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F77DBB8FA00 to 0x00007F77DBB91A00
7F77DBB8FA00 0000A21D 01800002 175500FA 04020003  [..........U.....]
7F77DBB8FA10 00004059 00000006 00000008 00001400  [Y@..............]
7F77DBB8FA20 00000009 00000080 003FFFFE 0000007E  [..........?.~...]
7F77DBB8FA30 000013FF 00000000 00000270 175500F9  [........p.....U.]
7F77DBB8FA40 00000003 00000000 00000000 00000000  [................]
7F77DBB8FA50 00000080 00000008 00000000 00000000  [................]
7F77DBB8FA60 00000000 00000000 00000000 00000000  [................]
        Repeat 504 times
7F77DBB919F0 00000000 00000000 00000000 00FA1D02  [................]
File Space Header Block:
Header Control:
RelFno: 6, Unit: 8, Size: 5120, Flag: 9
AutoExtend: YES, Increment: 128, MaxSize: 4194302
Initial Area: 126, Tail: 5119, First: 0, Free: 624
Deallocation scn: 391446777.3
Header Opcode:
Save: No Pending Op
End dump data block from file /mnt/ramdisk/book/tea01.dbf minblk 2 maxblk 2

--//对比标准数据块的map
BBED> map  /v dba 4,135
 File: /mnt/ramdisk/book/users01.dbf (4)
 Block: 135                                   Dba:0x01000087
------------------------------------------------------------
 KTB Data Block (Table/Cluster)
 struct kcbh, 20 bytes                      @0
    ub1 type_kcbh                           @0
    ub1 frmt_kcbh                           @1
    ub1 spare1_kcbh                         @2
    ub1 spare2_kcbh                         @3
    ub4 rdba_kcbh                           @4
    ub4 bas_kcbh                            @8
    ub2 wrp_kcbh                            @12
    ub1 seq_kcbh                            @14
    ub1 flg_kcbh                            @15
    ub2 chkval_kcbh                         @16
    ub2 spare3_kcbh                         @18
...
ub4 tailchk                                @8188

--//通过上面的比较可以看出不同之处在dba地址(偏移4-7)在以及文件号偏移(20).

3.通过上面比较可以推断,只要建立属性一样的数据文件替换几处就ok了。
SCOTT@book> column SPARE3 format a20
SCOTT@book> select * from sys.file$;
FILE#    STATUS$     BLOCKS        TS#   RELFILE#  MAXEXTEND        INC   CRSCNWRP   CRSCNBAS OWNERINSTANCE     SPARE1
----- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------- ----------
    1          2      64000          0          1    4194302       1280          0          7                  4194306
    2          2      51200          1          2    4194302       1280          0       1834                  8388610
    3          2       3200          2          3    4194302        640          0     923328                 12582914
    4          2        640          4          4    4194302        160          0      16143                 16777218
    5          2      12800          6          5    4194302         80          0     952916                 20971522
    6          2       5120          7          6    4194302        128          3  391355879                 25165826
    7          2       5120          8          7    4194302        128          3  423647208                 29360130
7 rows selected.

--//25165826 = 0x1800002
--//29360130 = 0x1c00002
--//spare1保存的是dba地址。
3,391355879 = scn(10): 13276257767 = scn(16): 0x317539de7
3,423647208 = scn(10): 13308549096 = scn(16): 0x3194057e8
--//这里的scn对应的是CREATION_CHANGE#。

SYS@book> SELECT file#, CHECKPOINT_CHANGE#, CHECKPOINT_TIME,CREATION_CHANGE#  , RESETLOGS_CHANGE#,status, CHECKPOINT_COUNT,fuzzy,name,tablespace_name  FROM v$datafile_header;
FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME     CREATION_CHANGE# RESETLOGS_CHANGE# STATUS  CHECKPOINT_COUNT FUZ NAME                                               TABLESPACE_NAME
----- ------------------ ------------------- ---------------- ----------------- ------- ---------------- --- -------------------------------------------------- ------------------------------
    1        13308581647 2020-12-21 10:38:16                7            925702 ONLINE              2169 YES /mnt/ramdisk/book/system01.dbf                     SYSTEM
    2        13308581647 2020-12-21 10:38:16             1834            925702 ONLINE              2158 YES /mnt/ramdisk/book/sysaux01.dbf                     SYSAUX
    3        13308581647 2020-12-21 10:38:16           923328            925702 ONLINE              2079 YES /mnt/ramdisk/book/undotbs01.dbf                    UNDOTBS1
    4        13308581647 2020-12-21 10:38:16            16143            925702 ONLINE              2165 YES /mnt/ramdisk/book/users01.dbf                      USERS
    5        13308581647 2020-12-21 10:38:16           952916            925702 ONLINE              2073 YES /mnt/ramdisk/book/example01.dbf                    EXAMPLE
    6        13308581647 2020-12-21 10:38:16      13276257767            925702 ONLINE              1546 YES /mnt/ramdisk/book/tea01.dbf                        TEA
    7        13308581647 2020-12-21 10:38:16      13308549096            925702 ONLINE                 8 YES /mnt/ramdisk/book/sugar01.dbf                      SUGAR
7 rows selected.


4.开始测试:

--//首先备份一下。
SCOTT@book> alter tablespace  tea offline ;
Tablespace altered.

$ cp /mnt/ramdisk/book/tea01.dbf ~/tea01.dbf

SCOTT@book> alter tablespace  tea online ;
Tablespace altered.

$ dd if=/dev/zero of=/mnt/ramdisk/book/tea01.dbf bs=8192 seek=2 count=1  conv=notrunc
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 5.3777e-05 seconds, 152 MB/s
--//使用dd注意。conv=notrunc,输出文件对于的动作是seek。

SYS@book> shutdown abort
ORACLE instance shut down.

SYS@book> startup
ORACLE instance started.
Total System Global Area  643084288 bytes
Fixed Size                  2255872 bytes
Variable Size             205521920 bytes
Database Buffers          427819008 bytes
Redo Buffers                7487488 bytes
Database mounted.
Database opened.

--//启动正常。
 $ od -j 16384 -N 8192 -t x1  /mnt/ramdisk/book/tea01.dbf
0040000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0060000
--//还是0的状态。

SYS@book> select count(*) from scott.tx;
  COUNT(*)
----------
     87038

--//你可以发现即使我清零,读取里面数据正常。

$ dbv file=/mnt/ramdisk/book/tea01.dbf
DBVERIFY: Release 11.2.0.4.0 - Production on Mon Dec 21 10:04:32 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = /mnt/ramdisk/book/tea01.dbf
Page 2 is marked corrupt
Corrupt block relative dba: 0x01800002 (file 6, block 2)
Completely zero block found during dbv:
DBVERIFY - Verification complete

Total Pages Examined         : 5120
Total Pages Processed (Data) : 2484
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 128
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 2507
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 423651790 (3.423651790)

SYS@book> select * from sys.file$;
FILE#    STATUS$     BLOCKS        TS#   RELFILE#  MAXEXTEND        INC   CRSCNWRP   CRSCNBAS OWNERINSTANCE                      SPARE1
----- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------------------------ ----------
    1          2      64000          0          1    4194302       1280          0          7                                   4194306
    2          2      51200          1          2    4194302       1280          0       1834                                   8388610
    3          2       3200          2          3    4194302        640          0     923328                                  12582914
    4          2        640          4          4    4194302        160          0      16143                                  16777218
    5          2      12800          6          5    4194302         80          0     952916                                  20971522
    6          2       5120          7          6    4194302        128          3  391355879                                  25165826
    7          2       5120          8          7    4194302        128          3  423647208                                  29360130
7 rows selected.

--//我通过toad访问,点击表空间报错:
Select MAX(d.bytes) total_bytes,
       nvl(SUM(f.Bytes), 0) free_bytes,
       d.file_name,
       MAX(d.bytes) - nvl(SUM(f.bytes), 0) used_bytes,
       ROUND(SQRT(MAX(f.BLOCKS)/SUM(f.BLOCKS))*(100/SQRT(SQRT(COUNT(f.BLOCKS)) )), 2) frag_idx
from   DBA_FREE_SPACE f , DBA_DATA_FILES d
where  f.tablespace_name(+) = d.tablespace_name
and    f.file_id(+) = d.file_id
and    d.tablespace_name = 'TEA'
group by d.file_name

Error occurred: [600] (ORA-00600: internal error code, arguments: [KSLFDNG2], [0x0862242F0], [0], [0x084C98158], [0x000000000], [], [], [], [], [], [], []
)

//点击script,给出脚本如下:
CREATE TABLESPACE TEA DATAFILE
  '/mnt/ramdisk/book/tea01.dbf' AUTOEXTEND OFF
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;

--//执行修改看看是否可以通过:

SYS@book> alter database datafile '/mnt/ramdisk/book/tea01.dbf' autoextend on next 1m maxsize unlimited;
alter database datafile '/mnt/ramdisk/book/tea01.dbf' autoextend on next 1m maxsize unlimited
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 2)
ORA-01110: data file 6: '/mnt/ramdisk/book/tea01.dbf'

--//不行。

SYS@book> create table ty tablespace tea as select * from dba_objects ;
--//hang住。

SYS@book> insert into scott.tx select * from dba_objects ;

--//hang住。

SYS@book> select count(*) from scott.tx;
  COUNT(*)
----------
     87038

SYS@book> update scott.tx set owner=upper(owner);
87038 rows updated.

SYS@book> rollback ;
Rollback complete.

--//但是如果修改等导致空间扩张,就hang。

5.尝试恢复:
SYS@book> alter database datafile 6 offline ;
Database altered.

SYS@book> recover datafile 6;
Media recovery complete.
 
--// dd if=/mnt/ramdisk/book/sugar01.dbf of=/mnt/ramdisk/book/tea01.dbf bs=8192 skip=2 seek=2 count=1  conv=notrun
--//注意dd参数 skip=2 seek=2 count=1  conv=notrun。
--//这里使用bbed要安全可靠一些。

BBED> set offset 0
        OFFSET          0
--//注意一定要先设置offset 0,避免从某个偏移开始copy。        

BBED>  copy  dba 7,2 to dba 6,2
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 2                                                    Offsets:    0 to   63                                               Dba:0x01800002
------------------------------------------------------------------------------------------------------------------------------------------------
 1da20000 0200c001 e7584019 03000104 809b0000 07000000 08000000 00140000 09000000 80000000 feff3f00 7e000000 ff130000 00000000 70020000 3fd59617
<64 bytes per line>

BBED> set dba 6,2
        DBA             0x01800002 (25165826 6,2)

BBED> set offset 4
        OFFSET          4

BBED> dump /v count 4
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 2                                 Offsets:    4 to    7                            Dba:0x01800002
-----------------------------------------------------------------------------------------------------------
 0200c001                                                                l ....

 <32 bytes per line>

--//修改注意大小头问题。 01800002 反转 02008001
BBED>  modify  /x 02008001
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 2                                                    Offsets:    4 to    7                                               Dba:0x01800002
------------------------------------------------------------------------------------------------------------------------------------------------
 02008001
 <64 bytes per line>

BBED> set offset 20
        OFFSET          20

BBED> dump /v count 4
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 2                                 Offsets:   20 to   23                            Dba:0x01800002
-----------------------------------------------------------------------------------------------------------
 07000000                                                                l ....

 <32 bytes per line>

BBED> modify /x 06
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 2                                                    Offsets:   20 to   23                                               Dba:0x01800002
------------------------------------------------------------------------------------------------------------------------------------------------
 06000000

 <64 bytes per line>

BBED> dump /v count 4
 File: /mnt/ramdisk/book/tea01.dbf (6)
 Block: 2                                 Offsets:   20 to   23                            Dba:0x01800002
-----------------------------------------------------------------------------------------------------------
 06000000                                                                l ....

 <32 bytes per line>
 
BBED> sum apply
Check value for File 6, Block 2:
current = 0x9bc1, required = 0x9bc1

BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/tea01.dbf
BLOCK = 2
DBVERIFY - Verification complete

Total Blocks Examined         : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing   (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing   (Index): 0
Total Blocks Empty            : 0
Total Blocks Marked Corrupt   : 0
Total Blocks Influx           : 0
Message 531 not found;  product=RDBMS; facility=BBED

SYS@book> alter system flush buffer_cache;
System altered.

SYS@book> alter database datafile 6 online ;
Database altered.

SYS@book> update scott.tx set object_name=lpad(object_name,128,' ');
87038 rows updated.

SYS@book> rollback ;
Rollback complete.

--//OK,现在扩张没有问题了。

SYS@book> create table ty tablespace tea as select * from dba_objects ;
Table created.

SYS@book> select count(*) from ty;
  COUNT(*)
----------
     87039

Select MAX(d.bytes) total_bytes,
       nvl(SUM(f.Bytes), 0) free_bytes,
       d.file_name,
       MAX(d.bytes) - nvl(SUM(f.bytes), 0) used_bytes,
       ROUND(SQRT(MAX(f.BLOCKS)/SUM(f.BLOCKS))*(100/SQRT(SQRT(COUNT(f.BLOCKS)) )), 2) frag_idx
from   DBA_FREE_SPACE f , DBA_DATA_FILES d
where  f.tablespace_name(+) = d.tablespace_name
and    f.file_id(+) = d.file_id
and    d.tablespace_name = 'TEA'
group by d.file_name;

TOTAL_BYTES FREE_BYTES FILE_NAME                                                    USED_BYTES   FRAG_IDX
----------- ---------- ------------------------------------------------------------ ---------- ----------
   41943040    8388608 /mnt/ramdisk/book/tea01.dbf                                    33554432        100

6.总结:
--//1.建立类似的数据文件属性。使用它覆盖。至于建立的脚本可以通过alert获得。在toad下点击script获得,好像一些属性属于
--//表空间的属性,比如EXTENT MANAGEMENT LOCAL AUTOALLOCATE,BLOCKSIZE 8K,SEGMENT SPACE MANAGEMENT MANUAL,FLASHBACK ON;
--//2.修改2处,dba地址(偏移4-7),以及文件号(偏移20-21).
--//3.再次提醒使用dd命令要小心再小心。我再次犯错。
--//在恢复使用dd时少写了参数seek。导致覆盖了tea01.dbf的第0块。最后我选择改用bbed要安全可靠一些。
--// dd if=/mnt/ramdisk/book/sugar01.dbf of=/mnt/ramdisk/book/tea01.dbf bs=8192 skip=2 seek=2 count=1 conv=notrun

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2744047/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969284