Как стать автором
Обновить

redmine переезд с postgres на mysql

Решил поделиться решением проблемы. Случилось, а точнее — случился казус. Быстро поднял людям redmine, чтобы показать интерфейс и прочее, ознакомить, так сказать, с redmine. Все поднимал быстро, на nginx и на postgres, а они начали пользоваться и достаточно много завели записей, около 1000, кролики. В общем, задача перенести все на другой сервер в mysql и на apache. Поехали.

Для переноса нам потребуется новый готовый сервер, благо он есть. На этом сервере мы займемся базой, так как конфиги можно переписать и перекинуть без проблем, а вот из одной базы в другую — тут есть неприятные моменты.

Вот тут, на хабре, писалось про подобный переезд, только там был друпал.

Итак, сначала нам потребуется сделать дамп всей базы постгреса. Делаем он так.

Идем на сервер, где стоит redmine с postgres и выполняем в консоли:

pg_dump -U postgres --attribute-insert -d redmine_db > redmine_db.sql

Так как у нас есть уже база mysql на новом сервере, то нам не надо делать импорт схемы базы и склеивать все дампы. Итак, мы получили дамп postgres, теперь нам надо от него оставить только строки с INSERT, а все другие запросы и комментарии удалить.

Все можно делать и руками, текстовыми редакторами, но мы пойдем bash-путем. Сразу скажу, что тут есть моменты с кавычками и их отсуствием, они выявились при импорте.

Собственно в данном случае — все косяки нашел и внес в скрипт.

Так же, на новый сервер рекомендую поставить phpmyadmin или что-то подобное, для удобства импорта и определения ошибок. Не только для этого конечно.

Первое — это забираем наш дамп файл. Пользуюсь mc для этого (sFTP).

Второе — установим phpmyadmin на новый сервер.

Установить phpmyadmin
Два варианта.

1 — yum install phpmyadmin (epel репозиторий нужен);

2 — Установка руками. Так как мы торопимся, то поставим все руками.

Итак, то что нам потребуется из дополнительного:

yum install -y php dejavu-fonts-common dejavu-sans-fonts libXpm libmcrypt libtidy libzip php-bcmath php-cli php-common php-gd php-mbstring php-mcrypt php-mysql php-pdo php-php-gettext php-tcpdf php-tcpdf-dejavu-sans-fonts php-tidy php-xml t1lib unzip


Скачиваем сам phpmyadmin:
wget https://files.phpmyadmin.net/phpMyAdmin/4.4.12/phpMyAdmin-4.4.12-all-languages.zip

Распаковываем:
unzip phpMyAdmin-4.4.12-all-languages.zip

Теперь перенесем все на наш веб-сервер:
mkdir /var/www/html/phpmyadmin

cp -av phpMyAdmin*/* /var/www/html/phpmyadmin

Идем в папку с phpmyadmin:
cd /var/www/html/phpmyadmin

Подготовимся к настройке: создадим папку и положим в нее временный конфиг, который потом переместим:

mkdir config
chmod o+rw config
cp config.sample.inc.php config/config.inc.php
chmod o+w config/config.inc.php

Из-за того, что у нас основной, так сказать, веб-сервис это redmine, нам нужно создать либо еще один виртуальный сервер, либо воспользоваться алиасами. Внимание — тут я поменял порт, это можно дополнить в конфиге httpd:
mcedit /etc/httpd/conf/httpd.conf

Listen 80
Listen 88

Так же в iptables:
mcedit /etc/sysconfig/iptables

-A INPUT -p tcp -m state --state NEW -m tcp --dport 88 -j ACCEPT


<VirtualHost *:88>
ServerName 192.168.1.223
ServerAdmin your_domain@domain.com
DocumentRoot /var/www/html/phpmyadmin/
ErrorLog logs/redmine_error_log
<Directory «/var/www/html/phpmyadmin/»>
Options Indexes ExecCGI FollowSymLinks
Order allow,deny
Allow from all
AllowOverride all
</Directory>
</VirtualHost>

А вот алиас — если виртуальный сервер не нравится или не подходит.
Alias /phpmyadmin/ "/var/www/html/phpmyadmin/"

<Directory "/var/www/html/phpmyadmin">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Перезагружаем httpd и iptables:
systemctl restart iptables
systemctl restart httpd

Идем по адресу 192.168.1.223:88/setup/ или 192.168.1.223/phpmyadmin/setup

Новый сервер, в нем выбираем порт 3306, имя серверу любое, во вкладке Аутентификация вместо cookie ставим http. Нажимаем сохранить. Выбираем язык нужный — Русский. Сохранить нажимаем.

Теперь копируем конфиг в корень админки:

cp -R config/config.inc.php config.inc.php

Удаляем папку конфиг:
rm -rf config


Теперь открываем 192.168.1.223:88, вводим логин/пароль от mysql (root — passd) и видим, что у нас видна БД redmine.

Открываем ее и идем в Импорт — сюда будет «сувать» наш дамп. Но сначала давайте подготовимся для плавного пуска. Нам нужно из нашего файла оставить строки только с INSERT, так как остальное нам не надо и будет мешать. Все бы ничего, но у нас есть несколько запросов, которые побиты на 3, 4 или даже 100 строк:
INSERT INTO custom_values (id, customized_type,

- "День"
- "Ночь"

То есть просто выдернуть все грепы не даст резальтат, мы потеряем часть строк и получим либо ошибки, либо неполный импорт. Пойдем таким путем, что сначала удалим все не нужные нам строки, а именно SET, SELECT, CREATE, ADD, ALTER, GRANT, REVOKE, Date.

Все строки которые нашел при осмотре файла дампа и которые не прошли моего отбора.

Затем из полученнного файла мы выдернем все строки с INSERT и 110 строк относительно совпадения, то есть до след совпадения, так как у нас идут подрят одни INSERT, то нам это подходит, исключение буду последние строки. Затем удалил пустые строки, и немного похитрил, или потупил, в общем дальше в коде напишу ниже приведу весь скрипт.

Небольшое how_to, а дальше сам скрипт:

sed -i "/SELECT/d" "redmine_db.sql"   # Удалит из файла все строки с SELECT

sed -i -e "/SELECT/d" -e "/ADD/d" -e "/CREATE/d" -e "/GRANT/d" -e "/REVOKE/d" -e "/ALTER/d" -e "/SET/d" -e "/Data/d" "redmine_db_alltest.sql" # удалит все строки перечисленные

cat redmine_db.sql | grep -A110 INSERT > test.sql # сделает выборку по 110 строк после нахождения

sed -i '/^$/d' test_all.sql # Удаляем все пустые строки

#Так как у нас есть лишние символы -- и естьнужные ---, мы --- заменим на ++, и удалим --, потом ++ заменим на ---

sed -i 's/---/++/g' test.sql

sed -i "/--/d" "test.sql"
sed -i 's/++/---/g' test.sql

Создадим скрипт:
touch import.sh && chmod +x import.sh
mcedit inport.sh
 
# Сам скрипт

#!/bin/sh
 

#Объявление двух переменных.

#Основной файл и конечный файл. в котором будет все окончательное
redminedump="redmine_db_finale.sql"      # Основной файал, котрый мы получили
dump_all="dump_import.sql"                       # Файл, который и будем в итоге импортировать

#Тут удаляем из файлы все не нужные строки

#(предварительно пробежавшись по файлу и выбрав не нужное)
sed -i -e "/SELECT/d" -e "/ADD/d" -e "/CREATE/d" -e "/GRANT/d" -e "/REVOKE/d" -e "/ALTER/d" -e "/SET/d" -e "/Data/d" $redminedump

#Тут мы выбираем из файлы все нужные строки и 110 после нее до след совпадения

# Это нужно  для того, что у меня в базе были данные, которые на 105 строк шли ниже строки с INSERT,

# но по факту были одним INSERT . только раскинутый на строки) вот это пояснил))))))
cat $redminedump | grep -A110 INSERT > $dump_all

#Удаляем пустые строки
sed -i '/^$/d' $dump_all

# Так как у нас есть строки с тройным тире и есть строки с двойным, с двойным не нужны, с тройным нужны.

# мы тройные тире заменяем на знак не встречающийся в дампе, наприме два плюса
sed -i 's/---/++/g' $dump_all

#Затем удаляем два тире и меняем два плюса на три тире)))
sed -i "/--/d" $dump_all
sed -i 's/++/---/g' $dump_all

#Кавычки мешаются в нескольких местах - уберем их)
sed -i 's/"position"/position/g' $dump_all

#тут ругается при импорте на regexp  - меняем на `regexp` это братные кавычки  - тильда или буква Ё )
sed -i 's/regexp/`regexp`/g' $dump_all

# Все. файл для импорта готов
echo "Готово"

И того из 14140 строк мы выбрали 10358 нужных, за не большее время, а теперь представьте все это делать руками, даже при помощи общих замен с помощью gedit. Правда данный скрипт заточен больше под эту задачу, но в целом как перегон базы вполне может подойти, нужно только добавить запросы по созданию нужных таблиц. В данном случае, все сделал сам redmine при установке.

Проверям наш /etc/php.ini на upload_max_filesize, что бы он был не меньше, чем импортируемый файл дампа, по умолчанию он 2М.

Берем файл, уже dump_import.sql и импортируем его в новую базу, через phpmyadmin), ждем несколько минут и получаем долгожданное. Импорт успешно завершён, выполнено 9087 запросов (dump_import.sql). Теперь идем на новый сервер и проверяем 192.168.1.223 и видим, что все проекты, пользователи и задачи перенесены.

Можно теперь улыбнуться и попить, поесть.

Спасибо и удачи нам всем!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.