• BBED Structure


    BBED中map命令能显示数据块的数据结构,本文以bbed分析数据块头及数据块为例,说明map中的具体结构。

    1. 数据块头结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    BBED> set dba 1,1
    DBA 0x00400001 (4194305 1,1)

    BBED> map /v
    File: /oradata/datafile/linora/system01.dbf (1)
    Block: 1 Dba:0x00400001
    ------------------------------------------------------------
    Data File Header --表示文件头

    struct kcvfh, 860 bytes @0 --此块只有一个Structure,kcvfh
    struct kcvfhbfh, 20 bytes @0
    struct kcvfhhdr, 76 bytes @20
    ub4 kcvfhrdb @96
    struct kcvfhcrs, 8 bytes @100
    ub4 kcvfhcrt @108
    ub4 kcvfhrlc @112
    struct kcvfhrls, 8 bytes @116
    ub4 kcvfhbti @124
    struct kcvfhbsc, 8 bytes @128
    ub2 kcvfhbth @136
    ub2 kcvfhsta @138
    struct kcvfhckp, 36 bytes @484
    ub4 kcvfhcpc @140
    ub4 kcvfhrts @144
    ub4 kcvfhccc @148
    struct kcvfhbcp, 36 bytes @152
    ub4 kcvfhbhz @312
    struct kcvfhxcd, 16 bytes @316
    sword kcvfhtsn @332
    ub2 kcvfhtln @336
    text kcvfhtnm[30] @338
    ub4 kcvfhrfn @368
    struct kcvfhrfs, 8 bytes @372
    ub4 kcvfhrft @380
    struct kcvfhafs, 8 bytes @384
    ub4 kcvfhbbc @392
    ub4 kcvfhncb @396
    ub4 kcvfhmcb @400
    ub4 kcvfhlcb @404
    ub4 kcvfhbcs @408
    ub2 kcvfhofb @412
    ub2 kcvfhnfb @414
    ub4 kcvfhprc @416
    struct kcvfhprs, 8 bytes @420
    struct kcvfhprfs, 8 bytes @428
    ub4 kcvfhtrt @444

    ub4 tailchk @8188

    print kcvfh看看具体内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    BBED> p kcvfh
    struct kcvfh, 860 bytes @0
    struct kcvfhbfh, 20 bytes @0
    --数据块头
    --前20个字节对应如图一所示
    ub1 type_kcbh @0 0x0b
    --Header Block Type,如图二
    --此处转换为10进制是11,正是file header
    ub1 frmt_kcbh @1 0xa2
    --块格式,1为Oracle 7,2为Oracle 8后
    ub1 spare1_kcbh @2 0x00
    ub1 spare2_kcbh @3 0x00
    ub4 rdba_kcbh @4 0x00400001
    --RDBA,相对块地址
    ub4 bas_kcbh @8 0x00000000
    --SCN base
    ub2 wrp_kcbh @12 0x0000
    --SCN Wrap
    ub1 seq_kcbh @14 0x01
    --序列号,同一个SCN不同的序列号,标记块版本
    ub1 flg_kcbh @15 0x04 (KCBHFCKV)
    --标记号
    --0x01新块
    --0x02 Delayed Logging Chang advanced SCN/seq
    --0x04 Check value saved
    ub2 chkval_kcbh @16 0x1375
    --块校验值
    ub2 spare3_kcbh @18 0x0000
    struct kcvfhhdr, 76 bytes @20
    --文件头通用数据类型
    ub4 kccfhswv @20 0x00000000
    ub4 kccfhcvn @24 0x0b200400
    ub4 kccfhdbi @28 0xc9cffd9d
    --dbid
    text kccfhdbn[0] @32 L
    --接下来8个字符为Oracle SID,只能<=8个字符
    text kccfhdbn[1] @33 I
    text kccfhdbn[2] @34 N
    text kccfhdbn[3] @35 O
    text kccfhdbn[4] @36 R
    text kccfhdbn[5] @37 A
    text kccfhdbn[6] @38
    text kccfhdbn[7] @39
    ub4 kccfhcsq @40 0x00002353
    --Controlfile sequence number
    ub4 kccfhfsz @44 0x00016800
    --所在数据文件块数=dba_data_files.blocks
    s_blkz kccfhbsz @48 0x00
    ub2 kccfhfno @52 0x0001
    --文件号file_id
    ub2 kccfhtyp @54 0x0003
    --文件类型,03表示数据文件,06表示undo
    ub4 kccfhacid @56 0x00000000
    ub4 kccfhcks @60 0x00000000
    text kccfhtag[0] @64
    text kccfhtag[1] @65
    text kccfhtag[2] @66
    text kccfhtag[3] @67
    text kccfhtag[4] @68
    text kccfhtag[5] @69
    text kccfhtag[6] @70
    text kccfhtag[7] @71
    text kccfhtag[8] @72
    text kccfhtag[9] @73
    text kccfhtag[10] @74
    text kccfhtag[11] @75
    text kccfhtag[12] @76
    text kccfhtag[13] @77
    text kccfhtag[14] @78
    text kccfhtag[15] @79
    text kccfhtag[16] @80
    text kccfhtag[17] @81
    text kccfhtag[18] @82
    text kccfhtag[19] @83
    text kccfhtag[20] @84
    text kccfhtag[21] @85
    text kccfhtag[22] @86
    text kccfhtag[23] @87
    text kccfhtag[24] @88
    text kccfhtag[25] @89
    text kccfhtag[26] @90
    text kccfhtag[27] @91
    text kccfhtag[28] @92
    text kccfhtag[29] @93
    text kccfhtag[30] @94
    text kccfhtag[31] @95
    ub4 kcvfhrdb @96 0x00400208
    --仅1号文件有值,代表root dba,本例中转换为10进制为4194824,
    --通过dbms_utility可以查看到正是1号文件520 Block。
    --在11g中,dba 1,520 代表的是bootstrap$,10g是dba 1,377,10g以前是dba 1,417
    --查询语句:
    --col SEGMENT_NAME for a15
    --select segment_name,segment_type,header_file,header_block from dba_segments where header_block=520;
    struct kcvfhcrs, 8 bytes @100
    --数据文件创建scn
    ub4 kscnbas @100 0x0000000e
    ub2 kscnwrp @104 0x0000
    ub4 kcvfhcrt @108 0x3201eb02
    --数据文件创建时间
    ub4 kcvfhrlc @112 0x32a6fb05
    --resetlog时间
    struct kcvfhrls, 8 bytes @116
    --resetlog scn
    ub4 kscnbas @116 0x00170c23
    ub2 kscnwrp @120 0x0000
    ub4 kcvfhbti @124 0x00000000
    --begin hot backup time
    struct kcvfhbsc, 8 bytes @128
    --last backup stared scn
    ub4 kscnbas @128 0x00000000
    ub2 kscnwrp @132 0x0000
    ub2 kcvfhbth @136 0x0000
    --begin hot backup redo thread
    ub2 kcvfhsta @138 0x2004 (KCVFHOFZ)
    --数据文件状态,04为正常,00为关闭,01为begin backup
    struct kcvfhckp, 36 bytes @484
    --检查点信息
    struct kcvcpscn, 8 bytes @484
    --检查点scn
    ub4 kscnbas @484 0x003443f4
    ub2 kscnwrp @488 0x0000
    ub4 kcvcptim @492 0x331aa11c
    --检查点时间
    ub2 kcvcpthr @496 0x0001
    --检查点线程号
    union u, 12 bytes @500
    struct kcvcprba, 12 bytes @500
    --Checkpoint scn redo rda(参照前文[重做日志]关于rba的描述)
    ub4 kcrbaseq @500 0x000000ae
    --log序列号
    ub4 kcrbabno @504 0x00000002
    --块号
    ub2 kcrbabof @508 0x0010
    --偏移量
    ub1 kcvcpetb[0] @512 0x02
    --最大线程数
    ub1 kcvcpetb[1] @513 0x00
    ub1 kcvcpetb[2] @514 0x00
    ub1 kcvcpetb[3] @515 0x00
    ub1 kcvcpetb[4] @516 0x00
    ub1 kcvcpetb[5] @517 0x00
    ub1 kcvcpetb[6] @518 0x00
    ub1 kcvcpetb[7] @519 0x00
    ub4 kcvfhcpc @140 0x00000253
    --v$datafile_header.CHECKPOINT_COUNT,数据文件发生Checkpoint的次数
    ub4 kcvfhrts @144 0x331aa119
    --recoved time
    ub4 kcvfhccc @148 0x00000252
    --控制文件检查点次数
    struct kcvfhbcp, 36 bytes @152
    --backup Checkpoint
    struct kcvcpscn, 8 bytes @152
    --begin backup checkpoint scn
    ub4 kscnbas @152 0x00000000
    ub2 kscnwrp @156 0x0000
    ub4 kcvcptim @160 0x00000000
    --begin backup checkpoint time
    ub2 kcvcpthr @164 0x0000
    --begin backup checkpoint thread
    union u, 12 bytes @168
    struct kcvcprba, 12 bytes @168
    --begin backup checkpoint rba
    ub4 kcrbaseq @168 0x00000000
    ub4 kcrbabno @172 0x00000000
    ub2 kcrbabof @176 0x0000
    ub1 kcvcpetb[0] @180 0x00
    ub1 kcvcpetb[1] @181 0x00
    ub1 kcvcpetb[2] @182 0x00
    ub1 kcvcpetb[3] @183 0x00
    ub1 kcvcpetb[4] @184 0x00
    ub1 kcvcpetb[5] @185 0x00
    ub1 kcvcpetb[6] @186 0x00
    ub1 kcvcpetb[7] @187 0x00
    ub4 kcvfhbhz @312 0x00000000
    struct kcvfhxcd, 16 bytes @316
    大专栏  BBED Structure ub4 space_kcvmxcd[0] @316 0x00000000
    ub4 space_kcvmxcd[1] @320 0x00000000
    ub4 space_kcvmxcd[2] @324 0x00000000
    ub4 space_kcvmxcd[3] @328 0x00000000
    sword kcvfhtsn @332 0
    --表空间号:v$tablespace.ts$
    ub2 kcvfhtln @336 0x0006
    --表空间名字,最大为30字节
    text kcvfhtnm[0] @338 S
    text kcvfhtnm[1] @339 Y
    text kcvfhtnm[2] @340 S
    text kcvfhtnm[3] @341 T
    text kcvfhtnm[4] @342 E
    text kcvfhtnm[5] @343 M
    text kcvfhtnm[6] @344
    text kcvfhtnm[7] @345
    text kcvfhtnm[8] @346
    text kcvfhtnm[9] @347
    text kcvfhtnm[10] @348
    text kcvfhtnm[11] @349
    text kcvfhtnm[12] @350
    text kcvfhtnm[13] @351
    text kcvfhtnm[14] @352
    text kcvfhtnm[15] @353
    text kcvfhtnm[16] @354
    text kcvfhtnm[17] @355
    text kcvfhtnm[18] @356
    text kcvfhtnm[19] @357
    text kcvfhtnm[20] @358
    text kcvfhtnm[21] @359
    text kcvfhtnm[22] @360
    text kcvfhtnm[23] @361
    text kcvfhtnm[24] @362
    text kcvfhtnm[25] @363
    text kcvfhtnm[26] @364
    text kcvfhtnm[27] @365
    text kcvfhtnm[28] @366
    text kcvfhtnm[29] @367
    ub4 kcvfhrfn @368 0x00000001
    --相对文件号
    struct kcvfhrfs, 8 bytes @372
    --Recovery fuzzy scn
    ub4 kscnbas @372 0x00000000
    ub2 kscnwrp @376 0x0000
    ub4 kcvfhrft @380 0x00000000
    --Recovery fuzzy time
    struct kcvfhafs, 8 bytes @384
    --Absolute fuzzy scn
    ub4 kscnbas @384 0x00000000
    ub2 kscnwrp @388 0x0000
    ub4 kcvfhbbc @392 0x00000000
    --Backup Block Count
    ub4 kcvfhncb @396 0x00000000
    --marked media Corrupt Blocks
    ub4 kcvfhmcb @400 0x00000000
    --Media Corrupt Blocks
    ub4 kcvfhlcb @404 0x00000000
    --Logically Corrupt Blocks
    ub4 kcvfhbcs @408 0x00000000
    --Backup Completion timeStamp
    ub2 kcvfhofb @412 0x000a
    ub2 kcvfhnfb @414 0x000a
    ub4 kcvfhprc @416 0x323c286e
    --prev reset logs time
    struct kcvfhprs, 8 bytes @420
    --prev reset logs scn
    ub4 kscnbas @420 0x001084e6
    ub2 kscnwrp @424 0x0000
    struct kcvfhprfs, 8 bytes @428
    ub4 kscnbas @428 0x00000000
    ub2 kscnwrp @432 0x0000
    ub4 kcvfhtrt @444 0x00000000
    --Terminal Recovery Stamp

    图1 Block Structure
    Data Block
    图2 Header block type
    Header block type

    2. 数据块结构

    数据块的结构如图三所示,包括cache层,事务层和数据层。
    图3 Data Block Structure
    data block

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    BBED> set dba 8,11477
    DBA 0x02002cd5 (33565909 8,11477)
    BBED> map /v
    File: /oradata/datafile/linora/perf01.dbf (8)
    Block: 11477 Dba:0x02002cd5
    ------------------------------------------------------------
    KTB Data Block (Table/Cluster) --表示属于KTB数据块
    struct kcbh, 20 bytes @0
    --数据块头,其定义跟kcvfh一样
    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
    struct ktbbh, 72 bytes @20
    --事务层
    ub1 ktbbhtyp @20
    union ktbbhsid, 4 bytes @24
    struct ktbbhcsc, 8 bytes @28
    sb2 ktbbhict @36
    ub1 ktbbhflg @38
    ub1 ktbbhfsl @39
    ub4 ktbbhfnx @40
    struct ktbbhitl[2], 48 bytes @44
    struct kdbh, 14 bytes @100
    --数据层
    ub1 kdbhflag @100
    sb1 kdbhntab @101
    sb2 kdbhnrow @102
    sb2 kdbhfrre @104
    sb2 kdbhfsbo @106
    sb2 kdbhfseo @108
    sb2 kdbhavsp @110
    sb2 kdbhtosp @112
    struct kdbt[1], 4 bytes @114
    --表目录层
    sb2 kdbtoffs @114
    sb2 kdbtnrow @116
    sb2 kdbr[9] @118
    --行目录层
    ub1 freespace[7430] @136
    --空闲空间
    ub1 rowdata[622] @7566
    --实际行数据
    ub4 tailchk @8188

    分别打印上述结构,看看具体内容(kcbh(block header structure)定义如kcvfh.kcvfhbfh一致,均为数据块头,此处不在赘述)。

    2.1 ktbbh(Transaction Fixed Header Structure)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    BBED> p ktbbh
    struct ktbbh, 72 bytes @20
    ub1 ktbbhtyp @20 0x01 (KDDBTDATA)
    --块类型,1为data,2为index
    union ktbbhsid, 4 bytes @24
    --Segment/Object ID,如果两者一致,表示对象没有被Truncate过
    ub4 ktbbhsg1 @24 0x00014b01
    ub4 ktbbhod1 @24 0x00014b01
    struct ktbbhcsc, 8 bytes @28
    --块最后清除的SCN
    ub4 kscnbas @28 0x0021d786
    ub2 kscnwrp @32 0x0000
    sb2 ktbbhict @36 2
    --ITL slot number,事务槽号
    ub1 ktbbhflg @38 0x32 (NONE)
    --0=on the free list
    ub1 ktbbhfsl @39 0x00
    --ITL free list slot
    ub4 ktbbhfnx @40 0x02002cd0
    --DBA of next block on the freelist
    struct ktbbhitl[0], 24 bytes @44
    --ITL list index
    struct ktbitxid, 8 bytes @44
    --ITL xid
    ub2 kxidusn @44 0x0003
    --usn
    ub2 kxidslt @46 0x000b
    --slot
    ub4 kxidsqn @48 0x0000050d
    --Sequence
    struct ktbituba, 8 bytes @52
    --uba
    ub4 kubadba @52 0x00c006d4
    ub2 kubaseq @56 0x00d2
    ub1 kubarec @58 0x34
    ub2 ktbitflg @60 0x2009 (KTBFUPB)
    union _ktbitun, 2 bytes @62
    sb2 _ktbitfsc @62 0
    ub2 _ktbitwrp @62 0x0000
    ub4 ktbitbas @64 0x0021d795
    struct ktbbhitl[1], 24 bytes @68
    struct ktbitxid, 8 bytes @68
    ub2 kxidusn @68 0x0000
    ub2 kxidslt @70 0x0000
    ub4 kxidsqn @72 0x00000000
    struct ktbituba, 8 bytes @76
    ub4 kubadba @76 0x00000000
    ub2 kubaseq @80 0x0000
    ub1 kubarec @82 0x00
    ub2 ktbitflg @84 0x0000 (NONE)
    union _ktbitun, 2 bytes @86
    sb2 _ktbitfsc @86 0
    ub2 _ktbitwrp @86 0x0000
    ub4 ktbitbas @88 0x00000000

    2.2 kdbh(Data Header Structure)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    BBED> p kdbh
    struct kdbh, 14 bytes @100
    ub1 kdbhflag @100 0x00 (NONE)
    sb1 kdbhntab @101 1
    --表的个数,clusters>1
    sb2 kdbhnrow @102 9
    --块中包含的行数
    sb2 kdbhfrre @104 -1
    --是否在空闲列表,-1表示不在空闲列表
    sb2 kdbhfsbo @106 36
    --freespace start offset
    sb2 kdbhfseo @108 7466
    --freespace end offset
    sb2 kdbhavsp @110 7430
    --块内可用空间
    sb2 kdbhtosp @112 7430
    --事务提交后所有的可用空间

    2.3 kdbt(Table Directory Entry Structure)

    1
    2
    3
    4
    BBED> p kdbt
    struct kdbt[0], 4 bytes @114
    sb2 kdbtoffs @114 0
    sb2 kdbtnrow @116 9

    2.4 kdbr(Row Directory)

    kdbr代表行目录,后面的n是代表该块中存储了多少行数据记录,从第0行开始计算。下例中,表示该块中存储了9行数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BBED> p kdbr
    sb2 kdbr[0] @118 8015
    sb2 kdbr[1] @120 7946
    sb2 kdbr[2] @122 7876
    sb2 kdbr[3] @124 7803
    sb2 kdbr[4] @126 7744
    sb2 kdbr[5] @128 7677
    sb2 kdbr[6] @130 7612
    sb2 kdbr[7] @132 7538
    sb2 kdbr[8] @134 7466

    结合*号可以打印此块中的第n行数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    BBED> p *kdbr[2]
    rowdata[410]
    ------------
    ub1 rowdata[410] @7976 0x2c
    --2c代表正常为删除数据,3c代表标记为删除的数据行,第二列是该行数据的偏移量,第三列为标识符fb。
    BBED> d /v
    File: /oradata/datafile/linora/perf01.dbf (8)
    Block: 11477 Offsets: 7976 to 8191 Dba:0x02002cd5
    -------------------------------------------------------
    2c010b02 c203084a 414e6e69 66657206 l ,......JANnifer.
    5768616c 656e074a 5748414c 454e0c35 l Whalen.JWHALEN.5
    31352e31 32332e34 34343407 78670911 l 15.123.4444.xg..
    01010107 41445f41 53535402 c22dff03 l ....AD_ASST..-..
    c2020202 c10b2c01 0b03c202 6407446f l ......,.....d.Do
    75676c61 73054772 616e7406 44475241 l uglas.Grant.DGRA
    4e540c36 35302e35 30372e39 38343407 l NT.650.507.9844.
    786c010d 01010108 53485f43 4c45524b l xl......SH_CLERK
    02c21bff 03c20219 02c1332c 010b03c2 l ..........3,....
    02630644 6f6e616c 64084f43 6f6e6e65 l .c.Donald.OConne
    6c6c0844 4f434f4e 4e454c0c 3635302e l ll.DOCONNEL.650.
    3530372e 39383333 07786b06 15010101 l 507.9833.xk.....
    0853485f 434c4552 4b02c21b ff03c202 l .SH_CLERK.......
    1902c133 010695d7 l ...3....
    BBED> x /rncccctcnnnn
    rowdata[410] @7976
    ------------
    [email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
    [email protected]: 0x01
    [email protected]: 11

    col 0[2] @7979: 200
    col 1[8] @7982: JANnifer
    col 2[6] @7991: Whalen
    col 3[7] @7998: JWHALEN
    col 4[12] @8006: 515.123.4444
    col 5[7] @8019: 2003-09-17 00:00:00
    col 6[7] @8027: AD_ASST
    col 7[2] @8035: 4400
    col 8[0] @8038: *NULL*
    col 9[3] @8039: 101
    col 10[2] @8043: 10

    Reference:
    dissassembling_the_data_block

  • 相关阅读:
    深入浅出数据库索引原理
    Mysql读写分离原理及主众同步延时如何解决
    数据库连接池实现原理
    MySQL 大表优化方案(长文)
    js-ajax-03
    js-ajax-04
    js-ajax-02
    js-ajax-01
    获取html对象方式
    js-事件总结
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12389640.html
Copyright © 2020-2023  润新知