MariaDBテーブルの古いデータを、テーブルが存在するボリュームとは別のLinuxサーバーの他のボリューム(またはマウントポイント)にアーカイブする予定です。
これにはpartitioningを使用しており、テーブルは 'innodb_files_per_table = ON'のinnodbテーブルです。
これを行っている間、他のボリュームにあるディレクトリに古いデータを含むパーティションを配置しています。
ただし、「」という形式の制限では、テーブルの一意のキーごとに、テーブルのパーティション式のすべての列を使用する必要があります。 (これには、一意のキーでもあるため、テーブルの主キーも含まれます。) 'は、私たちの活動の主要な道路遮断者です。 ( https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html )
ここでは、パーティション化のために、ほとんどの場合テーブルに作成されたすべての一意のキーに含まれていない特定の列を使用する必要があります。アプリケーションの操作に影響を与える可能性があるため、テーブルのキー構造を変更することもできません。
したがって、データをアーカイブするには他の方法を選択する必要があります。これに関する提案は本当に役に立ちます。
シナリオ例:表:
CREATE TABLE `tbl` (
`col1` int(11) NOT NULL DEFAULT '0',
`col2` int(11) NOT NULL AUTO_INCREMENT,
`col3` int(11) NOT NULL DEFAULT '0',
`col4` varchar(60) NOT NULL DEFAULT '',
`col5` varchar(60) DEFAULT NULL,
`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
UNIQUE KEY `uniq1` (`col2`),
UNIQUE KEY ` uniq2` (`col1`),
UNIQUE KEY ` uniq3` (`col4`,`col3`),
UNIQUE KEY `uniq4` (`col5`,`col3`),
KEY `key1` (`changed`),
);
W.r.tをパーティション化していますcol1。
クエリ:
alter table tbl partition by range(col1)(partition p0 values less than(10000000)data directory = '/ partitions'、partition p1 values less than(20000000)data directory = '/ partitions'、partition (30000000)より小さいp2値、(maxvalue)より小さいパーティションp3値);
エラー1503(HY000):PRIMARY KEYには、テーブルのパーティション関数のすべての列を含める必要があります
ここでは、トランザクションの整合性を備えたアーカイブについての考え方を示します。
archive
と呼びましょう。インデックスがあっても、ほとんど必要ありません。archive
に移動します。archive
。テーブルからの効率的なDELETEing
行の提案については、 this を参照してください。残りは
INSERT INTO `archive` SELECT ... FROM main ...;
どこ ...
チャンクから来ています。おそらくautocommit=on
およびBEGIN
...COMMIT
は必要ありません。