Прехвърляне на база данни от SQLite към MySQL с помощта на MediaWiki като пример

В тази статия ще дадем някои общи съвети, докато разглеждаме мигрирането на сайт към друга СУБД, като използваме примера на MediaWiki, който е създаден за Wikipedia и се разпространява безплатно.

И двете безплатни отворени СУБД SQLite и MySQL са много популярни, имат своите предимства, но са предназначени за различни цели, така че ако целите или условията на нашия проект са се променили, тогава става необходимо да преминете от една СУБД към друга. Може би сме искали да получим отдалечен достъп до базата данни, или да разграничим правата за достъп до таблиците, или да използваме някакъв специфичен административен инструмент - може да има няколко причини за превключване. За съжаление все още не е намерено просто решение на тази задача, което да изпълнява работата чрез натискане на един бутон, но простият алгоритъм, описан в статията, ще ви позволи да направите всичко сами, бързо и безплатно.

И така, имаме сайт на MediaWiki, използващ SQLite, който решихме да мигрираме към MySQL. За да избегнете проблеми, силно се препоръчва да използвате една и съща версия на двигателя по време на прехода, тъй като при промяна на версиите структурата на базата данни може да се промени. Като цяло можете да използвате същия набор от файлове на MediaWiki само като промените променливите за достъп до базата данни в конфигурационния файл LocalSettings.php (те имат общо начало: $wgDB. ). Използвайки същата версия, не е нужно да се притесняваме за прехвърляне на структурата, остава само да прехвърлим съдържанието на таблиците. Най-простото решение би било да изхвърлите съдържанието на SQLite като текстов файл с поредица от SQL команди и след това да изпълните тези команди в MySQL. Има обаче

Съдържание

В нашата конкретна задача няма значение по какво се различава функционалността на SQLite и MySQL, за нас е важно как се различават SQL командите в тези СУБД, защото в крайна сметкаработата с всяка СУБД се свежда до изпълнение на последователност от тези команди в нейната среда. С тяхна помощ се създават, модифицират и изтриват всички обекти, както и се записват и четат данни. Въпреки съществуващите стандарти на езика SQL, всяка СУБД допринася с нещо свое за неговата реализация. СУБД, които обмисляме, не отговарят на стандартите по различни начини, така че когато подготвяте SQLite команди за MySQL, ще трябва да:

  • Изтриване на редове (Някои парсери също премахват редовете "CREATE UNIQUE INDEX" и "COMMIT;", но това не е необходимо, тъй като и двете команди са в MySQL.):
  • ПРАГМА
  • ЗАПОЧВАНЕ НА ТРАНЗАКЦИЯ;
  • sqlite_sequence
  • ИЗТРИВАНЕ ОТ sqlite_sequence
  • INSERT INTO sqlite_sequence
  • Замени:
  • AUTOINCREMENT до AUTO_INCREMENT
  • Всички булеви стойности на полето от 't' до '1' и от 'f' до '0'
  • Символът " с ` - т.е. заменете двойните кавички с апостроф (освен в текстови полета, където тези знаци могат да се използват като част от текста).

Преди да започнете да мигрирате сайт на MediaWiki, добра идея е да прочетете общите указания на официалния сайт.

Тъй като механизмът на MediaWiki прилага механизъм за архивиране на базата данни в XML файл, който не зависи от използваната база данни, преходът е значително опростен. Използването му ще реши основния ни проблем: XML представянето ви позволява да заобиколите проблемите с кавичките в текстовите полета и използването на SQL команди в тях. В този файл обаче се качват само съдържанието на wiki страниците и историята на техните промени, той не включва данни от други таблици. Следователно нашият алгоритъм ще се състои от три етапа, с по три стъпки във всеки. Първата стъпка ще бъде

1. Подготовка на нов сайт

До пълното конфигуриране и тестване на новия сайтстарата трябва да е в работно състояние. Ето защо ние

1.1.Превключете текущия сайт в режим само за четене. За целта е достатъчно да дефинирате променливата $wgReadOnly в конфигурационния файл, като зададете съобщението, което ще се появява, ако някой иска да редактира статията. Например:

1.2.Дублирайте файловете на текущия сайт, с изключение на файла с базата данни SQLite. Вместо да копирате файлове и директории, можете да създадете меки връзки към тях. За да автоматизирате този процес, можете да вземете скрипта create_wiki.sh, написан от bash, за да създадете wiki ферма.

1.3.Стартирайте инсталатора на MediaWiki през уеб интерфейса и завършете инсталационния процес. Това ще създаде необходимата структура на базата данни в MySQL.

Сега можем да започнем

2. Миграция на страниците на сайта

2.1.Изхвърляне на съдържанието на wiki страниците от живия сайт в XML файл с помощта на обикновен скрипт за архивиране DumpBackup.php.

2.2.Импортираме данни в нов сайт с помощта на importDump.php (не работи бързо). Ако уикито е много голямо, тогава можете да използвате MWDumper, специално написан инструмент на Java. Данните за свързване с базата данни, както тук, така и в предишната стъпка, се вземат от конфигурационния файл LocalSettings.php , така че трябва да се стартират от съответните директории на стария и новия сайт.

2.3.Проверете колко успешно са преместени страниците: отидете на нов сайт, прегледайте няколко статии, които са трудни за форматиране, уверете се, че текстът не е изкривен.

Сега най-трудното свърши

3. Мигриране на останалите таблици

3.1.Вземете SQLite таблици като SQL команди. За да направите това, можете да използвате например помощна програма сsqliteman графичен интерфейс, вземане на таблиците поотделно - това ще бъде най-лесният начин. Можете също така да изпълните командата dump в sqlite shell, за да получите цялата база данни:

И от получения дъмп изберете команди за таблиците, които ни интересуват, и ги прехвърлете в един файл (да речем sqlite_tables.sql) за последващо преобразуване.

3.2.Нека преобразуваме SQL командите от SQLite в MySQL с помощта на анализатор, например parse_sqlite_sql.py :

Този анализатор на Python създава два изходни файла, групиращи отделно sql команди за данни и за структурата на базата данни. Ние се интересуваме само от данни (вече сме се погрижили за съвпадението на структурите). След преобразуването командите изглеждат така:

3.3.Изпълнение на команди в MySQL. Възможно е на малки части да се проследи резултатът или всички наведнъж, в уеб интерфейса на phpMyAdmin или в конзолата:

където UserName и DBName трябва да са същите като в LocalSettings.php на новия сайт.

Други таблици се прехвърлят по същия алгоритъм. Ако има проблеми при прехвърлянето на някои таблици, тогава обърнете внимание кои таблици са: може би данните в тях не са необходими. Някои таблици могат да бъдат възстановени с помощта на скриптовете за поддръжка, намерени в директорията за поддръжка. Например последните промени се възстановяват от скрипта rebuildrecentchanges.php.

Ако сме използвали софтуер на трета страна, различен от самата MediaWiki машина, като например търсачката Sphinx, тогава също трябва да запомним да я преконфигурираме или дори да я инсталираме отново, какъвто е случаят със Sphinx.

В заключение могат да се добавят още няколко думи за тези, които използват

Ако сте изправени пред подобна задача, но за различен двигател, тогава същността на решението и трудностите, които ще срещнете, остават същите. Следователно предложените тук решенияще ви помогне много. Може би единствената разлика и основната трудност ще остане в прехвърлянето на текста на статиите. Въпреки това е вероятно вашият двигател също да има начини за транспортиране на съдържание през междинни структури чрез създаване и зареждане на дъмп на база данни. Първата стъпка е да проверите тази възможност. Ако това не е така, тогава можете да напишете малка програма с връзка към двете СУБД. Тъй като SQLite и MySQL са много разпространени, мисля, че няма да е грешка да се каже, че във всички широко използвани езици за програмиране има библиотеки за работа с тях. Поне за PHP, C, C#, Perl, Python, Java е така.

В случая с MediaWiki, както видяхме, преходът от SQLite към MySQL не е толкова труден и дълъг.