web-dev-qa-db-ja.com

制限のためにパーティション化を実装できない場合、mariadbテーブルの古いデータをアーカイブするためのオプションは何ですか?

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には、テーブルのパーティション関数のすべての列を含める必要があります

1
Avijit batabyal

ここでは、トランザクションの整合性を備えたアーカイブについての考え方を示します。

  • 別のテーブルを持っています。それをarchiveと呼びましょう。インデックスがあっても、ほとんど必要ありません。
  • トランザクションで、一度に1000行をテーブルからarchiveに移動します。
  • 「十分」に移動した後。アーカイブしたいことは何でもarchive

テーブルからの効率的なDELETEing行の提案については、 this を参照してください。残りは

INSERT INTO `archive` SELECT ... FROM main ...;

どこ ...チャンクから来ています。おそらくautocommit=onおよびBEGIN...COMMITは必要ありません。

1
Rick James