Хорошо, я не мог оставить это без внимания.
Хотя, возможно, ошибку, которую я получил, можно было бы обработать скриптом импорта, мне кажется, что проблема кроется в структуре базы данных phpBB3 и в том, что моя кодировка базы данных — UTF8. При запуске скрипта импорта я получил следующую ошибку:
ERROR 1071 (42000) at line 1233035: Specified key was too long; max key length is 1000 bytes
Когда я посмотрел на строку 1233035 моего файла phpbb_mysql.sql (я использовал локальную копию дампа данных), я увидел следующее:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`),
ADD KEY `is_dynamic` (`is_dynamic`);
Изучив столбец config_name в таблице phpbb_config, я обнаружил, что он установлен как VARCHAR(255).
Благодаря этому посту на Stackoverflow, я узнал, что можно использовать «префиксный индекс», чтобы сократить длину ключа. Я протестировал это, и всё работает.
Для моей базы данных phpBB 3.3.8 затронутыми оказались четыре таблицы:
- phpbb_config
- phpbb_config_text
- phpbb_migrations
- phpbb_oauth_accounts
Если кто-то ещё захочет попробовать, вот шаги для таблицы phpbb_config, а в конце я приведу запросы для остальных таблиц.
Рассчитайте минимальную длину префиксного индекса с помощью этого запроса:
SELECT
ROUND(SUM(LENGTH(`config_name`)<10)*100/COUNT(`config_name`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`config_name`)<20)*100/COUNT(`config_name`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`config_name`)<50)*100/COUNT(`config_name`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`config_name`)<100)*100/COUNT(`config_name`),2) AS pct_length_100
FROM `phpbb_config`;
В моём случае结果显示, что 100% строк использовали менее 50 символов, поэтому я отредактировал файл дампа данных:
nano /var/discourse/shared/standalone/import/data/phpbb_mysql.sql
и использовал поиск Ctrl+W для следующей строки:
ALTER TABLE `phpbb_config`
затем заменил это:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`),
ADD KEY `is_dynamic` (`is_dynamic`);
на это:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`(50)),
ADD KEY `is_dynamic` (`is_dynamic`);
(50) здесь — это длина префиксного индекса.
В моём случае мне пришлось повторить процесс для остальных трёх таблиц, используя эти запросы для определения оптимальной длины префиксного ключа:
SELECT
ROUND(SUM(LENGTH(`config_name`)<10)*100/COUNT(`config_name`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`config_name`)<20)*100/COUNT(`config_name`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`config_name`)<50)*100/COUNT(`config_name`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`config_name`)<100)*100/COUNT(`config_name`),2) AS pct_length_100
FROM `phpbb_config_text`;
SELECT
ROUND(SUM(LENGTH(`migration_name`)<10)*100/COUNT(`migration_name`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`migration_name`)<20)*100/COUNT(`migration_name`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`migration_name`)<50)*100/COUNT(`migration_name`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`migration_name`)<100)*100/COUNT(`migration_name`),2) AS pct_length_100
FROM `phpbb_migrations`;
SELECT
ROUND(SUM(LENGTH(`provider`)<10)*100/COUNT(`provider`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`provider`)<20)*100/COUNT(`provider`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`provider`)<50)*100/COUNT(`provider`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`provider`)<100)*100/COUNT(`provider`),2) AS pct_length_100
FROM `phpbb_oauth_accounts`;
Вот строки поиска для остальных таблиц, чтобы сэкономить ваше время:
ALTER TABLE `phpbb_config_text`
ALTER TABLE `phpbb_migrations`
ALTER TABLE `phpbb_oauth_accounts`
Я не могу сказать, что всё уже позади, но вышеописанные действия решили мою первоначальную ошибку базы данных, и импорт запущен:
#import_phpbb3.sh
The phpBB3 import is starting...
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
importing from phpBB 3.3.8
creating users
722 / 5014 ( 14.4%) [58 items/min]
Обновление:
Скрипт импорта завершился за 9 часов 28 минут. Слава богу за Screen. Этот скрипт великолепен!
Сейчас идёт постобработка.
Есть ли где-то лог вывода скрипта импорта, или мне следовало перенаправить его в файл?