Ошибка базы данных при обновлении с Drupal 6.37 до Drupal 7.41
Я обновил свой сайт с Drupal 6.21 до 6.37, и он работал нормально. Теперь я пытаюсь обновить его до Drupal 7.41. Я изменил ядро в соответствии с инструкциями, которые мы выполняем для обновления, но я вижу ошибку базы данных и не знаю, как мы можем ее исправить. Я погуглил, и было несколько потоков с просьбой вручную увеличить размер поля https://www.drupal.org/node/1133024 но это не сильно помогло и показывает ту же ошибку снова.
Как я могу исправить эту ошибку?
1 answers
Заголовок ##Я вижу, что этому сообщению несколько дней, надеюсь, вы все еще смотрите.
Происходит то, что обновление пытается "изменить" поле типа в системной таблице, чтобы оно выглядело так в D7:
type | character varying(12) | not null default ''::character varying
Однако в D6 поле выглядело так:
type | character varying(255) | not null default ''::character varyin
g
Теперь у вас есть старое содержимое в этом поле, которое длиннее 12 и будет усечено, и поэтому команда ALTER TABLE завершится неудачно. Теперь это то, что я бы назвал испорченным обновлением система.
Я думаю, что есть несколько вариантов исправить это.
Сначала сделайте резервную копию вашей системной таблицы.
Затем откройте подключение к базе данных вашей базы данных drupal и проверьте, какой будет самая длинная запись. Я предполагаю, что вы используете Postgres:
select (length(type)), type from system group by type;
length | type
--------+--------
5 | theme
6 | module
Это мой вывод, теперь вы можете проверить, какая запись длиннее 12 символов, и посмотреть, содержала ли она какие-либо полезные данные.
Теперь, вероятно, самый простой способ - просто выполнить поле сами усечения:
ALTER TABLE system ALTER COLUMN type TYPE VARCHAR(12) USING SUBSTR(type, 1, 12)
Затем повторите попытку переноса, у вас все еще есть резервная копия, если что-то пойдет не так.
Второй вариант зависит от того, нужны ли вам эти определенные типы, возможно, их можно просто удалить:
select type from system where length(type) > 12;
Превратите это в инструкцию по удалению, если хотите.
Третий вариант возможен, если код не будет зависеть от размера поля, равного 12.
Код для обновления бд находится в строке modules/system/system.install 2112:
function system_update_7018() {
db_drop_index('system', 'modules');
db_drop_index('system', 'type_name');
db_change_field('system', 'type', 'type', array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''));
db_add_index('system', 'type_name', array('type', 'name'));
}
Измените длину =>12 на максимально желаемую длину и снова запустите dbupdate.
Я не могу сказать, какие последствия будет иметь каждый из подходов, и каждый из них может привести к последующим ошибкам и нарушению других вещей, поэтому вы должны попробовать их все.
Подсказка: используйте drush для обновлений, будет много повторяющихся задач, откат-обновление- откат-обновление.