問題
TDSQL-C for MySQLでは、単一のInnoDBテーブルスペース(つまり単一のテーブルに対応する物理ストレージ)には64TBの上限があります。テーブルのデータ量が64TBに近づくと書き込みが失敗し、深刻な場合にはインスタンス異常や業務中断をトリガーする可能性があります。
64TBは単一のテーブルの上限であり、インスタンスの総容量の上限ではありません。
あるテーブルの物理ボリュームが64TBに接近または達した場合、そのテーブルへの書き込みが継続できなくなります。これにより、インスタンスに異常が発生する可能性があります。
問題のトリガーシナリオ
以下の条件を満たす場合、この問題がトリガーされる可能性があり、重点的に確認する必要があります:
業務テーブルが長期間にわたって単調に増加し、かつパーティションテーブルやデータベース/テーブルの分割が行われていない場合です。
単一の超大規模テーブルが存在し、データとインデックスが継続的に蓄積されています。
単一テーブルのデータ量はTBレベルに達しており、なおも急速に増加しています。
関連エンジンバージョン
ソリューション分析
カーネルをアップグレードしても、単一テーブルの最大64TBの制限を突破することはできません。
対応方法は、事前の計画とオンラインでの移動/分割を組み合わせ、テーブルが上限に近づく前に積極的に対処することです。
ソリューションガイド
1. 占有量が最も高いテーブルの表示
以下のSQLを定期的に実行し、使用量Top10のテーブルを特定して、特に上位の大規模テーブルに重点的に注目することをお勧めします。
set session sql_mode='';
select t.table_schema,
t.table_name,
(data_length + index_length)/1024/1024/1024 as size_G
from information_schema.tables t
join information_schema.INNODB_SYS_TABLES syst
on concat(t.table_schema,'/',t.table_name) = substring_index(syst.NAME,'#',1)
where syst.SPACE = 0
group by t.table_schema, t.table_name
order by size_G desc
limit 10;
set session sql_mode='';
select t.table_schema,
t.table_name,
(data_length + index_length)/1024/1024/1024 as size_G
from information_schema.tables t
join information_schema.INNODB_TABLES syst
on concat(t.table_schema,'/',t.table_name) = substring_index(syst.NAME,'#',1)
where syst.SPACE = 0
group by t.table_schema, t.table_name
order by size_G desc
limit 10;
2. オンラインでのデータ移動
クエリ結果の上位にある大規模テーブルに対しては、オンラインテーブル再構築を実行し、テーブルの整理/移行を行って、データ量が単一テーブルの上限に近づくことで生じる可能性のあるリスクを低減できます:
ALTER TABLE $db.$tb ENGINE = INNODB, ALGORITHM=INPLACE, LOCK=NONE;
$db:実際のコマンド実行では、このパラメータをご自身のデータベース名に置き換えてください。
$tb:実際のコマンド実行では、このパラメータをご自身が選択したデータベースのテーブル名に置き換えてください。
推奨事項
1. 定期点検:上記の使用量が最も高いテーブルを確認するSQLに基づき、Top10大規模テーブルの使用状況を定期的に確認します。
2. タイムリーな移動:上位の大規模テーブルに対してオンライン移動再構築を実行します。
3. テーブルデータ量の増加を適切に制御:超大規模テーブルに対してパーティション/分割/アーカイブを適用し、単一テーブルのボリュームを根源的に制御します。