The Magento 2.x data migration tool works well, but sometimes has issues with very large tables on lower end servers that don’t have a ton of memory available.
We ran into this issue when migrating a client this morning, specifically in the code here:
vendor/magento/data-migration-tool/src/Migration/ResourceModel/Adapter/Mysql.php on line 161
Here was the associated code:
protected function insertMultiple($documentName, $records)
{
$bind = [];
$values = [];
$colNum = count($records[0]);
$fields = array_keys($records[0]);
foreach ($records as $record) {
foreach ($record as $value) {
$bind[] = $value;
}
$values[] = '(' . implode(',', array_fill(0, $colNum, '?')) . ')';
}
if ($values && $fields) {
$insertSql = sprintf(
'INSERT INTO %s (%s) VALUES %s',
$documentName,
sprintf('`%s`', implode('`,`', $fields)),
implode(',', $values)
);
$statement = $this->resourceAdapter->getConnection()->prepare($insertSql);
$statement->execute($bind);
}
return true;
}
The error was happening when a lot of data was hitting the $statment->execute($bind);
So, we updated the function to run single inserts for each row (MySQL documentation warns us that this is much slower, but at least it works!):
protected function insertMultiple($documentName, $records)
{
$colNum = count($records[0]);
$fields = array_keys($records[0]);
foreach ($records as $record) {
$row_bind = [];
$row_values = [];
foreach ($record as $value) {
$row_bind[] = $value;
}
$row_values[] = '(' . implode(',', array_fill(0, $colNum, '?')) . ')';
$insertSql = sprintf(
'INSERT INTO %s (%s) VALUES %s',
$documentName,
sprintf('`%s`', implode('`,`', $fields)),
implode(',', $row_values)
);
$statement = $this->resourceAdapter->getConnection()->prepare($insertSql);
$statement->execute($row_bind);
}
return true;
}
Are you having issues migrating your data to a Magento 2.x site? Contact Us and we will get you all squared away! We are Magento Certified and can tackle any issues you might have!
Share: