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


Іноді при використанні великих баз даних, наприклад при розмірах більше одного гігабайта, конвертування БД в ту чи іншу кодування стає не можливим при використанні текстових редакторів або PHP скриптів, у зв’язку з їх обмеженими можливостями. Для таких випадків чудово підходять досить швидкі операції з використанням SSH, про що власне і піде мова в даній статті.

Отже розглянемо як змінити кодування бази даних для DLE прямо на сервері з використанням shell (SSH) на прикладі операційної системи CentOS 5. Якщо база даних дуже велика, то для початку йдемо до файлу конфігурації MySQL сервера my.cnf і міняємо в ньому тимчасово значення рядків max_allowed_packet на більше. Тобто, наприклад:
max_allowed_packet = 256МПерезапускаем сервер MySQL командою
service mysqld restartДалее для простоти роботи переходимо по SSH в папку backup потрібного сайту, де і будемо проводити всі маніпуляції з базою даних по зміні кодування з utf-8, windows-1251.Наприклад, такою командою (всі шляхи в командах будуть вказані для прикладу і вам доведеться змінити їх на свої відносно шляхів на вашому сервері):
cd /var/www/user/data/www/site.ua/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 -иИМЯ_БАЗЫ -рПАРОЛЬ_БАЗЫ -hlocalhost -A > dump.sql2. Тепер перекодируем 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 або через панель управління).
72