web-dev-qa-db-ja.com

MyISAMと混合すると、mysqldump中にInnoDBテーブルがロックされますか?

私のmysqlサーバーのバックアップソリューションを探しています。ダウンタイムをできるだけ少なくする必要があります。私は以下を持っています:

  • MySQLサーバー
  • それらは複製されません
  • 各サーバーはそれ自体を表します

この数は増える可能性があるため、マスター/スレーブレプリケーションを設定することはお勧めできません。

私が見る最も簡単なバックアップ方法は、「automysqlbackup」などのソフトウェアでmysqldumpを使用することです。私の最も重要なデータはInnoDBを使用しています。私のInnoDBテーブルはかなり重いです。

問題は、サーバー内のすべてのデータベースに対してmysqldumpを実行すると、Innodbテーブルがロックされるのですか?

9
tounano

innoDBとMyISAMを組み合わせたmysqldumpは、相互に排他的なものとして扱われます。理由は次のとおりです。

Mysqldumpの進行中にmysqlにログインできる場合は、次のように表示されます。

_SELECT /* SQL_NO_CACHE */ * FROM tblname
_

デフォルトでは、mysqldumpは次のことを行います。

  • すべてのデータベースはアルファベット順にダンプされます
  • データベースごとにダンプされるすべてのテーブルは、(ストレージエンジンに関係なく)アルファベット順にダンプされます。

これは、他のデータベースアクティビティがないMySQLインスタンスには問題ありません。 InnoDBテーブルとMyISAMテーブルは互いに影響しません。

すべてのInnoDB MySQLインスタンスに対して_--single-transaction_を使用すると、チェックポイントが作成され、すべてのテーブルが同じ時点からダンプされます。 MyISAMテーブルが見つかると、すべてのベットがオフになります。 MyISAM後のすべてのInnoDBテーブルが異なる時点からダンプされる可能性があります。

InnoDBとMyISAMの混合に対して一貫したポイントインタイムダンプを取得するには、オプションがあります

オプション1

Mysqlを再起動して、他の誰もTCP/IPを介してログインできないようにしてから、mysqldump

_service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 
_

オプション#2

すべてのMyISAMテーブルが読み取り専用の場合は、mysqldumpで--single-transactionを使用します。

オプション#3

MyISAMテーブルが書き込まれている場合、-single-transactionでは不十分です

次のことを行う必要があります。

_mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql
_

Mysqldumpが完了したらすぐに、mysqlにログインして_show processlist;_を実行します。クエリSELECT SLEEP(86400)を探し、プロセスIDを見つけて、_KILL <procidnumn>;_を実行します

7
RolandoMySQLDBA

mysqldump --single-transactionはテーブルをロックしませんが、MyISAMテーブルは、このオプションで一貫したダンプを持っていることが保証されていません。 mydumpermydumperを使用することをお勧めします。MyISAMテーブルはロックされ、InnoDBはロックされないため、ダンプが一貫します。

5
Alex

mysqldumpは、ダンプ中にテーブルをロックします。 LVMスナップショットまたは Xtrabackup を使用します。

0
Wasif