Skip to content

zlib.error: Error -3 while decompressing data: unknown compression method #28

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
ZhiYinZhang opened this issue Aug 1, 2024 · 14 comments

Comments

@ZhiYinZhang
Copy link

python3.9
ibd2sql:ibd2sql-main.zip
mysql:8.0.39

image

@ddcw
Copy link
Owner

ddcw commented Aug 1, 2024

该报错原因是因为mysql.ibd是个general tablespace , 即里面存在多张表(比如mysql.user, mysql.tables_priv等). ibd2sql目前只支持每个ibd文件只包含一张表的情况 . 你可以试下其它表(File-Per-Table Tablespaces)

python3.9 ibd2sql:ibd2sql-main.zip mysql:8.0.39

image

@su-qiu
Copy link

su-qiu commented Feb 13, 2025

python: 3.8
mysql:8.0.23

(base) [root@localhost ibd2sql-main]# python main.py /nfs/mysql_bak/ibd/resident_base.ibd --sql --ddl
Traceback (most recent call last):
File "/nfs/mysql_bak/ibd/ibd2sql-main/main.py", line 207, in
ddcw.init()
File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/ibd2sql.py", line 141, in init
self.sdi = sdi(self.read(),debug=self.debug) #sdi页
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 173, in init
self._init_table()
File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 180, in _init_table
dd = self.get_dict()
^^^^^^^^^^^^^^^
File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 422, in get_dict
unzbdata = zlib.decompress(self.bdata[offset+33:offset+33+dzip_len])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
zlib.error: Error -3 while decompressing data: unknown compression method

同样的问题,但这个不是通用表空间

@ddcw
Copy link
Owner

ddcw commented Feb 13, 2025

python: 3.8 mysql:8.0.23

(base) [root@localhost ibd2sql-main]# python main.py /nfs/mysql_bak/ibd/resident_base.ibd --sql --ddl Traceback (most recent call last): File "/nfs/mysql_bak/ibd/ibd2sql-main/main.py", line 207, in ddcw.init() File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/ibd2sql.py", line 141, in init self.sdi = sdi(self.read(),debug=self.debug) #sdi页 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 173, in init self._init_table() File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 180, in _init_table dd = self.get_dict() ^^^^^^^^^^^^^^^ File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 422, in get_dict unzbdata = zlib.decompress(self.bdata[offset+33:offset+33+dzip_len]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ zlib.error: Error -3 while decompressing data: unknown compression method

同样的问题,但这个不是通用表空间

思考:

  1. 不是general tablespace
  2. 脚本已验证page的类型
  3. 坏块的概率很低

猜想:
应该是字段太多, 目前读取sdi的时候都是当作1行数据来处理的.. (实际上如果字段太多的话,可能是多行数据, 多页的情况应该不存在(字段有上限的,而且还有压缩))

我尽快验证和修复, 感谢反馈!

@su-qiu
Copy link

su-qiu commented Feb 13, 2025

python: 3.8 mysql:8.0.23
(base) [root@localhost ibd2sql-main]# python main.py /nfs/mysql_bak/ibd/resident_base.ibd --sql --ddl Traceback (most recent call last): File "/nfs/mysql_bak/ibd/ibd2sql-main/main.py", line 207, in ddcw.init() File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/ibd2sql.py", line 141, in init self.sdi = sdi(self.read(),debug=self.debug) #sdi页 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 173, in init self._init_table() File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 180, in _init_table dd = self.get_dict() ^^^^^^^^^^^^^^^ File "/nfs/mysql_bak/ibd/ibd2sql-main/ibd2sql/innodb_page_sdi.py", line 422, in get_dict unzbdata = zlib.decompress(self.bdata[offset+33:offset+33+dzip_len]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ zlib.error: Error -3 while decompressing data: unknown compression method
同样的问题,但这个不是通用表空间

思考:

  1. 不是general tablespace
  2. 脚本已验证page的类型
  3. 坏块的概率很低

猜想: 应该是字段太多, 目前读取sdi的时候都是当作1行数据来处理的.. (实际上如果字段太多的话,可能是多行数据, 多页的情况应该不存在(字段有上限的,而且还有压缩))

我尽快验证和修复, 感谢反馈!

1,2均已验证
Image

@su-qiu
Copy link

su-qiu commented Feb 13, 2025

该表一共有164个字段

@ddcw
Copy link
Owner

ddcw commented Feb 13, 2025

已修复, 再试下呢(wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip)

列太多的时候, 一个page放不下, 就会放到FIL_PAGE_SDI_BLOB里面去.

fil_header(38)
size(4)  解压前的大小
next_pageno(4) 下一页的pageno, 可能这一页也放不下.
data (zlib压缩的sdi数据, 所有FIL_PAGE_SDI_BLOB的拼接起来解压即可)
fil_trailer(4+4)

@su-qiu
Copy link

su-qiu commented Feb 13, 2025

已修复, 再试下呢(wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip)

列太多的时候, 一个page放不下, 就会放到FIL_PAGE_SDI_BLOB里面去.

fil_header(38)
size(4) 解压前的大小
next_pageno(4) 下一页的pageno, 可能这一页也放不下.
data (zlib压缩的sdi数据, 所有FIL_PAGE_SDI_BLOB的拼接起来解压即可)
fil_trailer(4+4)

Image
没有效果,我用MySQL的ibd2sdi导出sdi信息并替换get_dict函数的出参可正常读取

@ddcw
Copy link
Owner

ddcw commented Feb 13, 2025

啊,这.... 我这测试1000个字段的都能解析. 可能是临界值问题. 能否把这个ibd文件发我瞧瞧呢, 或者给下脱敏后的DDL也可以

Image

@su-qiu
Copy link

su-qiu commented Feb 13, 2025

啊,这.... 我这测试1000个字段的都能解析. 可能是临界值问题. 能否把这个ibd文件发我瞧瞧呢, 或者给下脱敏后的DDL也可以

Image

这个ibd文件涉及到用户隐私发不了,DDL可以

CREATE TABLE IF NOT EXISTS chronic_disease_business_new.resident_base(
resident_id bigint NOT NULL COMMENT '患者id',
long_id bigint NULL COMMENT '来自数据平台的long_id',
old_id bigint NULL,
health_code varchar(32) NULL DEFAULT '' COMMENT '档案编码',
name varchar(32) NOT NULL COMMENT '姓名',
crowd_type varchar(30) NULL DEFAULT '' COMMENT '适用人群(多个用|分隔):99一般人群,1老年人,2孕产妇,3:0-6岁儿童,4残疾人,5计划生育特殊家庭,6低收人群,7高血压,8糖尿病,9结核病,10严重精神障碍患者,11慢性阻塞性肺疾病患者,12退役军人,13重中之重人群',
gender_code tinyint NOT NULL COMMENT '性别代码 字典(0:未知的性别,1:男性,2:女性,9:未说明的性别)',
gender_name varchar(10) NOT NULL COMMENT '性别名称',
id_number varchar(20) NULL COMMENT '身份证号',
birth_date date NOT NULL COMMENT '出生日期',
age int NOT NULL COMMENT '年龄',
is_old tinyint NULL COMMENT '是否老年人',
phone_number varchar(50) NULL COMMENT '联系电话',
nation_code tinyint NULL COMMENT '民族代码 字典',
nation_name varchar(20) NULL COMMENT '民族名称',
blood_type_abo_code tinyint NULL COMMENT 'ABO血型代码 字典',
blood_type_abo_name varchar(10) NULL COMMENT 'ABO血型名称',
blood_type_rh_code tinyint NULL COMMENT 'RH血型代码 字典',
blood_type_rh_name varchar(10) NULL COMMENT 'RH血型名称',
education_level_code tinyint NULL COMMENT '文化程度代码 字典',
education_level_name varchar(20) NULL COMMENT '文化程度名称',
occupation_code varchar(10) NULL COMMENT '职业代码 字典',
occupation_name varchar(20) NULL COMMENT '职业名称',
marital_code tinyint NULL COMMENT '婚姻代码 字典',
marital_name varchar(10) NULL COMMENT '婚姻名称',
resident_addr_province_code varchar(15) NULL COMMENT '常住地址省代码',
resident_addr_province_name varchar(10) NULL COMMENT '常住地址省名称',
resident_addr_city_code varchar(15) NULL COMMENT '常住地址市代码',
resident_addr_city_name varchar(32) NULL COMMENT '常住地址市名称',
resident_addr_county_code varchar(15) NULL COMMENT '常住地址县代码',
resident_addr_county_name varchar(32) NULL COMMENT '常住地址县名称',
resident_addr_town_code varchar(15) NULL COMMENT '常住地址乡镇区域代码',
resident_addr_town_name varchar(32) NULL COMMENT '常住地址乡镇区域名称',
resident_addr_village_code varchar(15) NULL COMMENT '常住地址村委区域代码',
resident_addr_village_name varchar(32) NULL COMMENT '常住地址村委区域名称',
resident_addr_full_address varchar(100) NULL COMMENT '常住地址详细地址',
is_signed tinyint NULL DEFAULT '0' COMMENT '是否签约:0否1是2待结算3审批未通过',
sign_date datetime NULL COMMENT '签约日期',
sign_org_code varchar(32) NULL COMMENT '签约机构代码',
sign_org_name varchar(32) NULL COMMENT '签约机构名称',
sign_doctor_code varchar(32) NULL COMMENT '签约医生代码',
sign_doctor_name varchar(32) NULL COMMENT '签约医生名称',
is_death tinyint NULL COMMENT '是否死亡',
death_date datetime NULL COMMENT '死亡日期',
death_reason varchar(255) NULL COMMENT '死亡原因',
is_migrated tinyint NULL COMMENT '是否迁出',
migration_date datetime NULL COMMENT '迁出日期',
residence_prop_code tinyint NULL COMMENT '户属性代码 字典(1:低保户,2:五保户,3:贫困户,4:特困户,5:烈军属,6:其他)',
residence_prop_name varchar(10) NULL COMMENT '户属性名称',
disability_code varchar(100) NULL COMMENT '残疾情况代码 字典(01:无残疾,02:视力残疾,03:听力残疾,04:言语残疾,05:肢体残疾,06:智力残疾,07:精神残疾,99:其他残疾)',
disability_name varchar(150) NULL COMMENT '残疾情况名称',
occupancy_type tinyint NULL DEFAULT '0' COMMENT '常驻类型:1户籍2非户籍',
sign_date_start datetime NULL COMMENT '签约生效时间',
sign_date_end datetime NULL COMMENT '签约到期时间',
sign_team varchar(50) NULL DEFAULT '' COMMENT '签约团队',
sign_team_code varchar(50) NULL DEFAULT '' COMMENT '签约团队编码',
hbp_type tinyint NOT NULL DEFAULT '3' COMMENT '高血压类型 (1 高血压 2 疑似高血压 3非高血压)',
is_hbp_archived tinyint NOT NULL COMMENT '高血压是否建档',
dm_type tinyint NOT NULL DEFAULT '3' COMMENT '糖尿病类型 (1 糖尿病 2 疑似糖尿病 3非糖尿病) ',
is_dm_archived tinyint NOT NULL COMMENT '糖尿病是否建档',
health_label varchar(255) NULL COMMENT '健康标签',
remark varchar(255) NULL COMMENT '备注',
health_index_real int NULL COMMENT '真实健康指数',
health_index int NULL COMMENT '展示健康指数',
health_risk_level tinyint NULL COMMENT '健康风险分层 字典(1 低危 2 中危 3 高危 4 很高危)',
height float NULL COMMENT '身高',
weight float NULL COMMENT '体重',
waistline float NULL COMMENT '腰围',
bmi float NULL COMMENT 'BMI',
bmi_code tinyint NULL COMMENT 'bmi状态代码(1,2,3,4)',
bmi_name varchar(32) NULL COMMENT 'bmi状态名称(1 偏瘦 2 正常 3肥胖 4超重)',
is_smoke tinyint NULL COMMENT '是否吸烟',
is_drink tinyint NULL COMMENT '是否饮酒',
is_sport tinyint NULL COMMENT '是否运动',
is_fat tinyint NULL COMMENT '是否肥胖',
hbp_index int NULL COMMENT '高血压指数',
hbp_risk_level tinyint NULL COMMENT '高血压风险分层(1 低危 2 中危 3 高危 4 很高危 5 极高危)',
hbp_level tinyint NULL COMMENT '高血压分级结果(1:一级高血压,2:二级高血压,3:三级高血压,9:不详)',
hbp_level_management tinyint NULL COMMENT '高血压分级管理结果 (1:一级管理,2:二级管理,3:三级管理,9:不详)',
dm_index int NULL COMMENT '糖尿病指数',
dm_risk_level tinyint NULL COMMENT '糖尿病风险分层 (1 糖尿病前期 2 轻度 3 中度 4 高度 5 重度)',
dm_level_management tinyint NULL COMMENT '糖尿病管理结果 (1:常规管理、2:强化管理、3:未评估、9:不详)',
last_physical_examination_date datetime NULL COMMENT '最近一次体检日期',
last_physical_examination_status tinyint NULL DEFAULT '0' COMMENT '最近一次体检状态:0未登记体检,1已登记体检,2已规范体检',
is_hyperlipidemia tinyint NULL COMMENT '是否高血脂',
tc float NULL COMMENT '总胆固醇',
ldl float NULL COMMENT '低密度脂蛋白',
hcy float NULL COMMENT '同型半胱氨酸',
is_deleted tinyint NOT NULL DEFAULT '0' COMMENT '是否删除',
created_user_id varchar(32) NULL COMMENT '创建人id',
created_user_name varchar(32) NULL COMMENT '创建人姓名',
created_time datetime NULL COMMENT '创建时间',
modified_user_id varchar(32) NULL COMMENT '修改人id',
modified_user_name varchar(32) NULL COMMENT '修改人姓名',
modified_time datetime NULL COMMENT '修改时间',
data_id varchar(50) NULL,
residents_state tinyint NULL DEFAULT '1' COMMENT '1:正常,3:死亡,4:其他,5:失访',
update_state tinyint NULL DEFAULT '1' COMMENT '1:不需要更新,2:正在更新,3:需要更新',
calculation_time datetime NULL COMMENT '指数最近一次计算时间',
sc float NULL COMMENT '血清肌酐',
hdl float NULL COMMENT '高密度蛋白',
resident_census_addr_province_code varchar(30) NULL COMMENT '户籍地址省代码',
resident_census_addr_province_name varchar(30) NULL COMMENT '户籍地址市代码',
resident_census_addr_city_code varchar(30) NULL COMMENT '户籍地址市代码',
resident_census_addr_city_name varchar(30) NULL COMMENT '户籍地址市名称',
resident_census_addr_county_code varchar(30) NULL COMMENT '户籍地址县代码',
resident_census_addr_county_name varchar(30) NULL COMMENT '户籍地址县名称',
resident_census_addr_town_code varchar(30) NULL COMMENT '户籍地址乡镇区域代码',
resident_census_addr_town_name varchar(30) NULL COMMENT '户籍地址乡镇区域名称',
resident_census_addr_village_code varchar(30) NULL COMMENT '户籍地址村委区域代码',
resident_census_addr_village_name varchar(30) NULL COMMENT '户籍地址村委区域名称',
resident_census_address_full varchar(100) NULL COMMENT '户籍地址',
add_state tinyint NULL DEFAULT '1' COMMENT '1:需要新增,0:不需要新增',
responsible_doctor_id varchar(50) NULL DEFAULT '' COMMENT '责任医生编码',
responsible_doctor_name varchar(50) NULL DEFAULT '' COMMENT '责任医生名称',
first_letter_name varchar(10) NULL COMMENT '名字首字母',
fbg double NULL COMMENT '空腹血糖',
pbg double NULL COMMENT '餐后血糖',
sbp int NULL COMMENT '收缩压',
dbp int NULL COMMENT '舒张压',
is_dm_managed tinyint NULL DEFAULT '0' COMMENT '糖尿病是否接受社区管理',
is_hbp_managed tinyint NULL DEFAULT '0' COMMENT '高血压是否接受社区管理',
openid varchar(50) NULL COMMENT '微信用户的openid',
abnormal_date datetime NULL COMMENT '最新异常发生时间',
abnormal_num int NULL DEFAULT '0' COMMENT '待处理的异常数量',
next_followup_date datetime NULL COMMENT '下次随访时间',
hbp_next_followup_time datetime NULL COMMENT '高血压下次随访时间',
dm_next_followup_time datetime NULL COMMENT '糖尿病下次随访时间',
last_followup_time datetime NULL COMMENT '上次随访时间',
hbp_last_followup_time datetime NULL COMMENT '高血压上次随访时间',
dm_last_followup_time datetime NULL COMMENT '糖尿病上次随访时间',
bp_measure_result tinyint NULL DEFAULT '-1' COMMENT '血压测量结果(0正常,1偏高,2偏低)',
bg_measure_result tinyint NULL DEFAULT '-1' COMMENT '血糖测量结果(0正常,1偏高,2偏低)',
hbp_doctor_manage tinyint NULL DEFAULT '0' COMMENT '高血压是否医生纳管:0否1是',
dm_doctor_manage tinyint NULL DEFAULT '0' COMMENT '糖尿病是否医生纳管:0否1是',
new_crown tinyint NULL DEFAULT '0' COMMENT '新冠重点人群标签:0一般人群1次重点人群2重点人群',
first_doctor_manage_time datetime NULL COMMENT '首次纳管时间(不管病种)',
cx_health_index int NULL,
blood_fat_abnormal tinyint NULL DEFAULT '0' COMMENT '血脂异常:0无1诊断异常2用药异常3诊断和用药都异常',
management_level tinyint NULL DEFAULT '0' COMMENT '综合管理级别 1常规管理 2强化管理 3密切关注',
family_health_code varchar(30) NULL DEFAULT '' COMMENT '家庭档案编码',
relationship_householder tinyint NULL DEFAULT '0' COMMENT '与户主关系:对应字段编码10019',
contact_name varchar(20) NULL DEFAULT '' COMMENT '联系人姓名',
contact_phone varchar(50) NULL DEFAULT '' COMMENT '联系人电话',
sign_id bigint NULL DEFAULT '0' COMMENT '签约id',
is_sign_finish tinyint NULL DEFAULT '0' COMMENT '完成情况:2已完成、1部分完成、0未开始',
total_services int NULL DEFAULT '0' COMMENT '签约服务总项数',
finish_services int NULL DEFAULT '0' COMMENT '已完成服务项数',
archives_org_code varchar(50) NULL DEFAULT '' COMMENT '建档机构编码',
archives_org_name varchar(20) NULL DEFAULT '' COMMENT '建档机构名称',
is_check_complete tinyint NULL,
fail_check varchar(150) NULL COMMENT '未通过项目',
is_check_complete2 tinyint NULL,
fail_check2 varchar(150) NULL COMMENT '未通过项目',
hbp_archive_date datetime NULL COMMENT '高血压建档日期',
dm_archive_date datetime NULL COMMENT '糖尿病建档日期',
third_health_code varchar(50) NULL,
hbp_third_manage_card_code varchar(50) NULL,
dm_third_manage_card_code varchar(50) NULL,
is_empty tinyint NULL COMMENT '档案编码标识为空1不为空null',
those_year_hbp_level varchar(2) NULL COMMENT '当年高血压分级 0-否,1-是,2-未在管',
those_year_dm_level varchar(2) NULL COMMENT '当年糖尿病分级 0-否,1-是,2-未在管',
billno varchar(200) NULL DEFAULT '' COMMENT '单据编号(调用三方接口)',
special_situation tinyint NULL DEFAULT '0',
PRIMARY KEY (resident_id ),
KEY idx_health_code (health_code ),
KEY idx_id_resident (hbp_type ,dm_type ),
KEY idx_openid (openid ),
KEY idx_doctor (responsible_doctor_id ),
KEY ind_id_number (id_number ),
KEY idx_phone_number (phone_number ),
KEY idx_pre_clinic (is_deleted ,residents_state ,is_hbp_managed ,is_dm_managed ,next_followup_date ,resident_addr_town_code ,resident_id ,id_number ),
KEY idx_deleted_state_type (is_deleted ,residents_state ,dm_type ,is_dm_managed ,hbp_type ,is_hbp_managed ,abnormal_date ,health_index ,age ,id_number ,health_code ,responsible_doctor_id ,resident_id ),
KEY search (is_deleted ,is_signed ,sign_id ,sign_date_end ),
KEY idx_archive (is_deleted ,residents_state ,hbp_archive_date ,dm_archive_date ,responsible_doctor_id ),
KEY idx_long_id (long_id )
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT '居民基础信息表';

@ddcw
Copy link
Owner

ddcw commented Feb 13, 2025

再试下呢, 加了个判断dzip_len的.

@su-qiu
Copy link

su-qiu commented Feb 13, 2025

再试下呢, 加了个判断dzip_len的.

大佬牛!解决了

@wz200210
Copy link

该报错原因是因为mysql.ibd是个general tablespace , 即里面存在多张表(比如mysql.user, mysql.tables_priv等). ibd2sql目前只支持每个ibd文件只包含一张表的情况 . 你可以试下其它表(File-Per-Table Tablespaces)

python3.9 ibd2sql:ibd2sql-main.zip mysql:8.0.39
image

大佬这个有没有计划支持,或者有没有啥支持思路,我可以自己尝试实现一下

@ddcw
Copy link
Owner

ddcw commented Mar 28, 2025

将会在 2.0 版本支持general tablespace, 该版本还计划支持并发,不同的PAGE_SIZE等. 最早2025.7发布.

mysql 8.0里面的 mysql.ibd 也是general tablespace的, 你可以参考mysql.ibd 文件解析 去解析其它的general tablespace

该报错原因是因为mysql.ibd是个general tablespace , 即里面存在多张表(比如mysql.user, mysql.tables_priv等). ibd2sql目前只支持每个ibd文件只包含一张表的情况 . 你可以试下其它表(File-Per-Table Tablespaces)

python3.9 ibd2sql:ibd2sql-main.zip mysql:8.0.39
image

大佬这个有没有计划支持,或者有没有啥支持思路,我可以自己尝试实现一下

@wz200210
Copy link

感谢大佬~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants