MariaDB Server is een van de meest populaire open-source databaseservers. Het is gemaakt door de oorspronkelijke ontwikkelaars van MySQL en het werd populair omdat het snel, schaalbaar en robuust was. MariaDB heeft een rijk ecosysteem van opslag-engines, plug-ins en andere beschikbare tools die het zeer veelzijdig maken voor een breed scala aan gebruiksscenario's.
Wat betreft de MariaDB-opslagengine, je kunt uit verschillende typen kiezen, zoals XtraDB, InnoDB, MyRocks, MyISAM of zelfs Aria. Er is geen beste type storage-engine, omdat dit afhangt van de workload zelf. De laatstgenoemde, Aria Storage Engine, is standaard gecompileerd vanuit MariaDB 5.1 en moet 'in gebruik' zijn wanneer de MariaDB-service wordt gestart.
In deze blog zullen we zien wat Aria Storage Engine is en hoe het te gebruiken in een MariaDB-server.
Wat is Aria-opslag?
Aria is een opslagengine voor MySQL en MariaDB. Het is oorspronkelijk ontwikkeld met als doel de standaard transactionele en niet-transactionele opslagengine voor MariaDB en MySQL te worden.
Momenteel ondersteunt het encryptie en deadlock-detectie, en het biedt ook een crashveilig alternatief voor MyISAM. Wanneer MariaDB opnieuw opstart na een crash, herstelt Aria alle tabellen in de staat van het begin van een instructie of aan het begin van de laatste LOCK TABLES-instructie.
Aria ondersteunt externe en interne controle, reparatie en compressie van rijen, verschillende rij-indelingen, verschillende indexcompressie-indelingen, aria_chk en meer.
Deze opslagengine wordt sinds versie 10.4 gebruikt voor de MariaDB-systeemtabellen.
Verschillen tussen Aria en MyISAM
Laten we eens kijken naar enkele fundamentele verschillen tussen Aria en zijn directe concurrent:MyISAM, en dan de voor- en nadelen van de Aria Storage Engine.
- Aria gebruikt grote logbestanden (standaard 1G).
- Aria heeft een log-controlebestand (aria_log_control) en logbestanden (aria_log.%). De logbestanden kunnen automatisch worden opgeschoond wanneer ze niet nodig zijn of op verzoek worden gewist.
- Aria gebruikt standaard 8K pagina's, terwijl MyISAM 1K gebruikt. Dit maakt Aria iets sneller bij het gebruik van sleutels met een vaste grootte, maar langzamer bij het gebruik van ingepakte sleutels met variabele lengte.
Voordelen van Aria Storage Engine
- Gegevens en indexen zijn crashveilig.
- Bij een crash worden wijzigingen teruggedraaid naar de staat van het begin van een instructie of een laatste LOCK TABLES-instructie.
- Aria kan bijna alles uit het logboek opnieuw afspelen. De dingen die nog niet kunnen worden afgespeeld zijn:
- Batch INSERT in een lege tabel.
- WIJZIG TABELLEN.
- LOAD INDEX kan indexblokken voor ongewenste indexen overslaan.
- Ondersteunt alle MyISAM ROW-indelingen en de nieuwe PAGE-indeling waarin gegevens in pagina's worden opgeslagen.
- Meerdere gelijktijdige invoegers in dezelfde tabel.
- Bij gebruik van de PAGE-indeling worden rijgegevens gecached door paginacache.
- Aria heeft unit tests van de meeste onderdelen.
- Ondersteunt zowel crashveilige als niet-transactietabellen.
- PAGINA is de enige crashveilige/transactionele rij-indeling.
- PAGE-indeling zou een opmerkelijke snelheidsverbetering moeten opleveren op systemen met slechte gegevenscaching.
- Vanaf MariaDB 10.5 is de maximale sleutellengte 2000 bytes, vergeleken met 1000 bytes in MyISAM.
Nadelen van Aria Storage Engine
- Aria ondersteunt INSERT DELAYED niet.
- Aria ondersteunt geen meerdere sleutelcaches.
- De opslag van zeer kleine rijen (<25 bytes) is niet efficiënt voor PAGE-indeling.
- MERGE-tabellen ondersteunen Aria niet.
- Aria-gegevenspagina's in blokindeling hebben een overhead van 10 bytes/pagina en 5 bytes/rij. Transactie en ondersteuning voor meerdere gelijktijdige schrijvers gebruiken een extra overhead van 7 bytes voor nieuwe rijen, 14 bytes voor verwijderde rijen en 0 bytes voor oude gecomprimeerde rijen.
- Geen externe vergrendeling.
- Aria heeft één paginaformaat voor zowel index als gegevens. MyISAM ondersteunt verschillende paginaformaten per index.
- Kleine overhead per indexpagina (15 bytes).
- De minimale gegevensbestandsgrootte voor PAGE-indeling is 16K.
- Aria ondersteunt geen indexen op virtuele velden.
De Aria-opslagformaten
Het ondersteunt drie verschillende tabelopslagformaten.
Vaste lengte
Deze tabellen bevatten records met een vaste lengte. Elke kolom heeft dezelfde lengte voor alle records, ongeacht de werkelijke inhoud. Dit is de standaardindeling als een tabel geen BLOB-, TEXT-, VARCHAR- of VARBINARY-velden heeft en er geen ROW FORMAT is opgegeven.
Kenmerken:
- Snel, omdat MariaDB altijd weet waar een record begint.
- Eenvoudig te cachen.
- Neem meer ruimte in beslag dan dynamische tabellen, aangezien de maximale hoeveelheid opslagruimte aan elk record wordt toegewezen.
- Reconstructie na een crash is eenvoudig vanwege de vaste posities.
- Geen fragmentatie of noodzaak om te reorganiseren, tenzij records zijn verwijderd en u de ruimte wilt vrijmaken.
Tabellen die BLOB- of TEXT-velden bevatten, kunnen niet worden VASTGESTELD, omdat dit, door het ontwerp, beide dynamische velden zijn.
Dynamisch
Deze tabellen bevatten records met een variabele lengte. Dit is de standaardindeling als een tabel BLOB-, TEXT-, VARCHAR- of VARBINARY-velden heeft en er geen ROW FORMAT is opgegeven.
Kenmerken:
- Elke rij bevat een koptekst die de lengte van de rij aangeeft.
- Rijen hebben de neiging om gemakkelijk gefragmenteerd te raken. HET UPDATEN van een record zodat het langer wordt, zorgt er waarschijnlijk voor dat het op verschillende plaatsen op de schijf wordt opgeslagen.
- Alle stringkolommen met een lengte van vier of meer zijn dynamisch.
- Ze hebben veel minder ruimte nodig dan tafels met een vaste lengte.
- Herstellen na een crash is ingewikkelder dan met VASTE tabellen.
Pagina
Dit is de standaardindeling voor Aria-tabellen en is de enige indeling die kan worden gebruikt als TRANSACTIONAL is ingesteld op 1.
Kenmerken:
- Het wordt gecached door de paginacache, wat een betere willekeurige prestatie geeft omdat het minder systeemaanroepen gebruikt.
- Het fragmenteert niet zo gemakkelijk als het DYNAMIC-formaat tijdens UPDATES. Het maximum aantal fragmenten is erg laag.
- Wordt sneller bijgewerkt dan dynamische tabellen.
- Heeft een lichte opslagoverhead, vooral merkbaar op zeer kleine rijen.
- Langzamer om een volledige tabelscan uit te voeren.
- Langzamer als er meerdere dubbele sleutels zijn, omdat Aria eerst een rij schrijft, dan sleutels, en pas daarna controleert op dubbele sleutels.
Om het opslagformaat te kennen dat door een tabel wordt gebruikt, kunt u de instructie SHOW TABLE STATUS gebruiken.
Transactionele opties voor Aria Storage Engine
Eigenlijk, voor Aria, betekent transactioneel crashveilig, en het wordt niet ondersteund voor gepartitioneerde tabellen. Het vereist ook het PAGE-rijformaat om het te laten werken.
De TRANSACTIONAL- en ROW_FORMAT-tabelopties werken als volgt samen:
- Als TRANSACTIONAL=1 is ingesteld, is PAGE de enige ondersteunde rij-indeling. Als ROW_FORMAT is ingesteld op een andere waarde, geeft Aria een waarschuwing, maar dwingt de rij-indeling nog steeds om PAGE te zijn.
- Als TRANSACTIONAL=0 is ingesteld, is de tabel niet crashveilig en wordt elke rij-indeling ondersteund.
- Als TRANSACTIONAL op geen enkele waarde is ingesteld, wordt elke rij-indeling ondersteund. Als ROW_FORMAT is ingesteld, gebruikt de tabel die rij-indeling. Anders gebruikt de tabel de standaard PAGE-rijopmaak. Als de tabel in dit geval de rij-indeling PAGE gebruikt, is deze crashveilig. Als het een ander rijformaat gebruikt, is het niet crashveilig.
Hoe de Aria Storage Engine op MariaDB Server te gebruiken
Eerst moet u een database maken (als u er nog geen heeft) en deze gebruiken:
MariaDB [(none)]> create database db1;
Query OK, 1 row affected (0.003 sec)
MariaDB [(none)]> use db1
Database changed
Maak vervolgens een tabel met behulp van de "Aria"-engine:
MariaDB [db1]> CREATE TABLE table1 (id int(11) DEFAULT NULL, name text)
-> ENGINE=Aria
-> TRANSACTIONAL=1;
Query OK, 0 rows affected (0.025 sec)
We hebben de TRANSACTIONAL-waarde in 1 gespecificeerd om deze hier te zien, maar, zoals we al zeiden, is niet nodig omdat deze standaard 1 is als we Aria gebruiken zonder rij-indeling en transactiewaarden op te geven. Nu heb je de tabel gemaakt:
MariaDB [db1]> SHOW CREATE TABLE table1\G
*************************** 1. row ***************************
Table: table1
Create Table: CREATE TABLE `table1` (
`id` int(11) DEFAULT NULL,
`name` text DEFAULT NULL
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
1 row in set (0.000 sec)
En in de tabelstatus kunt u zowel de transactie- als de rij-opmaakwaarden controleren:
MariaDB [db1]> SHOW TABLE STATUS\G
*************************** 1. row ***************************
Name: table1
Engine: Aria
Version: 10
Row_format: Page
Rows: 0
Avg_row_length: 0
Data_length: 8192
Max_data_length: 17592186011648
Index_length: 8192
Data_free: 0
Auto_increment: NULL
Create_time: 2020-06-30 18:59:17
Update_time: 2020-06-30 18:59:17
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options: transactional=1
Comment:
Max_index_length: 137438945280
Temporary: N
1 rows in set (0.001 sec)
Er zijn veel parameters om te configureren met betrekking tot Aria Storage Engine. Je kunt een volledige lijst vinden op de officiële documentatiesite.
Aria Storage Engine Tools
Laten we enkele hulpmiddelen bekijken om met deze opslagengine te werken.
aria_chk
Aria_chk wordt gebruikt voor het controleren, repareren, optimaliseren, sorteren en verkrijgen van informatie over Aria-tabellen. Met de MariaDB-server kunt u CHECK TABLE, REPAIR TABLE en OPTIMIZE TABLE gebruiken om soortgelijke dingen te doen.
Deze tool mag niet worden gebruikt wanneer MariaDB actief is, omdat wordt aangenomen dat de tabel tijdens zijn gebruik niet wordt gewijzigd.
$ aria_chk [OPTIONS] aria_tables[.MAI]
Net als bij MyISAM wordt de Aria-tabelinformatie opgeslagen in twee verschillende bestanden:
- MAI-bestand bevat basistabelinformatie en de index.
- MAD-bestand bevat de gegevens.
Aria_chk takes one or more MAI files as arguments.
For example, to check all your tables and repairs only those that have an error, run this command in your data directory:
$ aria_chk --check --force --sort_buffer_size=1G */*.MAI
Checking Aria file: db1/table1.MAI
Data records: 0 Deleted blocks: 0
- check file-size
- check key delete-chain
- check index reference
- check record links
...
aria_pack
Aria_pack is een tool voor het comprimeren van Aria-tabellen. De resulterende tabellen zijn alleen-lezen en meestal ongeveer 40% tot 70% kleiner. De bestandsnaam die door deze tool wordt gebruikt, is het .MAI-indexbestand.
$ aria_pack [options] file_name [file_name2...]
Aria_pack comprimeert elke kolom afzonderlijk, en wanneer de resulterende gegevens worden gelezen, hoeven alleen de afzonderlijke rijen en kolommen te worden gedecomprimeerd, waardoor ze sneller kunnen worden gelezen.
$ aria_pack /var/lib/mysql/world/country
Compressing aria_pack /var/lib/mysql/world/country.MAD: (549 records)
- Calculating statistics
- Compressing file
37.71%
Remember to run aria_chk -rq on compressed tables
Zodra een tabel is ingepakt, gebruikt u het commando aria_chk -rq om de indexen opnieuw op te bouwen.
$ aria_chk -rq --ignore-control-file /var/lib/mysql/world/country
Recreating table '/var/lib/mysql/world/country'
- check record delete-chain
- recovering (with sort) Aria-table '/var/lib/mysql/world/country'
Data records: 549
- Fixing index 1
State updated
aria_read_log
Aria_read_log is een tool voor het weergeven en toepassen van logrecords uit een Aria-transactielog.
$ aria_read_log OPTIONS
U moet een van de opties "-d" of "-a" gebruiken:
- a:Logboek toepassen op tabellen:wijzigt tabellen. U moet eerst een back-up maken. Geeft veel informatie weer als u de parameter --silent niet gebruikt.
- d:korte informatie weergeven die uit de kop van de records is gelezen.
$ cd /var/lib/mysql
$ aria_read_log -d
You are using --display-only, NOTHING will be written to disk
The transaction log starts from lsn (1,0x2007)
TRACE of the last aria_read_log
Rec#1 LSN (1,0x2007) short_trid 0 redo_create_table(num_type:30) len 1042
Rec#2 LSN (1,0x2421) short_trid 0 redo_create_table(num_type:30) len 527
Rec#3 LSN (1,0x2638) short_trid 61986 long_transaction_id(num_type:36) len 6
Rec#4 LSN (1,0x2641) short_trid 61986 file_id(num_type:35) len 22
Rec#5 LSN (1,0x265d) short_trid 61986 undo_bulk_insert(num_type:39) len 9
Rec#6 LSN (1,0x266a) short_trid 0 incomplete_log(num_type:37) len 2
Rec#7 LSN (1,0x266f) short_trid 61986 commit(num_type:27) len 0
...
Conclusie
Zoals je kunt zien, heeft Aria Storage Engine veel verbeteringen ten opzichte van MyISAM, en het is een geweldig alternatief voor de opslagengine om te gebruiken. Het is ook gemakkelijk te gebruiken omdat het deel uitmaakt van de MariaDB Server-installatie, dus alleen het specificeren van de ENGINE-tabelparameter is voldoende om het in te schakelen.
MariaDB werkt nog steeds aan deze opslagengine, dus waarschijnlijk zullen we binnenkort nieuwe verbeteringen in toekomstige versies zien.