пятница, 31 мая 2013 г.

Сломанный collation utf8_general_ci в MySQL 5.1.x

Наступил на забавные грабли при копировании базы с mysql 5.0.51 на mysql 5.1.49. Сделал дамп базы и скопировал на тестовый сервер, но при импорте произошла ошибка

ERROR 1062 (23000) at line 8615879: Duplicate entry 'Voß' for key 'ticketwords'

Пробую найти значение в уже добавленных строках, которое конфликтует со значением 'Voß'

mysql> select * from swticketwords where contents = 'Voß';
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|        20080 | Vos      |
+--------------+----------+
1 row in set (0.00 sec)

Ерунда какая-то. Получается, что база считает 'Vos' = 'Voß' и отказывается добавлять значение. Начинаю гуглить и сразу натыкаюсь на репорты в багтрекере MySQL [1] [2]. Если в кратце, то разрабы поломали collation utf8_general_ci (который работал в mysql 5.0.x) и отказываются его чинить в mysql 5.1.x, мотивируя это тем, что фикс сломает еще больше.

Чтобы хоть как-то решить проблему был создан отдельный collation utf8_general_mysql500_ci, который возвращает старое поведение. Я поправил дамп, указав явный collation для таблицы swticketwords, и база успешно импортировалась. Чтобы показать разницу между utf8_general_ci и utf8_general_mysql500_ci я сделал запросы со старым и новым collation.

mysql> select * from swticketwords where contents = 'Voß' collate utf8_general_ci;
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|        20080 | Vos      |
|       126378 | Voß      |
+--------------+----------+
2 rows in set (0.00 sec)

На поле contents создан уникальный ключ ticketwords, и двух значений быть не должно.
mysql> select * from swticketwords where contents = 'Voß' collate utf8_general_mysql500_ci;
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|       126378 | Voß      |
+--------------+----------+
1 row in set (0.00 sec)

Ссылки:
1) http://bugs.mysql.com/bug.php?id=27877
2) http://bugs.mysql.com/bug.php?id=43593
3) http://dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html

пятница, 3 мая 2013 г.

Восстановление TP-Link TL-WA901ND после неудачной прошивки

Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.


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

Сразу предупреждаю, что человек, предоставивший мне свою точку доступа для опытов, выбирал между отправить ее в мусорку или дать мне покопаться в ней и в случае неудачи отправить ее в мусорку (по-крайней мере у меня сложилось такое впечатление). Так что если у вас стоит другой выбор, то попробуйте начать с сервис центра - возможно там вам помогут.

Если же вы все еще не передумали, то начать нужно с загрузки в fail safe режиме. Если кратко, то железку нужно выключить, затем включить и когда индикатор "SYS" начнет мигать - нажать кнопку "RESET". После этого индикатор "SYS" должен начать мигать чаще и вы сможете зайти в консоль через telnet по адресу 192.168.1.1. Перед тем, как куда-то заходить, вы должны настроить адрес своего компьютера для сети 192.168.1.0/24.

В том конкретном случае мне повезло и у человека железка была включена в коммутатор (ethernet switch), в котором водится интернет и адрес его сети как раз 192.168.1.0/24. Если у вас не так, то придется пошевелить мозгами, чтобы заполнить пробелы, не описанные в этом посте.

Чтобы зайти в консоль железки вам потребуется telnet клиент. Для Windows подойдет putty. Настройте параметры "Host Name (or IP address)", "Port" и "Connection type" как показано на скриншоте и жмите кнопку "Open".



Воскрешаемая железка имела аппаратную ревизию 1.x и все примеры будут даны исходя из этого. Не пытайтесь слепо повторить примеры, если у вас другая ревизия.

Сначала нужно перейти в /tmp и проверить, что хватает свободного места.

root@(none):/# df -h /tmp
Filesystem                Size      Used Available Use% Mounted on
tmpfs                    14.3M     56.0K     14.2M   0% /tmp

В моём случае свободно 14M, далее нужно настроить сеть

root@(none):/# echo 'nameserver 8.8.8.8' > /etc/resolv.conf
root@(none):/# route add default gw 192.168.1.15
root@(none):/# ping ya.ru

Если после этих действий у вас начал пинговаться ya.ru, то можно переходить к следующему этапу - загрузке новой прошивки. Тут есть список всех прошивок из trunk проекта openwrt. Поскольку ревизия устройства 1.x, то я выбираю вариант openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin. Теперь нужно скачать прошивку в устройство и на всякий случай проверить контрольную сумму.

root@(none):/# cd /tmp
root@(none):/tmp# wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin
root@(none):/tmp# wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/md5sums
root@(none):/tmp# md5sum -c md5sums 2>/dev/null | grep -v FAILED$
openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin: OK

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

root@(none):/tmp# mtd -r write openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin firmware

После успешного выполнения команды точка доступа должна перезагрузиться и у вас появится возможность зайти на нее через telnet. Дальнейшая настройка идентична первоначальной и описана тут.


Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.