stwa
Новичок
Всем привет.
Есть 2 БД.
Одна MySQL, другая на MS SQL
В MS SQL есть хранимая процедура, которая возвращает содержимое некой таблицы.
Аналогичная таблица с такими же полями есть в MySQL.
Задача - обновить все строки в таблице MySQL, если они отличаются от строк в таблице на MS SQL.
Пока интересует 1 часть задачи, а именно как найти строки, которые надо обновить.
Кол-во записей в каждой таблице порядка 300 тыс., тестирую на тестовой базе с кол-вом записей в 30 тыс.
В каждой таблице есть уникальное поле, по которому можно сравнивать записи
Работаю через PDO.
Первое что приходит в голову - получить таблицы из обеих БД с помощью fetchAll в массивы, а потом уже сравнивать эти массивы.
После сравнения у нас будет массив ключей строк (индексов) из таблицы первоисточника (MS SQL), которые отличаются от второй таблицы.
при выполнении через пару минут получаю ошибку:
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in...
ошибка возникает вот из-за этой конструкции:
потому что простая итерация по массиву
отработает без ошибок.
Больше всего меня смущает, что ошибка в MySQL
Погуглив, нашел советы по увеличению max_allowed_packet в настройках mysql.
Поэтому 2 вопроса:
1. как работает fetchAll в PDO? Я считал, что выбираются все записи и сохраняются в массив. Потом можно работать с массивом и обращений к базе не будет. Но только я делаю поиск по массиву выскакивает ошибка MySQL
2. Правильный ли путь я вообще выбрал, выбирая сначала ВСЕ записи в массив?
Может кто уже решал подобную задачу, откликнитесь
Есть 2 БД.
Одна MySQL, другая на MS SQL
В MS SQL есть хранимая процедура, которая возвращает содержимое некой таблицы.
Аналогичная таблица с такими же полями есть в MySQL.
Задача - обновить все строки в таблице MySQL, если они отличаются от строк в таблице на MS SQL.
Пока интересует 1 часть задачи, а именно как найти строки, которые надо обновить.
Кол-во записей в каждой таблице порядка 300 тыс., тестирую на тестовой базе с кол-вом записей в 30 тыс.
В каждой таблице есть уникальное поле, по которому можно сравнивать записи
Работаю через PDO.
Первое что приходит в голову - получить таблицы из обеих БД с помощью fetchAll в массивы, а потом уже сравнивать эти массивы.
После сравнения у нас будет массив ключей строк (индексов) из таблицы первоисточника (MS SQL), которые отличаются от второй таблицы.
PHP:
//msRows - массив, полученный с помощью fetchAll из MS SQL
//myRows - массив, полученный с помощью fetchAll из MySQL
$foundKeys = array(); //массив ключей строк, которые надо обновить
foreach ($msRows as $key => $msRow) {
if(!in_array($msRow, $myRows))
$foundKeys[] = $key;
}
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in...
ошибка возникает вот из-за этой конструкции:
PHP:
in_array($msRow, $myRows)
PHP:
foreach ($msRows as $key => $msRow) {
}
Больше всего меня смущает, что ошибка в MySQL
Погуглив, нашел советы по увеличению max_allowed_packet в настройках mysql.
Поэтому 2 вопроса:
1. как работает fetchAll в PDO? Я считал, что выбираются все записи и сохраняются в массив. Потом можно работать с массивом и обращений к базе не будет. Но только я делаю поиск по массиву выскакивает ошибка MySQL
2. Правильный ли путь я вообще выбрал, выбирая сначала ВСЕ записи в массив?
Может кто уже решал подобную задачу, откликнитесь