Основная проблема обновления форума IP.Board 3.x это конечно же кодировка, на версиях 2.x русскоязычные форумы в основном пользовались кодировкой cp1251. Если кодировка форума utf8, значит вы сэкономите время на конвертации базы данных.
Исходная информация о пациенте:
- Версия форума: 2.3.4
- До какой версии будем обновляться: 4.1
- На форуме сообщений: 902482
- Зарегистрировано пользователей: 30311
Приступим...
Копия форума
Для начала необходимо создать полную копию вашего форума на поддомене или в папке со всеми файлами форума и копией его базы данных. Для копии базы данных можно использовать утилиту Supex Dumper, позволяющую с лёгкостью и без проблем создавать бэкапы даже больших баз данных.
Процесс обновления будет производиться постепенно по каждой линейке: 3.0.x -> 3.1.x -> 3.2.x -> 3.3.x -> 3.4.x -> 4.0.x -> 4.1.x . Эта схема выбрана не зря - она зарекомендовался себя как самая стабильная схема обновления с минимально возможным возникновением ошибок.
Supex Dumper
Скачать программу можно на официальном сайте - https://sypex.net/, упрощённая версия программы абсолютно бесплатна, она нам вполне подойдёт. Скачиваем программу и загружаем папку sxd в корневой каталог форума. Переходим в адресной строке по адресу site.ru/sxd, вводим данные для доступа к базе и видим очень простой и удобный интерфейс, позволяющий импортировать/экспортировать базу.
SSH
Для подключения по протоколу SSH воспользуемся программой Putty, скачать которую можно также абсолютно бесплатно с сайта putty.org.ru/download.html. Подключаемся к серверу и снимаем копию с помощью команд:
Экспорт
mysqldump -u пользователь_БД -p имя_БД > имя_файла
Импорт
mysql -u пользователь_БД -p имя_БД < файл_дампа_БД
Теперь работаем только с копией форума
Удаление ненужных файлов
В IP.Board 2.x используется устаревшая структура директорий, поэтому нам необходимо почистить форум перед обновлением и удалить все ненужные для дальнейшего использования файлы и папки.
Удаляем:
- /admin
- /converge_local
- /interface
- /ips_kernel
- /jscripts
- /lofiversion
- /modules
- /resources
- /retail
- /skin_acp
- /sources
- admin.php
- index.php
- init.php
Загружаем дистрибутив IP.Board 305.zip в корень форума и распаковываем архив с заменой файлов. Проходим процесс авторизации и выставляем chmod 0777 на соответствующие папки:
- cache
- cache/lang_cache
- cache/lang_cache/1
- cache/lang_cache/1
- cache/skin_cache
- public/style_images
- public/style_css
- cache/tmp
- hooks
- uploads
- conf_global.php
Открываем файл conf_global.php и меняем строчку
$INFO['mysql_codepage'] = 'cp1251';
На
$INFO['sql_charset'] = 'utf8';
Конвертация базы данных из cp1251 в utf8
Для процесса конвертации кодировки базы, необходимо выполнить определённый запрос к каждой таблице:
ALTER TABLE название_таблицы DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci, CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci ;
либо воспользоваться скриптом, позволяющим создать такие запросы автоматически. Автор скрипта - Ritsuka. Сам скрипт:
Спойлер<?php include("conf_global.php"); $codepage='utf8'; $collation='utf8_general_ci'; $dbhost = $INFO['sql_host']; $dbuser = $INFO['sql_user']; $dbpass = $INFO['sql_pass']; $dbname = $INFO['sql_database']; $dbprefix = $INFO['sql_tbl_prefix']; if( !ini_get('safe_mode') ){ @set_time_limit(0); } @header("Content-Type: text/plain; charset=UTF-8"); $dbconn = mysql_connect($dbhost, $dbuser, $dbpass) or die( mysql_error() ); $db = mysql_select_db($dbname) or die( mysql_error() ); $sql = "ALTER DATABASE `".$dbname."` DEFAULT CHARACTER SET $codepage COLLATE $collation"; print "$sql;\n"; $sql ="SELECT table_name FROM information_schema.tables WHERE table_schema = '".$dbname."' AND table_collation NOT LIKE '".$collation."' AND table_name LIKE "."'".$dbprefix."%';"; $result = mysql_query($sql) or die( mysql_error() ); while ( $row = mysql_fetch_row($result) ) { $table = mysql_real_escape_string($row[0]); $sql = "ALTER TABLE $table DEFAULT CHARACTER SET $codepage COLLATE $collation, CONVERT TO CHARACTER SET $codepage COLLATE $collation"; print "$sql;\n"; } mysql_close($dbconn); flush(); ?>
Копируем содержание скрипта и вставляем в файл php, например convert.php. Загружаем файл на сервер и обращаемся к файлу из строки браузера. Результатом работы скрипта вы увидите запросы к базе, которые необходимо выполнить в phpmyadmin.
Совет: если у вас большая таблица сообщений, рекомендуется запрос для перекодирования этой таблицы выполнять отдельно ото всех запросов, чтобы не вызвать ошибку лимита времени на выполнение.
После перекодирования базы рекомендуется сделать её копию, например тем же Supex Dumper, чтобы у вас всегда была в наличии база в utf8. Теперь у нас всё готово для запуска процесса обновления.
Обновление форума до 3.0.5
Обращаемся в адресной строке по адресу: site.ru/admin/upgrade и следуем указаниям мастера обновления. В процессе обновления форума IP.Board до 3.0.5 у вас могут возникнуть следующие ошибки:
Ошибка: CREATE TABLE. 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 'TYPE=MyISAM' at line 33
Начиная с версии MySQL 5.5 синтаксис изменился с TYPE= на ENGINE= . Таким образом, необходимо скопировать весь лог ошибок в текстовый документ.
Исправление ошибки. В таком случае нам нужно запустить процесс обновления ещё раз. Отметьте опцию выполнения запросов вручную перед началом обновления, в этом случае у нас появится возможность самостоятельно выполнять необходимые запросы исправив TYPE=MyISAM на ENGINE=MyISAM вручную. То есть, перед выполнение предложенных мастером запросов, мы их исправляем. ВНИМАНИЕ: проверяйте каждый запрос на наличие 'TYPE=MyISAM'.
После обновления возникла другая неприятная ошибка - текст сообщений отображается знаками вопроса:
Спойлер
Идём в базу и видим точно такую же картину:
Спойлер
Делаем вывод - нужно было убедиться не только в правильном сравнении таблиц (utf8_general_ci), но и правильное отображение данных в них, хотя бы в самых основных - сообщения, темы, форумы, пользователи.
Перекодировка базы в utf8 с помощью Supex Dumper
Заливаем бэкап базы от 2.3.x и делаем экспорт базы с помощью программы Supex Dumper, выбрав в опции Кодировка значение utf8. После этого удаляем базу в phpmyadmin и импортируем её дампером, снова указав кодировку utf8 и поставив галочку на пункте Коррекция кодировки.
Вуаля:
Спойлер
Обновление форума с 3.0.5 до 3.1.4
Загружаем IP.Board 314.zip в корень форума, распаковываем архив с заменой файлов и выставляем права на указанные мастером обновления папки. Для обновления форума переходим по адресу site.ru/admin/upgrade и снова отмечаем галочку на пункте
В получаемых запросах снова меняем TYPE=MyISAM на ENGINE=MyISAM и выполняем в phpmyadmin.
Процесс обновления завершён успешно! Снимаем копию форума (без папки uploads) и базы данных и продолжаем наше обновление.
Обновление форума с 3.1.4 до 3.2.3
Технология обновления такая же - загружаем 323.zip в корень форума, распаковываем и переходим по site.ru/admin/upgrade. Начиная с этой версии редактировать запросы уже не нужно, разработчики учли этот момент и исправили запросы для более новой версии MySQL.
Обновление форума с 3.2.3 до 3.3.4
Без проблем обновляемся до IP.Board 334.zip и продолжаем наше обновление.
Обновление форума с 3.3.4 до 3.4.6
Точно также производим обновление, залив дистрибутив 3.4.6.zip в корень форума. Проблем на этом этапе не возникло. Если у вас будут проблемы при обновлении - пишите в комментариях, будем разбираться.
Обновление 3.4.6 до 4.1.4
Обновление производится по общему принципу - заливаем файлы 4.1.4.zip поверх старых с заменой существующих. Переходим по адресу site.ru/admin/upgrade. Перед обновлением рекомендуем ознакомиться с общей информацией по переходу между линейками 3.x и 4.x - Обновление с 3.x до 4.x - общая информация.
Таким образом мы произвели обновление большого форума на IP.Board 2.3.x до актуальной на данный момент версии 4.1.x с почти миллионом сообщений без потери какой-либо информации.