dump分析索引数据结构

作者: lawzjf(http://lawzjf.itpub.net)
发表于: 2006.04.23 22:01
分类: ora internal
出处: http://lawzjf.itpub.net/post/417/72620
---------------------------------------------------------------

软件版本:XP sp2,Oracle 10.2.0.1

首先创建测试表:

SQL> create table test_idx
2 as
3 select * from all_objects
4 /

表已创建。


SQL> select count(*) from test_idx;

COUNT(*)
--------------
4473

SQL> desc test_idx
名称 是否为空? 类型
---------------------------------- --------------- --------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
......

我们在整数列object_id上创建索引:

SQL> create index idxx on test_idx(object_id)
2 /

索引已创建。

查询新建的表和索引所在的表空间(因为自动段管理与手工管理的不同情况下,表空间中的段头所占用的block数是不同的,自动管理情况下,段头占用3个block,手工管理占用1个block):

SQL> select tablespace_name,segment_name
2 from user_segments
3 where segment_name in('TEST_IDX','IDXX')
4 /

TABLESPACE_NAME SEGMENT_NAME
------------------------------ ---------------
USERS TEST_IDX
USERS IDXX

查询users表空间的段空间管理方式:

SQL> conn system/oracle
已连接。
SQL> select tablespace_name,segment_space_management
2 from dba_tablespaces
3 where tablespace_name='USERS'
4 /

TABLESPACE_NAME SEGMEN
------------------------------ -------------
USERS AUTO


查询新建索引被分配的block情况:

SQL> col segment_name for a10
SQL> select segment_name,file_id,extent_id,block_id
2 from dba_extents
3 where segment_name='IDXX'
4 /

SEGMENT_NA FILE_ID EXTENT_ID BLOCK_ID
------------------- ------------- ---------------- ----------------
IDXX 4 0 225
IDXX 4 1 233

从上面结果可以知道,新建的索引分配到两个区,
各有8个block。因为索引所在的表空间为自动段管理,
其中的数据对象被分配的前三个block用来存储对象的
系统信息,而对象的真正数据从第4个block开始存储,
所以,idxx的数据228块开始存储。
下面,我们导出从228开始的三个数据块内容:

SQL> conn system/oracle
已连接。
SQL> alter system dump datafile 4 block min 228 block max 230;

系统已更改。

在udmp目录下查看新生成的导出文件,并打开,可以看出
228块为root节点,而229及230为两个叶节点。
摘录其内容如下(内容经过删减,但未作更改):

228号:

Branch blockdump ---表明这是一个分枝节点,其实这是root节点=================
header address 121512524=0x73e224c
kdxcolev 1 ##index level (0 represents leaf blocks)
KDXCOLEV Flags = - - -
kdxcolok 0 ##denotes whether structural block transaction is occurring
kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y ##internal operation code
kdxconco 2 ##index column count
kdxcosdc 0 ##count of index structural changes involving block
kdxconro 9 ##number of index entries (does not include kdxbrlmc pointer)
kdxcofbo 46=0x2e ##offset to beginning of free space within block
kdxcofeo 7979=0x1f2b ##offset to the end of free space (ie. first portion of block containing index data)
kdxcoavs 7933 ##available space in block (effectively area between the two fields above)
kdxbrlmc16777445=0x10000e5--这是下层节点的第 一个block号码229

kdxbrsno 0 ##last index entry to be modified
kdxbrbksz 8060 ##size of usable block space
kdxbr2urrc 0
row#0[8051] dba: 16777446=0x10000e6--块号230
col 0; len 3; (3): c2 12 30--此块中的最小的key值
col 1; TERM
row#1[8042] dba: 16777447=0x10000e7--块号
col 0; len 3; (3): c2 19 60--此块中的最小的key值
col 1; TERM
row#2[8033] dba: 16777448=0x10000e8
col 0; len 3; (3): c2 21 5f
col 1; TERM
row#3[8024] dba: 16777449=0x10000e9
col 0; len 3; (3): c2 29 49
col 1; TERM
……

row#7[7988] dba: 16777453=0x10000ed
col 0; len 3; (3): c2 54 21
col 1; TERM
row#8[7979] dba: 16777454=0x10000ee
col 0; len 3; (3): c2 64 61
col 1; TERM
----- end of branch block dump -----

可以看出,root节点下层共有10个block

相关内容的解释:

kdxcolev: index level (0 represents leaf blocks)
kdxcolok: denotes whether structural block transaction is occurring
kdxcoopc: internal operation code
kdxconco: index column count
kdxcosdc: count of index structural changes involving block
kdxconro: number of index entries (does not include kdxbrlmc pointer)
kdxcofbo: offset to beginning of free space within block
kdxcofeo: offset to the end of free space (ie. first portion of block containing index data)
kdxcoavs: available space in block (effectively area between the two fields above)


229号:

Leaf block dump
===============
header address 121512548=0x73e2264
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 479
kdxcofbo 994=0x3e2
kdxcofeo 1813=0x715
kdxcoavs 819
kdxlespl 0
kdxlende 0
kdxlenxt 16777446=0x10000e6 --下一个block号码
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8036
row#0[8023] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 03 3b--此块中的最小key值

col 1; len 6; (6): 01 00 00 a4 00 00--rowid
row#1[8010] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 03 3c
col 1; len 6; (6): 01 00 00 a4 00 01
row#2[7997] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 04 0c
col 1; len 6; (6): 01 00 00 a4 00 02
……

row#477[1826] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 12 2e
col 1; len 6; (6): 01 00 00 a9 00 4f
row#478[1813] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 12 2f
col 1; len 6; (6): 01 00 00 aa 00 00
----- end of leaf block dump -----

230号:

Leaf block dump
===============
header address 121512548=0x73e2264
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 479
kdxcofbo 994=0x3e2
kdxcofeo 1814=0x716
kdxcoavs 820
kdxlespl 0
kdxlende 0
kdxlenxt 16777447=0x10000e7--下一个block号码

kdxleprv 16777445=0x10000e5--前一个block号码

kdxledsz 0
kdxlebksz 8036
row#0[8023] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 12 30
col 1; len 6; (6): 01 00 00 aa 00 01
row#1[8010] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 12 31
col 1; len 6; (6): 01 00 00 aa 00 02
row#2[7997] flag: ------, lock: 0, len=13
col 0; len 3; (3): c2 12 33
col 1; len 6; (6): 01 00 00 aa 00 03
……

关于rowid的换算:索引中的rowid由48个bit构成,前10个bit构成文件号,中间22个bit构成块号,最后16个bit构成块中的行号。

关于整数key值的换算:如229块中的最小key值为c2 03 3b,先去掉c2,因为c2只表示最高位的位置,后面才是真正数据,03转换为十进制为3,减去1为2,3b转换为十进制为48+11=59,减去1为58,两个结果合并到一起,为258,这就是七其存储的真正数据,简单表示一下:

  1. c2 03 3b -> 03 3b
  2. 03 -> 0*16+3=3->3-1=2
  3. 3b -> 3*16+14=59 -> 59-1=58
  4. 结果合并得到258

关于字符串的换算:直接由十六进制得到各个ascii码,然后对应到相应字符。


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

转载于:http://blog.itpub.net/263455/viewspace-750982/

<think>我们使用Elasticdump工具迁移索引模板。索引模板在Elasticsearch中以JSON格式存储,我们可以通过导出源集群的索引模板,然后在目标集群导入来实现迁移。 步骤: 1. 安装Elasticdump 2. 导出源集群的索引模板 3. 将导出的模板导入到目标集群 详细步骤: 1. 安装Elasticdump 确保已安装Node.js,然后使用npm安装Elasticdump: ```bash npm install -g elasticdump ``` 2. 导出索引模板 索引模板存储在Elasticsearch的`_template`端点下。我们可以使用以下命令导出所有索引模板: ```bash elasticdump \ --input=http://source_es_host:9200/_template \ --output=templates.json \ --type=data ``` 或者,如果只想导出特定的模板,可以指定模板名称: ```bash elasticdump \ --input=http://source_es_host:9200/_template/my_template \ --output=my_template.json \ --type=data ``` 注意:`source_es_host`是源ES集群的地址,如果有认证,则需要提供用户名和密码: ```bash --input=http://user:pass@source_es_host:9200/_template ``` 3. 导入索引模板到目标集群 将导出的模板文件导入到目标集群: ```bash elasticdump \ --input=templates.json \ --output=http://target_es_host:9200/_template \ --type=data ``` 同样,如果目标集群需要认证: ```bash --output=http://user:pass@target_es_host:9200/_template ``` 4. 验证 导入完成后,在目标集群上检查模板是否存在: ```bash curl -XGET http://target_es_host:9200/_template ``` 注意事项: - 确保源集群和目标集群的版本兼容。如果目标集群版本高于源集群,通常没有问题,因为ES向后兼容。但如果目标集群版本低于源集群,则可能不兼容。 - 如果模板中包含了目标集群不支持的设置或映射,导入可能会失败,需要手动调整模板。 - 如果使用安全集群,确保提供正确的凭证以及目标集群有创建模板的权限。 另外,根据引用[3],如果涉及到索引重建(不仅仅是模板迁移,还包括数据迁移),那么可以使用_reindex API,但这里我们只迁移模板,所以使用Elasticdump导出导入模板即可。 引用[2]提到了快照恢复迁移,但那是用于整个集群的迁移,包括索引数据。而模板迁移只是元数据迁移,使用Elasticdump更轻量。 所以,使用Elasticdump迁移索引模板是非常直接的方法。 生成相关问题: 1. 使用Elasticdump迁移索引模板时如何解决认证问题? 2. 如果源集群和目标集群版本不兼容,如何调整索引模板? 3. 除了索引模板,Elasticdump还能迁移Elasticsearch中的哪些数据? </think>### 使用 Elasticdump 迁移索引模板的方法 Elasticdump 是专门用于 ES 数据/配置迁移的工具,迁移索引模板的核心流程如下: #### **步骤 1:安装 Elasticdump** ```bash npm install elasticdump -g # 需提前安装 Node.js ``` #### **步骤 2:导出源集群索引模板** ```bash # 导出单个模板(推荐) elasticdump \ --input=http://source_es:9200/_template/TEMPLATE_NAME \ --output=template.json \ --type=data # 导出所有模板 elasticdump \ --input=http://source_es:9200/_template \ --output=templates.json \ --type=data ``` > **参数说明** > - `--input`:源集群模板 API 地址 > - `--output`:导出的 JSON 文件路径 > - `--type=data`:指定迁移数据类型(模板属于元数据) > - 若集群开启安全认证,需添加 `--httpAuthFile=auth.txt`(文件格式:`user:password`) #### **步骤 3:处理兼容性问题** 编辑导出的 `template.json`,需重点关注: 1. **移除版本号**:删除 `"version"` 字段,避免目标集群冲突 2. **字段类型更新**(参考引用[1][3]): - ES 6.x → 7.x+:`"type":"string"` → `"type":"text"` 或 `"keyword"` - 废弃参数:如 `"index":"not_analyzed"` → `"index":false` 3. **分词器兼容**:确认 `analyzer`(如 `ik_max_word`)在目标集群已安装[^3] #### **步骤 4:导入到目标集群** ```bash elasticdump \ --input=template.json \ --output=http://target_es:9200/_template/NEW_TEMPLATE_NAME \ --type=data ``` #### **步骤 5:验证迁移结果** ```bash # 检查模板是否存在 curl http://target_es:9200/_template/NEW_TEMPLATE_NAME # 测试模板效果 PUT /test_index-001 # 创建符合模板模式的索引 GET /test_index-001/_mapping # 验证字段类型是否正确 ``` --- ### **关键注意事项** 1. **版本兼容性** - ES 5.x → 7.x+ 需重写模板(引用[2]),建议通过 Kibana Dev Tools 手动调试[^3] - 跨大版本时,优先使用 `GET /_template` 对比新旧集群 API 响应结构 2. **网络认证** - 集群间需网络互通,或通过中间服务器中转 JSON 文件 - 安全集群需配置证书:`--output-cacert=ca.crt` 3. **性能优化** - 批量迁移时使用 `--limit=100` 限制并发请求量 - 禁用模板刷新:`PUT /_cluster/settings {"transient":{"action.auto_create_index":false}}`[^4] > ✅ ** \_reindex 的区别** > Elasticdump 迁移模板(元数据配置),而 `_reindex` 用于迁移索引数据[^1][^4],两者需配合使用: > 1. 先迁移模板到新集群 > 2. 再用 `_reindex` 迁移数据(自动应用新模板) --- ### **迁移示例** 导出模板片段(原始): ```json { "order": 0, "index_patterns": ["logs-*"], "settings": { "number_of_shards": 3 }, "mappings": { "properties": { "message": { "type": "string", "index": "not_analyzed" } // ES 5.x 格式 } } } ``` 修改后(适配 ES 7.x+): ```json { "index_patterns": ["logs-*"], "settings": { "number_of_shards": 3 }, "mappings": { "properties": { "message": { "type": "keyword", "index": false } // 更新类型和参数 } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值