Microsoft SQL Server для синхронизации MySQL через php - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь синхронизировать базу данных mssql (размещенную в офисе клиента) с базой данных mysql, которая находится на платформе хостинга, где находится веб-сайт клиента.

Я уже успел успешно синхронизировать три из четырех таблиц (структура и данные) базы данных. Проблемы возникают, когда я пытаюсь синхронизировать 4-ю таблицу, в которой содержится около 2300 записей с 2 ​​полями BLOB с изображениями каждого продукта. Первое, что я попробовал, было

SELECT * FROM chunkyTable

но многие тайм-ауты были запущены (несмотря на то, что я установил "mssql.timeout" на 7200.

Итак, я настроил постраничную синхронизацию, которая читает 10 записей каждого запроса и вставляет их в базу данных mysql.

Все работает гладко для первых 150 записей. Из журнала, который я делаю, я вижу, что для первых 15 страниц синхронизация 10 записей занимает от 2 до 6 секунд (учтите, что с веб-сайта, который я подключаю к серверу mssql, который подключен к обычному ADSL, который представляет собой довольно большое узкое место) ). С 16-й страницы время, необходимое для синхронизации 10 записей, увеличивается до 5:30 секунд. Сначала я подумал, что это связано с тем, что в первых 150 записях не было сохранено ни одного изображения, поэтому я проверил, что было вставлено в mysql, и обнаружил, что ничего не было вставлено!

Это привело меня к мысли, что, возможно, mysql имеет некоторые ограничения на длину аргумента, передаваемого функции mysql_query (). Способ составления запроса:

INSERT INTO chunckyTable(field1,field2,...fieldN)
VALUES (val1,val2,val3,...,valN),(val4,val5,val6,...,valM),

и т. Д.

повторяется для 10 записей.

Знаете ли вы, есть ли какие-то ограничения на максимальную длину строки sql, передаваемой в функцию mysql_query (я посмотрел на вывод phpinfo(), но в этой теме нет настроек)?

У вас есть подобный опыт с такой синхронизацией? Любая помощь будет принята с благодарностью!

Спасибо, Люк

Ответы [ 2 ]

0 голосов
/ 25 ноября 2011

Я нашел, что вызвало ошибку. На самом деле было 2 вещи.

  1. Я составлял запрос следующим образом: $ query = "\" ". Mysql_real_escape_string ($ val)." \ "", Но \ " позволяло сбою запроса.
  2. Mysql @@ global.max_allowed_packet на моем сервере имеет значение 1 МБ, но в каждой строке содержится 2 поля больших двоичных объектов с изображением ~ 150 КБ. Таким образом, каждая строка занимает более 300 КБ, так как есть также данные записей, и когда я упаковывал вставку из 10 строк в одном запросе, я превысил предел max_allowed_packet. Чтобы решить эту проблему, я вставляю строку один за другим

В любом случае, спасибо за совет, который вы дали мне!

0 голосов
/ 24 ноября 2011

Что произойдет, если вы вручную сбросите mssql / insert в mysql на одну строку?Также - вы можете попробовать mysqli (обратите внимание, что я имею в виду Улучшенное расширение mysql), в любом случае это должно быть лучше, чем старое расширение mysql.

...