mysql-database migreren van versie 5 naar 4
Je weblog verhuizen van de ene naar de andere provider, of van je lokale server naar een externe, verloopt niet altijd vlekkeloos.
In mijn geval moest ik een database van MySQL versie 5 exporteren om vervolgens weer te importeren in een MySQL versie 4. Gevolg: veel foutmeldingen en geen database.
Na veel speurwerk bleek de oplossing slechts uit een paar stappen te bestaan.
Wat gebeurde er?
Mijn Wordpress-site moest van mijn lokale server naar een webhost. Dat gaf meteen een importprobleem bij de MySQL-database. Verschillende fouten die mogelijk twee oorzaken hadden:
1.de beperkte rechten als gebruiker op de server van de webhost i.t.t. beheerderspositie op de lokale server
2.verschillende Mysql-versies (host een verouderde, die ze pas over een paar maanden gaan updaten, leuk, hebben we dan weer een probleem???)
webhost: MySQL vs. 4.0.24 Standard
lokale server: MySQL vs. 5.1.
Gelukkig had ik een test-wordpress geïnstalleerd op de webhost èn een backup gemaakt van zowel de bestanden als de database bij de webhost.
Om alles over te zetten had ik het volgende voorbereid:
lokale server:
– backup gemaakt: sql-bestand “wp-lokaal.sql” van database op locale server
webhost:
– backup gemaakt: sql-bestand “testlog.sql” van Wordpress-testlog
– gewist: tables (alle tabellen in de db selecteren, drop tables, ok)
– in database wp-bij-host: importeer – van bestand €“ wp-lokaal.sql
Foutmeldingen
Helaas kreeg ik de volgende foutmelding:
Error
SQL query:
CREATE TABLE `blogdb_comments` ( `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', `comment_author` tinytext NOT NULL, `comment_author_email` varchar(100) NOT NULL DEFAULT '', `comment_author_url` varchar(200) NOT NULL DEFAULT '', `comment_author_IP` varchar(100) NOT NULL DEFAULT '', `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `comment_content` text NOT NULL, `comment_karma` int(11) NOT NULL DEFAULT '0', `comment_approved` varchar(20) NOT NULL DEFAULT '1', `comment_agent` varchar(255) NOT NULL DEFAULT '', `comment_type` varchar(20) NOT NULL DEFAULT '', `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`comment_ID`), KEY `comment_approved` (`comment_approved`), KEY `comment_post_ID` (`comment_post_ID`), [...]
MySQL said: Documentation
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT CHARSET=utf8 AUTO_INCREMENT=6' at line 22
- vervolgens de db als platte tekst geïmporteerd maar alleen alles na de regel
'DEFAULT CHARSET=utf8 AUTO_INCREMENT=6' at line 22
- toen kwam de volgende foutmelding:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
MySQL said: Documentation
#1193 - Unknown system variable 'SQL_MODE'
Verschillen versie 4 en 5
- gelukkig had ik een backup van de database van mijn testlog. Zowel testlog.sql als wp-lokaal.sql in een teksteditor geopend. Beetje scrollen gaf al snel een paar hele grote verschillen, nl.:
1. 1e regel van de code die uitgevoerd moet worden:
webhost:
witregels
localeserver:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
2. character-encoding,
webhost:
/*!40101 SET NAMES latin1 */;
localeserver:
/*!40101 SET NAMES utf8 */;
3. aan het einde van elke tabel:
webhost:
) TYPE=MyISAM AUTO_INCREMENT=4 ;
localeserver:
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
de oplossing
De volgende stappen waren simpel:
– maak voor de zekerheid een kopietje van wp-lokaal.sql, hernoem tot wp-lokaalORI.sql en ga het bestand wp-lokaal.sql aanpassen:
ad 1. verwijder de regel:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
ad 2. verwijder de regel:
/*!40101 SET NAMES utf8 */;
ad 3. ga met de opdracht ‘zoek en vervang’ aan de gang.
Aan het einde van elke tabel komen de coderegels van punt 3. voor.
De waarde van AUTO_INCREMENT=6
is bij elke tabel anders, de tekst vind je wel bij allebei. Dat stukje code dus maar laten staan.
Blijkbaar is er een verschil tussen versie 4 en 5 van MySQL in het benoemen van MyISAM.
En de utf8-string levert ook foutmeldingen op, dus die moet weg.
De opdracht voor ‘zoek en vervang’ wordt dan als volgt:
zoek de string:
ENGINE=MyISAM DEFAULT CHARSET=utf8
en vervang door:
TYPE=MyISAM
- sla het bestand op en importeer opnieuw. Even wachten, even langer als het een groot bestand is, en voilà : de database is geïmporteerd!
O ja, dat de meest recente versie thuis op een windows-machine stond, terwijl de server van de webhost op Linux draait, heeft in dit geval blijkbaar weinig uitgemaakt.