Перенос (миграция) MySQL на MS SQL Server базы Moodle

Дано: Moodle 2.8, установленный на Windows Server 2012 R2, с базой на MySQL.
Задача: перенести базу данных на СУБД Microsoft SQL Server 2014.

Процесс будет состоять из нескольких этапов:
1. Создание базы данных
2. Подготовка сервера с MSSQL.
3. Подготовка сервера с Moodle
4. Миграция базы данных
5. Настройка Moodle на работу с базой MSSQL

Если Вы хотите не перенести базу, а установить чистый Moodle на MS SQL Server, то можно сделать все те же этапы, кроме 4го.
Примечание: если на момент переноса базы Moodle сообщает о наличии новых версий, то делать обновление не рекомендуется, лучше сделать это после переноса базы. Максимум можно обновить плагины.

1. Создание базы данных
Создаем новую базу данных в MSSQL.


Обязательно ставим параметр Is Read Committed transaction ON = True (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON).

Следующие параметры ставим только если при переносе и использовании возникли проблемы (обычно драйвер для SQL, который мы установим в шаге 3 их не требует):
- Case sensitive collation (например, Latin1_General_CS_AS)
- ANSI NULLS Enabled = True (ALTER DATABASE xxxx SET ANSI_NULLS ON)
- Quoted Identifiers Enabled = True (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)


Также создаем пользователя для этой базы с правами owner.

2. Подготовка сервера с MSSQL
По умолчанию, SQL Server слушает 1433 порт по TCP/IP, поэтому необходимо открыть этот порт в FireWall (Inbound Rules):


Также нужно проверить, что протокол TCP/IP включен: SQL Server Configuration Manager -> Network Configuration -> Protocols -> TCP/IP enabled


3. Подготовка сервера с Moodle
Для начала необходимо настроить PHP на работу с СУБД MS SQL Server. Можно пропустить этот шаг, если подобная настройка уже производилась ранее.

Нужно установить следующий драйвер: Microsoft Drivers for PHP for SQL Server
http://www.microsoft.com/en-us/download/details.aspx?id=20098
Если у Вас PHP версии 5.6, то скачиваем файл SQLSRV32.EXE, затем распаковываем куда-либо.

В PHP менеджере в IIS - подключаем извлеченную из скаченного файла архива библиотеку (либо добавляем  строку в php.ini):


(После этого в списке баз для конвертации в Moodle появится строка mssql)

Также устанавливаем в систему драйвер Microsoft ODBC Driver 11 for SQL Server https://www.microsoft.com/en-us/download/details.aspx?id=36434

Чтобы проверить, работает ли PHP с MSSQL, можно создать в IIS тестовый файл для проверки подключения к базе.

Тестовый PHP файл
<?php
$serverName = "SERVER"; //serverName\instanceName
$connectionInfo = array ("Database"=>"moodledb", 
"UID"=>"moodledbuser", 
"PWD"=>"moodledbpass");
$conn = sqlsrv_connect ($serverName, $connectionInfo);
if ($conn) {
     echo "Подключено успешно";
} else {
     echo "Проблемы с подключением";
     die (print_r (sqlsrv_errors(), true));
}
?>

4. Перенос базы
Теперь попробуем сделать непосредственно миграцию базы данных Moodle.
Заходим на сайт Moodle: Администрирование - Разработка - Экспериментальные возможности - Перенос базы данных:


На открывшейся странице в списке "Тип" выбираем "SQL Server":


Если пункта SQL Server нет, то делаем описанное выше (установка драйвера и т.п.) в шаге 3.

Заполняем поля соответственно созданной ранее базе данных в MSSQL и укажите префикс для создаваемых таблиц:


Чтобы начать конвертацию, нажимаем кнопку "Перенос данных". Что будет происходить: мудл создаст в новой базе свои таблицы и заполнит их данными из базы MySQL. Никаких перенастроек на текущем экземпляре Moodle не произойдет, он также продолжит работать на базе MySQL. Т.е. никаких изменений в мудл не будет, он только попытается создать базу. Поэтому если что-то при конвертации пошло не так, не стоит волноваться за работу Moodle.

Какие могут быть проблемы на данном этапе? В основном ошибки могут проявиться в таблицах сторонних компонентов, например, плагинов. Все схемы таблиц должны быть представлены в файле Moodle - install.xml, если какой-либо компонент не внес в него свои данные или было некорректное обновление, то при конвертации может появиться следующая ошибка:
Current database structure does not match all install.xml files.
Текущая структура базы данных соответствует не всем файлам install.xml.

Далее будут перечислены таблицы, которые мудл не смог сконвертировать с сообщением, например:
Таблица qtype_ddmatch_options: table is not expected


Какие варианты? Возможно стоит обновить указанные компоненты, чтобы они корректно прописались в схеме данных, а если этого сделать нельзя, то удалить их. Можно попытаться откатиться до предыдущей версии мудл и конвертировать ее.

После устранения проблемы, можно снова попробовать сделать перенос. Процесс переноса может длиться от нескольких минут до получаса. Операция переноса отчитается о созданных таблицах:



В данном отчете будут перечислены все созданные таблицы.

Также в процессе может возникнуть 500 ошибка. Большая вероятность, что сработал timeout. Желательно его увеличить на время переноса.

В итоге данной операции будет сформирована структура таблиц в базе MS SQL Server и перенесены данные.


5. Настройка Moodle на работу с базой MSSQL

Теперь нужно перенастроить конфигурационный файл Moodle на работу с новой базой. Открываем файл config.php в каталоге moodle и меняем строки:

$CFG->dbtype    = 'sqlsrv';         // тип базы
$CFG->dbhost    = 'localhost';      // localhost, если база на том же сервере, либо
                                    // Имя или IP адрес сервера
$CFG->dbname    = 'moodle';         // название базы данных
$CFG->dbuser    = 'yourusername';   // имя пользователя базы
$CFG->dbpass    = 'yourpassword';   // пароль пользователя базы
$CFG->dbpersist =  true;
$CFG->prefix    = 'tbl_';           // префикс таблиц (что задавали при переносе)

Теперь можно запускать Moodle, чтобы проверить его работу с новой базой.
Если были необходимы обновления, то обновляем плагины, а затем и сам мудл.

Если возникнут проблемы, можно в файле php.ini установить след.параметры
• mssql.textlimit = 20971520
• mssql.textsize = 20971520


Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

20 комментариев :

  1. у нас сервер на Винде там система универа работает с базой MSsql
    а мудл на Mysql
    мне надо
    1 соединить авторизацию
    2 отчеты по мудлу автоматом показывлись в системе универа

    ОтветитьУдалить
    Ответы
    1. 1. Зависит от того, какая авторизация в системе. Если AD, то вообще без проблем.
      2. Зависит от того, на какой технологии сделала система университета и позволяет ли она себя расширять (дописывать блоки или т.п.)

      Удалить
  2. 1 да AD
    2 система гибкая можно дописать, сис унив работает с AD если в актив директорий создать пользователя то и в сис унив она уже будет и с одним паролем пользователем и т д
    мне надо так же быть сними в команде понимайте как 3 три гада )

    ОтветитьУдалить
    Ответы
    1. Если честно, плохо понимаю Ваш язык, Вам бы более конкретнее и яснее излагаться надо, или хотя бы знаки препинания ставить...
      1) в Moodle можно включить авторизацию через LDAP (AD).
      2) либо сами дописываете систему отчетности (если это 1С:Университет), либо можно использовать платный компонент от РИБиУ (но дорого, зависит от того, насколько это нужно).

      Удалить
  3. Здраствуйте проблема с переносом базы данных Mysql на MSsql
    у меня Мудл стойт на (Убунту14.07 trasty tahr) поумолчанию в мудле перенос базы можно только усовершенствованный Mysql(радной/mysql) и MariaDB (радной/mariadb)
    подскажите что делать?
    а то сроки поджимают надо отчет сдать (

    ОтветитьУдалить
    Ответы
    1. Можно попробовать установить sqlsrv драйвер на Ubuntu через FreeTDS - http://php.net/manual/ru/ref.pdo-dblib.php

      1) Установка библиотеки Sysbase для PHP (FreeTDS)
      sudo apt-get install php5-sybase

      2) Конфигурирование файла freetds.conf для использования версии 8.0 (например, для работы с MSSQL 2008)
      sudo vim /etc/freetds/freetds.conf
      надо изменить строку:
      tds version = 8.0

      3) Рестарт Apahce
      sudo /etc/init.d/apache2 restart

      Удалить
    2. Здраствуйте спс что подсказали как и что делать по установке библиотеки на убунту серевер

      какие данные переносит мудл? и в каком виде таблиц будет в отчете ???
      я правильно понимаю они будут в таблице типа так username,first_name,last,name,email,city,country,group, ?????
      Если нет то плз скинте как представить себе Экспорт данных в Мудле вместе с оценками итогами курсов. обучения и какой. преподаватель там был у пользователя?
      Вообщем мне надо это для переноса данных на MSSQL server каторый должен отаброзить всю мудлятину пользователя (извиняюсь за вырожения) каторый уже ранее имеет в свою очередь аккаунт на катором отаброжаться должна вся его деятельность
      надеюсь я вас не запутал)

      Удалить
    3. > какие данные переносит мудл?
      Встроенная функция "Перенос базы" дублирует все данные из MySQL в MSSQL, структура базы и таблиц не изменится.

      > и в каком виде таблиц будет в отчете ???
      В каком отчете? При переносе все данные сохраняются (включая сведения об оценках).

      > надеюсь я вас не запутал)
      Запутал. Я не понимаю, что Вы конкретно хотите сделать, т.к. Вы не можете нормально сформулировать свою проблему.
      Если Вы будете делать всё по указанной в статье инструкции, то перенос данных ничего не изменит в Вашем Moodle, просто переключитесь на базу MSSQL после переноса и все сведения по пользователю по-прежнему будут доступны через стандартный интерфейс Moodle, смысла лезть в саму базу нет.
      Если Вам нужно выгрузить сведения о пользователе - это можно сделать через функцию выгрузки в Excel.
      Если Вы пишете свою программу на каком-либо языке программирования и хотите подключиться и извлечь какие-либо данные из базы, то придется самостоятельно анализировать структуру базы, либо посмотреть PHP-код Moodle и найти к каким таблицам он обращается при выводе каких-либо отчетов.
      Всё, на этом моя "телепатия" иссякла...

      Удалить
    4. *Если Вы пишете свою программу на каком-либо языке программирования и хотите подключиться и извлечь какие-либо данные из базы, то придется самостоятельно анализировать структуру базы, *либо посмотреть PHP-код Moodle и найти к каким таблицам он обращается при выводе каких-либо отчетов.
      Да вы хорошо подметили
      собственная разрабротка на С++ MSSQL
      и надо выгрузить от мудла нужные таблицы...

      *Всё, на этом моя "телепатия" иссякла...
      Бальшое спасибо за за ваше внимания

      Удалить
    5. Тогда Вам придется открыть базу и найти нужные таблицы по логике соответствующие тем данным, которые нужны. Когда мне нужно было найти данные пользователей, по логике вычислила, что нужна таблица users. Если найти не сможете, то лучше спросить на официальном форуме, может там знают.

      Удалить
  4. Здравствуйте.
    "Также создаем пользователя для этой базы с правами owner." (последнее предложение перед пунктом 2)
    Можете более подробно объяснить где/как это делать.

    ОтветитьУдалить
    Ответы
    1. Посмотрите вот эту статью - http://kooboo-cms.ru/articles/detail/create-sql-database-for-kooboo/ (моя же статья по созданию базы в SQL Server, раньше я их публиковала на том сайте).
      Там как раз описано, как создать пользователя к базе: сначала создается логин, затем на его основе пользователь базы с правами db_owner.

      Удалить
  5. Анонимный9 июня 2017 г., 14:25

    Добрый день !
    Статья очень познавательная, СПС !
    Мне нужно перенести всю базу moodle на локальный компьютер.
    Я запакопал rar - moodle и moodledata перенёс на локальный компьютер, так же при помощи phpmyadmin сделал копию базы (moodle.sql) так же перекинул на локальный компьютер.
    Теперь как я понял мне нужно файл config.php отредактировать и поменять там $CFG->wwwroot = 'localhost'; ?
    и что ещё нужно поменять что бы moodle локально заработал ?
    Подскажите последовательность действий, пожалуйста.
    Мне это всё нужно что бы проверить смогу ли я без проблем обновиться с 2.7 до 3.1
    И вот ещё вопрос (замучил уже наверное , простите)
    когда захожу Среда(версии ПО) в moodle так всегда присутствовали 2 проблемы (но всё работает нормально)
    Может подскажите как их решить:
    1)
    unsupported_db_table_row_format непрохождение данного теста указывает на возможную проблему
    Your database has tables using Antelope as the file format. You are recommended to convert the tables to the Barracuda file format. See the documentation Administration via command line for details of a tool for converting InnoDB tables to Barracuda.
    2)php_setting opcache.enable следует изменить параметр PHP.
    Кэширование байт-кода улучшает производительность и уменьшает требования к памяти. Расширение OPcache языка PHP рекомендуется к установке и полностью поддерживается.
    Заранее спасибо за любую информацию.

    ОтветитьУдалить
    Ответы
    1. Установка мудл локально особо ничем не отличается от любой другой его установки, поэтому рекомендую прочитать статью по установке - http://www.e-du.ru/2016/02/install-php-moodle-windows-iis.html (пропускаете только момент со скачиванием дистрибутива мудл, т.к. нужные папки у Вас уже есть).
      Там написано, что куда прописать в настройки.
      Про сообщения:
      1) у меня такого не было, но на форумах тема уже обсуждалась:
      - https://moodle.org/mod/forum/discuss.php?d=312237
      - https://moodle.org/mod/forum/discuss.php?d=314802

      2) читайте здесь docs.moodle.org/32/en/OPcache (там написано, что если PHP версии 5.5 и выше, то можно проигнорировать этот параметр)

      Удалить
  6. Анонимный13 июня 2017 г., 12:18

    спасибо огромное ! только вопрос, инструкция на windows 10 подойдёт ? (локально хочу дома установить, а у меня 10), а на работе , да как и у Вас - Windows Server 2012 R2.
    И заработает ли у меня дома всё это, если я поменяю config.php с сервера на пути куда скину папки moodle и moodledata и укажу wwwroot - ip домашнего компьютера, а так же в moodle.sql (базе данных), поменяю авто заменой все пути на также свой ip компа,а после поставлю дома phpmyadmin и просто загружу эту базу ? ещё раз извиняюсь что выношу мозг! ))
    Как думаете заработают эти манипуляции ?

    ОтветитьУдалить
    Ответы
    1. На Windows 10 также будет работать, если всё нормально в настройках пропишете.

      >> в moodle.sql (базе данных) поменяю авто заменой все пути на также свой ip
      А вот это лишнее. Просто в конфиге укажите новый адрес системы ($CFG->dbhost). Мудл сам умеет отлавливать смену адреса сайта (если конечно, где-то в курсах преподаватели "жестко" не забили URL в виде абсолютного пути).

      >> поставлю дома phpmyadmin
      Зачем phpmyadmin? Или Вы будете ставить апач вместо использования IIS? А базу же можно загрузить через стандартное приложение MySQL Workbench? Тут правда кому как удобнее.

      Удалить
  7. Анонимный13 июня 2017 г., 14:53

    phpmyadmin, там слева выбираю базу moodle и просто жму импорт, думал тоже самое сделать у себя дома только нажать экспорт.
    И да большое спасибо ещё раз за информацию что авто замену делать не нужно )
    Кстати Вы не сталкивались, когда архивируешь на сервере 2 папки эти - возникают ошибки, я на форуме рылся там сказано про нужно как я понял архивировать в binary, тогда ошибок не будет.
    Где это вообще выставить ?
    MySQL Workbench, спасибо за наводку попробую сегодня дома поставить !
    Нет у меня есть локальная версия 2.7 попробую значит её поставить и после того как она встанет, перекинуть 2 папки и изменить конфиг.
    Вообще я путаюсь очень в последовательности ;) У Вас оч здорово написано как обновлять !, была бы моя воля, я бы уже обновил просто ) сложности как раз в том что бы локально её поставить обновить и глянуть всё ли работает, потому такие проблемы )

    ОтветитьУдалить
    Ответы
    1. >> на сервере 2 папки эти - возникают ошибки
      У меня обычно возникают ошибки при архивировании, если сайт активно используется в этот момент и ругается на кэш-файлы (которые в процессе архивирования могут просто самоудалиться). Обычно не обращаю на это внимание. Поэтому нужны подробности, что именно за ошибки.

      >> я бы уже обновил просто
      Если мне лень тестировать, то выбираю неактивный период (например, ранее утро или ночь), накатываю обновление прямо на рабочий сервер (предварительно сделав конечно бэкап). Если всё нормально, то оставляю. Если какие-то проблемы, то просто сразу откатываюсь на резерв.

      >> сложности как раз в том что бы локально её поставить обновить и глянуть всё ли работает
      У меня для этого есть виртуальный сервер, который по конфигурации полностью повторяет рабочий сервер, даже домен сайта тот же. Поэтому для тестов, просто беру и перекидываю на него нужные папки, переношу базу через бэкап и пробую (в этом случае даже конфиги править не нужно).

      Удалить
  8. Анонимный14 июня 2017 г., 13:12

    кстати это хорошая идея ! как виртуальный сервер создать есть какая нибудь инструкция ? мне для этого ещё такой же сервер нужен ? или на базе того что для moodle ?

    ОтветитьУдалить
    Ответы
    1. Ну это уже вопрос, совсем не относящийся к Мудл. Изучайте тему виртуализации. У меня дома отдельный физический сервер с Hyper-V для таких игрушек (т.к. веду много проектов). Если предпочитаете Windows-системы, то можно смотреть в сторону того же Hyper-V.
      Если рабочий мудл стоит на виртулке, то вообще проблем быть не должно, просто копируете виртуальную машину и переносите. Если мудл на хосте (на реальной системе), то можно снять образ системы и преобразовать в виртуальную машину. Или можно просто взять любое ПО для виртуализации и установить виртуальную систему с нуля... вариантов полно, тема обширная, относится к системному администрированию.

      Удалить