web-dev-qa-db-ja.com

mysql innodbパーティションをバックアップする最良のオプション

月ごとに分割する予定のテーブルがいくつかあります。これらのパーティションを削除する前に、バックアップを実行したいと思います。私たちが見つけた1つのオプションは、このリンク http://www.percona.com/doc/percona-xtrabackup/howtos/recipes_ibkx_partition.html です。誰もが最高のメカニズムまたはmysqldumpなどの他のオプションがあることを示唆できますか?

2
newbie14

質問でリンクしたPercona xtrabackupソリューションは良いソリューションです。これはホットバックアップであり、innodbテーブルをロックしません。ほとんどの場合、mysqldumpよりもそれを好みます。

Xtrabackupを試しましたか?それの使用について質問がありますか?

テーブルのバックアップを個別に取得する必要がある場合は、mysqldumpを各テーブルで個別のファイルに実行することを検討してください。

まず、テーブルのリストを作成します

MYSQL_USER=username
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQLSTMT="SELECT CONCAT(table_schema,'.',table_name)"
SQLSTMT="${SQLSTMT} FROM information_schema.tables"
SQLSTMT="${SQLSTMT} WHERE table_schema NOT IN"
SQLSTMT="${SQLSTMT} ('information_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > ListOfTables.txt

中程度の数のテーブルがある場合、それらをすべて同時にダンプできます。

MYSQL_USER=username
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
MYSQLDUMP_OPTIONS="--hex-blob --triggers"
do
    DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
    mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
done
wait

並列にダンプするにはテーブルが多すぎる場合は、一度にすべてのテーブルを10にダンプします。

MYSQL_USER=username
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
COMMIT_COUNT=0
COMMIT_LIMIT=10
MYSQLDUMP_OPTIONS="--hex-blob --triggers"
for DBTB in `cat ListOfTables.txt`
do
    DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
    mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

必要に応じて、メッセージをロードできる場合は、mysqldumpを実行します。

別の方法を次に示します。パーティション化する各テーブルのスキーマではなく、データのみのmysqldumpを実行します。上記のコードでは、mysqldumpオプションに--no-create-infoを追加してデータをダンプするだけです

MYSQLDUMP_OPTIONS="--hex-blob --triggers --no-create-info"

データが別のファイルにダンプされるだけなので、好みに応じてパーティション化されたInnoDBの作成に集中し、そこにデータのmysqldumpをロードすることができます。

2013-01-16 08:24 EDT更新

あなたが試すことができる2つのことがあります

オプション1

一度に1つのテーブルをダンプしたい場合は、すべてを1つのファイルにダンプする必要がありますが、トランザクションとしてダンプする必要があります。

MYSQL_USER=username
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
MYSQLDUMP_OPTIONS="--hex-blob --routines --triggers --single-transaction"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} --all-databases | gzip > MySQLData.sql.gz 

オプション#2

トランザクションとしてマークされた並列mysqldumpを試すことができます

MYSQL_USER=username
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
MYSQLDUMP_OPTIONS="--hex-blob --triggers --single-transaction"
do
    DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
    mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
done
wait

お役に立てれば !!!

1
RolandoMySQLDBA