X

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

Задача: По крону сделать бэкап указанных таблиц и восстановить их из бэкапа.

Что-то похожее на синхронизацию: делаем бэкап одной базы, восстанавливаем в другую:

    <?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 (!emptyempty($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 (emptyempty($_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>';  
      
    ?>

Так же скрипт на время синхронизации отключает сайт заменяя индексный файл.

Тэги: sync

Комментарии (2)

  • Чувак, это не синхронизация. Это бэкап и восстановление. Синхронизация это когда у тебя есть n баз и ты поддерживаешь их одинаковость по какому-либо правилу в онлайне.

    • Чувак, синхронизация это приведение объектов к одному виду. Если таблица А имеет идентичные значения в таблице Б, то такие таблицы синхронизированы. Базы данных и тем более онлайн, тут ваще не при делах :)

      А вообще, это какой-то странный старый пост, со старым скриптом. Который можно заменить простой bash командой
      mysqldump -u dbuser -p dbpass database_name table1 table2 table3 | mysql -h remote_host -u dbuser -p dbpass remote_database_name

      Я не помню, что это за скрипт и зачем он тут, но пусть будет.. :)