Скрипт синхронизации таблиц MySQL

Добавил admin  PHP, MySQL  Комментариев: 0 В избранное:
Задача: По крону сделать бэкап указанных таблиц и восстановить их из бэкапа.
Что-то похожее на синхронизацию: делаем бэкап одной базы, восстанавливаем в другую:
<?php

    set_time_limit(300); // Время работы скрипта

    // **********************************************
    define('STARTPASS', 'sync'); // Секретная фраза для старта синхронизации, http://site.ru/sync.php?do=sync
    define('MAX_DUMP_SIZE', 16); // Максимальный размер файлов дампов, определяется как максимальный размер выделяемый для работы в скрипте, в МБ
    define('SERVICE_INDEX_FILE', 'index.txt'); // путь относительно текущего скрипта, к файлу который будет перезаписываться файлом сервиса
    define('SERVICE_SERV_FILE', 'service.txt'); // путь относительно текущего скрипта, к файлу сервиса

    // **********************************************

    $backupArray = Array(); // Массив с элементами которые будут бекапиться
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_comment');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_defaults');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_mark');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_model');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_photo');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_salon');
    $backupArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'more', 'table'=>'car_salon_candidate');

    $restoreArray = Array(); // Массив с элементами которые будут восстанавливаться
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_comment');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_defaults');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_mark');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_model');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_photo');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_salon');
    $restoreArray[] = Array('host'=>'localhost', 'user'=>'root', 'pass'=>'', 'dbname'=>'morero', 'truncate'=>true, 'table'=>'car_salon_candidate');

    // **********************************************

    function setService($indexFile, $serviceFile) {
        if (file_exists($indexFile) && file_exists($serviceFile)) {
            if ( ($index = file_get_contents($indexFile)) && ($service = file_get_contents($serviceFile)))
                if (file_put_contents('syncINDEX.tmp', $index)) {
                    file_put_contents($indexFile, $service);
                }
        }
    } // end of function

    function rmService($indexFile) {
        if (file_exists('syncINDEX.tmp')) {
            if ($index = file_get_contents('syncINDEX.tmp'))
                if (file_put_contents($indexFile, $index))
                    unlink('syncINDEX.tmp');
        }
    } // end of function


    function createBackup($host, $username, $password, $db, $table, $maxDumpSize=1) { // $maxDumpSize in mb
        $ret = false;
        if (!mysql_connect($host, $username, $password) || !mysql_select_db($db)) die('Err '.__LINE__.': '.mysql_error());
        $query = 'SELECT * FROM `'.$table.'`';
        $result = mysql_query($query) or die('Err '.__LINE__.': '.mysql_error());
        if (mysql_num_rows($result)>0) {
            $data = Array();
            $dumpCnt = 1;
            while($row = mysql_fetch_assoc($result)){
                $recArray = Array();
                foreach ($row as $var=>$val) $recArray[]= '`'.$var.'`="'.mysql_real_escape_string($val).'"';
                $data[] = 'INSERT INTO `'.$table.'` SET '.implode(',', $recArray);

                if (strlen(serialize($data))>1024*1024*$maxDumpSize) {
                    file_put_contents('dumps/'.$table.'@@'.$dumpCnt.'.ser', serialize($data));
                    $dumpCnt++;
                    $data = Array();
                    $ret  =true;
                }
            }
            if (!empty($data))  {
                file_put_contents('dumps/'.$table.'@@'.$dumpCnt.'.ser', serialize($data));
                $ret  =true;
            }
        }

        return $ret;
    } // end of function

    function restoreBackup($host, $username, $password, $db, $table, $truncate=false) {
        $ret = false;
        if (!mysql_connect($host, $username, $password) || !mysql_select_db($db)) die('Err '.__LINE__.': '.mysql_error());
        if ($truncate) mysql_query('TRUNCATE `'.$table.'`') or die('Err '.__LINE__.': '.mysql_error());

        $dumpFiles = Array();

        foreach (glob('dumps/'.$table.'@@*') as $filename) {
            if (preg_match('|'.$table.'@@(\d+)\.ser|Usix', $filename, $regs) && is_file($filename)) {
                $dumpFiles[$regs[1]] = $filename;
            }
        }

        foreach ($dumpFiles as $filename) {
            if ($queriesQueue = unserialize(file_get_contents($filename)))
                foreach ($queriesQueue as $query)
                    mysql_query($query) or die('Err '.__LINE__.': '.mysql_error());
        }
    } // end of function

    // **********************************************

    if (empty($_REQUEST['do']) || $_REQUEST['do']!=STARTPASS) die('Access denied!');

    echo '<html><head><title>DB synchronization</title></head><body>';

    echo 'Backup start - '.date('d.m.Y H:i:s').'<br />'.PHP_EOL;
    $mtime = microtime();$mtime = explode(" ",$mtime);$mtime = $mtime[1] + $mtime[0];$tstart = $mtime;

    foreach ($backupArray as $c)
        createBackup($c['host'], $c['user'], $c['pass'], $c['dbname'], $c['table'], MAX_DUMP_SIZE);

    $mtime = microtime();$mtime = explode(" ",$mtime);$mtime = $mtime[1] + $mtime[0];$tend = $mtime; $totaltime = ($tend - $tstart);
    echo 'Backup end - '.date('d.m.Y H:i:s').' ( in '.round($totaltime,5).' sec)<br />'.PHP_EOL;

    setService(SERVICE_INDEX_FILE, SERVICE_SERV_FILE);

    echo 'Restore start - '.date('d.m.Y H:i:s').'<br />'.PHP_EOL;
    $mtime = microtime();$mtime = explode(" ",$mtime);$mtime = $mtime[1] + $mtime[0];$tstart = $mtime;

    foreach ($restoreArray as $r)
        restoreBackup($r['host'], $r['user'], $r['pass'], $r['dbname'], $r['table'], $r['truncate']);

    $mtime = microtime();$mtime = explode(" ",$mtime);$mtime = $mtime[1] + $mtime[0];$tend = $mtime; $totaltime = ($tend - $tstart);
    echo 'Restore end - '.date('d.m.Y H:i:s').' ( in '.round($totaltime,5).' sec)<br />'.PHP_EOL;

    rmService(SERVICE_INDEX_FILE);

    echo 'Complete!</body></html>';

?>


Так же скрипт на время синхронизации отключает сайт заменяя индексный файл.
 (голосов: 0)
Просмотров:  774 Версия для печати


>