9

mysqldump を実行するためのバックアップ シェル スクリプトを作成します。

mysqldump -u$BACKUP_USER -p$BACKUP_PASS --flush-logs --lock-tables $DB_NAME > $SQL_FILE

私のデータベースのストレージ ENGINE は MyISAM です。--single-transactionなのでオプションは使えません。mysqldump 進行中の 1 つの--lock-tablesテーブルのみをロックします。MySQL インスタンスには多くのデータベースがあります。使用したくありません--lock-all-tables。サーバーで実行されているすべてのデータベースがロックされます。では、ダンプできるように、1 つの mysql データベース内のすべてのテーブルを同時にロックする方法を教えてください。

4

3 に答える 3

8

これまでで最も美しいソリューションではありませんが、これは機能します。私は同じニーズを持っていました。これが私の解決策です。変数名に合わせてわずかに変更されています。これはシェル BASH セマンティクスに大きく依存しているため、Linux で MySQL を実行していると想定しています。Windows を使用している場合、これはおそらく機能しません。

# Mysql script to lock all tables in one DB
# (such as to get a consistent export dump of one database)

MYSQLCMD="mysql -u$BACKUP_USER -p$BACKUP_PASS -A"

function lock_db {
  [ -e "/tmp/mysql-db-lock-${1}" ] && rm "/tmp/mysql-db-lock-${1}"
  mkfifo "/tmp/mysql-db-lock-${1}"
  (
    (
      echo "SELECT CONCAT( 'LOCK TABLES '
             , GROUP_CONCAT(CONCAT('\`',table_name,'\`'),' WRITE')
             , ';'
             ) AS \"-- Statement to lock tables\"
      FROM information_schema.tables
      WHERE table_schema='${1}'
      ORDER BY table_name;
      " | $MYSQLCMD
      echo "\! cat '/tmp/mysql-db-lock-${1}' >/dev/null"
      echo 'UNLOCK TABLES;'
    ) | $MYSQLCMD -D"${1}"
    rm "/tmp/mysql-db-lock-${1}"
  ) &
}

function unlock_db {
  >"/tmp/mysql-db-lock-${1}"
}

# Lock one database, all tables
lock_db $DB_NAME

# Verify locks have been placed
echo "SHOW OPEN TABLES WHERE in_use != 0" | $MYSQLCMD

# Do whatever here that you needed the locked db for
mysqldump -u$BACKUP_USER -p$BACKUP_PASS $DB_NAME > $SQL_FILE

# Release locks
unlock_db $DB_NAME

# Verify locks released
echo "SHOW OPEN TABLES WHERE in_use != 0" | $MYSQLCMD
于 2013-09-11T22:28:54.030 に答える
4

このオプションを検討する必要があります。

FLUSH TABLES WITH READ LOCK

開いているすべてのテーブルを閉じ、すべてのデータベースのすべてのテーブルをグローバル読み取りロックでロックします。これは、バックアップを取得するための非常に便利な方法です...

http://dev.mysql.com/doc/refman/5.0/en/flush.html

于 2012-12-27T06:55:30.130 に答える