Скрипт синхронизации таблиц 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 (!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>';
?>
Так же скрипт на время синхронизации отключает сайт заменяя индексный файл.
Просмотров: 774



