[sisyphus] снова вопрос о сортировке в постгресе

Alex Gorbachenko agent_007 на immo.ru
Чт Дек 13 15:07:33 MSK 2007


On Thu, 13 Dec 2007 13:29:04 +0200
Serge wrote:

>lc_collate                      ru_RU.KOI8-R
>lc_ctype                        ru_RU.KOI8-R

ну вот, собственно, и причина засора. LC_COLLATE и LC_CTYPE задаются
при инициализации кластера, после чего их изменить нельзя. как
следствие, если initdb был выполнен с локалью KOI, получаем проблемы с
сортировками и работой ф-ций upper()/lower() во всех БД кластера,
кодировка которых отлична от той, с которой кластер инициализировали.

существует два способа решения данной проблемы. 

прервый. сдампить базу, остановить постгрес, удалить содержимое каталога
с данными (/var/lib/pgsql/data/*, предварительно сохранив конфиги из
него). затем выполнить: 
echo "LANG=ru_RU.UTF-8" > /var/lib/pgsql/data/.18n
поднять постгрес, создать базу, залить в неё содержимое дампа. это
официально рекомендованый способ.

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

итак. 
1. Отключить сеть в postgresql;
2. service postgresql restart. Это позволит сбросить все сетевые
соединения и корректно завершить все транзакции;
3. service postgresql stop;
4. cp -a /var/lib/pgsql-root/var/lib/pgsql/data/global/ /root - спасаем
служебную информацию;
5. subst
"s,KOI8-R,UTF8,g" /var/lib/pgsql-root/var/lib/pgsql/data/global/pg_control
- изменяем значения LC_COLLATE и LC_CTYPE 
6. su -l postgres -s /bin/bash - получаем shell с правами
суперпользователя БД.
7. pg_resetxlog -n /var/lib/pgsql/data - запоминаем значения «Latest
checkpoint's NextXID» и «Latest checkpoint's NextOID». разумнее этот
этап делать до этапа 5 :)
8. cp -a /var/lib/pgsql/data/pg_xlog /var/lib/pgsql/data/pg_xlog.old -
на случай, если вам нужны старые логи транзакций. этап необязательный.
9. pg_resetxlog -o «Latest checkpoint's NextOID» -x «Latest
checkpoint's NextXID» -f /var/lib/pgsql/data - чиним служебный файл,
который искорёжили на этапе 5. после исправления выведется диагностика,
из которой можно будет понять, насколько успешно прошёл процесс.
10. если всё хорошо, и  pg_controldata /var/lib/pgsql/data не выдаёт
ругани, то можно поднять postgresql. 
если плохо, то нужно вернуть на место каталоги global и pg_xlog.

-- 
np: As I Lay Dying - Repeating yersterday
----------- УМЕДХАЭБС ЮБУФШ -----------
Было удалено вложение не в текстовом формате...
Имя     : signature.asc
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: отсутствует
Url     : http://lists.altlinux.org/pipermail/sisyphus/attachments/20071213/98379e58/attachment.bin 


Подробная информация о списке рассылки Sisyphus