War story: о хостерах, MySQL и PHP
Где-то пару недель назад я обнаружил, что не могу восстановить backup базы WordPress-блога сайта developers.org.ua. Точнее, восстановить-то я могу, только вместо русских букв отображается какой-то мусор.
Хотя на сайте все было по прежнему ОК (иначе я заметил бы и раньше) невозможность создания резервной копии базы означала что я в любой момент могу остаться без базы совсем. Порывшись в документации и в службе поддержки хостера обнаружил следующее.
Некоторое время назад хостер втихую обновил версию MySQL на сервере с 4.0 до 4.1. Как я узнал из документации после такого обновления следовало выполнить некоторые шаманства с текстовыми полями чтобы MySQL продолжал их правильно воспринимать.
Я этого не делал (потому что обновление прошло втихую) и продолжал добавлять данные в базу, ничего не подозревая. Когда я наконец «схаменувся», то обнаружил в таблицах нечитаемую смесь из utf8 данных закодированных в latin1 и utf8 данных закодированных в utf8. По крайней мере, так было в резервных копиях которые генерировал mysqldump. На сайте (онлайн) все почему-то показывалось ОК.
Различные ухищрения с резервной копией ничего не дали, как и запрос в ua-devtalk и некоторые другие онлайн-форумы.
Промучавшись с резервной копией, решил вернуться к тому факту что онлайн данные каким-то образом читаются PHP-кодом нормально. Возникла идея написать PHP-скрипт, который пройдет все нужные мне таблицы и сохранит данные в CSV или другую базу. Задачка та еще. Но тут я вспомнил что нечто такое уже видел, а именно: WordPress Database Backup Plugin.
Как следовало из исходного кода плагина, он работает именно так, как мне надо: проходит по табличкам и складывает их содержимое в текстовый файл (в .sql скрипт, который затем можно выполнить для восстановления базы). После небольших шаманств с настройкой я загрузил сгенерированный бекап и...на первый взгляд все было в ажуре!
Пришлось, конечно, поправить DEFAULT CHARSET=latin1 на utf8, ну да это пустяки. Запускаю скрипт и получаю кучу синтаксических ошибок. Ладно. Как оказалось, бекап скрипт «не понимает» NULL, в итоге некоторые INSERT строки выглядели как: «INSERT INTO ... (12, , , ’m’, 222)». Не страшно, делаем :g/^INSERT/s/, ,/, NULL,/g и пробуем еще раз. Опять та же ошибка — почему-то мой регэксп не все пустышки поймал. Выполняю еще раз, запускаю скрипт...данные загрузились!!!
Осталось обновить базу на сервере. Создаю резервную копию локальной базы, заливаю на сервер, заливаю в новую БД. Кажется все ОК. Переключаю WP на новую базу...вижу вопросики вместо русских букв. Так, кажется мы это уже проходили. Открываю wp-db.php и добавляю «SET NAMES utf8;».
Все. Работает. Только почему-то пропал опрос с заглавной страницы сайта. Таак, оказывается таблица опросника называется wp_democracyq хотя должно быть wp_democracyQ. Очевидно, когда я восстановил копию на своей Windows-машине MySQL и «потерял» регистр таблицы. Фигня, переименовываем таблицу...кажется теперь точно все.
PS: Если вы сегодня оставляли комментарий или анкету в базе зарплат в интервале примерно с 16:00 до 17:00, ваш комментарий был потерян. Но вроде бы никто ничего не писал, так что ничего не потерялось.
PPS: Ну а криворукого и некомпетентного хостера рекомендую остерегаться.
Все про українське ІТ в телеграмі — підписуйтеся на канал DOU
4 коментарі
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.