Ошибка базы данных при обновлении с Drupal 6.37 до Drupal 7.41


Я обновил свой сайт с Drupal 6.21 до 6.37, и он работал нормально. Теперь я пытаюсь обновить его до Drupal 7.41. Я изменил ядро в соответствии с инструкциями, которые мы выполняем для обновления, но я вижу ошибку базы данных и не знаю, как мы можем ее исправить. Я погуглил, и было несколько потоков с просьбой вручную увеличить размер поля https://www.drupal.org/node/1133024 но это не сильно помогло и показывает ту же ошибку снова.

enter image description here

Как я могу исправить эту ошибку?

Author: TBI Infotech, 2016-01-25

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 для обновлений, будет много повторяющихся задач, откат-обновление- откат-обновление.

 1
Author: Michael, 2016-02-18 12:08:25