Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите идей, как сделать синхронизацию баз 
V
    Опции темы
kulikoff
Дата 30.10.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



Помогите советом и идеей. У меня есть две независимые базы с описаниями товаров. Мне необходимо синхронизировать их по коду товара. Детальнее: в одной базе храниться полная инфа про овары. Мне необходиом по коду товара из одной базы в другую перекачивать некоторую инфу про эти товары. Как это лучше сделать? Мне ничего умнее, чем подключиться к одной базе, выбрать необходимую инфу, записать её в массив какой, отключиться от первой базы, подключиться ко второй и проапдейтить вторую базу информацией из этого массива. Насколько это рационально и нет ли способа попроще и понадежней?
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 30.10.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(kulikoff @  30.10.2007,  15:40 Найти цитируемый пост)
чем подключиться к одной базе, выбрать необходимую инфу, записать её в массив какой, отключиться от первой базы, подключиться ко второй и проапдейтить вторую базу информацией из этого массива

необязательно. памяти может не хватить для большой БД. учитывая, что mysql_query(конечно, если используешь MySQL) принимает в качестве параметра идентификатор подключения к БД, то в одном цикле можно перебросить все данные из одной базы в другую.
однако, я не совсе понял, что тебе требуется. если полная замена(репликация снимками - snapshot replication), то в MySQL  имеется вполне рабочий механизм для этих целей. Если же тебе необходимо сделать репликаю слиянием - т.е. данные из второй БД должны дополнить, а не заменить данные в первой БД, то, видимо, придется это делать циклом в скрипте...
PM MAIL   Вверх
flashaa
Дата 30.10.2007, 22:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 2
Всего: 25



Зачем для этого циклы, выборка? Существуют запросы, которые позволяют пересоздать таблицы по образу других и перекинуть данные. При этом никакой выборки не делается. 
Вот эти запросы (возможно есть и более оптимальные для данной задачи):
Код

create table tbl2 like tbl1;
insert into tbl2 (select * from tbl1);

PM MAIL   Вверх
skyboy
Дата 30.10.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



flashaa, только уточни, что это может помочь только в том случае, если таблицы находятся в пределах одной БД. 
Если же используются разные БД, то в запросе надо указывать не только имя таблицы, но и имя БД.
Если же БД находятся на разных серверах, то одним запросом не обойтись, насколько я знаю.
А потому предложенный вариант быстрее, но может оказаться не рабочим smile
PM MAIL   Вверх
flashaa
Дата 30.10.2007, 23:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 2
Всего: 25



Пример для работы с двумя БД (на одном хосте).
Код

use bd2;
create table tbl1 like bd1.tbl1;


Если 2 хоста, то можно слить дамп импортируемой базы, создать пустую базу, залить туда этот дамп. И вот инфа уже на одном хосте. Дальше можно использовать приведенные варианты.

Код

mysqldump -u user1 -p -h www.host1.ru bd1 > /home/user/dump.sql  // Получаем дамп базы с одного хоста
mysql -uroot -p -h www.host2.ru  // Подключаемся ко второму хосту
mysql> create database bd1; // Cоздаем базу
mysql> quit // Выходим 
mysql -u user2 -p -h www.host2.ru bd1 < /home/user/dump.sql // Заливаем дамп в подготовленную базу


Это сообщение отредактировал(а) flashaa - 31.10.2007, 12:44
PM MAIL   Вверх
kulikoff
Дата 31.10.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



Мне надо сделать обмен данными (там будет всё делаться через update) между базами, которые на разных серваках находятся...
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 31.10.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



кстати, если на разных серверах, то тебе надо делать два скрипта: один отдает данные из своей БД, а второй эти данные принимает и вставляет. т.н. РНР-туннель. ибо, если речь о хост-серверах, то хостеры обычно ограничивают доступ к mysql только localhost'ом и удаленно подключиться не получится.
мне кажется, лучшим вариантом будет формирование xml, сжатие в gzip с последующей передачей по запросу.
скрипт, который отсылает запрос, соотвественно, должен распаковать и для каждого элемента делать sql.
я к тому, что при использовании xml можно унифицировать переброску - один алгоритм будет парсить xml и формировать адекватные запросы. а если передавать чистым текстом, то с единым алгоритмом пролетаем, придется на каждую таблицу свою функцию писать...

Добавлено через 2 минуты и 7 секунд
конечно, вариант, предложенный flashaa(с использованием mysqldump) тоже годится. в таком случае самому формировать данные в виде структуры и парсить не придется - с одной стороны скрипт создает дамп, с другой стороны скрипт просто выполняет содержимое дампа - и все.
PM MAIL   Вверх
kulikoff
Дата 2.11.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



А где можно почитать пор формирование xml и сжатие? Чтоб статья нормальная была, то в Гугле искал - куча воды и ничего толкового... 
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 2.11.2007, 17:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 2
Всего: 25



Цитата(skyboy @  31.10.2007,  18:08 Найти цитируемый пост)
кстати, если на разных серверах, то тебе надо делать два скрипта: один отдает данные из своей БД, а второй эти данные принимает и вставляет. т.н. РНР-туннель. ибо, если речь о хост-серверах, то хостеры обычно ограничивают доступ к mysql только localhost'ом и удаленно подключиться не получится.


Зачем иметь дело с запросом данных с несколькими серверами? Я полагаю если БД большая, то время выполнения скрипта будет намного больше 30 секунд. Запрос по созданию БД с несколькими таблицами будет занимать ~5-10 сек, а тут добавьте ещё запросы к удаленным серверам да ещё обернутые в скрипт PHP. Зачем вообще иметь дело со скриптом PHP для этой цели? Лучший способ для этого - использование административных утилит, либо прямой доступ к операционке сервера.
Цитата(skyboy @  31.10.2007,  18:08 Найти цитируемый пост)
мне кажется, лучшим вариантом будет формирование xml, сжатие в gzip с последующей передачей по запросу.
скрипт, который отсылает запрос, соотвественно, должен распаковать и для каждого элемента делать sql.
я к тому, что при использовании xml можно унифицировать переброску - один алгоритм будет парсить xml и формировать адекватные запросы. а если передавать чистым текстом, то с единым алгоритмом пролетаем, придется на каждую таблицу свою функцию писать...

Зачем XML ? Зачем эти сложности? Обсуждаемый вопрос вполне вписывается в возможности БД, никаких XML не надо, это как микроскопом гвозди забивать, вы уж извините.  smile 
Цитата(skyboy @  31.10.2007,  18:08 Найти цитируемый пост)
 в таком случае самому формировать данные в виде структуры и парсить не придется - с одной стороны скрипт создает дамп, с другой стороны скрипт просто выполняет содержимое дампа - и все. 

Это не скрипты. Это команды при доступе через SSH. (Команды ОС *nix).
добавить сжатие с помощью них можно легко.
Код

mysqldump -uroot -p db1 | gzip > /home/dump.sql

На счет синтаксиса gzip не помню, но суть такая.
Цитата(skyboy @  31.10.2007,  18:08 Найти цитируемый пост)

конечно, вариант, предложенный flashaa(с использованием mysqldump) тоже годится.

Kulikoff, рекомендую ознакомиться с ssh-доступом. Не совсем понятно, что значит "независимые базы данных". Если бд настолько независимы, что находятся на разных хостингах, то есть смысл обратиться к одному из хостеров для получения дампа/ssh-доступа к вашему серверу. 

А вообще, надеюсь, что это разовая операция. Если не так, то надо серьезно пересмотреть организацию вашего проекта.

Это сообщение отредактировал(а) flashaa - 2.11.2007, 17:32
PM MAIL   Вверх
kulikoff
Дата 2.11.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



flashaa, спасибо большое! Эта операция не разовая, но носит очень редкий характер, не чаще раза в три-четыре месяца... Я почитаю про ssh...
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.