::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Разработка CRM для туристического бизнес...
  - тестування по прив"язці до часу...
  - СРОЧНО! Требуется талантливый PHP програ...
  - Оплачу FLASH-сайт под ключ.
  - выборка одним запросом нескольких похожи...
  - функции верификации строк.
  - Помогите вытянуть скрипт отправки почты ...


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Шпаргалки

Шпаргалки

Автор: - 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.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005