|
 |
Путь: Шпаргалки
Шпаргалки
Автор: - Sych
Дата публикации - 13.1.2006
Просмотров: - 4630
Религиозные войны и репликация в MySQL
С кадым днем web технологии шагают вперед а вместе с ними и задачи которые приходится решать становятся интереснее - это я к чему веду. И так наступил такой день когда надо было реализовать, вернее переделать то что до меня навояли горе программисты, синхронизацию двух баз на MySQL.
И так что у нас было и к чему мы стремимся.
Есть машинка с Win32 и MYSQL 4.0.24 (позже был заменен на 4.0.26) у хостера стоит FreBSD и MySQL 4.0.25.
Синхронизация баз была реализована полным пересозданием базы на стороне сервера даже если в базе изменилась всего одна запись.
[nb]Явный пример того что люди которые проектировали систему не были полностью в курсе своего дела[/nb]
Так как мы более образованные то знаем что в MySQL есть встроенный механизм репликации данных. Как его настроить и использовать подробно описано в [url=http://www.sql.ru/faq/faq_topic.aspx?fid=258]FAQ на сайте SQL.ru[/url].
Казалось бы что тут сложного настроили, запустили и радуемся жизни - но не все так просто как хотелось бы.
Настройка MySql заняла минут 15 - после этого перезапустили сервера и ждем чуда.... а его как всегда нету, тогда лезем и смотри что нам говорит лог
[quote]051125 10:30:00 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log '.\horoshok-relay-bin.001' position: 4MySql: ready for connections.Version: '4.0.26-nt' socket: '' port: 3306 Official MySQL binary 051125
10:30:21 Slave I/O thread: connected to master 'user@server.kyiv.ua:3306', replication started in log 'ukrserver2-bin.141' at position 63673051125
10:34:27 Error reading packet from server: Lost connection to MySQL server during query (server_errno=2013)[/quote]
После небольшой экскурсии по [url=http://dev.mysql.com]dev.mysql.com[/url= и [url=http://google.com.ua]google.com.ua[] и [url=http://google.com.ua]google.com.ua[/url] ситуация прояснилась - оказалось все просто в самам [url=http://bugs.mysql.com/bug.php?id=5588]MySQL был баг[/url] который пофиксили
[quote]Fixed in 4.0.27, 4.1.15, 5.0.13[/quote]
То что пофиксили эту проблему в новых версиях хорошо - но нам то надо использовать то что есть сейчас.
После небольшого мозгового штурма была придумана вот такая схема работы, так сказать свой трехколесный велосипед
[li]Пишем лог запросов (UPDATE, INSERT, DELETE, REPLACE) к mysql в файл (средствами mysql)[/li]
[li] останавливаем mysql - иначе мы просто не сможем удалить лог [/li]
[li]Парсим это лог построчно с помощью php и выполняем эти запросы на удаленном сервере[/li]
[li]удаляем лог[/li]
[li]запускаем mysql[/li]
На win32 машине это выглядит примерно так.
[code]net stop mysql4
c:\php\php.exe -f c:\sync_db.php
net start mysql4[/code]
[li]останавливаем mysql[/li]
[li]запускаем скрипт парсинга логов и отправки их на удаленный сервер[/li]
[li]запускаем mysql[/li]
Теперь собственно сам скрипт обработки, скрипт не полный - опущены основные проверки а так же обработака ошибок при работе скрипта.
[php]
<?php
// пусть к логу
$update_log = 'c:\update.log';
$user = '';
$passwd = '';
$base = '';
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Not connected : ' . mysql_error());
}
$db_selected = mysql_select_db($base, $link);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}
if (!file_exists($update_log)){
echo "не могу найти файл ".$update_log." проверьте настройки"; exit();
}
$sql_update = file($update_log);
foreach ($sql_update as $sql){
if (preg_match('/^(UPDATE|INSERT|DELETE|REPLACE)(.*)$/i', $sql)){
mysql_query($sql);
}
}*/
unlink($update_log);
?>[
/php]
В заключение могу сказатть только одно - велосипед получился трехколесный, но это лучше чем ничего - о недостатках работы схемы я думаю не надо гворить, скажу только одно они есть и их довольно много - но меня вполне устроил и такой вариант.
Обсудить в ФОРУМе - комментариев (15)
Путь: Шпаргалки
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|