Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

erectus

Ita factum est ut server virus redemptionis aggressus est, quod per "fortunatum casum" ex parte .ibd lima (crassa notitiarum tabularum innodbarum) intacta reliquit, sed simul tabulas .fpm funditus encryptas. compages imaginum). In hoc casu .idb dividi potuit;

  • subditi restitutionis per instrumenta et duces. In talibus rebus est optimum fiet;
  • mensas partim encrypted. Paene hae sunt magnae tabulae, pro quibus (ut intelligo) oppugnatores non satis RAM ad plenam encryptionem non habent;
  • Bene tabulae plene encryptae quae restitui nequeunt.

Fieri potest uter optio tabulae pertineant ad aperiendam illam in quavis textu editore sub optato descriptam (in casu UTF8) et simpliciter inspiciendo tabellam ad praesentiam textuum agrorum, exempli gratia:

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

Etiam, ineunte tabella, magnum numerum bytes 0 observare potes, et virus utentes in stipite encryption algorithmus (communissimum) eos quoque plerumque afficiunt.
Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

In casu meo, oppugnatores chorda 4-byte (1, 0, 0, 0) reliquerunt in fine cuiusque fasciculi encrypted, quod negotium faciliorem reddebat. Ad investigandum fasciculas putridas, scriptura satis erat;

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)

Ita evenit ut fasciculi primi generis invenirent. Alter multum operis manualis involvit, sed iam satis inventum est. Omnia denique essent, sed scire debes omnino precise structuram et causa orta est me saepe mutando mensam laborare. Nemo recordatus est utrum genus agri mutatum sit an nova columna addita sit.

Wilds urbem, proh dolor, cum tali casu adiuvare non potuit, quam ob rem hoc scriptum est.

Ad punctum

Exstat structura mensae ante 3 menses quae cum uno currenti non coincidit (fortasse unus campus, fortasse plures). Tabulae structurae:

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)
); 

in hoc casu extrahere debes;

  • id_point int (11);
  • id_user int (11);
  • date_start DATE TEMPUS;
  • date_finish DATE TEMPUS.

Ad recuperandum, byte-byte analysis .ibd fasciculi adhibita est, sequitur eos in formam magis lectibilem convertendo. Cum ad inveniendum quid opus sit, tantum opus est ut species int et datatime analysinent, articulus eas tantum describet, sed interdum etiam ad alias species datas referemus, quae in aliis similibus incidentibus iuvare possunt.

Problema 1Agros typorum DATETIME et TEXT nulla bona habebant, et in tabella simpliciter omittuntur, ob hoc, structuram restituere in casu meo statuere non potuit. In novis columnis, valor defectus nulla erat, et pars transactionis ob occasum innod_log_at_trx_commit = 0 deperire potuit, ut tempus addito ad structuram definiendam impenderetur.

Problema 2: ratio habenda est ut ordines per DELETE deleti omnes in tabula ibd erunt, sed cum ALTER TABLE structura eorum non renovabitur. Quam ob rem, structura notitiarum ab initio tabellae ad finem variari potest. Si saepe tabellam OPTIMAM uteris, tunc probabile es talem problema occurrere.

placere noteDBMS versio viae notitia reposita afficit, et hoc exemplum aliis maioribus versionibus laborare non potest. In casu fenestrae versionis mariadb 10.1.24 adhibita est. Item, licet in mariadb laboras cum tabulis InnoDB, tamen sunt XtraDBexcludit applicabilitas methodi apud InnoDB mysql.

Tabularii analysis

In pythonis, genus notitia bytes () indicat Unicode datam loco regularis numerorum. Etsi tabellam in hac forma inspicere potes, commoditatis causa potes bytes in formam numericam convertendo byte ordinata in ordinatam regularem (exemplum (exemplum_byte_array)). Utroque in casu, utraque methodus ad analysim aptum est.

Postquam per plures fasciculos ibd quaeris, sequentia invenire potes:

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

Praeterea si tabellam per has keywords dividas, plerumque etiam caudices notitiarum habebis. Utemur infimum quasi divisorem.

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

Observatio interesting: nam tabulae cum parva notitiarum copia, inter infimum et supremum regula numerorum in scandalo est.

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte - test mensam cum 1 row

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte - test mensam cum II ordines

Ordo mensae ordinatae [0] omitti potest. Cum perspexisset, adhuc rudem tabulam datam invenire non potui. Verisimile est hic clausus ad indices et claves reponendas.
Incipiens a tabula[1] eamque in ordinem numerorum transferendo, nonnulla exemplaria iam animadvertere potes, nempe:

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

Hae int bona in filo repositae sunt. Primus byte indicat utrum numerus sit affirmativus vel negativus. In casu meo omnes numeri positivi sunt. Ex reliquis 3 bytes, numerum sequenti functione utens determinare potes. Scriptor:

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

Eg 128, 0, 0, 1 = 1uel 128, 0, 75, 108 = 19308.
Mensa primarium clavem cum auto-incremento habuit et hic quoque inveniri potest

Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-byte

Comparatis notitias ex tabulis probatis, revelatum est objectum DATETIME ex 5 bytes consistere et ab 153 incipere (verisimile indicans intervalla annua). Cum ambitus DATTIME sit "1000-01-01" ad "9999-12-31", numerus bytes variari puto, sed in casu meo, notitia in periodo ab 2016 ad 2019 cadit, ideo ponemus. quod 5 bytes satis.

Ad tempus sine secundis determinare sequuntur munera scripta sunt. Scriptor:

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}

Non potuit scribere functionem functionis pro anno et mense, ideo me trucidare oportuit. Scriptor:

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

Certus sum enim, si quantum temporis expendas n, haec error corrigi potest.
Deinde munus quod obiecto filo refert ad tempus. Scriptor:

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)

Accurantur ut saepe repetitas valores deprehendas ab int, int, datetime, datetime . Recuperanda notitia ex tabulis XtraDB sine lima structurae per analysin fasciculi ibd byte-bytevidetur hoc quod opus est. Talis autem successio bis per lineam non iteratur.

Regulari expressione adhibita, notitia necessaria invenimus:

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)

Quaeso note quod cum hac expressione utens quaerimus, valores nullos in agris quaesitis determinare poterit, sed in casu critico non est. Inde imus per quod invenimus in ansa. Scriptor:

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)

Profecto, omnia, notitia eventi ordinata est notitia quae nobis necessaria est. ### PS.
Hanc methodum non omnibus aptam intelligo, sed praecipuum articulum propositum est festinationi actionis potius quam solvendi omnia problemata tua. Puto rectissimam solutionem esse incipere studendi fons code ipsum mariadbsed propter tempus determinatum, ratio hodierna velocissima esse videbatur.

In quibusdam casibus, post analysin tabellam, proximam structuram determinare poteris et eam restituere, utendo uno modos regulae ex nexibus superioribus. Multo rectius haec erunt et pauciora problemata efficient.

Source: www.habr.com