Ok, non sono riuscito a lasciar perdere.
Sebbene supponga che sia possibile che l’errore che ho ricevuto possa essere gestito dallo script di importazione, mi sembra davvero un problema con la struttura del database di phpBB3 e il fatto che la mia collation del database sia UTF8. Ho ricevuto questo errore eseguendo lo script di importazione:
ERROR 1071 (42000) at line 1233035: Specified key was too long; max key length is 1000 bytes
Quando ho guardato la riga 1233035 del mio file phpbb_mysql.sql - sto usando una copia locale del dump dei dati - ho visto questo:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`),
ADD KEY `is_dynamic` (`is_dynamic`);
Guardando la colonna config_name nella tabella phpbb_config, ho scoperto che è impostata su VARCHAR(255).
Grazie a questo post su Stackoverflow, ho scoperto che posso usare un “prefisso di indice” per ridurre la lunghezza della chiave. L’ho testato e funziona.
Per il mio database phpBB 3.3.8, c’erano in realtà quattro tabelle interessate:
- phpbb_config
- phpbb_config_text
- phpbb_migrations
- phpbb_oauth_accounts
Se qualcun altro vuole provarci, ecco i passaggi per la tabella phpbb_config, e includerò le query per le altre tabelle alla fine.
Calcola il valore più corto per il prefisso di indice usando questa query:
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`;
Nel mio caso, ha mostrato che il 100% delle righe utilizzava meno di 50 caratteri, quindi ho modificato il mio file di dump dei dati:
nano /var/discourse/shared/standalone/import/data/phpbb_mysql.sql
e ho usato la ricerca Ctrl+W per la seguente stringa:
ALTER TABLE `phpbb_config`
quindi ho cambiato questo:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`),
ADD KEY `is_dynamic` (`is_dynamic`);
in questo:
ALTER TABLE `phpbb_config`
ADD PRIMARY KEY (`config_name`(50)),
ADD KEY `is_dynamic` (`is_dynamic`);
Il (50) qui è la lunghezza del prefisso di indice.
Nel mio caso, ho dovuto ripetere il processo con le altre tre tabelle usando queste query per ottenere la lunghezza ottimale della chiave di prefisso:
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`;
Ecco le stringhe di ricerca per le altre tabelle per farti risparmiare tempo:
ALTER TABLE `phpbb_config_text`
ALTER TABLE `phpbb_migrations`
ALTER TABLE `phpbb_oauth_accounts`
Non dirò di essere fuori pericolo, ma quanto sopra ha risolto il mio errore iniziale del database e l’importazione è in corso:
#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]
Aggiornamento:
L’importazione dello script è terminata in 9 ore e 28 minuti. Meno male che c’era Screen. Questo script è fantastico!
Il post-processing è ora in corso.
C’è un log dell’output dello script di importazione da qualche parte, o avrei dovuto reindirizzarlo a un file?