attikottidetti
@attikottidetti

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

バックアップ(mysqldump)からのMySQLのリカバリーができません。

Q&A

Closed

解決したいこと

MySQLのリカバリーができません。
解決方法を教えて下さい。

発生している問題・エラー

あるサーバーで実行中のデータベースを別のサーバーにコピーしようとしています。
mysqldumpでバックアップファイルを作り、それを別のサーバーにコピーしてリカバリーしようとしています。
テーブルは87個あり、86個はうまくいっているのですが、1つだけ実行できません。実行できないファイルの容量が27MBあり、そのせいかと思います。その次に大きいのは20MBなのですが、こちらはOKです。
実行しているサーバーは、2つともXサーバーです。MySQLバージョンは5.7.xです。

Error:SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

バックアップファイル作成

echo date("個別バックアップ開始:Y年m月d日 H時i分s秒") . '<br>';
for ($i = 0; $i < $tblflno; $i++) {
exec("mysqldump --user={$user} --password={$pass} --host={$host} {$database} {$tblflnm[$i]} --result-file={$tblflnm[$i]}.sql 2>&1", $output);
}

リカバリー実行
php
for ($i = 0; $i < $tblflno; $i++) {
echo "{{$tblflnm[$i]}.sql" . ":インポート開始" . date(":Y年m月d日 H時i分s秒");
try {
$pdo = new PDO('mysql:host='.$host.'; dbname='.$user, $user, $pass);
$sql = file_get_contents("{{$tblflnm[$i]}.sql");
$qr = $pdo->exec($sql);
echo ":インポート成功" . date(":Y年m月d日 H時i分s秒") . '<br>';
} catch (PDOException $e) {
echo('Error:' . $e->getMessage());
die();
}
}

0

1Answer

Comments

  1. @attikottidetti

    Questioner

    ありがとうございます。問題の所在がよく分かりました。xサーバーなので、自分で変えられるのかxサーバーに質問してみます。大変、助かりました。
  2. @attikottidetti

    Questioner

    xサーバーの回答は、以下のようなものでした。
    「誠に恐れ入りますが、ご希望の設定内容につきましては、
    MySQLサーバー側の設定ファイル(my.cnf)の編集が必要となりますが、
    当該ファイルをお客様側で任意にご変更いただくことはかないません。」
    MYSQLDUMPでバックアップファイルを小分けして作るわけにはいかないでしょうし、困りました。
  3. 少し面倒な方法ですが、下記の方法でリストアできると思います。

    1. 大きなテーブル以外をバックアップする(バックアップファイルA)
    参考:
    https://qiita.com/kadoppe/items/ca54fdc57097e109a151

    2. 大きなテーブルのみをバックアップする(バックアップファイルB)
    参考:
    https://qiita.com/kooohei/items/530f46b6ef8909227dc8

    3. バックアップファイルAをリストアする

    4. バックアップファイルBをエラーが出ない程度に少しずつリストアしていく
    4.1. バックアップファイルBをテキストエディター等で開く
    4.2. 大きなテーブルを作るCREATE TABLE文と、大きなテーブルにデータを挿入するINSERT文(これはたくさんある)を確認する
    4.3. CREATE TABLE文を手動で発行する
    4.4. INSERT文をエラーが出ない程度の量で手動で発行していく
  4. @attikottidetti

    Questioner

    ありがとうございます。
    dumpしたファイルは、insert に続けて、1レコードごとに()くくりで、,を挟んで全レコードが続いている一文のようです。例えば、半分のレコード数に分け、それぞれをinsert文としたファイルを2つ作り、それぞれを
    $pdo = new PDO('mysql:host='.$host.'; dbname='.$user, $user, $pass);
    $sql = file_get_contents("{$dbname_core}0_{$tblflnm[$i]}.sql");
    $qr = $pdo->exec($sql);
    で取り込むというイメージで良いのでしょうか?
  5. @attikottidetti

    Questioner

    すいません。間違えていました。dumpしたファイルには、INSERT INTO 文が複数入っていました。dumpしたファイルの中を分けてfile_get_contentsでやってみます。
  6. @attikottidetti

    Questioner

    dumpしたファイルをエディターで
    「ファイル前半.sql」
    「ファイル後半.sql」
    に分け(insert文の区切りの良いところで)、

    $sql = file_get_contents("ファイル前半.sql");
    $qr = $pdo->exec($sql);
    $sql = file_get_contents("ファイル後半.sql");
    $qr = $pdo->exec($sql);

    としたら、全体をリカバリーできました。
    ありがとうございました。
  7. リストアできて良かったですね!

Your answer might help someone💌