Конвертирование кодировки базы данных DLE по SSH

Конвертирование кодировки базы данных DLE по SSH

Иногда при использовании больших баз данных, например при размерах более одного гигабайта, конвертирование БД в ту или иную кодировку становится не возможным при использовании текстовых редакторов или PHP скриптов, в связи с их ограниченными возможностями. Для таких случаев прекрасно подходят достаточно быстрые операции с использованием SSH, о чем собственно и пойдет речь в данной статье.


Итак рассмотрим как изменить кодировку базы данных для DLE прямо на сервере с использованием shell (SSH) на примере операционной системы CentOS 5. Если база данных очень большая, то для начала идем к файлу конфигурации MySQL сервера my.cnf и меняем в нем временно значение строк max_allowed_packet на большее. Т.е., например:
max_allowed_packet = 256M

Перезапускаем сервер MySQL командой
service mysqld restart

Далее для простоты работы переходим по SSH в папку backup нужного сайта, где и будем проводить все манипуляции с базой данных по смене кодировки с utf-8 на windows-1251.Например, такой командой (все пути в командах будут указаны для примера и вам придется изменить их на свои относительно путей на вашем сервере):
cd /var/www/user/data/www/site.ru/backup

На время работы сайт лучше отключить в админпанели скрипта для посетителей.

1. Делаем дамп последней базы данных используя раздел админки "Управление базой данных". Дамп обычно имеет название что-то вроде 2012-03-16_02-10_user_base_55e2d753e9072ed783a2258bbf2d6106.sql.gz

Распакуем его командой:
gunzip 2012-03-16_02-10_user_base_55e2d753e9072ed783a2258bbf2d6106.sql.gz

У вас получится файл 2012-03-16_02-10_user_base_55e2d753e9072ed783a2258bbf2d6106.sql, который мы просто переименуем через панель управления для простоты работы, например, в dump.sql. Как вариант, если размер базы данных слишком большой, то дамп можно сделать через shell такой командой:
mysqldump -uИМЯ_БАЗЫ -pПАРОЛЬ_БАЗЫ -hlocalhost -A > dump.sql

2. Теперь перекодируем dump.sql в нужную нам кодировку с нужными параметрами командой:
iconv -f UTF-8 -t WINDOWS-1251 dump.sql > dump_cp1251.sql

Т.е. мы конвертируем дамп из кодировки utf-8 в windows-1251 и сохраняем его как новый файл с названием dump_cp1251.sql.

3. Теперь у нас есть база данных в нужной нам кодировке windws-1251 и нам нужно выставить правильные DEFAULT CHARSET для всех таблиц. Делаем это командой:
cat dump_cp1251.sql | replace "utf8" "cp1251" > dump_cp1251_replace.sql

Т.е. мы меняем в файле базы данных dump_cp1251.sql значения DEFAULT CHARSET с utf8 на ср1251 и сохраняем его как новый файл dump_cp1251_replace.sql.

4. Теперь можно восстановить этот дамп, который уже полностью поддерживает кодировку windows-1251, и сразу создать новую базу данных (или указать существующую - таблицы будут перезаписаны) командой:
mysql -uuser -ppassword newbdname --default-character-set=cp1251 < dump_cp1251_replace.sql

На данном примере показан способ конвертирования из UTF-8 в windows-1251. Аналогичным способом конвертируется и из windows-1251 в UTF-8, только кодировки в командах меняются соответственно.

Дополнительно...
Если вы планируете установить новую базу данных на другом домене, то вы можете сразу сменить имя домена по всей базе данных на новое и затем восстановить базу данных. Пример такой замены:
cat dump_cp1251.sql | replace "site.ru" "new.site.ru" > dump_cp1251_replace.sql

И потом восстанавливаем базу по пункту 4.

Примечание: Если у вас в процессе создания или восстановления базы данных возникают ошибки сервера, то это обычно связано с маленькими лимитами max_allowed_packet в my.cnf (увеличивайте на очень больших базах пока не пропадет ошибка) или с нехваткой времени выполнения скрипта (время увеличивайте в php.ini или через панель управления).
 
Автор: ower_xz
Источник
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.