MariaDBサーバーは、最も人気のあるオープンソースデータベースサーバーの1つです。これはMySQLの最初の開発者によって作成され、高速、スケーラブル、および堅牢であることが一般的になりました。 MariaDBには、ストレージエンジン、プラグイン、その他の利用可能なツールの豊富なエコシステムがあり、さまざまなユースケースで非常に用途が広くなっています。
MariaDBストレージエンジンに関しては、XtraDB、InnoDB、MyRocks、MyISAM、さらにはAriaなどのさまざまなタイプから選択できます。ワークロード自体に依存するため、最適なストレージエンジンタイプはありません。最後に説明したAriaStorageEngineは、デフォルトでMariaDB 5.1からコンパイルされており、MariaDBサービスの開始時に「使用中」である必要があります。
このブログでは、Aria Storage Engineとは何か、MariaDBサーバーでの使用方法を説明します。
Aria Storageとは何ですか?
Ariaは、MySQLおよびMariaDBのストレージエンジンです。もともとは、MariaDBとMySQLのデフォルトのトランザクションおよび非トランザクションストレージエンジンになることを目的として開発されました。
現在、暗号化とデッドロックの検出をサポートしており、MyISAMの代わりにクラッシュセーフな方法も提供しています。クラッシュ後にMariaDBが再起動すると、Ariaはすべてのテーブルをステートメントの開始時または最後のLOCKTABLESステートメントの開始時の状態に回復します。
Ariaは、行の外部および内部チェック、修復、圧縮、さまざまな行形式、さまざまなインデックス圧縮形式、aria_chkなどをサポートしています。
このストレージエンジンは、10.4バージョンからMariaDBシステムテーブルに使用されています。
AriaとMyISAMの違い
Ariaと彼の直接のライバルであるMyISAMの基本的な違い、そしてAriaStorageEngineの長所と短所を見てみましょう。
- Ariaは大きなログファイル(デフォルトでは1G)を使用します。
- Ariaには、ログ制御ファイル(aria_log_control)とログファイル(aria_log。%)があります。ログファイルは、不要な場合は自動的にパージすることも、オンデマンドでパージすることもできます。
- Ariaはデフォルトで8Kページを使用しますが、MyISAMは1Kを使用します。これにより、固定サイズのキーを使用する場合はAriaが少し速くなりますが、可変長のパックキーを使用する場合は遅くなります。
AriaStorageEngineの利点
- クラッシュすると、変更はステートメントの開始状態または最後のLOCKTABLESステートメントの状態にロールバックされます。
- Ariaはログからほとんどすべてを再生できます。まだ再生できないものは次のとおりです。
- INSERTを空のテーブルにバッチ処理します。
代替テーブル。
AriaStorageEngineのデメリット
- AriaはINSERTDELAYEDをサポートしていません。
- Ariaは複数のキーキャッシュをサポートしていません。
- 非常に小さい行(<25バイト)の保存は、PAGE形式では効率的ではありません。
- MERGEテーブルはAriaをサポートしていません。
- ブロック形式のAriaデータページには、10バイト/ページと5バイト/行のオーバーヘッドがあります。トランザクションと複数の同時ライターのサポートでは、新しい行に7バイト、削除された行に14バイト、古い圧縮行に0バイトの追加のオーバーヘッドが使用されます。
- Ariaのページサイズはインデックスとデータの両方で1つです。 MyISAMは、インデックスごとに異なるページサイズをサポートしています。
- インデックスページあたりのオーバーヘッドが小さい(15バイト)。
- PAGE形式の最小データファイルサイズは16Kです。
- Ariaは仮想フィールドのインデックスをサポートしていません。
Ariaストレージフォーマット
3つの異なるテーブルストレージ形式をサポートしています。
これらのテーブルには、固定長のレコードが含まれています。各列は、実際の内容に関係なく、すべてのレコードで同じ長さです。テーブルにBLOB、TEXT、VARCHAR、またはVARBINARYフィールドがなく、ROW FORMATが指定されていない場合、これはデフォルトの形式です。
- MariaDBはレコードの開始位置を常に認識しているため、高速です。
- 各レコードに最大量のストレージスペースが割り当てられるため、動的テーブルよりも多くのスペースを占有します。
- 位置が固定されているため、クラッシュ後の再構築は簡単です。
- レコードが削除されていて、スペースを解放したい場合を除いて、断片化や再編成の必要はありません。
BLOBまたはTEXTフィールドを含むテーブルは、設計上、両方とも動的フィールドであるため、修正できません。
これらのテーブルには、可変長のレコードが含まれています。テーブルにBLOB、TEXT、VARCHAR、またはVARBINARYフィールドがあり、ROW FORMATが指定されていない場合は、これがデフォルトの形式です。
- 各行には、行の長さを示すヘッダーが含まれています。
- 4つ以上の長さのすべての文字列列は動的です。
- クラッシュ後の復元は、FIXEDテーブルよりも複雑です。
これはAriaテーブルのデフォルトの形式であり、TRANSACTIONALが1に設定されている場合に使用できる唯一の形式です。
- ページキャッシュによってキャッシュされます。これにより、使用するシステムコールが少なくなるため、ランダムなパフォーマンスが向上します。
- UPDATES中のDYNAMIC形式ほど簡単には断片化されません。フラグメントの最大数は非常に少ないです。
- ストレージのオーバーヘッドがわずかにあり、主に非常に小さい行で顕著です。
- 重複するキーが複数ある場合は遅くなります。これは、Ariaが最初に行を書き込み、次にキーを書き込み、次に重複をチェックするためです。
テーブルで使用されるストレージ形式を知るには、SHOWTABLESTATUSステートメントを使用できます。
AriaStorageEngineのトランザクションオプション
実際、Ariaの場合、トランザクションはクラッシュセーフを意味し、パーティション化されたテーブルではサポートされていません。また、それを機能させるには、PAGE行形式が必要です。
TRANSACTIONALテーブルオプションとROW_FORMATテーブルオプションは次のように相互作用します。
- TRANSACTIONAL =1が設定されている場合、サポートされる行形式はPAGEのみです。 ROW_FORMATが他の値に設定されている場合、Ariaは警告を発行しますが、それでも行形式を強制的にPAGEにします。
- TRANSACTIONAL =0が設定されている場合、テーブルはクラッシュセーフではなく、任意の行形式がサポートされます。
- TRANSACTIONALがどの値にも設定されていない場合、任意の行形式がサポートされます。 ROW_FORMATが設定されている場合、テーブルはその行形式を使用します。それ以外の場合、テーブルはデフォルトのPAGE行形式を使用します。この場合、テーブルがPAGE行形式を使用していると、クラッシュセーフになります。他の行形式を使用している場合、クラッシュセーフではありません。
まず、データベースを作成し(データベースを作成していない場合)、それを使用する必要があります:
MariaDB [(none)]> create database db1;
Query OK, 1 row affected (0.003 sec)
MariaDB [(none)]> use db1
Database changed
次に、「Aria」エンジンを使用してテーブルを作成します。
MariaDB [db1]> CREATE TABLE table1 (id int(11) DEFAULT NULL, name text)
-> ENGINE=Aria
-> TRANSACTIONAL=1;
Query OK, 0 rows affected (0.025 sec)
ここに表示するために1でTRANSACTIONAL値を指定しましたが、前述のように、行形式とトランザクション値を指定せずにAriaを使用している場合、デフォルトで1になるため、必要ありません。これで、テーブルが作成されます:
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)
テーブルのステータスでは、トランザクションと行の両方の形式の値を確認できます。
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)
AriaStorageEngineに関連して構成するパラメーターは多数あります。完全なリストは、公式ドキュメントサイトにあります。
Ariaストレージエンジンツール
aria_chk
Aria_chkは、Ariaテーブルに関する情報を確認、修復、最適化、並べ替え、および取得するために使用されます。 MariaDBサーバーでは、CHECK TABLE、REPAIR TABLE、およびOPTIMIZETABLEを使用して同様のことを行うことができます。
このツールは、MariaDBの実行中にテーブルが変更されないことを前提としているため、MariaDBの実行中は使用しないでください。
$ aria_chk [OPTIONS] aria_tables[.MAI]
MyISAMと同様に、Ariaテーブル情報は2つの異なるファイルに保存されます:
- MAIファイルにはベーステーブル情報とインデックスが含まれています。
- MADファイルにはデータが含まれています。
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は、Ariaテーブルを圧縮するためのツールです。結果のテーブルは読み取り専用で、通常は約40%から70%小さくなります。このツールで使用されるファイル名は、.MAIインデックスファイルです。
$ aria_pack [options] file_name [file_name2...]
Aria_packは各列を個別に圧縮し、結果のデータを読み取るときに、必要な個々の行と列のみを解凍する必要があるため、すばやく読み取ることができます。
$ 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
テーブルがパックされたら、コマンドaria_chk-rqを使用してインデックスを再構築します。
$ 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は、Ariaトランザクションログのログレコードを表示および適用するためのツールです。
$ aria_read_log OPTIONS
- a:ログをテーブルに適用:テーブルを変更します。最初にバックアップを作成する必要があります。 --silentパラメータを使用しない場合、多くの情報が表示されます。
- d:レコードのヘッダーから読み取った簡単な情報を表示します。
$ 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
...
ご覧のとおり、Aria Storage EngineはMyISAMに対して多くの改善があり、使用するのに最適なストレージエンジンの代替手段です。また、MariaDBサーバーのインストールの一部であるため、使いやすいため、ENGINEテーブルパラメーターを指定するだけで有効になります。
MariaDBはまだこのストレージエンジンに取り組んでいるので、おそらく将来のバージョンで新しい改善が見られるでしょう。