パーティション化されたテーブルでこの問題を解決するには、おそらくもっとクールな方法があることがわかりました。数年前からパーティションを削除する必要があり、2014年にはパーティションを追加する必要がありました。ほとんどすべてのパーティションがこのエラーを報告するため、古いものも報告します。非常に厄介なクラッシュ。
古いものを削除し、MAXVALUEパーティション(最後のパーティション)のREORGANIZEを使用している間は、問題のない新しいファイルが作成されるため、警告は少なくなります。それまでの間、ログシーケンスカウンターをインクリメントするのに役立つため、偽のデータを挿入する必要はありません。私はこれがマスターサーバーで起こっています...
したがって、この:
ALTER TABLE Events DROP PARTITION p1530 , p1535 , p1540 , p1545 ,
p1550, p1555 , p1560 , p1565 , p1570 , p1575 , p1580 , p1585 , p1590 ,
p1595 , p1600 , p1605 , p1610 , p1615 , p1620 , p1625 , p1630 , p1635 ,
p1640 , p1645 , p1650 , p1655 , p1660 , p1665 , p1670 , p1675 , p1680 ,
p1685 , p1690 , p1695 , p1700 , p1705 , p1710 , p1715 , p1720 , p1725 ,
p1730 , p1735 , p1740 , p1745 , p1750 , p1755 , p1760 , p1765 , p1770 ,
p1775 , p1780 , p1785 , p1790 , p1795 , p1800 , p1805 , p1810 , p1815 ,
p1820 , p1825 , p1830 , p1835 , p1840;
この:
ALTER table Events REORGANIZE PARTITION p3000 INTO (
PARTITION p3500 VALUES LESS THAN (TO_DAYS('2013-01-01')),
PARTITION p3510 VALUES LESS THAN (TO_DAYS('2013-01-04')),
PARTITION p3520 VALUES LESS THAN (TO_DAYS('2013-01-07')),
PARTITION p3530 VALUES LESS THAN (TO_DAYS('2013-01-10'))
...
PARTITION p4740 VALUES LESS THAN (TO_DAYS('2014-01-08')),
PARTITION p9000 VALUES LESS THAN MAXVALUE)
これにより、変更内の各パーティションが効果的に削除され、そこにあったコンテンツの一時コピーで再作成されます。必要に応じてテーブルごとにこれを行うことができます。私のアプリケーションではそれが可能になるため、同期されたバックアップなどを心配する必要はありません。
表の残りの部分では、プロセスのすべてのパーティションに触れていないため、ログシーケンスの警告が残っているものがあります。壊れているが、この再編成アクションでカバーされているパーティションについては、おそらくこれを実行します:
ALTER TABLE Events REBUILD PARTITION p0, p1;
またはその
ALTER TABLE Events OPTIMIZE PARTITION p0, p1;
だから、私は考えてみました、あなたは普通のバニラテーブルでこれを行い、ハッシュによって一時的にパーティションを追加し、後でそれを削除することができます(またはそれらを保持して、パーティションを強くお勧めします)。
ただし、mysqlではなくmariadbを使用しています(XtraDB)
おそらくこれは誰かを助ける。私はまだそれを実行していますが、これまでのところとても良いです。ENGINEを変更することでも同じように機能するようであるため、MyIsamとInnoDBの間でやり直します。
ENGINEを変更すると、innodbからテーブルが消えるので、これは問題になりません。
ALTER TABLE Events ENGINE=MyISAM;
ALTER TABLE Events ENGINE=InnoDB;
ここで動作するようです。パーティションテーブルに関するいくつかのことを確認できます。
- ALTER TABLE xyz ENGINE = InnoDBは非常に低速で、Aria(mariadb)の2倍の速度ですが、一般的にログシーケンスカウンターをインクリメントする方法は低速です
- ALTER TABLE xyz REBUILD PARTITION ALLは、テーブルを「修正」し、カウンターをインクリメントするのに役立つ最速の方法です
- ALTER TABLE xyz ANALYZE PARTITION ALLは前者に比べて遅いため、チェックアウトしても問題ないパーティションを書き換えません。REBUILDは、一時テーブルスキーマへの書き換えを保証します。
最後のテーブルをいくつかのテーブルで使用しました。警告は、ファイルを開こうとするときに発生し、カウンターの問題で開くパーティション定義ごとに1つあります。本日、最後のテーブルのカウンターをほぼロールオーバーしました。処理がすべて完了したら、バイナリログをフラッシュする必要があると思います。
更新:この問題を解決することができたいくつかのことを結論付けることができます。
- 私のクラッシュは、Aria形式(MariaDB)でテーブルのパーティションを再編成したことが原因でした。
- (私にとって)パーティションの再構築を行うと、シーケンスカウンターを上げるために最善かつ最速で動作しました。エンジンの変更は遅く、innodbに影響を与えるには2回行う必要があります。innoDBへの変更は、MyIsamやAriaに比べて非常に遅いです。
- 5.5ではなくMariaDB 5.3にアップグレードし(以前は5.2)、正常に動作しました。5.5のパーティション(および確認済みのバグ)には、その組み合わせを使用するにはあまりにも多くの問題があります。
- ログシーケンスカウンタをリセットするより良い方法があるはずです。