Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

prehistory

Чунин рӯй дод, ки ба сервер вируси ransomware ҳамла карда шуд, ки он бо "садамаи хушбахтона" қисман файлҳои .ibd (файлҳои хоми маълумотҳои ҷадвалҳои innodb) -ро бетағйир гузошт, аммо дар айни замон файлҳои .fpm -ро пурра рамзгузорӣ кард ( файлҳои сохторӣ). Дар ин ҳолат, .idb-ро метавон ба инҳо тақсим кард:

  • бояд тавассути асбобҳо ва дастурҳои стандартӣ барқарор карда шавад. Барои чунин ҳолатҳо, як аъло вуҷуд дорад шудан;
  • ҷадвалҳои қисман рамзкунонидашуда. Аксаран инҳо ҷадвалҳои калон мебошанд, ки барои онҳо (чунон ки ман мефаҳмам) ҳамлагарон барои рамзгузории пурра RAM-и кофӣ надоштанд;
  • Хуб, ҷадвалҳои пурра рамзгузоришуда, ки барқарор карда намешаванд.

Бо кушодани он дар ҳама гуна муҳаррири матнӣ зери рамзгузории дилхоҳ (дар ҳолати ман ин UTF8) ва танҳо дидани файл барои мавҷудияти майдонҳои матн, муайян кардан мумкин буд, ки ҷадвалҳо ба кадом вариант тааллуқ доранд, масалан:

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

Инчунин, дар ибтидои файл шумо метавонед шумораи зиёди 0 байтро мушоҳида кунед ва вирусҳое, ки алгоритми рамзгузории блокро (аз ҳама маъмул) истифода мебаранд, одатан ба онҳо низ таъсир мерасонанд.
Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

Дар ҳолати ман, ҳамлагарон дар охири ҳар як файли рамзгузоришуда сатри 4-байтӣ (1, 0, 0, 0) гузоштанд, ки ин вазифаро содда кард. Барои ҷустуҷӯи файлҳои сироятнашуда, скрипт кофӣ буд:

def opened(path):
    files = os.listdir(path)
    for f in files:
        if os.path.isfile(path + f):
            yield path + f

for full_path in opened("C:somepath"):
    file = open(full_path, "rb")
    last_string = ""
    for line in file:
        last_string = line
        file.close()
    if (last_string[len(last_string) -4:len(last_string)]) != (1, 0, 0, 0):
        print(full_path)

Ҳамин тариқ, маълум шуд, ки файлҳои ба навъи якум тааллуқ доранд. Дуюм кори зиёди дастиро дарбар мегирад, аммо он чизе, ки ёфт шуд, аллакай кифоя буд. Ҳама чиз хуб мешавад, аммо шумо бояд бидонед сохтори комилан дақиқ ва (албатта) парвандае ба миён омад, ки ман бояд бо мизи зуд-зуд ивазшаванда кор кунам. Ҳеҷ кас ба ёд наовард, ки навъи майдон иваз шудааст ё сутуни нав илова карда шудааст.

Вайлдс Сити, мутаассифона, дар чунин ҳолат кӯмак карда натавонист, ки чаро ин мақола навишта мешавад.

Ба нуқтаи наздиктар

Сохтори ҷадвали 3 моҳи пеш мавҷуд аст, ки бо ҷадвали ҷорӣ мувофиқат намекунад (эҳтимолан як майдон ва эҳтимолан бештар). Сохтори ҷадвал:

CREATE TABLE `table_1` (
    `id` INT (11),
    `date` DATETIME ,
    `description` TEXT ,
    `id_point` INT (11),
    `id_user` INT (11),
    `date_start` DATETIME ,
    `date_finish` DATETIME ,
    `photo` INT (1),
    `id_client` INT (11),
    `status` INT (1),
    `lead__time` TIME ,
    `sendstatus` TINYINT (4)
); 

дар ин ҳолат, шумо бояд истихроҷ кунед:

  • id_point int(11);
  • id_user int(11);
  • date_start DATETIME;
  • date_finish DATETIME.

Барои барқарорсозӣ, таҳлили байт ба байт файли .ibd истифода мешавад ва пас аз он ба шакли бештар хондан табдил додани онҳо истифода мешавад. Азбаски барои дарёфти он чизе, ки ба мо лозим аст, мо бояд танҳо намудҳои додаҳоро таҳлил кунем, ба монанди int ва datatime, мақола танҳо онҳоро тавсиф мекунад, аммо баъзан мо ба дигар намудҳои додаҳо муроҷиат мекунем, ки метавонанд дар дигар ҳодисаҳои шабеҳ кӯмак кунанд.

Мушкилоти 1: майдонҳое, ки намудҳои DATETIME ва TEXT дорои арзишҳои NULL буданд ва онҳо танҳо дар файл гузаронида мешаванд, бинобар ин, дар ҳолати ман сохтори барқароршавандаро муайян кардан имкон надошт. Дар сутунҳои нав арзиши пешфарз ночиз буд ва як қисми транзаксия бо сабаби танзими innodb_flush_log_at_trx_commit = 0 гум шуда метавонист, бинобар ин барои муайян кардани сохтор вақти иловагӣ сарф мешуд.

Мушкилоти 2: бояд ба назар гирифт, ки сатрҳои тавассути DELETE тозашуда ҳама дар файли ibd хоҳанд буд, аммо бо ALTER TABLE сохтори онҳо нав карда намешавад. Дар натиҷа, сохтори маълумот метавонад аз аввали файл то охири он фарқ кунад. Агар шумо аксар вақт аз OPTIMIZE TABLE истифода баред, пас аз эҳтимол дур нест, ки бо чунин мушкилот дучор шавед.

Диққат диҳед, версияи DBMS ба тарзи нигоҳдории маълумот таъсир мерасонад ва ин мисол метавонад барои дигар версияҳои асосӣ кор накунад. Дар ҳолати ман, версияи windows-и mariadb 10.1.24 истифода шудааст. Инчунин, гарчанде ки дар mariadb шумо бо ҷадвалҳои InnoDB кор мекунед, дар асл онҳо ҳастанд XtraDB, ки татбиқи усулро бо InnoDB mysql истисно мекунад.

Таҳлили файл

Дар python, навъи маълумот байт () маълумоти Юникодро ба ҷои маҷмӯи муқаррарии рақамҳо нишон медиҳад. Гарчанде ки шумо метавонед файлро дар ин шакл бубинед, барои роҳат шумо метавонед байтҳоро ба шакли ададӣ тавассути табдил додани массиви байт ба массиви муқаррарӣ табдил диҳед (рӯйхат(мисол_байт_массиви)). Дар ҳар сурат, ҳарду усул барои таҳлил мувофиқанд.

Пас аз дидани якчанд файлҳои ibd, шумо метавонед инҳоро пайдо кунед:

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

Ғайр аз он, агар шумо файлро аз рӯи ин калимаҳои калидӣ тақсим кунед, шумо асосан ҳатто блокҳои маълумот мегиред. Мо инфимумро ҳамчун тақсимкунанда истифода хоҳем кард.

table = table.split("infimum".encode())

Мушоҳидаи ҷолиб: барои ҷадвалҳое, ки миқдори ками маълумот доранд, дар байни infimum ва supremum нишондиҳандаи шумораи сатрҳои блок мавҷуд аст.

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd — ҷадвали санҷишӣ бо сатри 1

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd - ҷадвали санҷишӣ бо 2 қатор

Ҷадвали массиви сатр[0]-ро гузаронидан мумкин аст. Пас аз азназаргузаронии он, ман то ҳол маълумоти ҷадвали хомро ёфта натавонистам. Эҳтимол, ин блок барои нигоҳ доштани индексҳо ва калидҳо истифода мешавад.
Аз ҷадвал [1] сар карда ва онро ба массиви ададӣ тарҷума карда, шумо аллакай якчанд намунаҳоро мушоҳида карда метавонед, аз ҷумла:

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

Ин арзишҳои int мебошанд, ки дар сатр нигоҳ дошта мешаванд. Байти аввал нишон медиҳад, ки шумора мусбат ё манфӣ аст. Дар ҳолати ман, ҳама рақамҳо мусбатанд. Аз 3 байти боқимонда шумо метавонед рақамро бо истифода аз функсияи зерин муайян кунед. Скрипт:

def find_int(val: str):  # example '128, 1, 2, 3'
    val = [int(v) for v in  val.split(", ")]
    result_int = val[1]*256**2 + val[2]*256*1 + val[3]
    return result_int

Барои мисол, 128, 0, 0, 1 = 1ё 128, 0, 75, 108 = 19308.
Ҷадвал калиди ибтидоӣ бо афзоиши худкор дошт ва онро инчунин дар ин ҷо пайдо кардан мумкин аст

Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd

Ҳангоми муқоисаи маълумот аз ҷадвалҳои санҷишӣ маълум шуд, ки объекти DATETIME аз 5 байт иборат буда, аз 153 оғоз шудааст (эҳтимолан фосилаҳои солонаро нишон медиҳад). Азбаски диапазони DATTIME '1000-01-01' то '9999-12-31' аст, ман фикр мекунам, ки шумораи байтҳо метавонанд фарқ кунанд, аммо дар ҳолати ман, маълумот ба давраи аз 2016 то 2019 рост меояд, бинобар ин мо тахмин мекунем ки 5 байт кифоя аст.

Барои муайян кардани вақт бе сония, функсияҳои зерин навишта шудаанд. Скрипт:

day_ = lambda x: x % 64 // 2  # {x,x,X,x,x }

def hour_(x1, x2):  # {x,x,X1,X2,x}
    if x1 % 2 == 0:
        return x2 // 16
    elif x1 % 2 == 1:
        return x2 // 16 + 16
    else:
        raise ValueError

min_ = lambda x1, x2: (x1 % 16) * 4 + (x2 // 64)  # {x,x,x,X1,X2}

Барои сол ва моҳ навиштани функсияи функсионалӣ имконнопазир буд, бинобар ин ман маҷбур шудам, ки онро вайрон кунам. Скрипт:

ym_list = {'2016, 1': '153, 152, 64', '2016, 2': '153, 152, 128', 
           '2016, 3': '153, 152, 192', '2016, 4': '153, 153, 0',
           '2016, 5': '153, 153, 64', '2016, 6': '153, 153, 128', 
           '2016, 7': '153, 153, 192', '2016, 8': '153, 154, 0', 
           '2016, 9': '153, 154, 64', '2016, 10': '153, 154, 128', 
           '2016, 11': '153, 154, 192', '2016, 12': '153, 155, 0',
           '2017, 1': '153, 155, 128', '2017, 2': '153, 155, 192', 
           '2017, 3': '153, 156, 0', '2017, 4': '153, 156, 64',
           '2017, 5': '153, 156, 128', '2017, 6': '153, 156, 192',
           '2017, 7': '153, 157, 0', '2017, 8': '153, 157, 64',
           '2017, 9': '153, 157, 128', '2017, 10': '153, 157, 192', 
           '2017, 11': '153, 158, 0', '2017, 12': '153, 158, 64', 
           '2018, 1': '153, 158, 192', '2018, 2': '153, 159, 0',
           '2018, 3': '153, 159, 64', '2018, 4': '153, 159, 128', 
           '2018, 5': '153, 159, 192', '2018, 6': '153, 160, 0',
           '2018, 7': '153, 160, 64', '2018, 8': '153, 160, 128',
           '2018, 9': '153, 160, 192', '2018, 10': '153, 161, 0', 
           '2018, 11': '153, 161, 64', '2018, 12': '153, 161, 128',
           '2019, 1': '153, 162, 0', '2019, 2': '153, 162, 64', 
           '2019, 3': '153, 162, 128', '2019, 4': '153, 162, 192', 
           '2019, 5': '153, 163, 0', '2019, 6': '153, 163, 64',
           '2019, 7': '153, 163, 128', '2019, 8': '153, 163, 192',
           '2019, 9': '153, 164, 0', '2019, 10': '153, 164, 64', 
           '2019, 11': '153, 164, 128', '2019, 12': '153, 164, 192',
           '2020, 1': '153, 165, 64', '2020, 2': '153, 165, 128',
           '2020, 3': '153, 165, 192','2020, 4': '153, 166, 0', 
           '2020, 5': '153, 166, 64', '2020, 6': '153, 1, 128',
           '2020, 7': '153, 166, 192', '2020, 8': '153, 167, 0', 
           '2020, 9': '153, 167, 64','2020, 10': '153, 167, 128',
           '2020, 11': '153, 167, 192', '2020, 12': '153, 168, 0'}

def year_month(x1, x2):  # {x,X,X,x,x }

    for key, value in ym_list.items():
        key = [int(k) for k in key.replace("'", "").split(", ")]
        value = [int(v) for v in value.split(", ")]
        if x1 == value[1] and x2 // 64 == value[2] // 64:
            return key
    return 0, 0

Ман боварӣ дорам, ки агар шумо n миқдори вақт сарф кунед, ин нофаҳмиро ислоҳ кардан мумкин аст.
Баъдан, функсияе, ки объекти санаи вақтро аз сатр бармегардонад. Скрипт:

def find_data_time(val:str):
    val = [int(v) for v in val.split(", ")]
    day = day_(val[2])
    hour = hour_(val[2], val[3])
    minutes = min_(val[3], val[4])
    year, month = year_month(val[1], val[2])
    return datetime(year, month, day, hour, minutes)

Муяссар шуд, ки арзишҳои зуд-зуд такроршавандаро аз int, int, datetime, datetime муайян кунад Барқарор кардани маълумот аз ҷадвалҳои XtraDB бе файли сохторӣ бо истифода аз таҳлили байт ба байт файли ibd, ба назар чунин мерасад, ки ин ба шумо лозим аст. Гузашта аз ин, чунин пайдарпай дар як сатр ду маротиба такрор намешавад.

Бо истифода аз ифодаи муқаррарӣ, мо маълумоти заруриро пайдо мекунем:

fined = re.findall(r'128, d*, d*, d*, 128, d*, d*, d*, 153, 1[6,5,4,3]d, d*, d*, d*, 153, 1[6,5,4,3]d, d*, d*, d*', int_array)

Лутфан таваҷҷӯҳ намоед, ки ҳангоми ҷустуҷӯ бо истифода аз ин ифода, муайян кардани арзишҳои NULL дар майдонҳои зарурӣ ғайриимкон аст, аммо дар ҳолати ман ин муҳим нест. Он гоҳ мо он чизеро, ки дар як ҳалқа ёфтем, мегузарем. Скрипт:

result = []
for val in fined:
    pre_result = []
    bd_int  = re.findall(r"128, d*, d*, d*", val)
    bd_date= re.findall(r"(153, 1[6,5,4,3]d, d*, d*, d*)", val)
    for it in bd_int:
        pre_result.append(find_int(bd_int[it]))
    for bd in bd_date:
        pre_result.append(find_data_time(bd))
    result.append(pre_result)

Дар асл, ин ҳама аст, маълумот аз массиви натиҷа ин маълумотест, ки ба мо лозим аст. ###PS.###
Ман мефаҳмам, ки ин усул барои ҳама мувофиқ нест, аммо ҳадафи асосии мақола ин аст, ки фавран амал кунед, на ҳалли ҳамаи мушкилоти шумо. Ман фикр мекунам, ки ҳалли дурусттарин ин аст, ки худатон ба омӯзиши коди сарчашма шурӯъ кунед Мариадб, аммо аз сабаби маҳдуд будани вақт, усули ҷорӣ зудтартарин ба назар мерасид.

Дар баъзе мавридҳо, пас аз таҳлили файл, шумо метавонед сохтори тахминиро муайян кунед ва онро бо истифода аз яке аз усулҳои стандартии истинодҳои дар боло овардашуда барқарор кунед. Ин хеле дурусттар хоҳад буд ва мушкилоти камтар меорад.

Манбаъ: will.com

Илова Эзоҳ