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

Alex Gorbachenko =?iso-8859-1?q?agent=5F007_=CE=C1_immo=2Eru?=
Чт Дек 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 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20071213/98379e58/attachment-0002.bin>


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